From 468fb547bb29e71535c09631a54c4e106b313a43 Mon Sep 17 00:00:00 2001 From: Guilherme de Souza Date: Fri, 12 Sep 2014 06:25:15 -0300 Subject: [PATCH 001/144] doc: http.request() improved code example Reviewed-by: Trevor Norris Reviewed-by: Fedor Indutny --- doc/api/http.markdown | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/doc/api/http.markdown b/doc/api/http.markdown index c0a8730ca99..b0499707c1e 100644 --- a/doc/api/http.markdown +++ b/doc/api/http.markdown @@ -489,11 +489,19 @@ upload a file with a POST request, then write to the `ClientRequest` object. Example: + var postData = querystring.stringify({ + 'msg' : 'Hello World!' + }); + var options = { hostname: 'www.google.com', port: 80, path: '/upload', - method: 'POST' + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Content-Length': postData.length + } }; var req = http.request(options, function(res) { @@ -510,8 +518,7 @@ Example: }); // write data to request body - req.write('data\n'); - req.write('data\n'); + req.write(postData); req.end(); Note that in the example `req.end()` was called. With `http.request()` one From 378d9723f25cb5db88d2d0c74190800606d120f1 Mon Sep 17 00:00:00 2001 From: Guilherme de Souza Date: Fri, 12 Sep 2014 07:07:05 -0300 Subject: [PATCH 002/144] doc: console example improvement Reviewed-by: Trevor Norris Reviewed-by: Fedor Indutny --- doc/api/console.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/api/console.markdown b/doc/api/console.markdown index 5cfe068f26c..1517304d2e3 100644 --- a/doc/api/console.markdown +++ b/doc/api/console.markdown @@ -27,7 +27,9 @@ should worry about unless you log huge amounts of data. Prints to stdout with newline. This function can take multiple arguments in a `printf()`-like way. Example: + var count = 5; console.log('count: %d', count); + // prints 'count: 5' If formatting elements are not found in the first string then `util.inspect` is used on each argument. See [util.format()][] for more information. @@ -73,6 +75,7 @@ Finish timer, record output. Example: ; } console.timeEnd('100-elements'); + // prints 100-elements: 262ms ## console.trace(message, [...]) From 03e93526e6b38279c04d69ddf98c493342730e85 Mon Sep 17 00:00:00 2001 From: Alexis Campailla Date: Fri, 15 Aug 2014 18:25:38 +0200 Subject: [PATCH 003/144] win: manifest node.exe for Windows 8.1 Adding a compatibility section to node.exe embedded manifest so that Node is declared explicitly compatible with Windows 8.1. Required so that os.release() can return the correct version on Windows 8.1. See http://msdn.microsoft.com/en-us/library/windows/desktop/ms724451(v=vs.85).aspx Reviewed-by: Trevor Norris --- node.gyp | 4 ++++ src/res/node.exe.extra.manifest | 15 +++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 src/res/node.exe.extra.manifest diff --git a/node.gyp b/node.gyp index 5454af2f963..24c8860ac17 100644 --- a/node.gyp +++ b/node.gyp @@ -361,6 +361,10 @@ 'VCLinkerTool': { 'SubSystem': 1, # /subsystem:console }, + 'VCManifestTool': { + 'EmbedManifest': 'true', + 'AdditionalManifestFiles': 'src/res/node.exe.extra.manifest' + } }, }, # generate ETW header and resource files diff --git a/src/res/node.exe.extra.manifest b/src/res/node.exe.extra.manifest new file mode 100644 index 00000000000..c4cc80a141d --- /dev/null +++ b/src/res/node.exe.extra.manifest @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + From c6155454163a439bf9c74a876f9ac201673b20fc Mon Sep 17 00:00:00 2001 From: Mickael van der Beek Date: Wed, 17 Sep 2014 14:40:01 -0700 Subject: [PATCH 004/144] crypto: clarify RandomBytes() error msg Reviewed-by: Trevor Norris --- src/node_crypto.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node_crypto.cc b/src/node_crypto.cc index 85f18bc1994..7f546ed6718 100644 --- a/src/node_crypto.cc +++ b/src/node_crypto.cc @@ -4723,7 +4723,7 @@ void RandomBytes(const FunctionCallbackInfo& args) { // maybe allow a buffer to write to? cuts down on object creation // when generating random data in a loop if (!args[0]->IsUint32()) { - return env->ThrowTypeError("Argument #1 must be number > 0"); + return env->ThrowTypeError("size must be a number >= 0"); } const uint32_t size = args[0]->Uint32Value(); From cb4ed3c78fd6c795c29ff67df19d358a90c777cc Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Thu, 18 Sep 2014 02:21:32 +0400 Subject: [PATCH 005/144] crypto: never store pointer to conn in SSL_CTX SSL_CTX is shared between multiple connections and is not a right place to store per-connection data. fix #8348 Reviewed-By: Trevor Norris --- src/node_crypto.cc | 36 +++++++++++++++--------------------- src/node_crypto.h | 2 +- src/tls_wrap.cc | 4 ++-- 3 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/node_crypto.cc b/src/node_crypto.cc index 7f546ed6718..5d8a9f5de0e 100644 --- a/src/node_crypto.cc +++ b/src/node_crypto.cc @@ -120,8 +120,7 @@ X509_STORE* root_cert_store; template class SSLWrap; template void SSLWrap::AddMethods(Environment* env, Handle t); -template void SSLWrap::InitNPN(SecureContext* sc, - TLSCallbacks* base); +template void SSLWrap::InitNPN(SecureContext* sc); template SSL_SESSION* SSLWrap::GetSessionCallback( SSL* s, unsigned char* key, @@ -1013,26 +1012,21 @@ void SSLWrap::AddMethods(Environment* env, Handle t) { template -void SSLWrap::InitNPN(SecureContext* sc, Base* base) { - if (base->is_server()) { +void SSLWrap::InitNPN(SecureContext* sc) { #ifdef OPENSSL_NPN_NEGOTIATED - // Server should advertise NPN protocols - SSL_CTX_set_next_protos_advertised_cb(sc->ctx_, - AdvertiseNextProtoCallback, - base); + // Server should advertise NPN protocols + SSL_CTX_set_next_protos_advertised_cb(sc->ctx_, + AdvertiseNextProtoCallback, + NULL); + // Client should select protocol from list of advertised + // If server supports NPN + SSL_CTX_set_next_proto_select_cb(sc->ctx_, SelectNextProtoCallback, NULL); #endif // OPENSSL_NPN_NEGOTIATED - } else { -#ifdef OPENSSL_NPN_NEGOTIATED - // Client should select protocol from list of advertised - // If server supports NPN - SSL_CTX_set_next_proto_select_cb(sc->ctx_, SelectNextProtoCallback, base); -#endif // OPENSSL_NPN_NEGOTIATED - } #ifdef NODE__HAVE_TLSEXT_STATUS_CB // OCSP stapling SSL_CTX_set_tlsext_status_cb(sc->ctx_, TLSExtStatusCallback); - SSL_CTX_set_tlsext_status_arg(sc->ctx_, base); + SSL_CTX_set_tlsext_status_arg(sc->ctx_, NULL); #endif // NODE__HAVE_TLSEXT_STATUS_CB } @@ -1688,7 +1682,7 @@ int SSLWrap::AdvertiseNextProtoCallback(SSL* s, const unsigned char** data, unsigned int* len, void* arg) { - Base* w = static_cast(arg); + Base* w = static_cast(SSL_get_app_data(s)); Environment* env = w->env(); HandleScope handle_scope(env->isolate()); Context::Scope context_scope(env->context()); @@ -1714,7 +1708,7 @@ int SSLWrap::SelectNextProtoCallback(SSL* s, const unsigned char* in, unsigned int inlen, void* arg) { - Base* w = static_cast(arg); + Base* w = static_cast(SSL_get_app_data(s)); Environment* env = w->env(); HandleScope handle_scope(env->isolate()); Context::Scope context_scope(env->context()); @@ -1806,7 +1800,7 @@ void SSLWrap::SetNPNProtocols(const FunctionCallbackInfo& args) { #ifdef NODE__HAVE_TLSEXT_STATUS_CB template int SSLWrap::TLSExtStatusCallback(SSL* s, void* arg) { - Base* w = static_cast(arg); + Base* w = static_cast(SSL_get_app_data(s)); Environment* env = w->env(); HandleScope handle_scope(env->isolate()); @@ -2122,7 +2116,7 @@ int Connection::SelectSNIContextCallback_(SSL *s, int *ad, void* arg) { if (secure_context_constructor_template->HasInstance(ret)) { conn->sniContext_.Reset(env->isolate(), ret); SecureContext* sc = Unwrap(ret.As()); - InitNPN(sc, conn); + InitNPN(sc); SSL_set_SSL_CTX(s, sc->ctx_); } else { return SSL_TLSEXT_ERR_NOACK; @@ -2158,7 +2152,7 @@ void Connection::New(const FunctionCallbackInfo& args) { if (is_server) SSL_set_info_callback(conn->ssl_, SSLInfoCallback); - InitNPN(sc, conn); + InitNPN(sc); #ifdef SSL_CTRL_SET_TLSEXT_SERVERNAME_CB if (is_server) { diff --git a/src/node_crypto.h b/src/node_crypto.h index c88f3945e64..3c46e0c11e2 100644 --- a/src/node_crypto.h +++ b/src/node_crypto.h @@ -188,7 +188,7 @@ class SSLWrap { inline bool is_waiting_new_session() const { return new_session_wait_; } protected: - static void InitNPN(SecureContext* sc, Base* base); + static void InitNPN(SecureContext* sc); static void AddMethods(Environment* env, v8::Handle t); static SSL_SESSION* GetSessionCallback(SSL* s, diff --git a/src/tls_wrap.cc b/src/tls_wrap.cc index d74954f7eef..8e70b88d31e 100644 --- a/src/tls_wrap.cc +++ b/src/tls_wrap.cc @@ -186,7 +186,7 @@ void TLSCallbacks::InitSSL() { } #endif // SSL_CTRL_SET_TLSEXT_SERVERNAME_CB - InitNPN(sc_, this); + InitNPN(sc_); if (is_server()) { SSL_set_accept_state(ssl_); @@ -800,7 +800,7 @@ int TLSCallbacks::SelectSNIContextCallback(SSL* s, int* ad, void* arg) { p->sni_context_.Reset(env->isolate(), ctx); SecureContext* sc = Unwrap(ctx.As()); - InitNPN(sc, p); + InitNPN(sc); SSL_set_SSL_CTX(s, sc->ctx_); return SSL_TLSEXT_ERR_OK; } From 9c992bdb752063913067feb533cd3db37d2e4d01 Mon Sep 17 00:00:00 2001 From: Julien Gilli Date: Tue, 2 Sep 2014 10:52:45 -0700 Subject: [PATCH 006/144] test: add test for cluster.worker.destroy() Add a simple test to cover workers' implementation of Worker.prototype.destroy(). Before adding this test, this code wouldn't be covered by the tests suite, and any regression introduced in workers' implementation of Worker.prototype.destroy wouldn't be caught. Fixes: https://github.com/joyent/node/issues/8223 Reviewed-by: Trevor Norris --- test/simple/test-cluster-worker-destroy.js | 79 ++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 test/simple/test-cluster-worker-destroy.js diff --git a/test/simple/test-cluster-worker-destroy.js b/test/simple/test-cluster-worker-destroy.js new file mode 100644 index 00000000000..318b55caf6f --- /dev/null +++ b/test/simple/test-cluster-worker-destroy.js @@ -0,0 +1,79 @@ +// 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. + +/* + * The goal of this test is to cover the Workers' implementation of + * Worker.prototype.destroy. Worker.prototype.destroy is called within + * the worker's context: once when the worker is still connected to the + * master, and another time when it's not connected to it, so that we cover + * both code paths. + */ + +require('../common'); +var cluster = require('cluster'); +var assert = require('assert'); + +var worker1, worker2, workerExited, workerDisconnected; + +if (cluster.isMaster) { + worker1 = cluster.fork(); + worker2 = cluster.fork(); + + workerExited = 0; + workerDisconnected = 0; + + [worker1, worker2].forEach(function(worker) { + worker.on('disconnect', ondisconnect); + worker.on('exit', onexit); + }); + + process.on('exit', onProcessExit); + +} else { + if (cluster.worker.id === 1) { + // Call destroy when worker is disconnected + cluster.worker.process.on('disconnect', function() { + cluster.worker.destroy(); + }); + + cluster.worker.disconnect(); + } else { + // Call destroy when worker is not disconnected yet + cluster.worker.destroy(); + } +} + +function onProcessExit() { + assert.equal(workerExited, + 2, + 'When master exits, all workers should have exited too'); + assert.equal(workerDisconnected, + 2, + 'When master exits, all workers should have disconnected'); +} + +function ondisconnect() { + ++workerDisconnected; +} + +function onexit() { + ++workerExited; +} From 30bd7b672cbb7ef9a400eb34f6d5c778991e1b3c Mon Sep 17 00:00:00 2001 From: Vladimir Kurchatkin Date: Thu, 4 Sep 2014 20:02:04 +0400 Subject: [PATCH 007/144] node: support v8 microtask queue When V8 started supporting Promises natively it also introduced a microtack queue. This feature operates similar to process.nextTick(), and created an issue where neither knew when the other had run. This patch has nextTick() call the microtask queue runner at the end of processing callbacks in the nextTickQueue. Fixes: https://github.com/joyent/node/issues/7714 Reviewed-by: Trevor Norris --- src/node.cc | 7 ++ src/node.js | 33 ++++++++- ...test-microtask-queue-integration-domain.js | 70 +++++++++++++++++++ .../test-microtask-queue-integration.js | 69 ++++++++++++++++++ 4 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 test/simple/test-microtask-queue-integration-domain.js create mode 100644 test/simple/test-microtask-queue-integration.js diff --git a/src/node.cc b/src/node.cc index 76d6503366d..2223c369831 100644 --- a/src/node.cc +++ b/src/node.cc @@ -967,6 +967,10 @@ void SetupDomainUse(const FunctionCallbackInfo& args) { FIXED_ONE_BYTE_STRING(args.GetIsolate(), "_setupDomainUse")); } +void RunMicrotasks(const FunctionCallbackInfo& args) { + args.GetIsolate()->RunMicrotasks(); +} + void SetupNextTick(const FunctionCallbackInfo& args) { HandleScope handle_scope(args.GetIsolate()); @@ -974,6 +978,7 @@ void SetupNextTick(const FunctionCallbackInfo& args) { assert(args[0]->IsObject()); assert(args[1]->IsFunction()); + assert(args[2]->IsObject()); // Values use to cross communicate with processNextTick. Local tick_info_obj = args[0].As(); @@ -984,6 +989,8 @@ void SetupNextTick(const FunctionCallbackInfo& args) { env->set_tick_callback_function(args[1].As()); + NODE_SET_METHOD(args[2].As(), "runMicrotasks", RunMicrotasks); + // Do a little housekeeping. env->process_object()->Delete( FIXED_ONE_BYTE_STRING(args.GetIsolate(), "_setupNextTick")); diff --git a/src/node.js b/src/node.js index 65092249d55..e7b45ad5cc7 100644 --- a/src/node.js +++ b/src/node.js @@ -294,6 +294,10 @@ var _runAsyncQueue = tracing._runAsyncQueue; var _loadAsyncQueue = tracing._loadAsyncQueue; var _unloadAsyncQueue = tracing._unloadAsyncQueue; + var microtasksScheduled = false; + + // Used to run V8's micro task queue. + var _runMicrotasks = {}; // This tickInfo thing is used so that the C++ code in src/node.cc // can have easy accesss to our nextTick state, and avoid unnecessary @@ -312,7 +316,9 @@ process._tickCallback = _tickCallback; process._tickDomainCallback = _tickDomainCallback; - process._setupNextTick(tickInfo, _tickCallback); + process._setupNextTick(tickInfo, _tickCallback, _runMicrotasks); + + _runMicrotasks = _runMicrotasks.runMicrotasks; function tickDone() { if (tickInfo[kLength] !== 0) { @@ -327,11 +333,34 @@ tickInfo[kIndex] = 0; } + function scheduleMicrotasks() { + if (microtasksScheduled) + return; + + nextTickQueue.push({ + callback: runMicrotasksCallback, + domain: null + }); + + tickInfo[kLength]++; + microtasksScheduled = true; + } + + function runMicrotasksCallback() { + microtasksScheduled = false; + _runMicrotasks(); + + if (tickInfo[kIndex] < tickInfo[kLength]) + scheduleMicrotasks(); + } + // Run callbacks that have no domain. // Using domains will cause this to be overridden. function _tickCallback() { var callback, hasQueue, threw, tock; + scheduleMicrotasks(); + while (tickInfo[kIndex] < tickInfo[kLength]) { tock = nextTickQueue[tickInfo[kIndex]++]; callback = tock.callback; @@ -358,6 +387,8 @@ function _tickDomainCallback() { var callback, domain, hasQueue, threw, tock; + scheduleMicrotasks(); + while (tickInfo[kIndex] < tickInfo[kLength]) { tock = nextTickQueue[tickInfo[kIndex]++]; callback = tock.callback; diff --git a/test/simple/test-microtask-queue-integration-domain.js b/test/simple/test-microtask-queue-integration-domain.js new file mode 100644 index 00000000000..2197bf9212e --- /dev/null +++ b/test/simple/test-microtask-queue-integration-domain.js @@ -0,0 +1,70 @@ +// 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 common = require('../common'); +var assert = require('assert'); +var domain = require('domain'); + +var implementations = [ + function (fn) { + Promise.resolve().then(fn); + }, + function (fn) { + var obj = {}; + + Object.observe(obj, fn); + + obj.a = 1; + } +]; + +var expected = 0; +var done = 0; + +process.on('exit', function () { + assert.equal(done, expected); +}); + +function test (scheduleMicrotask) { + var nextTickCalled = false; + expected++; + + scheduleMicrotask(function () { + process.nextTick(function () { + nextTickCalled = true; + }); + + setTimeout(function () { + assert(nextTickCalled); + done++; + }, 0); + }); +} + +// first tick case +implementations.forEach(test); + +// tick callback case +setTimeout(function () { + implementations.forEach(function (impl) { + process.nextTick(test.bind(null, impl)); + }); +}, 0); diff --git a/test/simple/test-microtask-queue-integration.js b/test/simple/test-microtask-queue-integration.js new file mode 100644 index 00000000000..af01548477f --- /dev/null +++ b/test/simple/test-microtask-queue-integration.js @@ -0,0 +1,69 @@ +// 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 common = require('../common'); +var assert = require('assert'); + +var implementations = [ + function (fn) { + Promise.resolve().then(fn); + }, + function (fn) { + var obj = {}; + + Object.observe(obj, fn); + + obj.a = 1; + } +]; + +var expected = 0; +var done = 0; + +process.on('exit', function () { + assert.equal(done, expected); +}); + +function test (scheduleMicrotask) { + var nextTickCalled = false; + expected++; + + scheduleMicrotask(function () { + process.nextTick(function () { + nextTickCalled = true; + }); + + setTimeout(function () { + assert(nextTickCalled); + done++; + }, 0); + }); +} + +// first tick case +implementations.forEach(test); + +// tick callback case +setTimeout(function () { + implementations.forEach(function (impl) { + process.nextTick(test.bind(null, impl)); + }); +}, 0); From d66adf0c85fa8b26c7f72c5bd030fbcb79dbb0bb Mon Sep 17 00:00:00 2001 From: Andrew Teich Date: Thu, 18 Sep 2014 22:09:24 -0700 Subject: [PATCH 008/144] doc: corrected typo in vm docs Reviewed-by: Trevor Norris --- doc/api/vm.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/vm.markdown b/doc/api/vm.markdown index 0f963ca4351..c73a86da62c 100644 --- a/doc/api/vm.markdown +++ b/doc/api/vm.markdown @@ -85,7 +85,7 @@ returns the result. Running code does not have access to local scope. The `vm.runInContext` takes the same options as `vm.runInThisContext`. -Example: compile and execute differnt scripts in a single existing context. +Example: compile and execute different scripts in a single existing context. var util = require('util'); var vm = require('vm'); From 4c9b30db675ba3094a733e2691e968b658105334 Mon Sep 17 00:00:00 2001 From: Kang-Hao Kenny Date: Fri, 19 Sep 2014 23:14:37 +0800 Subject: [PATCH 009/144] buffer: improve Buffer constructor Increase the performance of new Buffer construction by initializing all properties before SetIndexedPropertiesToExternalArrayData call. Reviewed-by: Trevor Norris --- lib/buffer.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/buffer.js b/lib/buffer.js index bd69a972003..adb551a9e4e 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -66,6 +66,7 @@ function Buffer(subject, encoding) { 'size: 0x' + kMaxLength.toString(16) + ' bytes'); } + this.parent = null; if (this.length <= (Buffer.poolSize >>> 1) && this.length > 0) { if (this.length > poolSize - poolOffset) createPool(); @@ -217,11 +218,6 @@ Buffer.byteLength = function(str, enc) { }; -// pre-set for values that may exist in the future -Buffer.prototype.length = undefined; -Buffer.prototype.parent = undefined; - - // toString(encoding, start=0, end=buffer.length) Buffer.prototype.toString = function(encoding, start, end) { var loweredCase = false; From 64d6de9f34abe63bf7602ab0b55ff268cf480e45 Mon Sep 17 00:00:00 2001 From: Julien Gilli Date: Mon, 22 Sep 2014 17:21:40 -0700 Subject: [PATCH 010/144] http: write() after end() emits an error. When calling write() after end() has been called on an OutgoingMessage, an error is emitted and the write's callback is called with an instance of Error. Fix #7477. Reviewed-By: Fedor Indutny --- lib/_http_outgoing.js | 12 +++++ test/simple/test-http-res-write-after-end.js | 49 ++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 test/simple/test-http-res-write-after-end.js diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index ff42e653bba..bec9a3c0155 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -403,6 +403,18 @@ Object.defineProperty(OutgoingMessage.prototype, 'headersSent', { OutgoingMessage.prototype.write = function(chunk, encoding, callback) { + var self = this; + + if (this.finished) { + var err = new Error('write after end'); + process.nextTick(function() { + self.emit('error', err); + if (callback) callback(err); + }); + + return true; + } + if (!this._header) { this._implicitHeader(); } diff --git a/test/simple/test-http-res-write-after-end.js b/test/simple/test-http-res-write-after-end.js new file mode 100644 index 00000000000..71a2564bfe4 --- /dev/null +++ b/test/simple/test-http-res-write-after-end.js @@ -0,0 +1,49 @@ +// 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 common = require('../common'); +var assert = require('assert'); +var http = require('http'); + +var responseError; + +var server = http.Server(function(req, res) { + res.on('error', function onResError(err) { + responseError = err; + }); + + res.write('This should write.'); + res.end(); + + var r = res.write('This should raise an error.'); + assert.equal(r, true, 'write after end should return true'); +}); + +server.listen(common.PORT, function() { + var req = http.get({port: common.PORT}, function(res) { + server.close(); + }); +}); + +process.on('exit', function onProcessExit(code) { + assert(responseError, 'response should have emitted error'); + assert.equal(responseError.message, 'write after end'); +}); From 6e08bb94e8b1aaf913cf88106cb59f9d2ae85925 Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Fri, 12 Sep 2014 13:27:22 +0100 Subject: [PATCH 011/144] crypto: export externals to internal structs Export External getters for a internal structs: SSL, SSL_CTX. --- src/node_crypto.cc | 32 ++++++++++++++++++++++++++++++++ src/node_crypto.h | 4 ++++ src/node_internals.h | 15 +++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/src/node_crypto.cc b/src/node_crypto.cc index 5d8a9f5de0e..44ed4e09a05 100644 --- a/src/node_crypto.cc +++ b/src/node_crypto.cc @@ -81,6 +81,7 @@ using v8::Boolean; using v8::Context; using v8::EscapableHandleScope; using v8::Exception; +using v8::External; using v8::False; using v8::FunctionCallbackInfo; using v8::FunctionTemplate; @@ -286,6 +287,11 @@ void SecureContext::Initialize(Environment* env, Handle target) { "getIssuer", SecureContext::GetCertificate); + NODE_SET_EXTERNAL( + t->PrototypeTemplate(), + "_external", + CtxGetter); + target->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "SecureContext"), t->GetFunction()); env->set_secure_context_constructor_template(t); @@ -956,6 +962,16 @@ void SecureContext::SetTicketKeys(const FunctionCallbackInfo& args) { } +void SecureContext::CtxGetter(Local property, + const PropertyCallbackInfo& info) { + HandleScope scope(info.GetIsolate()); + + SSL_CTX* ctx = Unwrap(info.Holder())->ctx_; + Local ext = External::New(info.GetIsolate(), ctx); + info.GetReturnValue().Set(ext); +} + + template void SecureContext::GetCertificate(const FunctionCallbackInfo& args) { HandleScope scope(args.GetIsolate()); @@ -1008,6 +1024,11 @@ void SSLWrap::AddMethods(Environment* env, Handle t) { NODE_SET_PROTOTYPE_METHOD(t, "getNegotiatedProtocol", GetNegotiatedProto); NODE_SET_PROTOTYPE_METHOD(t, "setNPNProtocols", SetNPNProtocols); #endif // OPENSSL_NPN_NEGOTIATED + + NODE_SET_EXTERNAL( + t->PrototypeTemplate(), + "_external", + SSLGetter); } @@ -1846,6 +1867,17 @@ int SSLWrap::TLSExtStatusCallback(SSL* s, void* arg) { #endif // NODE__HAVE_TLSEXT_STATUS_CB +template +void SSLWrap::SSLGetter(Local property, + const PropertyCallbackInfo& info) { + HandleScope scope(info.GetIsolate()); + + SSL* ssl = Unwrap(info.Holder())->ssl_; + Local ext = External::New(info.GetIsolate(), ssl); + info.GetReturnValue().Set(ext); +} + + void Connection::OnClientHelloParseEnd(void* arg) { Connection* conn = static_cast(arg); diff --git a/src/node_crypto.h b/src/node_crypto.h index 3c46e0c11e2..1a719b9058a 100644 --- a/src/node_crypto.h +++ b/src/node_crypto.h @@ -105,6 +105,8 @@ class SecureContext : public BaseObject { static void LoadPKCS12(const v8::FunctionCallbackInfo& args); static void GetTicketKeys(const v8::FunctionCallbackInfo& args); static void SetTicketKeys(const v8::FunctionCallbackInfo& args); + static void CtxGetter(v8::Local property, + const v8::PropertyCallbackInfo& info); template static void GetCertificate(const v8::FunctionCallbackInfo& args); @@ -237,6 +239,8 @@ class SSLWrap { void* arg); #endif // OPENSSL_NPN_NEGOTIATED static int TLSExtStatusCallback(SSL* s, void* arg); + static void SSLGetter(v8::Local property, + const v8::PropertyCallbackInfo& info); inline Environment* ssl_env() const { return env_; diff --git a/src/node_internals.h b/src/node_internals.h index d38a3f019fb..253bd38d962 100644 --- a/src/node_internals.h +++ b/src/node_internals.h @@ -216,6 +216,21 @@ NODE_DEPRECATED("Use ThrowUVException(isolate)", return ThrowUVException(isolate, errorno, syscall, message, path); }) +inline void NODE_SET_EXTERNAL(v8::Handle target, + const char* key, + v8::AccessorGetterCallback getter) { + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + v8::HandleScope handle_scope(isolate); + v8::Local prop = v8::String::NewFromUtf8(isolate, key); + target->SetAccessor(prop, + getter, + NULL, + v8::Handle(), + v8::DEFAULT, + static_cast(v8::ReadOnly | + v8::DontDelete)); +} + } // namespace node #endif // SRC_NODE_INTERNALS_H_ From c5f5d4cd11c2aec74fa03985405122d1ecb06f69 Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Fri, 19 Sep 2014 21:37:55 +0400 Subject: [PATCH 012/144] deps: update uv to v1.0.0-rc1 --- deps/uv/.gitignore | 6 + deps/uv/.mailmap | 2 + deps/uv/AUTHORS | 2 + deps/uv/ChangeLog | 99 +- deps/uv/Makefile.am | 10 +- deps/uv/README.md | 35 +- deps/uv/configure.ac | 4 +- deps/uv/docs/make.bat | 243 ++++ deps/uv/docs/src/async.rst | 56 + deps/uv/docs/src/check.rst | 46 + deps/uv/docs/src/conf.py | 348 +++++ deps/uv/docs/src/design.rst | 137 ++ deps/uv/docs/src/dll.rst | 44 + deps/uv/docs/src/dns.rst | 83 ++ deps/uv/docs/src/errors.rst | 329 +++++ deps/uv/docs/src/fs.rst | 259 ++++ deps/uv/docs/src/fs_event.rst | 102 ++ deps/uv/docs/src/fs_poll.rst | 65 + deps/uv/docs/src/handle.rst | 172 +++ deps/uv/docs/src/idle.rst | 54 + deps/uv/docs/src/index.rst | 84 ++ deps/uv/docs/src/loop.rst | 137 ++ deps/uv/docs/src/misc.rst | 228 +++ deps/uv/docs/src/pipe.rst | 86 ++ deps/uv/docs/src/poll.rst | 99 ++ deps/uv/docs/src/prepare.rst | 46 + deps/uv/docs/src/process.rst | 215 +++ deps/uv/docs/src/request.rst | 82 ++ deps/uv/docs/src/signal.rst | 77 + deps/uv/docs/src/static/architecture.png | Bin 0 -> 206767 bytes .../src/static/diagrams.key/Data/st0-311.jpg | Bin 0 -> 19328 bytes .../src/static/diagrams.key/Data/st1-475.jpg | Bin 0 -> 12655 bytes .../uv/docs/src/static/diagrams.key/Index.zip | Bin 0 -> 71160 bytes .../Metadata/BuildVersionHistory.plist | 8 + .../diagrams.key/Metadata/DocumentIdentifier | 1 + .../diagrams.key/Metadata/Properties.plist | Bin 0 -> 340 bytes .../src/static/diagrams.key/preview-micro.jpg | Bin 0 -> 1425 bytes .../src/static/diagrams.key/preview-web.jpg | Bin 0 -> 8106 bytes .../docs/src/static/diagrams.key/preview.jpg | Bin 0 -> 107456 bytes deps/uv/docs/src/static/favicon.ico | Bin 0 -> 15086 bytes deps/uv/docs/src/static/logo.png | Bin 0 -> 33545 bytes deps/uv/docs/src/static/loop_iteration.png | Bin 0 -> 80528 bytes deps/uv/docs/src/stream.rst | 189 +++ deps/uv/docs/src/tcp.rst | 97 ++ deps/uv/docs/src/threading.rst | 156 ++ deps/uv/docs/src/threadpool.rst | 59 + deps/uv/docs/src/timer.rst | 68 + deps/uv/docs/src/tty.rst | 63 + deps/uv/docs/src/udp.rst | 280 ++++ deps/uv/include/uv-errno.h | 6 - deps/uv/include/uv-unix.h | 47 +- deps/uv/include/uv-version.h | 13 +- deps/uv/include/uv-win.h | 34 +- deps/uv/include/uv.h | 1281 +++-------------- deps/uv/m4/.gitignore | 3 + deps/uv/m4/as_case.m4 | 21 + deps/uv/m4/dtrace.m4 | 66 + deps/uv/m4/libuv-check-flags.m4 | 319 ++++ deps/uv/src/fs-poll.c | 15 +- deps/uv/src/unix/core.c | 57 + deps/uv/src/unix/darwin-proctitle.c | 24 +- deps/uv/src/unix/fs.c | 41 +- deps/uv/src/unix/fsevents.c | 2 +- deps/uv/src/unix/getaddrinfo.c | 67 + deps/uv/src/unix/internal.h | 2 +- deps/uv/src/unix/linux-core.c | 21 +- deps/uv/src/unix/loop.c | 5 +- deps/uv/src/unix/netbsd.c | 1 + deps/uv/src/unix/process.c | 85 +- deps/uv/src/unix/stream.c | 153 +- deps/uv/src/unix/timer.c | 3 + deps/uv/src/unix/udp.c | 2 - deps/uv/src/uv-common.c | 142 +- deps/uv/src/uv-common.h | 4 + deps/uv/src/version.c | 2 +- deps/uv/src/win/core.c | 138 +- deps/uv/src/win/fs.c | 202 +-- deps/uv/src/win/getaddrinfo.c | 19 + deps/uv/src/win/getnameinfo.c | 16 +- deps/uv/src/win/internal.h | 6 +- deps/uv/src/win/loop-watcher.c | 6 +- deps/uv/src/win/pipe.c | 105 +- deps/uv/src/win/process.c | 16 +- deps/uv/src/win/stream.c | 6 +- deps/uv/src/win/tcp.c | 2 + deps/uv/src/win/timer.c | 98 +- deps/uv/src/win/tty.c | 1 + deps/uv/src/win/udp.c | 15 +- deps/uv/src/win/util.c | 37 +- deps/uv/src/win/winapi.c | 4 + deps/uv/src/win/winapi.h | 3 + deps/uv/test/echo-server.c | 22 +- deps/uv/test/test-default-loop-close.c | 59 + deps/uv/test/test-fs.c | 28 +- deps/uv/test/test-handle-fileno.c | 120 ++ deps/uv/test/test-list.h | 29 + deps/uv/test/test-osx-select.c | 48 + .../test/test-pipe-close-stdout-read-stdin.c | 103 ++ deps/uv/test/test-pipe-getsockname.c | 58 + deps/uv/test/test-socket-buffer-size.c | 77 + deps/uv/test/test-spawn.c | 6 +- deps/uv/test/test-tcp-write-after-connect.c | 68 + deps/uv/test/test-tcp-write-queue-order.c | 2 +- deps/uv/test/test-timer.c | 11 + deps/uv/test/test-udp-ipv6.c | 7 + deps/uv/test/test-udp-multicast-interface6.c | 2 +- deps/uv/test/test-udp-send-unreachable.c | 150 ++ deps/uv/test/test-watcher-cross-stop.c | 2 +- deps/uv/uv.gyp | 36 +- src/node_file.cc | 61 +- 110 files changed, 6370 insertions(+), 1680 deletions(-) create mode 100644 deps/uv/docs/make.bat create mode 100644 deps/uv/docs/src/async.rst create mode 100644 deps/uv/docs/src/check.rst create mode 100644 deps/uv/docs/src/conf.py create mode 100644 deps/uv/docs/src/design.rst create mode 100644 deps/uv/docs/src/dll.rst create mode 100644 deps/uv/docs/src/dns.rst create mode 100644 deps/uv/docs/src/errors.rst create mode 100644 deps/uv/docs/src/fs.rst create mode 100644 deps/uv/docs/src/fs_event.rst create mode 100644 deps/uv/docs/src/fs_poll.rst create mode 100644 deps/uv/docs/src/handle.rst create mode 100644 deps/uv/docs/src/idle.rst create mode 100644 deps/uv/docs/src/index.rst create mode 100644 deps/uv/docs/src/loop.rst create mode 100644 deps/uv/docs/src/misc.rst create mode 100644 deps/uv/docs/src/pipe.rst create mode 100644 deps/uv/docs/src/poll.rst create mode 100644 deps/uv/docs/src/prepare.rst create mode 100644 deps/uv/docs/src/process.rst create mode 100644 deps/uv/docs/src/request.rst create mode 100644 deps/uv/docs/src/signal.rst create mode 100644 deps/uv/docs/src/static/architecture.png create mode 100644 deps/uv/docs/src/static/diagrams.key/Data/st0-311.jpg create mode 100644 deps/uv/docs/src/static/diagrams.key/Data/st1-475.jpg create mode 100644 deps/uv/docs/src/static/diagrams.key/Index.zip create mode 100644 deps/uv/docs/src/static/diagrams.key/Metadata/BuildVersionHistory.plist create mode 100644 deps/uv/docs/src/static/diagrams.key/Metadata/DocumentIdentifier create mode 100644 deps/uv/docs/src/static/diagrams.key/Metadata/Properties.plist create mode 100644 deps/uv/docs/src/static/diagrams.key/preview-micro.jpg create mode 100644 deps/uv/docs/src/static/diagrams.key/preview-web.jpg create mode 100644 deps/uv/docs/src/static/diagrams.key/preview.jpg create mode 100644 deps/uv/docs/src/static/favicon.ico create mode 100644 deps/uv/docs/src/static/logo.png create mode 100644 deps/uv/docs/src/static/loop_iteration.png create mode 100644 deps/uv/docs/src/stream.rst create mode 100644 deps/uv/docs/src/tcp.rst create mode 100644 deps/uv/docs/src/threading.rst create mode 100644 deps/uv/docs/src/threadpool.rst create mode 100644 deps/uv/docs/src/timer.rst create mode 100644 deps/uv/docs/src/tty.rst create mode 100644 deps/uv/docs/src/udp.rst create mode 100644 deps/uv/m4/as_case.m4 create mode 100644 deps/uv/m4/dtrace.m4 create mode 100644 deps/uv/m4/libuv-check-flags.m4 create mode 100644 deps/uv/test/test-default-loop-close.c create mode 100644 deps/uv/test/test-handle-fileno.c create mode 100644 deps/uv/test/test-pipe-close-stdout-read-stdin.c create mode 100644 deps/uv/test/test-socket-buffer-size.c create mode 100644 deps/uv/test/test-tcp-write-after-connect.c create mode 100644 deps/uv/test/test-udp-send-unreachable.c diff --git a/deps/uv/.gitignore b/deps/uv/.gitignore index a2e2558115b..14a174adf63 100644 --- a/deps/uv/.gitignore +++ b/deps/uv/.gitignore @@ -61,3 +61,9 @@ UpgradeLog*.XML Debug Release ipch + +# sphinx generated files +/docs/build/ + +*.xcodeproj +*.xcworkspace diff --git a/deps/uv/.mailmap b/deps/uv/.mailmap index 2ca07c83813..34f5e4daf35 100644 --- a/deps/uv/.mailmap +++ b/deps/uv/.mailmap @@ -14,11 +14,13 @@ Isaac Z. Schlueter Justin Venus Keno Fischer Keno Fischer +Leonard Hecker Maciej Małecki Marc Schlaich Rasmus Christian Pedersen Rasmus Christian Pedersen Rasmus Christian Pedersen +Rasmus Christian Pedersen Rasmus Christian Pedersen Rasmus Pedersen Robert Mustacchi diff --git a/deps/uv/AUTHORS b/deps/uv/AUTHORS index 19f911f1131..210fa5610e5 100644 --- a/deps/uv/AUTHORS +++ b/deps/uv/AUTHORS @@ -155,3 +155,5 @@ Pavel Platto Tony Kelman John Firebaugh lilohuang +Paul Goldsmith +Julien Gilli diff --git a/deps/uv/ChangeLog b/deps/uv/ChangeLog index db13f188c67..9d303e4ff8d 100644 --- a/deps/uv/ChangeLog +++ b/deps/uv/ChangeLog @@ -1,4 +1,101 @@ -2014.08.08, Version 0.11.28 (Unstable) +2014.09.18, Version 1.0.0-rc1 (Unstable), 0c28bbf7b42882853d1799ab96ff68b07f7f8d49 + +* windows: improve timer precision (Alexis Campailla) + +* build, gyp: set xcode flags (Recep ASLANTAS) + +* ignore: include m4 files which are created manually (Recep ASLANTAS) + +* build: add m4 for feature/flag-testing (Recep ASLANTAS) + +* ignore: ignore Xcode project and workspace files (Recep ASLANTAS) + +* unix: fix warnings about dollar symbol usage in identifiers (Recep ASLANTAS) + +* unix: fix warnings when loading functions with dlsym (Recep ASLANTAS) + +* linux: try epoll_pwait if epoll_wait is missing (Michael Hudson-Doyle) + +* test: add test for closing and recreating default loop (Saúl Ibarra Corretgé) + +* windows: properly close the default loop (Saúl Ibarra Corretgé) + +* version: add ability to specify a version suffix (Saúl Ibarra Corretgé) + +* doc: add API documentation (Saúl Ibarra Corretgé) + +* test: don't close connection on write error (Trevor Norris) + +* windows: further simplify the code for timers (Saúl Ibarra Corretgé) + +* gyp: remove UNLIMITED_SELECT from dependent define (Fedor Indutny) + +* darwin: allocate enough space for select() hack (Fedor Indutny) + +* unix, windows: don't allow a NULL callback on timers (Saúl Ibarra Corretgé) + +* windows: simplify code in uv_timer_again (Saúl Ibarra Corretgé) + +* test: use less requests on tcp-write-queue-order (Saúl Ibarra Corretgé) + +* unix: stop child process watcher after last one exits (Saúl Ibarra Corretgé) + +* unix: simplify how process handle queue is managed (Saúl Ibarra Corretgé) + +* windows: remove duplicated field (mattn) + +* core: add a reserved field to uv_handle_t and uv_req_t (Saúl Ibarra Corretgé) + +* windows: fix buffer leak after failed udp send (Bert Belder) + +* windows: make sure sockets and handles are reset on close (Saúl Ibarra Corretgé) + +* unix, windows: add uv_fileno (Saúl Ibarra Corretgé) + +* build: use same CFLAGS in autotools build as in gyp (Saúl Ibarra Corretgé) + +* build: remove unneeded define in uv.gyp (Saúl Ibarra Corretgé) + +* test: fix watcher_cross_stop on Windows (Saúl Ibarra Corretgé) + +* unix, windows: move includes for EAI constants (Saúl Ibarra Corretgé) + +* unix: fix exposing EAI_* glibc-isms (Saúl Ibarra Corretgé) + +* unix: fix tcp write after bad connect freezing (Andrius Bentkus) + + +2014.08.20, Version 0.11.29 (Unstable), 35451fed830807095bbae8ef981af004a4b9259e + +Changes since version 0.11.28: + +* windows: make uv_read_stop immediately stop reading (Jameson Nash) + +* windows: fix uv__getaddrinfo_translate_error (Alexis Campailla) + +* netbsd: fix build (Saúl Ibarra Corretgé) + +* unix, windows: add uv_recv_buffer_size and uv_send_buffer_size (Andrius + Bentkus) + +* windows: add support for UNC paths on uv_spawn (Paul Goldsmith) + +* windows: replace use of inet_addr with uv_inet_pton (Saúl Ibarra Corretgé) + +* unix: replace some asserts with returning errors (Andrius Bentkus) + +* windows: use OpenBSD implementation for uv_fs_mkdtemp (Pavel Platto) + +* windows: fix GetNameInfoW error handling (Alexis Campailla) + +* fs: introduce uv_readdir_next() and report types (Fedor Indutny) + +* fs: extend reported types in uv_fs_readdir_next (Saúl Ibarra Corretgé) + +* unix: read on stream even when UV__POLLHUP set. (Julien Gilli) + + +2014.08.08, Version 0.11.28 (Unstable), fc9e2a0bc487b299c0cd3b2c9a23aeb554b5d8d1 Changes since version 0.11.27: diff --git a/deps/uv/Makefile.am b/deps/uv/Makefile.am index 861b632bbf4..06a5532ef2a 100644 --- a/deps/uv/Makefile.am +++ b/deps/uv/Makefile.am @@ -23,7 +23,7 @@ CLEANFILES = lib_LTLIBRARIES = libuv.la libuv_la_CFLAGS = @CFLAGS@ -libuv_la_LDFLAGS = -no-undefined -version-info 11:0:0 +libuv_la_LDFLAGS = -no-undefined -version-info 1:0:0 libuv_la_SOURCES = src/fs-poll.c \ src/heap-inl.h \ src/inet.c \ @@ -81,6 +81,7 @@ else # WINNT include_HEADERS += include/uv-unix.h AM_CPPFLAGS += -I$(top_srcdir)/src/unix +libuv_la_CFLAGS += -g --std=gnu89 -pedantic -Wall -Wextra -Wno-unused-parameter libuv_la_SOURCES += src/unix/async.c \ src/unix/atomic-ops.h \ src/unix/core.c \ @@ -126,6 +127,7 @@ test_run_tests_SOURCES = test/blackhole-server.c \ test/test-condvar.c \ test/test-connection-fail.c \ test/test-cwd-and-chdir.c \ + test/test-default-loop-close.c \ test/test-delayed-accept.c \ test/test-dlerror.c \ test/test-embed.c \ @@ -141,6 +143,7 @@ test_run_tests_SOURCES = test/blackhole-server.c \ test/test-getaddrinfo.c \ test/test-getnameinfo.c \ test/test-getsockname.c \ + test/test-handle-fileno.c \ test/test-hrtime.c \ test/test-idle.c \ test/test-ip4-addr.c \ @@ -163,6 +166,7 @@ test_run_tests_SOURCES = test/blackhole-server.c \ test/test-pipe-getsockname.c \ test/test-pipe-sendmsg.c \ test/test-pipe-server-close.c \ + test/test-pipe-close-stdout-read-stdin.c \ test/test-platform-output.c \ test/test-poll-close.c \ test/test-poll-closesocket.c \ @@ -177,6 +181,7 @@ test_run_tests_SOURCES = test/blackhole-server.c \ test/test-shutdown-twice.c \ test/test-signal-multiple-loops.c \ test/test-signal.c \ + test/test-socket-buffer-size.c \ test/test-spawn.c \ test/test-stdio-over-pipes.c \ test/test-tcp-bind-error.c \ @@ -194,6 +199,7 @@ test_run_tests_SOURCES = test/blackhole-server.c \ test/test-tcp-shutdown-after-write.c \ test/test-tcp-unexpected-read.c \ test/test-tcp-write-to-half-open-connection.c \ + test/test-tcp-write-after-connect.c \ test/test-tcp-writealot.c \ test/test-tcp-try-write.c \ test/test-tcp-write-queue-order.c \ @@ -216,6 +222,7 @@ test_run_tests_SOURCES = test/blackhole-server.c \ test/test-udp-options.c \ test/test-udp-send-and-recv.c \ test/test-udp-send-immediate.c \ + test/test-udp-send-unreachable.c \ test/test-udp-try-send.c \ test/test-walk-handles.c \ test/test-watcher-cross-stop.c @@ -253,6 +260,7 @@ endif if DARWIN include_HEADERS += include/uv-darwin.h libuv_la_CFLAGS += -D_DARWIN_USE_64_BIT_INODE=1 +libuv_la_CFLAGS += -D_DARWIN_UNLIMITED_SELECT=1 libuv_la_SOURCES += src/unix/darwin.c \ src/unix/darwin-proctitle.c \ src/unix/fsevents.c \ diff --git a/deps/uv/README.md b/deps/uv/README.md index 364cf695c41..e0edf50383c 100644 --- a/deps/uv/README.md +++ b/deps/uv/README.md @@ -34,6 +34,11 @@ used by Mozilla's [Rust language](http://www.rust-lang.org/), * Threading and synchronization primitives +## Versioning + +Starting with version 1.0.0 libuv follows the [semantic versioning](http://semver.org/) +scheme. The API change and backwards compatiblity rules are those indicated by +SemVer. libuv will keep a stable ABI across major releases. ## Community @@ -41,8 +46,34 @@ used by Mozilla's [Rust language](http://www.rust-lang.org/), ## Documentation - * [include/uv.h](https://github.com/joyent/libuv/blob/master/include/uv.h) - — API documentation in the form of detailed header comments. +### Official API documentation + +Located in the docs/ subdirectory. It uses the [Sphinx](http://sphinx-doc.org/) +framework, which makes it possible to build the documentation in multiple +formats. + +Show different supported building options: + + $ make help + +Build documentation as HTML: + + $ make html + +Build documentation as man pages: + + $ make man + +Build documentation as ePub: + + $ make epub + +NOTE: Windows users need to use make.bat instead of plain 'make'. + +Documentation can be browsed online [here](http://docs.libuv.org). + +### Other resources + * [An Introduction to libuv](http://nikhilm.github.com/uvbook/) — An overview of libuv with tutorials. * [LXJS 2012 talk](http://www.youtube.com/watch?v=nGn60vDSxQ4) diff --git a/deps/uv/configure.ac b/deps/uv/configure.ac index ac789524b56..e85439c053b 100644 --- a/deps/uv/configure.ac +++ b/deps/uv/configure.ac @@ -13,16 +13,18 @@ # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. AC_PREREQ(2.57) -AC_INIT([libuv], [0.11.28], [https://github.com/joyent/libuv/issues]) +AC_INIT([libuv], [1.0.0], [https://github.com/joyent/libuv/issues]) AC_CONFIG_MACRO_DIR([m4]) m4_include([m4/libuv-extra-automake-flags.m4]) m4_include([m4/as_case.m4]) +m4_include([m4/libuv-check-flags.m4]) AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects] UV_EXTRA_AUTOMAKE_FLAGS) AC_CANONICAL_HOST AC_ENABLE_SHARED AC_ENABLE_STATIC AC_PROG_CC AM_PROG_CC_C_O +CC_CHECK_CFLAGS_APPEND([-Wno-dollar-in-identifier-extension]) # AM_PROG_AR is not available in automake v0.11 but it's essential in v0.12. m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) diff --git a/deps/uv/docs/make.bat b/deps/uv/docs/make.bat new file mode 100644 index 00000000000..10eb94b013b --- /dev/null +++ b/deps/uv/docs/make.bat @@ -0,0 +1,243 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=build +set SRCDIR=src +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% %SRCDIR% +set I18NSPHINXOPTS=%SPHINXOPTS% %SRCDIR% +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. xml to make Docutils-native XML files + echo. pseudoxml to make pseudoxml-XML files for display purposes + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + + +%SPHINXBUILD% 2> nul +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\libuv.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\libuv.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdf" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf + cd %BUILDDIR%/.. + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdfja" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf-ja + cd %BUILDDIR%/.. + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +if "%1" == "xml" ( + %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The XML files are in %BUILDDIR%/xml. + goto end +) + +if "%1" == "pseudoxml" ( + %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. + goto end +) + +:end diff --git a/deps/uv/docs/src/async.rst b/deps/uv/docs/src/async.rst new file mode 100644 index 00000000000..7afc92a71bc --- /dev/null +++ b/deps/uv/docs/src/async.rst @@ -0,0 +1,56 @@ + +.. _async: + +:c:type:`uv_async_t` --- Async handle +===================================== + +Async handles allow the user to "wakeup" the event loop and get a callback +called from another thread. + + +Data types +---------- + +.. c:type:: uv_async_t + + Async handle type. + +.. c:type:: void (*uv_async_cb)(uv_async_t* handle) + + Type definition for callback passed to :c:func:`uv_async_init`. + + +Public members +^^^^^^^^^^^^^^ + +N/A + +.. seealso:: The :c:type:`uv_handle_t` members also apply. + + +API +--- + +.. c:function:: int uv_async_init(uv_loop_t* loop, uv_async_t* async, uv_async_cb async_cb) + + Initialize the handle. A NULL callback is allowed. + + .. note:: + Unlike other handle initialization functions, it immediately starts the handle. + +.. c:function:: int uv_async_send(uv_async_t* async) + + Wakeup the event loop and call the async handle's callback. + + .. note:: + It's safe to call this function from any thread. The callback will be called on the + loop thread. + + .. warning:: + libuv will coalesce calls to :c:func:`uv_async_send`, that is, not every call to it will + yield an execution of the callback, the only guarantee is that it will be called at least + once. Thus, calling this function may not wakeup the event loop if it was already called + previously within a short period of time. + +.. seealso:: + The :c:type:`uv_handle_t` API functions also apply. diff --git a/deps/uv/docs/src/check.rst b/deps/uv/docs/src/check.rst new file mode 100644 index 00000000000..8d48f222767 --- /dev/null +++ b/deps/uv/docs/src/check.rst @@ -0,0 +1,46 @@ + +.. _check: + +:c:type:`uv_check_t` --- Check handle +===================================== + +Check handles will run the given callback once per loop iteration, right +after polling for i/o. + + +Data types +---------- + +.. c:type:: uv_check_t + + Check handle type. + +.. c:type:: void (*uv_check_cb)(uv_check_t* handle) + + Type definition for callback passed to :c:func:`uv_check_start`. + + +Public members +^^^^^^^^^^^^^^ + +N/A + +.. seealso:: The :c:type:`uv_handle_t` members also apply. + + +API +--- + +.. c:function:: int uv_check_init(uv_loop_t*, uv_check_t* check) + + Initialize the handle. + +.. c:function:: int uv_check_start(uv_check_t* check, uv_check_cb cb) + + Start the handle with the given callback. + +.. c:function:: int uv_check_stop(uv_check_t* check) + + Stop the handle, the callback will no longer be called. + +.. seealso:: The :c:type:`uv_handle_t` API functions also apply. diff --git a/deps/uv/docs/src/conf.py b/deps/uv/docs/src/conf.py new file mode 100644 index 00000000000..9ec9ec2c98d --- /dev/null +++ b/deps/uv/docs/src/conf.py @@ -0,0 +1,348 @@ +# -*- coding: utf-8 -*- +# +# libuv API documentation documentation build configuration file, created by +# sphinx-quickstart on Sun Jul 27 11:47:51 2014. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import os +import re +import sys + + +def get_libuv_version(): + with open('../../include/uv-version.h') as f: + data = f.read() + try: + m = re.search(r"""^#define UV_VERSION_MAJOR (\d)$""", data, re.MULTILINE) + major = int(m.group(1)) + m = re.search(r"""^#define UV_VERSION_MINOR (\d)$""", data, re.MULTILINE) + minor = int(m.group(1)) + m = re.search(r"""^#define UV_VERSION_PATCH (\d)$""", data, re.MULTILINE) + patch = int(m.group(1)) + m = re.search(r"""^#define UV_VERSION_IS_RELEASE (\d)$""", data, re.MULTILINE) + is_release = int(m.group(1)) + m = re.search(r"""^#define UV_VERSION_SUFFIX \"(\w*)\"$""", data, re.MULTILINE) + suffix = m.group(1) + return '%d.%d.%d%s' % (major, minor, patch, '-%s' % suffix if not is_release else '') + except Exception: + return 'unknown' + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'libuv API documentation' +copyright = u'libuv contributors' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = get_libuv_version() +# The full version, including alpha/beta/rc tags. +release = version + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = [] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'nature' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +html_title = 'libuv API documentation' + +# A shorter title for the navigation bar. Default is the same as html_title. +html_short_title = 'libuv %s API documentation' % version + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +html_logo = 'static/logo.png' + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +html_favicon = 'static/favicon.ico' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'libuv' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + ('index', 'libuv.tex', u'libuv API documentation', + u'libuv contributors', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'libuv', u'libuv API documentation', + [u'libuv contributors'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'libuv', u'libuv API documentation', + u'libuv contributors', 'libuv', 'Cross-platform asychronous I/O', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False + + +# -- Options for Epub output ---------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = u'libuv API documentation' +epub_author = u'libuv contributors' +epub_publisher = u'libuv contributors' +epub_copyright = u'2014, libuv contributors' + +# The basename for the epub file. It defaults to the project name. +epub_basename = u'libuv' + +# The HTML theme for the epub output. Since the default themes are not optimized +# for small screen space, using the same theme for HTML and epub output is +# usually not wise. This defaults to 'epub', a theme designed to save visual +# space. +#epub_theme = 'epub' + +# The language of the text. It defaults to the language option +# or en if the language is not set. +#epub_language = '' + +# The scheme of the identifier. Typical schemes are ISBN or URL. +#epub_scheme = '' + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +#epub_identifier = '' + +# A unique identification for the text. +#epub_uid = '' + +# A tuple containing the cover image and cover page html template filenames. +#epub_cover = () + +# A sequence of (type, uri, title) tuples for the guide element of content.opf. +#epub_guide = () + +# HTML files that should be inserted before the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_pre_files = [] + +# HTML files shat should be inserted after the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_post_files = [] + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + +# The depth of the table of contents in toc.ncx. +#epub_tocdepth = 3 + +# Allow duplicate toc entries. +#epub_tocdup = True + +# Choose between 'default' and 'includehidden'. +#epub_tocscope = 'default' + +# Fix unsupported image types using the PIL. +#epub_fix_images = False + +# Scale large images. +#epub_max_image_width = 0 + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#epub_show_urls = 'inline' + +# If false, no index is generated. +#epub_use_index = True diff --git a/deps/uv/docs/src/design.rst b/deps/uv/docs/src/design.rst new file mode 100644 index 00000000000..803a4219835 --- /dev/null +++ b/deps/uv/docs/src/design.rst @@ -0,0 +1,137 @@ + +.. _design: + +Design overview +=============== + +libuv is cross-platform support library which was originally written for NodeJS. It's designed +around the event-driven asynchronous I/O model. + +The library provides much more than simply abstraction over different I/O polling mechanisms: +'handles' and 'streams' provde a high level abstraction for sockets and other entities; +cross-platform file I/O and threading functionality is also provided, amongst other things. + +Here is a diagram illustrating the different parts that compose libuv and what subsystem they +relate to: + +.. image:: static/architecture.png + :scale: 75% + :align: center + + +Handles and requests +^^^^^^^^^^^^^^^^^^^^ + +libuv provides users with 2 abstractions to work with, in combination with the event loop: +handles and requests. + +Handles represent long-lived objects capable of performing certain operations while active. Some +examples: a prepare handle gets its callback called once every loop iteration when active, and +a TCP server handle get its connection callback called every time there is a new connection. + +Requests represent (typically) short-lived operations. These operations can be performed over a +handle: write requests are used to write data on a handle; or standalone: getaddrinfo requests +don't need a handle they run directly on the loop. + + +The I/O loop +^^^^^^^^^^^^ + +The I/O (or event) loop is the central part of libuv. It establishes the content for all I/O +operations, and it's meant to be tied to a single thread. One can run multiple event loops +as long as each runs in a different thread. The libuv event loop (or any other API involving +the loop or handles, for that matter) **is not thread-safe** except stated otherwise. + +The event loop follows the rather usual single threaded asynchronous I/O approah: all (network) +I/O is performed on non-blocking sockets which are polled using the best mechanism available +on the given platform: epoll on Linux, kqueue on OSX and other BSDs, event ports on SunOS and IOCP +on Windows. As part of a loop iteration the loop will block waiting for I/O activity on sockets +which have been added to the poller and callbacks will be fired indicating socket conditions +(readable, writable hangup) so handles can read, write or perform the desired I/O operation. + +In order to better understand how the event loop operates, the following diagram illustrates all +stages of a loop iteration: + +.. image:: static/loop_iteration.png + :scale: 75% + :align: center + + +#. The loop concept of 'now' is updated. The event loop caches the current time at the start of + the event loop tick in order to reduce the number of time-related system calls. + +#. If the loop is *alive* an iteration is started, otherwise the loop will exit immediately. So, + when is a loop considered to be *alive*? If a loop has active and ref'd handles, active + requests or closing handles it's considered to be *alive*. + +#. Due timers are run. All active timers scheduled for a time before the loop's concept of *now* + get their callbacks called. + +#. Pending callbacks are called. All I/O callbacks are called right after polling for I/O, for the + most part. There are cases, however, in which calling such a callback is deferred for the next + loop iteration. If the previous iteration deferred any I/O callback it will be run at this point. + +#. Idle handle callbacks are called. Despite the unfortunate name, idle handles are run on every + loop iteration, if they are active. + +#. Prepare handle callbacks are called. Prepare handles get their callbacks called right before + the loop will block for I/O. + +#. Poll timeout is calculated. Before blocking for I/O the loop calculates for how long it should + block. These are the rules when calculating the timeout: + + * If the loop was run with the ``UV_RUN_NOWAIT`` flag, the timeout is 0. + * If the loop is going to be stopped (:c:func:`uv_stop` was called), the timeout is 0. + * If there are no active handles or requests, the timeout is 0. + * If there are any idle handles active, the timeout is 0. + * If there are any handles pending to be closed, the timeout is 0. + * If none of the above cases was matched, the timeout of the closest timer is taken, or + if there are no active timers, infinity. + +#. The loop blocks for I/O. At this point the loop will block for I/O for the timeout calculated + on the previous step. All I/O related handles that were monitoring a given file descriptor + for a read or write operation get their callbacks called at this point. + +#. Check handle callbacks are called. Check handles get their callbacks called right after the + loop has blocked for I/O. Check handles are essentially the counterpart of prepare handles. + +#. Close callbacks are called. If a handle was closed by calling :c:func:`uv_close` it will + get the close callback called. + +#. Special case in case the loop was run with ``UV_RUN_ONCE``, as it implies forward progress. + It's possible that no I/O callbacks were fired after blocking for I/O, but some time has passed + so there might be timers which are due, those timers get their callbacks called. + +#. Iteration ends. If the loop was run with ``UV_RUN_NOWAIT`` or ``UV_RUN_ONCE`` modes the + iteration is ended and :c:func:`uv_run` will return. If the loop was run with ``UV_RUN_DEFAULT`` + it will contionue from the start if it's asill *alive*, otherwise it will also end. + + +.. important:: + libuv uses a thread pool to make asynchronous file I/O operations possible, but + network I/O is **always** performed in a single thread, each loop's thread. + +.. note:: + While the polling mechanism is different, libuv makes the execution model consistent + Unix systems and Windows. + + +File I/O +^^^^^^^^ + +Unlike network I/O, there are no platform-specific file I/O primitives libuv could rely on, +so the current approach is to run blocking file I/O operations in a thread pool. + +For a thorough explanation of the cross-platform file I/O landscape, checkout +`this post `_. + +libuv currently uses a global thread pool on which all loops can queue work on. 3 types of +operations are currently run on this pool: + + * Filesystem operations + * DNS functions (getaddrinfo and getnameinfo) + * User specified code via :c:func:`uv_queue_work` + +.. warning:: + See the :c:ref:`threadpool` section for more details, but keep in mind the thread pool size + is quite limited. diff --git a/deps/uv/docs/src/dll.rst b/deps/uv/docs/src/dll.rst new file mode 100644 index 00000000000..3afa31f39d0 --- /dev/null +++ b/deps/uv/docs/src/dll.rst @@ -0,0 +1,44 @@ + +.. _dll: + +Shared library handling +======================= + +libuv prodives cross platform utilities for loading shared libraries and +retrieving symbols from them, using the following API. + + +Data types +---------- + +.. c:type:: uv_lib_t + + Shared library data type. + + +Public members +^^^^^^^^^^^^^^ + +N/A + + +API +--- + +.. c:function:: int uv_dlopen(const char* filename, uv_lib_t* lib) + + Opens a shared library. The filename is in utf-8. Returns 0 on success and + -1 on error. Call :c:func:`uv_dlerror` to get the error message. + +.. c:function:: void uv_dlclose(uv_lib_t* lib) + + Close the shared library. + +.. c:function:: uv_dlsym(uv_lib_t* lib, const char* name, void** ptr) + + Retrieves a data pointer from a dynamic library. It is legal for a symbol + to map to NULL. Returns 0 on success and -1 if the symbol was not found. + +.. c:function:: const char* uv_dlerror(const uv_lib_t* lib) + + Returns the last uv_dlopen() or uv_dlsym() error message. diff --git a/deps/uv/docs/src/dns.rst b/deps/uv/docs/src/dns.rst new file mode 100644 index 00000000000..d7c889f7ada --- /dev/null +++ b/deps/uv/docs/src/dns.rst @@ -0,0 +1,83 @@ + +.. _dns: + +DNS utility functions +===================== + +libuv provides asynchronous variants of `getaddrinfo` and `getnameinfo`. + + +Data types +---------- + +.. c:type:: uv_getaddrinfo_t + + `getaddrinfo` request type. + +.. c:type:: void (*uv_getaddrinfo_cb)(uv_getaddrinfo_t* req, int status, struct addrinfo* res) + + Callback which will be called with the getaddrinfo request result once + complete. In case it was cancelled, `status` will have a value of + ``UV_ECANCELED``. + +.. c:type:: uv_getnameinfo_t + + `getnameinfo` request type. + +.. c:type:: void (*uv_getnameinfo_cb)(uv_getnameinfo_t* req, int status, const char* hostname, const char* service) + + Callback which will be called with the getnameinfo request result once + complete. In case it was cancelled, `status` will have a value of + ``UV_ECANCELED``. + + +Public members +^^^^^^^^^^^^^^ + +.. c:member:: uv_loop_t* uv_getaddrinfo_t.loop + + Loop that started this getaddrinfo request and where completion will be + reported. Readonly. + +.. c:member:: uv_loop_t* uv_getnameinfo_t.loop + + Loop that started this getnameinfo request and where completion will be + reported. Readonly. + +.. seealso:: The :c:type:`uv_req_t` members also apply. + + +API +--- + +.. c:function:: int uv_getaddrinfo(uv_loop_t* loop, uv_getaddrinfo_t* req, uv_getaddrinfo_cb getaddrinfo_cb, const char* node, const char* service, const struct addrinfo* hints) + + Asynchronous ``getaddrinfo(3)``. + + Either node or service may be NULL but not both. + + `hints` is a pointer to a struct addrinfo with additional address type + constraints, or NULL. Consult `man -s 3 getaddrinfo` for more details. + + Returns 0 on success or an error code < 0 on failure. If successful, the + callback will get called sometime in the future with the lookup result, + which is either: + + * status == 0, the res argument points to a valid `struct addrinfo`, or + * status < 0, the res argument is NULL. See the UV_EAI_* constants. + + Call :c:func:`uv_freeaddrinfo` to free the addrinfo structure. + +.. c:function:: void uv_freeaddrinfo(struct addrinfo* ai) + + Free the struct addrinfo. Passing NULL is allowed and is a no-op. + +.. c:function:: int uv_getnameinfo(uv_loop_t* loop, uv_getnameinfo_t* req, uv_getnameinfo_cb getnameinfo_cb, const struct sockaddr* addr, int flags) + + Asynchronous ``getnameinfo(3)``. + + Returns 0 on success or an error code < 0 on failure. If successful, the + callback will get called sometime in the future with the lookup result. + Consult `man -s 3 getnameinfo` for more details. + +.. seealso:: The :c:type:`uv_req_t` API functions also apply. diff --git a/deps/uv/docs/src/errors.rst b/deps/uv/docs/src/errors.rst new file mode 100644 index 00000000000..5d59dc30f28 --- /dev/null +++ b/deps/uv/docs/src/errors.rst @@ -0,0 +1,329 @@ + +.. _errors: + +Error handling +============== + +In libuv errors are negative numbered constants. As a rule of thumb, whenever +there is a status parameter, or an API functions returns an integer, a negative +number will imply an error. + +.. note:: + Implementation detail: on Unix error codes are the negated `errno` (or `-errno`), while on + Windows they are defined by libuv to arbitrary negative numbers. + + +Error constants +--------------- + +.. c:macro:: UV_E2BIG + + argument list too long + +.. c:macro:: UV_EACCES + + permission denied + +.. c:macro:: UV_EADDRINUSE + + address already in use + +.. c:macro:: UV_EADDRNOTAVAIL + + address not available + +.. c:macro:: UV_EAFNOSUPPORT + + address family not supported + +.. c:macro:: UV_EAGAIN + + resource temporarily unavailable + +.. c:macro:: UV_EAI_ADDRFAMILY + + address family not supported + +.. c:macro:: UV_EAI_AGAIN + + temporary failure + +.. c:macro:: UV_EAI_BADFLAGS + + bad ai_flags value + +.. c:macro:: UV_EAI_BADHINTS + + invalid value for hints + +.. c:macro:: UV_EAI_CANCELED + + request canceled + +.. c:macro:: UV_EAI_FAIL + + permanent failure + +.. c:macro:: UV_EAI_FAMILY + + ai_family not supported + +.. c:macro:: UV_EAI_MEMORY + + out of memory + +.. c:macro:: UV_EAI_NODATA + + no address + +.. c:macro:: UV_EAI_NONAME + + unknown node or service + +.. c:macro:: UV_EAI_OVERFLOW + + argument buffer overflow + +.. c:macro:: UV_EAI_PROTOCOL + + resolved protocol is unknown + +.. c:macro:: UV_EAI_SERVICE + + service not available for socket type + +.. c:macro:: UV_EAI_SOCKTYPE + + socket type not supported + +.. c:macro:: UV_EALREADY + + connection already in progress + +.. c:macro:: UV_EBADF + + bad file descriptor + +.. c:macro:: UV_EBUSY + + resource busy or locked + +.. c:macro:: UV_ECANCELED + + operation canceled + +.. c:macro:: UV_ECHARSET + + invalid Unicode character + +.. c:macro:: UV_ECONNABORTED + + software caused connection abort + +.. c:macro:: UV_ECONNREFUSED + + connection refused + +.. c:macro:: UV_ECONNRESET + + connection reset by peer + +.. c:macro:: UV_EDESTADDRREQ + + destination address required + +.. c:macro:: UV_EEXIST + + file already exists + +.. c:macro:: UV_EFAULT + + bad address in system call argument + +.. c:macro:: UV_EFBIG + + file too large + +.. c:macro:: UV_EHOSTUNREACH + + host is unreachable + +.. c:macro:: UV_EINTR + + interrupted system call + +.. c:macro:: UV_EINVAL + + invalid argument + +.. c:macro:: UV_EIO + + i/o error + +.. c:macro:: UV_EISCONN + + socket is already connected + +.. c:macro:: UV_EISDIR + + illegal operation on a directory + +.. c:macro:: UV_ELOOP + + too many symbolic links encountered + +.. c:macro:: UV_EMFILE + + too many open files + +.. c:macro:: UV_EMSGSIZE + + message too long + +.. c:macro:: UV_ENAMETOOLONG + + name too long + +.. c:macro:: UV_ENETDOWN + + network is down + +.. c:macro:: UV_ENETUNREACH + + network is unreachable + +.. c:macro:: UV_ENFILE + + file table overflow + +.. c:macro:: UV_ENOBUFS + + no buffer space available + +.. c:macro:: UV_ENODEV + + no such device + +.. c:macro:: UV_ENOENT + + no such file or directory + +.. c:macro:: UV_ENOMEM + + not enough memory + +.. c:macro:: UV_ENONET + + machine is not on the network + +.. c:macro:: UV_ENOPROTOOPT + + protocol not available + +.. c:macro:: UV_ENOSPC + + no space left on device + +.. c:macro:: UV_ENOSYS + + function not implemented + +.. c:macro:: UV_ENOTCONN + + socket is not connected + +.. c:macro:: UV_ENOTDIR + + not a directory + +.. c:macro:: UV_ENOTEMPTY + + directory not empty + +.. c:macro:: UV_ENOTSOCK + + socket operation on non-socket + +.. c:macro:: UV_ENOTSUP + + operation not supported on socket + +.. c:macro:: UV_EPERM + + operation not permitted + +.. c:macro:: UV_EPIPE + + broken pipe + +.. c:macro:: UV_EPROTO + + protocol error + +.. c:macro:: UV_EPROTONOSUPPORT + + protocol not supported + +.. c:macro:: UV_EPROTOTYPE + + protocol wrong type for socket + +.. c:macro:: UV_ERANGE + + result too large + +.. c:macro:: UV_EROFS + + read-only file system + +.. c:macro:: UV_ESHUTDOWN + + cannot send after transport endpoint shutdown + +.. c:macro:: UV_ESPIPE + + invalid seek + +.. c:macro:: UV_ESRCH + + no such process + +.. c:macro:: UV_ETIMEDOUT + + connection timed out + +.. c:macro:: UV_ETXTBSY + + text file is busy + +.. c:macro:: UV_EXDEV + + cross-device link not permitted + +.. c:macro:: UV_UNKNOWN + + unknown error + +.. c:macro:: UV_EOF + + end of file + +.. c:macro:: UV_ENXIO + + no such device or address + +.. c:macro:: UV_EMLINK + + too many links + + +API +--- + +.. c:function:: const char* uv_strerror(int err) + + Returns the error message for the given error code. + +.. c:function:: const char* uv_err_name(int err) + + Returns the error name for the given error code. diff --git a/deps/uv/docs/src/fs.rst b/deps/uv/docs/src/fs.rst new file mode 100644 index 00000000000..d2db408134d --- /dev/null +++ b/deps/uv/docs/src/fs.rst @@ -0,0 +1,259 @@ + +.. _fs: + +Filesystem operations +===================== + +libuv provides a wide variety of cross-platform sync and async filesystem +operations. All functions defined in this document take a callback, which is +allowed to be NULL. If the callback is NULL the request is completed synchronously, +otherwise it will be performed asynchronously. + +All file operations are run on the threadpool, see :ref:`threadpool` for information +on the threadpool size. + + +Data types +---------- + +.. c:type:: uv_fs_t + + Filesystem request type. + +.. c:type:: uv_stat_t + + Portable equivalent of `struct stat`. + + :: + + typedef struct { + uint64_t st_dev; + uint64_t st_mode; + uint64_t st_nlink; + uint64_t st_uid; + uint64_t st_gid; + uint64_t st_rdev; + uint64_t st_ino; + uint64_t st_size; + uint64_t st_blksize; + uint64_t st_blocks; + uint64_t st_flags; + uint64_t st_gen; + uv_timespec_t st_atim; + uv_timespec_t st_mtim; + uv_timespec_t st_ctim; + uv_timespec_t st_birthtim; + } uv_stat_t; + +.. c:type:: uv_fs_type + + Filesystem request type. + + :: + + typedef enum { + UV_FS_UNKNOWN = -1, + UV_FS_CUSTOM, + UV_FS_OPEN, + UV_FS_CLOSE, + UV_FS_READ, + UV_FS_WRITE, + UV_FS_SENDFILE, + UV_FS_STAT, + UV_FS_LSTAT, + UV_FS_FSTAT, + UV_FS_FTRUNCATE, + UV_FS_UTIME, + UV_FS_FUTIME, + UV_FS_CHMOD, + UV_FS_FCHMOD, + UV_FS_FSYNC, + UV_FS_FDATASYNC, + UV_FS_UNLINK, + UV_FS_RMDIR, + UV_FS_MKDIR, + UV_FS_MKDTEMP, + UV_FS_RENAME, + UV_FS_READDIR, + UV_FS_LINK, + UV_FS_SYMLINK, + UV_FS_READLINK, + UV_FS_CHOWN, + UV_FS_FCHOWN + } uv_fs_type; + +.. c:type:: uv_dirent_t + + Cross platform (reduced) equivalent of ``struct dirent``. + Used in :c:func:`uv_fs_readdir_next`. + + :: + + typedef enum { + UV_DIRENT_UNKNOWN, + UV_DIRENT_FILE, + UV_DIRENT_DIR, + UV_DIRENT_LINK, + UV_DIRENT_FIFO, + UV_DIRENT_SOCKET, + UV_DIRENT_CHAR, + UV_DIRENT_BLOCK + } uv_dirent_type_t; + + typedef struct uv_dirent_s { + const char* name; + uv_dirent_type_t type; + } uv_dirent_t; + + +Public members +^^^^^^^^^^^^^^ + +.. c:member:: uv_loop_t* uv_fs_t.loop + + Loop that started this request and where completion will be reported. + Readonly. + +.. c:member:: uv_fs_type uv_fs_t.fs_type + + FS request type. + +.. c:member:: const char* uv_fs_t.path + + Path affecting the request. + +.. c:member:: ssize_t uv_fs_t.result + + Result of the request. < 0 means error, success otherwise. On requests such + as :c:func:`uv_fs_read` or :c:func:`uv_fs_write` it indicates the amount of + data that was read or written, respectively. + +.. c:member:: uv_stat_t uv_fs_t.statbuf + + Stores the result of :c:func:`uv_fs_stat` and other stat requests. + +.. c:member:: void* uv_fs_t.ptr + + Stores the result of :c:func:`uv_fs_readlink` and serves as an alias to + `statbuf`. + +.. seealso:: The :c:type:`uv_req_t` members also apply. + + +API +--- + +.. c:function:: void uv_fs_req_cleanup(uv_fs_t* req) + + Cleanup request. Must be called after a request is finished to deallocate + any memory libuv might have allocated. + +.. c:function:: int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) + + Equivalent to ``close(2)``. + +.. c:function:: int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, int mode, uv_fs_cb cb) + + Equivalent to ``open(2)``. + +.. c:function:: int uv_fs_read(uv_loop_t* loop, uv_fs_t* req, uv_file file, const uv_buf_t bufs[], unsigned int nbufs, int64_t offset, uv_fs_cb cb) + + Equivalent to ``preadv(2)``. + +.. c:function:: int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) + + Equivalent to ``unlink(2)``. + +.. c:function:: int uv_fs_write(uv_loop_t* loop, uv_fs_t* req, uv_file file, const uv_buf_t bufs[], unsigned int nbufs, int64_t offset, uv_fs_cb cb) + + Equivalent to ``pwritev(2)``. + +.. c:function:: int uv_fs_mkdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb) + + Equivalent to ``mkdir(2)``. + + .. note:: + `mode` is currently not implemented on Windows. + +.. c:function:: int uv_fs_mkdtemp(uv_loop_t* loop, uv_fs_t* req, const char* tpl, uv_fs_cb cb) + + Equivalent to ``mkdtemp(3)``. + +.. c:function:: int uv_fs_rmdir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) + + Equivalent to ``rmdir(2)``. + +.. c:function:: int uv_fs_readdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, uv_fs_cb cb) +.. c:function:: int uv_fs_readdir_next(uv_fs_t* req, uv_dirent_t* ent) + + Equivalent to ``readdir(2)``, with a slightly different API. Once the callback + for the request is called, the user can use :c:func:`uv_fs_readdir_next` to + get `ent` populated with the next directory entry data. When there are no + more entries ``UV_EOF`` will be returned. + +.. c:function:: int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) +.. c:function:: int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) +.. c:function:: int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) + + Equivalent to ``(f/l)stat(2)``. + +.. c:function:: int uv_fs_rename(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb) + + Equivalent to ``rename(2)``. + +.. c:function:: int uv_fs_fsync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) + + Equivalent to ``fsync(2)``. + +.. c:function:: int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) + + Equivalent to ``fdatasync(2)``. + +.. c:function:: int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file file, int64_t offset, uv_fs_cb cb) + + Equivalent to ``ftruncate(2)``. + +.. c:function:: int uv_fs_sendfile(uv_loop_t* loop, uv_fs_t* req, uv_file out_fd, uv_file in_fd, int64_t in_offset, size_t length, uv_fs_cb cb) + + Limited equivalent to ``sendfile(2)``. + +.. c:function:: int uv_fs_chmod(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb) +.. c:function:: int uv_fs_fchmod(uv_loop_t* loop, uv_fs_t* req, uv_file file, int mode, uv_fs_cb cb) + + Equivalent to ``(f)chmod(2)``. + +.. c:function:: int uv_fs_utime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime, double mtime, uv_fs_cb cb) +.. c:function:: int uv_fs_futime(uv_loop_t* loop, uv_fs_t* req, uv_file file, double atime, double mtime, uv_fs_cb cb) + + Equivalent to ``(f)utime(s)(2)``. + +.. c:function:: int uv_fs_link(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb) + + Equivalent to ``link(2)``. + +.. c:function:: int uv_fs_symlink(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, int flags, uv_fs_cb cb) + + Equivalent to ``symlink(2)``. + + .. note:: + On Windows the `flags` parameter can be specified to control how the symlink will + be created: + + * ``UV_FS_SYMLINK_DIR``: indicates that `path` points to a directory. + + * ``UV_FS_SYMLINK_JUNCTION``: request that the symlink is created + using junktion points. + +.. c:function:: int uv_fs_readlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) + + Equivalent to ``readlink(2)``. + +.. c:function:: int uv_fs_chown(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb) +.. c:function:: int uv_fs_fchown(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb) + + Equivalent to ``(f)chown(2)``. + + .. note:: + These functions are not implemented on Windows. + +.. seealso:: The :c:type:`uv_req_t` API functions also apply. diff --git a/deps/uv/docs/src/fs_event.rst b/deps/uv/docs/src/fs_event.rst new file mode 100644 index 00000000000..eeb6bfbcb99 --- /dev/null +++ b/deps/uv/docs/src/fs_event.rst @@ -0,0 +1,102 @@ + +.. _fs_event: + +:c:type:`uv_fs_event_t` --- FS Event handle +=========================================== + +FS Event handles allow the user to monitor a given path for changes, for example, +if the file was renamed or there was a generic change in it. This handle uses +the best backend for the job on each platform. + + +Data types +---------- + +.. c:type:: uv_fs_event_t + + FS Event handle type. + +.. c:type:: void (*uv_fs_event_cb)(uv_fs_event_t* handle, const char* filename, int events, int status) + + Callback passed to :c:func:`uv_fs_event_start` which will be called repeatedly + after the handle is started. If the handle was started with a directory the + `filename` parameter will be a relative path to a file contained in the directory. + The `events` parameter is an ORed mask of :c:type:`uv_fs_event` elements. + +.. c:type:: uv_fs_event + + Event types that :c:type:`uv_fs_event_t` handles monitor. + + :: + + enum uv_fs_event { + UV_RENAME = 1, + UV_CHANGE = 2 + }; + +.. c:type:: uv_fs_event_flags + + Flags that can be passed to :c:func:`uv_fs_event_start` to control its + behavior. + + :: + + enum uv_fs_event_flags { + /* + * By default, if the fs event watcher is given a directory name, we will + * watch for all events in that directory. This flags overrides this behavior + * and makes fs_event report only changes to the directory entry itself. This + * flag does not affect individual files watched. + * This flag is currently not implemented yet on any backend. + */ + UV_FS_EVENT_WATCH_ENTRY = 1, + /* + * By default uv_fs_event will try to use a kernel interface such as inotify + * or kqueue to detect events. This may not work on remote filesystems such + * as NFS mounts. This flag makes fs_event fall back to calling stat() on a + * regular interval. + * This flag is currently not implemented yet on any backend. + */ + UV_FS_EVENT_STAT = 2, + /* + * By default, event watcher, when watching directory, is not registering + * (is ignoring) changes in it's subdirectories. + * This flag will override this behaviour on platforms that support it. + */ + UV_FS_EVENT_RECURSIVE = 4 + }; + + +Public members +^^^^^^^^^^^^^^ + +N/A + +.. seealso:: The :c:type:`uv_handle_t` members also apply. + + +API +--- + +.. c:function:: int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) + + Initialize the handle. + +.. c:function:: int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* path, unsigned int flags) + + Start the handle with the given callback, which will watch the specified + `path` for changes. `flags` can be an ORed mask of :c:type:`uv_fs_event_flags`. + +.. c:function:: int uv_fs_event_stop(uv_fs_event_t* handle) + + Stop the handle, the callback will no longer be called. + +.. c:function:: int uv_fs_event_getpath(uv_fs_event_t* handle, char* buf, size_t* len) + + Get the path being monitored by the handle. The buffer must be preallocated + by the user. Returns 0 on success or an error code < 0 in case of failure. + On sucess, `buf` will contain the path and `len` its length. If the buffer + is not big enough UV_ENOBUFS will be returned and len will be set to the + required size. + +.. seealso:: The :c:type:`uv_handle_t` API functions also apply. diff --git a/deps/uv/docs/src/fs_poll.rst b/deps/uv/docs/src/fs_poll.rst new file mode 100644 index 00000000000..2e64bfb70d0 --- /dev/null +++ b/deps/uv/docs/src/fs_poll.rst @@ -0,0 +1,65 @@ + +.. _fs_poll: + +:c:type:`uv_fs_poll_t` --- FS Poll handle +========================================= + +FS Poll handles allow the user to monitor a given path for changes. Unlike +:c:type:`uv_fs_event_t`, fs poll handles use `stat` to detect when a file has +changed so they can work on file systems where fs event handles can't. + + +Data types +---------- + +.. c:type:: uv_fs_poll_t + + FS Poll handle type. + +.. c:type:: void (*uv_fs_poll_cb)(uv_fs_poll_t* handle, int status, const uv_stat_t* prev, const uv_stat_t* curr) + + Callback passed to :c:func:`uv_fs_poll_start` which will be called repeatedly + after the handle is started, when any change happens to the monitored path. + + The callback is invoked with `status < 0` if `path` does not exist + or is inaccessible. The watcher is *not* stopped but your callback is + not called again until something changes (e.g. when the file is created + or the error reason changes). + + When `status == 0`, the callback receives pointers to the old and new + :c:type:`uv_stat_t` structs. They are valid for the duration of the + callback only. + + +Public members +^^^^^^^^^^^^^^ + +N/A + +.. seealso:: The :c:type:`uv_handle_t` members also apply. + + +API +--- + +.. c:function:: int uv_fs_poll_start(uv_fs_poll_t* handle, uv_fs_poll_cb poll_cb, const char* path, unsigned int interval) + + Check the file at `path` for changes every `interval` milliseconds. + + .. note:: + For maximum portability, use multi-second intervals. Sub-second intervals will not detect + all changes on many file systems. + +.. c:function:: int uv_fs_poll_stop(uv_fs_poll_t* handle) + + Stop the handle, the callback will no longer be called. + +.. c:function:: int uv_fs_poll_getpath(uv_fs_poll_t* handle, char* buf, size_t* len) + + Get the path being monitored by the handle. The buffer must be preallocated + by the user. Returns 0 on success or an error code < 0 in case of failure. + On sucess, `buf` will contain the path and `len` its length. If the buffer + is not big enough UV_ENOBUFS will be returned and len will be set to the + required size. + +.. seealso:: The :c:type:`uv_handle_t` API functions also apply. diff --git a/deps/uv/docs/src/handle.rst b/deps/uv/docs/src/handle.rst new file mode 100644 index 00000000000..ae8efb70df2 --- /dev/null +++ b/deps/uv/docs/src/handle.rst @@ -0,0 +1,172 @@ + +.. _handle: + +:c:type:`uv_handle_t` --- Base handle +===================================== + +`uv_handle_t` is the base type for all libuv handle types. + +Strcutures are aligned so that any libuv handle can be cast to `uv_handle_t`. +All API functions defined here work with any handle type. + + +Data types +---------- + +.. c:type:: uv_handle_t + + The base libuv handle type. + +.. c:type:: uv_any_handle + + Union of all handle types. + +.. c:type:: void (*uv_close_cb)(uv_handle_t* handle) + + Type definition for callback passed to :c:func:`uv_close`. + + +Public members +^^^^^^^^^^^^^^ + +.. c:member:: uv_loop_t* uv_handle_t.loop + + Pointer to the :c:type:`uv_loop_t` where the handle is running on. Readonly. + +.. c:member:: void* uv_handle_t.data + + Space for user-defined arbitrary data. libuv does not use this field. + + +API +--- + +.. c:function:: int uv_is_active(const uv_handle_t* handle) + + Returns non-zero if the handle is active, zero if it's inactive. What + "active" means depends on the type of handle: + + - A uv_async_t handle is always active and cannot be deactivated, except + by closing it with uv_close(). + + - A uv_pipe_t, uv_tcp_t, uv_udp_t, etc. handle - basically any handle that + deals with i/o - is active when it is doing something that involves i/o, + like reading, writing, connecting, accepting new connections, etc. + + - A uv_check_t, uv_idle_t, uv_timer_t, etc. handle is active when it has + been started with a call to uv_check_start(), uv_idle_start(), etc. + + Rule of thumb: if a handle of type `uv_foo_t` has a `uv_foo_start()` + function, then it's active from the moment that function is called. + Likewise, `uv_foo_stop()` deactivates the handle again. + +.. c:function:: int uv_is_closing(const uv_handle_t* handle) + + Returns non-zero if the handle is closing or closed, zero otherwise. + + .. note:: + This function should only be used between the initialization of the handle and the + arrival of the close callback. + +.. c:function:: void uv_close(uv_handle_t* handle, uv_close_cb close_cb) + + Request handle to be closed. `close_cb` will be called asynchronously after + this call. This MUST be called on each handle before memory is released. + + Handles that wrap file descriptors are closed immediately but + `close_cb` will still be deferred to the next iteration of the event loop. + It gives you a chance to free up any resources associated with the handle. + + In-progress requests, like uv_connect_t or uv_write_t, are cancelled and + have their callbacks called asynchronously with status=UV_ECANCELED. + +.. c:function:: void uv_ref(uv_handle_t* handle) + + Reference the given handle. References are idempotent, that is, if a handle + is already referenced calling this function again will have no effect. + + See :ref:`refcount`. + +.. c:function:: void uv_unref(uv_handle_t* handle) + + Un-reference the given handle. References are idempotent, that is, if a handle + is not referenced calling this function again will have no effect. + + See :ref:`refcount`. + +.. c:function:: int uv_has_ref(const uv_handle_t* handle) + + Returns non-zero if the handle referenced, zero otherwise. + + See :ref:`refcount`. + +.. c:function:: size_t uv_handle_size(uv_handle_type type) + + Returns the size of the given handle type. Useful for FFI binding writers + who don't want to know the structure layout. + + +Miscellaneous API functions +--------------------------- + +The following API functions take a :c:type:`uv_handle_t` argument but they work +just for some handle types. + +.. c:function:: int uv_send_buffer_size(uv_handle_t* handle, int* value) + + Gets or sets the size of the send buffer that the operating + system uses for the socket. + + If `*value` == 0, it will return the current send buffer size, + otherwise it will use `*value` to set the new send buffer size. + + This function works for TCP, pipe and UDP handles on Unix and for TCP and + UDP handles on Windows. + + .. note:: + Linux will set double the size and return double the size of the original set value. + +.. c:function:: int uv_recv_buffer_size(uv_handle_t* handle, int* value) + + Gets or sets the size of the receive buffer that the operating + system uses for the socket. + + If `*value` == 0, it will return the current receive buffer size, + otherwise it will use `*value` to set the new receive buffer size. + + This function works for TCP, pipe and UDP handles on Unix and for TCP and + UDP handles on Windows. + + .. note:: + Linux will set double the size and return double the size of the original set value. + +.. c:function:: int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd) + + Gets the platform dependent file descriptor equivalent. + + The following handles are supported: TCP, pipes, TTY, UDP and poll. Passing + any other handle type will fail with `UV_EINVAL`. + + If a handle doesn't have an attached file descriptor yet or the handle + itself has been closed, this function will return `UV_EBADF`. + + .. warning:: + Be very careful when using this function. libuv assumes it's in control of the file + descriptor so any change to it may lead to malfunction. + + +.. _refcount: + +Reference counting +------------------ + +The libuv event loop (if run in the default mode) will run until there are no +active `and` referenced handles left. The user can force the loop to exit early +by unreferencing handles which are active, for example by calling :c:func:`uv_unref` +after calling :c:func:`uv_timer_start`. + +A handle can be referenced or unreferenced, the refcounting scheme doesn't use +a counter, so both operations are idempotent. + +All handles are referenced when active by default, see :c:func:`uv_is_active` +for a more detailed explanation on what being `active` involves. diff --git a/deps/uv/docs/src/idle.rst b/deps/uv/docs/src/idle.rst new file mode 100644 index 00000000000..81f51d2076e --- /dev/null +++ b/deps/uv/docs/src/idle.rst @@ -0,0 +1,54 @@ + +.. _idle: + +:c:type:`uv_idle_t` --- Idle handle +=================================== + +Idle handles will run the given callback once per loop iteration, right +before the :c:type:`uv_prepare_t` handles. + +.. note:: + The notable difference with prepare handles is that when there are active idle handles, + the loop will perform a zero timeout poll instead of blocking for i/o. + +.. warning:: + Despite the name, idle handles will get their callbacks called on every loop iteration, + not when the loop is actually "idle". + + +Data types +---------- + +.. c:type:: uv_idle_t + + Idle handle type. + +.. c:type:: void (*uv_idle_cb)(uv_idle_t* handle) + + Type definition for callback passed to :c:func:`uv_idle_start`. + + +Public members +^^^^^^^^^^^^^^ + +N/A + +.. seealso:: The :c:type:`uv_handle_t` members also apply. + + +API +--- + +.. c:function:: int uv_idle_init(uv_loop_t*, uv_idle_t* idle) + + Initialize the handle. + +.. c:function:: int uv_idle_start(uv_idle_t* idle, uv_idle_cb cb) + + Start the handle with the given callback. + +.. c:function:: int uv_idle_stop(uv_idle_t* idle) + + Stop the handle, the callback will no longer be called. + +.. seealso:: The :c:type:`uv_handle_t` API functions also apply. diff --git a/deps/uv/docs/src/index.rst b/deps/uv/docs/src/index.rst new file mode 100644 index 00000000000..112a0d04c9b --- /dev/null +++ b/deps/uv/docs/src/index.rst @@ -0,0 +1,84 @@ + +Welcome to the libuv API documentation +====================================== + +Overview +-------- + +libuv is a multi-platform support library with a focus on asynchronous I/O. It +was primarily developed for use by `Node.js`_, but it's also used by Mozilla's +`Rust language`_, `Luvit`_, `Julia`_, `pyuv`_, and `others`_. + +.. note:: + In case you find errors in this documentation you can help by sending + `pull requests `_! + +.. _Node.js: http://nodejs.org +.. _Rust language: http://www.rust-lang.org +.. _Luvit: http://luvit.io +.. _Julia: http://julialang.org +.. _pyuv: https://github.com/saghul/pyuv +.. _others: https://github.com/joyent/libuv/wiki/Projects-that-use-libuv + + +Features +-------- + +* Full-featured event loop backed by epoll, kqueue, IOCP, event ports. +* Asynchronous TCP and UDP sockets +* Asynchronous DNS resolution +* Asynchronous file and file system operations +* File system events +* ANSI escape code controlled TTY +* IPC with socket sharing, using Unix domain sockets or named pipes (Windows) +* Child processes +* Thread pool +* Signal handling +* High resolution clock +* Threading and synchronization primitives + + +Downloads +--------- + +libuv can be downloaded from `here `_. + + +Installation +------------ + +Installation instructions can be found on `the README `_. + + +Documentation +------------- + +.. toctree:: + :maxdepth: 1 + + design + errors + loop + handle + request + timer + prepare + check + idle + async + poll + signal + process + stream + tcp + pipe + tty + udp + fs_event + fs_poll + fs + threadpool + dns + dll + threading + misc diff --git a/deps/uv/docs/src/loop.rst b/deps/uv/docs/src/loop.rst new file mode 100644 index 00000000000..bc2afe2ff69 --- /dev/null +++ b/deps/uv/docs/src/loop.rst @@ -0,0 +1,137 @@ + +.. _loop: + +:c:type:`uv_loop_t` --- Event loop +================================== + +The event loop is the central part of libuv's functionality. It takes care +of polling for i/o and scheduling callbacks to be run based on different sources +of events. + + +Data types +---------- + +.. c:type:: uv_loop_t + + Loop data type. + +.. c:type:: uv_run_mode + + Mode used to run the loop with :c:func:`uv_run`. + + :: + + typedef enum { + UV_RUN_DEFAULT = 0, + UV_RUN_ONCE, + UV_RUN_NOWAIT + } uv_run_mode; + +.. c:type:: void (*uv_walk_cb)(uv_handle_t* handle, void* arg) + + Type definition for callback passed to :c:func:`uv_walk`. + + +Public members +^^^^^^^^^^^^^^ + +.. c:member:: void* uv_loop_t.data + + Space for user-defined arbitrary data. libuv does not use this field. + + +API +--- + +.. c:function:: int uv_loop_init(uv_loop_t* loop) + + Initializes the given `uv_loop_t` structure. + +.. c:function:: int uv_loop_close(uv_loop_t* loop) + + Closes all internal loop resources. This function must only be called once + the loop has finished its execution or it will return UV_EBUSY. After this + function returns the user shall free the memory allocated for the loop. + +.. c:function:: uv_loop_t* uv_default_loop(void) + + Returns the initialized default loop. It may return NULL in case of + allocation failture. + +.. c:function:: int uv_run(uv_loop_t* loop, uv_run_mode mode) + + This function runs the event loop. It will act differently depending on the + specified mode: + + - UV_RUN_DEFAULT: Runs the event loop until there are no more active and + referenced handles or requests. Always returns zero. + - UV_RUN_ONCE: Poll for i/o once. Note that this function blocks if + there are no pending callbacks. Returns zero when done (no active handles + or requests left), or non-zero if more callbacks are expected (meaning + you should run the event loop again sometime in the future). + - UV_RUN_NOWAIT: Poll for i/o once but don't block if there are no + pending callbacks. Returns zero if done (no active handles + or requests left), or non-zero if more callbacks are expected (meaning + you should run the event loop again sometime in the future). + +.. c:function:: int uv_loop_alive(const uv_loop_t* loop) + + Returns non-zero if there are active handles or request in the loop. + +.. c:function:: void uv_stop(uv_loop_t* loop) + + Stop the event loop, causing :c:func:`uv_run` to end as soon as + possible. This will happen not sooner than the next loop iteration. + If this function was called before blocking for i/o, the loop won't block + for i/o on this iteration. + +.. c:function:: size_t uv_loop_size(void) + + Returns the size of the `uv_loop_t` structure. Useful for FFI binding + writers who don't want to know the structure layout. + +.. c:function:: int uv_backend_fd(const uv_loop_t* loop) + + Get backend file descriptor. Only kqueue, epoll and event ports are + supported. + + This can be used in conjunction with `uv_run(loop, UV_RUN_NOWAIT)` to + poll in one thread and run the event loop's callbacks in another see + test/test-embed.c for an example. + + .. note:: + Embedding a kqueue fd in another kqueue pollset doesn't work on all platforms. It's not + an error to add the fd but it never generates events. + +.. c:function:: int uv_backend_timeout(const uv_loop_t* loop) + + Get the poll timeout. The return value is in milliseconds, or -1 for no + timeout. + +.. c:function:: uint64_t uv_now(const uv_loop_t* loop) + + Return the current timestamp in milliseconds. The timestamp is cached at + the start of the event loop tick, see :c:func:`uv_update_time` for details + and rationale. + + The timestamp increases monotonically from some arbitrary point in time. + Don't make assumptions about the starting point, you will only get + disappointed. + + .. note:: + Use :c:func:`uv_hrtime` if you need sub-millisecond granularity. + +.. c:function:: void uv_update_time(uv_loop_t* loop) + + Update the event loop's concept of "now". Libuv caches the current time + at the start of the event loop tick in order to reduce the number of + time-related system calls. + + You won't normally need to call this function unless you have callbacks + that block the event loop for longer periods of time, where "longer" is + somewhat subjective but probably on the order of a millisecond or more. + +.. c:function:: void uv_walk(uv_loop_t* loop, uv_walk_cb walk_cb, void* arg) + + Walk the list of handles: `walk_cb` will be executed with the given `arg`. diff --git a/deps/uv/docs/src/misc.rst b/deps/uv/docs/src/misc.rst new file mode 100644 index 00000000000..b313159dba0 --- /dev/null +++ b/deps/uv/docs/src/misc.rst @@ -0,0 +1,228 @@ + +.. _misc: + +Miscelaneous utilities +====================== + +This section contains miscelaneous functions that don't really belong in any +other section. + + +Data types +---------- + +.. c:type:: uv_buf_t + + Buffer data type. + +.. c:type:: uv_file + + Cross platform representation of a file handle. + +.. c:type:: uv_os_sock_t + + Cross platform representation of a socket handle. + +.. c:type:: uv_os_fd_t + + Abstract representation of a file descriptor. On Unix systems this is a + `typedef` of `int` and on Windows fa `HANDLE`. + +.. c:type:: uv_rusage_t + + Data type for resource usage results. + + :: + + typedef struct { + uv_timeval_t ru_utime; /* user CPU time used */ + uv_timeval_t ru_stime; /* system CPU time used */ + uint64_t ru_maxrss; /* maximum resident set size */ + uint64_t ru_ixrss; /* integral shared memory size */ + uint64_t ru_idrss; /* integral unshared data size */ + uint64_t ru_isrss; /* integral unshared stack size */ + uint64_t ru_minflt; /* page reclaims (soft page faults) */ + uint64_t ru_majflt; /* page faults (hard page faults) */ + uint64_t ru_nswap; /* swaps */ + uint64_t ru_inblock; /* block input operations */ + uint64_t ru_oublock; /* block output operations */ + uint64_t ru_msgsnd; /* IPC messages sent */ + uint64_t ru_msgrcv; /* IPC messages received */ + uint64_t ru_nsignals; /* signals received */ + uint64_t ru_nvcsw; /* voluntary context switches */ + uint64_t ru_nivcsw; /* involuntary context switches */ + } uv_rusage_t; + +.. c:type:: uv_cpu_info_t + + Data type for CPU information. + + :: + + typedef struct uv_cpu_info_s { + char* model; + int speed; + struct uv_cpu_times_s { + uint64_t user; + uint64_t nice; + uint64_t sys; + uint64_t idle; + uint64_t irq; + } cpu_times; + } uv_cpu_info_t; + +.. c:type:: uv_interface_address_t + + Data type for interface addresses. + + :: + + typedef struct uv_interface_address_s { + char* name; + char phys_addr[6]; + int is_internal; + union { + struct sockaddr_in address4; + struct sockaddr_in6 address6; + } address; + union { + struct sockaddr_in netmask4; + struct sockaddr_in6 netmask6; + } netmask; + } uv_interface_address_t; + + +API +--- + +.. c:function:: uv_handle_type uv_guess_handle(uv_file file) + + Used to detect what type of stream should be used with a given file + descriptor. Usually this will be used during initialization to guess the + type of the stdio streams. + + For ``isatty()`` functionality use this function and test for ``UV_TTY``. + +.. c:function:: unsigned int uv_version(void) + + Returns the libuv version packed into a single integer. 8 bits are used for + each component, with the patch number stored in the 8 least significant + bits. E.g. for libuv 1.2.3 this would return 0x010203. + +.. c:function:: const char* uv_version_string(void) + + Returns the libuv version number as a string. For non-release versions + "-pre" is appended, so the version number could be "1.2.3-pre". + +.. c:function:: uv_buf_t uv_buf_init(char* base, unsigned int len) + + Constructor for :c:type:`uv_buf_t`. + + Due to platform differences the user cannot rely on the ordering of the + `base` and `len` members of the uv_buf_t struct. The user is responsible for + freeing `base` after the uv_buf_t is done. Return struct passed by value. + +.. c:function:: char** uv_setup_args(int argc, char** argv) + + Store the program arguments. Required for getting / setting the process title. + +.. c:function:: int uv_get_process_title(char* buffer, size_t size) + + Gets the title of the current process. + +.. c:function:: int uv_set_process_title(const char* title) + + Sets the current process title. + +.. c:function:: int uv_resident_set_memory(size_t* rss) + + Gets the resident set size (RSS) for the current process. + +.. c:function:: int uv_uptime(double* uptime) + + Gets the current system uptime. + +.. c:function:: int uv_getrusage(uv_rusage_t* rusage) + + Gets the resource usage measures for the current process. + + .. note:: + On Windows not all fields are set, the unsupported fields are filled with zeroes. + +.. c:function:: int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) + + Gets information about the CPUs on the system. The `cpu_infos` array will + have `count` elements and needs to be freed with :c:func:`uv_free_cpu_info`. + +.. c:function:: void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) + + Frees the `cpu_infos` array previously allocated with :c:func:`uv_cpu_info`. + +.. c:function:: int uv_interface_addresses(uv_interface_address_t** addresses, int* count) + + Gets address information about the network interfaces on the system. An + array of `count` elements is allocated and returned in `addresses`. It must + be freed by the user, calling :c:func:`uv_free_interface_addresses`. + +.. c:function:: void uv_free_interface_addresses(uv_interface_address_t* addresses, int count) + + Free an array of :c:type:`uv_interface_address_t` which was returned by + :c:func:`uv_interface_addresses`. + +.. c:function:: void uv_loadavg(double avg[3]) + + Gets the load average. See: http://en.wikipedia.org/wiki/Load_(computing) + + .. note:: + Returns [0,0,0] on Windows (i.e., it's not implemented). + +.. c:function:: int uv_ip4_addr(const char* ip, int port, struct sockaddr_in* addr) + + Convert a string containing an IPv4 addresses to a binary structure. + +.. c:function:: int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr) + + Convert a string containing an IPv6 addresses to a binary structure. + +.. c:function:: int uv_ip4_name(const struct sockaddr_in* src, char* dst, size_t size) + + Convert a binary structure containing an IPv4 addres to a string. + +.. c:function:: int uv_ip6_name(const struct sockaddr_in6* src, char* dst, size_t size) + + Convert a binary structure containing an IPv6 addres to a string. + +.. c:function:: int uv_inet_ntop(int af, const void* src, char* dst, size_t size) +.. c:function:: int uv_inet_pton(int af, const char* src, void* dst) + + Cross-platform IPv6-capable implementation of the 'standard' ``inet_ntop()`` + and ``inet_pton()`` functions. On success they return 0. In case of error + the target `dst` pointer is unmodified. + +.. c:function:: int uv_exepath(char* buffer, size_t* size) + + Gets the executable path. + +.. c:function:: int uv_cwd(char* buffer, size_t* size) + + Gets the current working directory. + +.. c:function:: int uv_chdir(const char* dir) + + Changes the current working directory. + +.. uint64_t uv_get_free_memory(void) +.. c:function:: uint64_t uv_get_total_memory(void) + + Gets memory information (in bytes). + +.. c:function:: uint64_t uv_hrtime(void) + + Returns the current high-resolution real time. This is expressed in + nanoseconds. It is relative to an arbitrary time in the past. It is not + related to the time of day and therefore not subject to clock drift. The + primary use is for measuring performance between intervals. + + .. note:: + Not every platform can support nanosecond resolution; however, this value will always + be in nanoseconds. diff --git a/deps/uv/docs/src/pipe.rst b/deps/uv/docs/src/pipe.rst new file mode 100644 index 00000000000..9a4a19340b8 --- /dev/null +++ b/deps/uv/docs/src/pipe.rst @@ -0,0 +1,86 @@ + +.. _pipe: + +:c:type:`uv_pipe_t` --- Pipe handle +=================================== + +Pipe handles provide an abstraction over local domain sockets on Unix and named +pipes on Windows. + +:c:type:`uv_pipe_t` is a 'subclass' of :c:type:`uv_stream_t`. + + +Data types +---------- + +.. c:type:: uv_pipe_t + + Pipe handle type. + + +Public members +^^^^^^^^^^^^^^ + +N/A + +.. seealso:: The :c:type:`uv_stream_t` members also apply. + + +API +--- + +.. c:function:: int uv_pipe_init(uv_loop_t*, uv_pipe_t* handle, int ipc) + + Initialize a pipe handle. The `ipc` argument is a boolean to indicate if + this pipe will be used for handle passing between processes. + +.. c:function:: int uv_pipe_open(uv_pipe_t*, uv_file file) + + Open an existing file descriptor or HANDLE as a pipe. + + .. note:: + The user is responsible for setting the dile descriptor in non-blocking mode. + +.. c:function:: int uv_pipe_bind(uv_pipe_t* handle, const char* name) + + Bind the pipe to a file path (Unix) or a name (Windows). + + .. note:: + Paths on Unix get truncated to ``sizeof(sockaddr_un.sun_path)`` bytes, typically between + 92 and 108 bytes. + +.. c:function:: void uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle, const char* name, uv_connect_cb cb) + + Connect to the Unix domain socket or the named pipe. + + .. note:: + Paths on Unix get truncated to ``sizeof(sockaddr_un.sun_path)`` bytes, typically between + 92 and 108 bytes. + +.. c:function:: int uv_pipe_getsockname(const uv_pipe_t* handle, char* buf, size_t* len) + + Get the name of the Unix domain socket or the named pipe. + + A preallocated buffer must be provided. The len parameter holds the length + of the buffer and it's set to the number of bytes written to the buffer on + output. If the buffer is not big enough ``UV_ENOBUFS`` will be returned and + len will contain the required size. + +.. c:function:: void uv_pipe_pending_instances(uv_pipe_t* handle, int count) + + Set the number of pending pipe instance handles when the pipe server is + waiting for connections. + + .. note:: + This setting applies to Windows only. + +.. c:function:: int uv_pipe_pending_count(uv_pipe_t* handle) +.. c:function:: uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle) + + Used to receive handles over IPC pipes. + + First - call :c:func:`uv_pipe_pending_count`, if it's > 0 then initialize + a handle of the given `type`, returned by :c:func:`uv_pipe_pending_type` + and call ``uv_accept(pipe, handle)``. + +.. seealso:: The :c:type:`uv_stream_t` API functions also apply. diff --git a/deps/uv/docs/src/poll.rst b/deps/uv/docs/src/poll.rst new file mode 100644 index 00000000000..f34842256b6 --- /dev/null +++ b/deps/uv/docs/src/poll.rst @@ -0,0 +1,99 @@ + +.. _poll: + +:c:type:`uv_poll_t` --- Poll handle +=================================== + +Poll handles are used to watch file descriptors for readability and +writability, similar to the purpose of poll(2). + +The purpose of poll handles is to enable integrating external libraries that +rely on the event loop to signal it about the socket status changes, like +c-ares or libssh2. Using uv_poll_t for any other purpose is not recommended; +:c:type:`uv_tcp_t`, :c:type:`uv_udp_t`, etc. provide an implementation that is faster and +more scalable than what can be achieved with :c:type:`uv_poll_t`, especially on +Windows. + +It is possible that poll handles occasionally signal that a file descriptor is +readable or writable even when it isn't. The user should therefore always +be prepared to handle EAGAIN or equivalent when it attempts to read from or +write to the fd. + +It is not okay to have multiple active poll handles for the same socket, this +can cause libuv to busyloop or otherwise malfunction. + +The user should not close a file descriptor while it is being polled by an +active poll handle. This can cause the handle to report an error, +but it might also start polling another socket. However the fd can be safely +closed immediately after a call to :c:func:`uv_poll_stop` or :c:func:`uv_close`. + +.. note:: + On windows only sockets can be polled with poll handles. On Unix any file + descriptor that would be accepted by poll(2) can be used. + + +Data types +---------- + +.. c:type:: uv_poll_t + + Poll handle type. + +.. c:type:: void (*uv_poll_cb)(uv_poll_t* handle, int status, int events) + + Type definition for callback passed to :c:func:`uv_poll_start`. + +.. c:type:: uv_poll_event + + Poll event types + + :: + + enum uv_poll_event { + UV_READABLE = 1, + UV_WRITABLE = 2 + }; + + +Public members +^^^^^^^^^^^^^^ + +N/A + +.. seealso:: The :c:type:`uv_handle_t` members also apply. + + +API +--- + +.. c:function:: int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd) + + Initialize the handle using a file descriptor. + +.. c:function:: int uv_poll_init_socket(uv_loop_t* loop, uv_poll_t* handle, uv_os_sock_t socket) + + Initialize the handle using a socket descriptor. On Unix this is identical + to :c:func:`uv_poll_init`. On windows it takes a SOCKET handle. + +.. c:function:: int uv_poll_start(uv_poll_t* handle, int events, uv_poll_cb cb) + + Starts polling the file descriptor. `events` is a bitmask consisting made up + of UV_READABLE and UV_WRITABLE. As soon as an event is detected the callback + will be called with `status` set to 0, and the detected events set on the + `events` field. + + If an error happens while polling, `status` will be < 0 and corresponds + with one of the UV_E* error codes (see :ref:`errors`). The user should + not close the socket while the handle is active. If the user does that + anyway, the callback *may* be called reporting an error status, but this + is **not** guaranteed. + + .. note:: + Calling :c:func:`uv_poll_start` on a handle that is already active is fine. Doing so + will update the events mask that is being watched for. + +.. c:function:: int uv_poll_stop(uv_poll_t* poll) + + Stop polling the file descriptor, the callback will no longer be called. + +.. seealso:: The :c:type:`uv_handle_t` API functions also apply. diff --git a/deps/uv/docs/src/prepare.rst b/deps/uv/docs/src/prepare.rst new file mode 100644 index 00000000000..aca58155809 --- /dev/null +++ b/deps/uv/docs/src/prepare.rst @@ -0,0 +1,46 @@ + +.. _prepare: + +:c:type:`uv_prepare_t` --- Prepare handle +========================================= + +Prepare handles will run the given callback once per loop iteration, right +before polling for i/o. + + +Data types +---------- + +.. c:type:: uv_prepare_t + + Prepare handle type. + +.. c:type:: void (*uv_prepare_cb)(uv_prepare_t* handle) + + Type definition for callback passed to :c:func:`uv_prepare_start`. + + +Public members +^^^^^^^^^^^^^^ + +N/A + +.. seealso:: The :c:type:`uv_handle_t` members also apply. + + +API +--- + +.. c:function:: int uv_prepare_init(uv_loop_t* loop, uv_prepare_t* prepare) + + Initialize the handle. + +.. c:function:: int uv_prepare_start(uv_prepare_t* prepare, uv_prepare_cb cb) + + Start the handle with the given callback. + +.. c:function:: int uv_prepare_stop(uv_prepare_t* prepare) + + Stop the handle, the callback will no longer be called. + +.. seealso:: The :c:type:`uv_handle_t` API functions also apply. diff --git a/deps/uv/docs/src/process.rst b/deps/uv/docs/src/process.rst new file mode 100644 index 00000000000..fccfc00ca87 --- /dev/null +++ b/deps/uv/docs/src/process.rst @@ -0,0 +1,215 @@ + +.. _process: + +:c:type:`uv_process_t` --- Process handle +========================================= + +Process handles will spawn a new process and allow the user to control it and +establish communication channels with it using streams. + + +Data types +---------- + +.. c:type:: uv_process_t + + Process handle type. + +.. c:type:: uv_process_options_t + + Options for spawning the process (passed to :c:func:`uv_spawn`. + + :: + + typedef struct uv_process_options_s { + uv_exit_cb exit_cb; + const char* file; + char** args; + char** env; + const char* cwd; + unsigned int flags; + int stdio_count; + uv_stdio_container_t* stdio; + uv_uid_t uid; + uv_gid_t gid; + } uv_process_options_t; + +.. c:type:: void (*uv_exit_cb)(uv_process_t*, int64_t exit_status, int term_signal) + + Type definition for callback passed in :c:type:`uv_process_options_t` which + will indicate the exit status and the signal that caused the process to + terminate, if any. + +.. c:type:: uv_process_flags + + Flags to be set on the flags field of :c:type:`uv_process_options_t`. + + :: + + enum uv_process_flags { + /* + * Set the child process' user id. + */ + UV_PROCESS_SETUID = (1 << 0), + /* + * Set the child process' group id. + */ + UV_PROCESS_SETGID = (1 << 1), + /* + * Do not wrap any arguments in quotes, or perform any other escaping, when + * converting the argument list into a command line string. This option is + * only meaningful on Windows systems. On Unix it is silently ignored. + */ + UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS = (1 << 2), + /* + * Spawn the child process in a detached state - this will make it a process + * group leader, and will effectively enable the child to keep running after + * the parent exits. Note that the child process will still keep the + * parent's event loop alive unless the parent process calls uv_unref() on + * the child's process handle. + */ + UV_PROCESS_DETACHED = (1 << 3), + /* + * Hide the subprocess console window that would normally be created. This + * option is only meaningful on Windows systems. On Unix it is silently + * ignored. + */ + UV_PROCESS_WINDOWS_HIDE = (1 << 4) + }; + +.. c:type:: uv_stdio_container_t + + Container for each stdio handle or fd passed to a child process. + + :: + + typedef struct uv_stdio_container_s { + uv_stdio_flags flags; + union { + uv_stream_t* stream; + int fd; + } data; + } uv_stdio_container_t; + +.. c:type:: uv_stdio_flags + + Flags specifying how a stdio should be transmitted to the child process. + + :: + + typedef enum { + UV_IGNORE = 0x00, + UV_CREATE_PIPE = 0x01, + UV_INHERIT_FD = 0x02, + UV_INHERIT_STREAM = 0x04, + /* + * When UV_CREATE_PIPE is specified, UV_READABLE_PIPE and UV_WRITABLE_PIPE + * determine the direction of flow, from the child process' perspective. Both + * flags may be specified to create a duplex data stream. + */ + UV_READABLE_PIPE = 0x10, + UV_WRITABLE_PIPE = 0x20 + } uv_stdio_flags; + + +Public members +^^^^^^^^^^^^^^ + +.. c:member:: uv_process_t.pid + + The PID of the spawned process. It's set after calling :c:func:`uv_spawn`. + +.. note:: + The :c:type:`uv_handle_t` members also apply. + +.. c:member:: uv_process_options_t.exit_cb + + Callback called after the process exits. + +.. c:member:: uv_process_options_t.file + + Path pointing to the program to be executed. + +.. c:member:: uv_process_options_t.args + + Command line arguments. args[0] should be the path to the program. On + Windows this uses `CreateProcess` which concatenates the arguments into a + string this can cause some strange errors. See the + ``UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS`` flag on :c:type:`uv_process_flags`. + +.. c:member:: uv_process_options_t.env + + Environment for the new process. If NULL the parents environment is used. + +.. c:member:: uv_process_options_t.cwd + + Current working directory for the subprocess. + +.. c:member:: uv_process_options_t.flags + + Various flags that control how :c:func:`uv_spawn` behaves. See + :c:type:`uv_process_flags`. + +.. c:member:: uv_process_options_t.stdio_count +.. c:member:: uv_process_options_t.stdio + + The `stdio` field points to an array of :c:type:`uv_stdio_container_t` + structs that describe the file descriptors that will be made available to + the child process. The convention is that stdio[0] points to stdin, + fd 1 is used for stdout, and fd 2 is stderr. + + .. note:: + On Windows file descriptors greater than 2 are available to the child process only if + the child processes uses the MSVCRT runtime. + +.. c:member:: uv_process_options_t.uid +.. c:member:: uv_process_options_t.gid + + Libuv can change the child process' user/group id. This happens only when + the appropriate bits are set in the flags fields. + + .. note:: + This is not supported on Windows, :c:func:`uv_spawn` will fail and set the error + to ``UV_ENOTSUP``. + +.. c:member:: uv_stdio_container_t.flags + + Flags specifying how the stdio container should be passed to the child. See + :c:type:`uv_stdio_flags`. + +.. c:member:: uv_stdio_container_t.data + + Union containing either the stream or fd to be passed on to the child + process. + + +API +--- + +.. c:function:: void uv_disable_stdio_inheritance(void) + + Disables inheritance for file descriptors / handles that this process + inherited from its parent. The effect is that child processes spawned by + this process don't accidentally inherit these handles. + + It is recommended to call this function as early in your program as possible, + before the inherited file descriptors can be closed or duplicated. + + .. note:: + This function works on a best-effort basis: there is no guarantee that libuv can discover + all file descriptors that were inherited. In general it does a better job on Windows than + it does on Unix. + +.. c:function:: int uv_spawn(uv_loop_t* loop, uv_process_t* handle, const uv_process_options_t* options) + + Initializes the process handle and starts the process. If the process is + successfully spawned, this function will return 0. Otherwise, the + negative error code corresponding to the reason it couldn't spawn is + returned. + + Possible reasons for failing to spawn would include (but not be limited to) + the file to execute not existing, not having permissions to use the setuid or + setgid specified, or not having enough memory to allocate for the new + process. + +.. seealso:: The :c:type:`uv_handle_t` API functions also apply. diff --git a/deps/uv/docs/src/request.rst b/deps/uv/docs/src/request.rst new file mode 100644 index 00000000000..29c1277924b --- /dev/null +++ b/deps/uv/docs/src/request.rst @@ -0,0 +1,82 @@ + +.. _request: + +:c:type:`uv_req_t` --- Base request +=================================== + +`uv_req_t` is the base type for all libuv request types. + +Strcutures are aligned so that any libuv request can be cast to `uv_req_t`. +All API functions defined here work with any request type. + + +Data types +---------- + +.. c:type:: uv_req_t + + The base libuv request structure. + +.. c:type:: uv_any_req + + Union of all request types. + + +Public members +^^^^^^^^^^^^^^ + +.. c:member:: void* uv_request_t.data + + Space for user-defined arbitrary data. libuv does not use this field. + +.. c:member:: uv_req_type uv_req_t.type + + Indicated the type of request. Readonly. + + :: + + typedef enum { + UV_UNKNOWN_REQ = 0, + UV_REQ, + UV_CONNECT, + UV_WRITE, + UV_SHUTDOWN, + UV_UDP_SEND, + UV_FS, + UV_WORK, + UV_GETADDRINFO, + UV_GETNAMEINFO, + UV_REQ_TYPE_PRIVATE, + UV_REQ_TYPE_MAX, + } uv_req_type; + + +API +--- + +.. c:function:: int uv_cancel(uv_req_t* req) + + Cancel a pending request. Fails if the request is executing or has finished + executing. + + Returns 0 on success, or an error code < 0 on failure. + + Only cancellation of :c:type:`uv_fs_t`, :c:type:`uv_getaddrinfo_t`, + :c:type:`uv_getnameinfo_t` and :c:type:`uv_work_t` requests is + currently supported. + + Cancelled requests have their callbacks invoked some time in the future. + It's **not** safe to free the memory associated with the request until the + callback is called. + + Here is how cancellation is reported to the callback: + + * A :c:type:`uv_fs_t` request has its req->result field set to `UV_ECANCELED`. + + * A :c:type:`uv_work_t`, :c:type:`uv_getaddrinfo_t` or c:type:`uv_getnameinfo_t` + request has its callback invoked with status == `UV_ECANCELED`. + +.. c:function:: size_t uv_req_size(uv_req_type type) + + Returns the size of the given request type. Useful for FFI binding writers + who don't want to know the structure layout. diff --git a/deps/uv/docs/src/signal.rst b/deps/uv/docs/src/signal.rst new file mode 100644 index 00000000000..21675945fc4 --- /dev/null +++ b/deps/uv/docs/src/signal.rst @@ -0,0 +1,77 @@ + +.. _signal: + +:c:type:`uv_signal_t` --- Signal handle +======================================= + +Signal handles implement Unix style signal handling on a per-event loop bases. + +Reception of some signals is emulated on Windows: + +* SIGINT is normally delivered when the user presses CTRL+C. However, like + on Unix, it is not generated when terminal raw mode is enabled. + +* SIGBREAK is delivered when the user pressed CTRL + BREAK. + +* SIGHUP is generated when the user closes the console window. On SIGHUP the + program is given approximately 10 seconds to perform cleanup. After that + Windows will unconditionally terminate it. + +* SIGWINCH is raised whenever libuv detects that the console has been + resized. SIGWINCH is emulated by libuv when the program uses a :c:type:`uv_tty_t` + handle to write to the console. SIGWINCH may not always be delivered in a + timely manner; libuv will only detect size changes when the cursor is + being moved. When a readable :c:type:`uv_tty_t` handle is used in raw mode, + resizing the console buffer will also trigger a SIGWINCH signal. + +Watchers for other signals can be successfully created, but these signals +are never received. These signals are: `SIGILL`, `SIGABRT`, `SIGFPE`, `SIGSEGV`, +`SIGTERM` and `SIGKILL.` + +Calls to raise() or abort() to programmatically raise a signal are +not detected by libuv; these will not trigger a signal watcher. + +.. note:: + On Linux SIGRT0 and SIGRT1 (signals 32 and 33) are used by the NPTL pthreads library to + manage threads. Installing watchers for those signals will lead to unpredictable behavior + and is strongly discouraged. Future versions of libuv may simply reject them. + + +Data types +---------- + +.. c:type:: uv_signal_t + + Signal handle type. + +.. c:type:: void (*uv_signal_cb)(uv_signal_t* handle, int signum) + + Type definition for callback passed to :c:func:`uv_signal_start`. + + +Public members +^^^^^^^^^^^^^^ + +.. c:member:: int uv_signal_t.signum + + Signal being monitored by this handle. Readonly. + +.. seealso:: The :c:type:`uv_handle_t` members also apply. + + +API +--- + +.. c:function:: int uv_signal_init(uv_loop_t*, uv_signal_t* signal) + + Initialize the handle. + +.. c:function:: int uv_signal_start(uv_signal_t* signal, uv_signal_cb cb, int signum) + + Start the handle with the given callback, watching for the given signal. + +.. c:function:: int uv_signal_stop(uv_signal_t* signal) + + Stop the handle, the callback will no longer be called. + +.. seealso:: The :c:type:`uv_handle_t` API functions also apply. diff --git a/deps/uv/docs/src/static/architecture.png b/deps/uv/docs/src/static/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..81e8749f2495741d4b4c2c5dd8a6bca8803d8818 GIT binary patch literal 206767 zcmeFZcQl;e_dlvdi6A0cv@|4$7SS1zBBDp4L>VPY!l=>Bj4q-jQKJhXqW2a?pCC$f z2BX)}8Dp9|@6Yevb-(w=`@8NxzqNjA-D^G8dYn1WdGnB&~ zgM+Nb>Gm({cD3p~ezH6h=gR> zrp%+;)MOW*j7lp)1lX4;;`J*#IVDf2dJYrrN`^^DvSrhKE4sPZQR;}!UlDHXPEHb7 z%D!gY&-qI#BdSq%HidsaCyFZDG?{`!2mNM49OLFu>dIcF?0gjQ>GBtqlR<$W974fAvmfay9o~9>t%24o7@I{icwLH` zKn@OJPNo>PWSAhU379NX;HFh;>z#Y-&6-BT-h!BaUdN`)Slh-v&$UY?5(;dKqgDA$ zOZoSy5iQr=W7SVax5=4rIDEdDOHuG7b`5`f1~*#lpD&6jOFWs z34Wq`P2~{8bR+TlZO7X$FJGfwr6q(gw@K**{?K`UGwiZYhpE-w@|cN-ztp(}wBxR- zhuvm>ar^Gqs=$}(?{1n2C| zwdJ1ItN5t+Jo^5E;fK?R(a+?D^w&B~kHOEuVrp^slMa#=yNlxrKRYCBCi(H}#E&O= zB>_b<1%Wr9&xv{XItsm3l~(=0oHB##r}I^9N}=jcQobcveXvTgim(b^c+jcG|LaTO zm)a{j1uE-hL;T-wTvHwX?lV+ZrBx+AWiuttqb8G!8;)D=JmgzzI;6AVw=r41v&_AG zZMm}N1$CRa1?K(>&hJriQH@ct2U08b1B(L)>C(66r@!tdoCrAy`6t{=uuULOi2bSg z%6ataX!=jkPn{9*cLMJ$-%Y;5jfxgV59AMcWelVPrB0Xd;TvTQ5x#ZUcSr3TN*i(4 zQm!>$KGl)pU}g=5hrL_0uI$g7S*b2AxQFzFZGjb1%*tli8nqh- z(2VGtI02jljZ(OGcoXCC#Cy*>jUnJs=FPSFy8gYWMH)dr!SZ4Cd}O+D|J{Cu{v7&C z?7QqE_c+}Cy3W^eyL}dYBN_$tcF7)jg-BR@y@~y!H6Fd{*#YX9nNXS})Zv7gG?+fC zMZ)9r<5sT?(3^iqDmDCUSX%q#*lOq9PQJ3da)ffUGE1{(b0Js^V@aSOcw%P`#&=h- z<2W5ES*jwswTrn_PpJ%Ol<6huu3Ye-YHuZPZ4BZQ8v@=o9buzT#Xs^4Rit}x$&3~2 z&LJuyRV0A&se9!O@%Ey+XZ7UqqmIUBvA>6Yt3^h$X|Q=c?N;l2GODKa#P3Pc6OAMz z5#!3Gr%|t?uIDMS@o};G-S%`VI3AkO2wy}kTwL51y>FUWiJEe&UM}bzDES0zHFg!^ z<>KQ(UOtUrX)9RPEI9<$do5Fq$2ErIzN~f$uSV~gVQlc9sggn}LjFEZ>M)D2RxeR! zRbQmgd00K?Q32c!Tq=nF6rXeVe!<^@zPBM&n5tn_e#?(#!e;lC1e?U#rE1_{Ib2Fva_Z&jKIq0l z9@swc@~~_6B!=NzA8b1?7Ke_Nm?G-6z06u0=8u{;V?ozJ&n96JBG*jMhXbg9;>>diOZ>o;L^>~v&x+?uhiEPjVbx@rFR$f|eY@KLeF}~khao}GVe)9oP8wz2tK7e!zmIhtiXVbH zEvM&;+6OkjZ8X5_pg`#3t!I0m2h>8VFu8{+d$RW2Z6jxt}#HRW8#Dvai||x)&M29xiYAUb&%aX(+vL0uU@BEpbtiO*N zCEDtY7P$W`Jbh(WTiDpp2+CyAen|CL<;-RAgxMab=a-YtOwN4y%tcEjHE*bPw*7J- z>oXM=BJ0GDDgJXF8w>%0&%R29%HTS=7RJyb=Uvh{lBlpij?M@`dbLp?NeEzI^iQ)Z z=X|V%8KpUAFpCRU21B41qm3(Tng|F|_)@&0TH1(@BDIbr5=+=e-|#+he#{bgQ}f_vWF;+D04D5EE>s)+h#R z>T}MS8F!a-^z!z;Jp!E?Z$wnK5a&y4YvD(S?+x)_V^Fgu)y~%D;C2JJp65reCRt;8 zqi17Zs!ZdIAG%>SgLizhzKvH=*i>+)V=1Imu&yS&0gc(Zba;FM3*;=Jgy6uIe7Y;5 zNCO4MoGpY`9Zz!;nvv1B+01EX>VXph>*18X8Z2vM4di^PRH}y*wdWgQ$1zgdtL>JP zJMz^*dmnR2vW_>GIsT_B~Qze@9*rIgS~sz4yMj-rB{_Jiz#d7DHx1CX;URMF-&oQ zLd*P)on)k>xEIQbQKimMWZqh=MKB>;Y{L3<5Uz$N&NCeyEA03x@*O%KZkZ#It@I!U z8GA`42$8l~)00fMxkf8&?CSYZw}O}m(4(H)t2 z&XC2PBn>|9V0(8L^$YQlkcvq@q#qhZ2l*iuQ~WkFobVXdh91L0f{B5Upd7_RSLa~) zTTnN*p4z@`&g~2@HM_Op?5#&i!eBNq4?-ogJ-MRqc$^2}MGZW>aTw^)EcOz+IW-8R zp{D)_`5@24z!Xk+@?_9cwq~$dRzR&#O+4^Wr3*RXdqr`<1I*6*k z<&Dh^+{GzoFg=JhMty*S+~-G*QW#3w^^bBLs1Z?N;~-0&FV1!X3Gvm|(s@<0=}~A< z>{d8li9{x%M?XZ8!o??+>)$cP{`-*5B{6ENO;U;aXRSLT8?n$f>U7cbv@&bENd+f zab*C#KH>QhV>o9#|N4Yre+<9jZQ);G{eAgkbDhm*uv6jbBeVQtt#EYsPVQ>NKHhfb zH7a%IeuC@B&cGjzFmR{q#TpKH3oHBqv{F|min&k|+SzOkq$U`Bw6@{uGJsAmcrkB% zEPvnrXQE;DIARon@Z^4!-uhSmf*3*tM2{i;%R%s54n{1J03MNdNNV1 zskM%Di){Y7Y&GE(e^*$VGb;NpG~nyWuw)P#|5OVESedu~LKnex`Ix1d1K{#28(3o8 z)UcLR#KMoJBQU~TImFN>P(}8Z8VTxe+V=F^EF5-id#gU#?$?<-T8RvdjG^E*2~KQS zEt9|P6d!?%Ku%!B#Y)2^s%K&i6+E{OSFiXr0sT0*Tum)gH^)jCZ~>myD!A;D3C11@ z;IoMiFb`Y-vN{OgLvZxh`XlCKDB#yN0vB0u%u_#BWO|RuOIKxsJX?w3%5(Lt?C|?& zI`}P2i1G@8)@Hu;a`xe`PCiOmz7DyUvWflx)fVSh%igKrS&Bv?(Hx0xCK#T8{34_+ zkdw;;p}QuuH5jcs{U&242Z>)L=wX0D0>%ROM%H=H)Wv^H$$1Y>4xy<5A(+uD)^{L6 zVc^C&86KM~rk4XILQ%izaB!sI;ke7}!ZFVxD^^o9Yd~=hCwvyARla zI#HW*Z2^nU;Q(}*&Rk$QBk>0xS}cn4KHNR@?K1ZzFvDuegh2lV3C1~p;j~(e* z*1&;j2BP}P@;6w>0UMG@PBf@c$+=Z}(0OoY@qq2nuZqimk1GO6iQ>oJ#$M@9Ep(@d zDuzTIg2Me_C%Q-%m>cI|_Mx@+|I4lc_+*QRc#(PNs!%EMvh3FXzKV1I-j z8~}Pf(X7g_xJSs(t||-R4&@ZomX|0d1Q_Kt z|8(KiZ)k7#Zqykay|u09u-I*nX6bNETf;)iV5&AjMsnSq7M3(wwByC-Qlj-!XCZAjB87PM^kLCpQQ zz1G+y!cAno55qIsHUTsM%yvYt(drRmp?g77>SSUaVZ4EKm1PecUX$kwn4 zyGTYNx$(^XYjhCfcaHN&(>=p|zbClZ(PZCrENCmj$^oE0BA6Pp45V zeFzQD`%en{zuRZt=BIHxarb%oftn9;2PSNvKSmEgAmNQz9Dvp^Zl&?YNkjnchclOy zHW|B4zZ_2FI9WrCQHGN1xX36`8&j)X*9YF(Gz?R~x!>b3)M&(4h&>bOZ2vM(2g7I2 znmsq|YxwQLmbuv7GTqxh>Z-V8n$YFeeFM7ssrQ0U0 zqe*a=fZ=W+(1>ldKJmoTWVe0s@&w~C`_WI4@U2V!dTfcS-$YQ({`Y7R9s5G@p^g3C zj^r8vE`r5h$&ZAv0YJ7;e$bEm+hJD5+!V5l?*zA#7fKituUge}7^G)0jcnT8p+u1D zlh|ECZ+e*sO|R=<>8@;O^+Vh(EuJAG?GX8F%|r4cDU~KwzTFceuw;<(9PTQbhFjQB zNeK$1sbauSDF3kLF5@wM6)Lu&13-x_*pL&*K(sZ}Uem@uxJ`^Q*4nO!6bZHTa8BIF zYBoxVwCO&oA@_@q4j^3T6My*CqStNjhvtUp#VHmN?oN4jlt(NN(AEVu8S0R)nT= z-#+TIC0)a@gRKf5{ELc+Fx)7LEYHGZ{-Xko_v0?)4BU(dAV8XdWcXtB=Y%J6CH5Nl z=3OWL#M7Pqtq_|u=@vdyf~9#>>L2(JK^gYaJ=1y9W!%%&vD#W3^jCC(2E~*Z)J6k0 z^S;!&<9we2`w^sb$R*N8WyfuY0kuI4y3FxTIGYs9lX?3I8O-8D2k~2JR&0n(HDvl8 z{T;C=WAksYmskUWJ9!xcxCJ-wn%N`NJmpR<^7VqXNaPb3mD(XtWU|Bc0_2FozwF-O zT?MoiP`HpX^gB=O8cEpn)bxoL5!#ph+8Po$1v zS76U`xhnn`xu{yx=r;G1x)M$6#z@GlWPn;Mo;ZM?4L@LmHC$cY@tn3!x1wXCUCUge z?8kuVRv$I*+?@M+HH~SK4A{spLas3Pci?VK1tkIQ*Hg3s2HW7ATrI6Kj3IFxkojg8#@8Y6p|ApOTt}Y7Y=eD)A zgWed1)|~)n%0H)<7u?CC#@FDo&}CWcfeSsd-xRCJIc`qWJT~r>ON_n61ZRz*<62NA z6ZJ-Mz}7K+kN8w@S&C6C7Ey55r%wsDqVIz#3k6-%=D3R;c_Wb@G(?*R(~m#6w@rXH z_1FfqG0^?t&6xy4u*`b{wg7Ga>2i2oPONedkN;qp%k^Dj!6Al#}%#^jbzAzW&YYB59vo_|+4D11g zBOD$tSa7EpLt>Nz=qPa<)XxqtAgJfU37s{?83+m*6yN?}cnhn16>G{Bz{R@&EWDzK zDeKhga?2ih%nuo?%1`8!n;x_ZfK|c@ZG_tWY?Yk_ZjRe?dvsZt`-qMt?eG`_;&n=D ze)*dIwfk$ZRym=gUFOJH!}J==9nQmXJ*&vnZ!VWw&`36~^%?|IK2Zh%%O<+sAjfgU zI9CM%%IPS}o!!%xEa;{H_Oqm)%hYX6f%2I2w?oj3{fZww7lVz=$7>oo9;9XfO z2lEu-V3CPiF33anZ47$cDgUqRMzo!utJQKLumBK~|J9lfP?Sj5Qw(SIpfRC3^l_=i z|E8BOWMW(aOpPvn^gm?4XJo^y9G~#Gz6c|Jv}Qbd$ctmz2qi`}2NT-)HY2dsQ7sWX zsA~*Gc0Igl5)uq77XWwWOaoxXM>Va;qE31CmK_F+r9y%`xgwL9oTr}5VPIW)3;T_+ zM>LEWo)$XJ7#e(7wljhZiVyU2x)h}3*uqGT_=vOmy?Yu8LBWL&$)nUUO;75*cc^A- zgAN4EIaGk~Hw-Yn`Qy>!qupjsF=HL>U|Hf|_zT?ctuE3w28eBtMM%0T9?14?vG=Hb zOM6ij7QV=T_nh6wX!5!!e)C!`q4zS@E3xvgv@@v7pJb(BMIH z#q~d>+(>euT(TUBjkqCt$BLIF<{pf}@&0N!D2GSLR2arNcPRs-6?05qbEmK>%br)g!*;Wy! zy3X9Ivd52(2qgy4{9T2))0WXNmrK5j$*dq0`-XK|wt5bmi4{{`icpwKuxG|9vcU zI;VYfCgl?UIhiRHs+8ws>|_vM!c(uKW5{LEZxd|;3di%?>N?(OulN@$1@JORw^ZCv z66`g{;?DsV0xQ+kAJ-{vp1sOWY3It9Pl?!s?UKgrlF7CEnUJr3YwP)AYYUH;14B9Q zCFYtQrSGsx8xi+@ogRs3q3LgaJWJF*v=DEVO+lr1eFl6I{r2N{fd{l*Ud=ed?(ZkY zTJJ~#&Gx{F3TRz+coAZFL!q)?oq5o%gmbQ>VHn5 zJ7wT<7IG|;n!_x{+#NbkgaBF*p1}J9vNJqxyAPjSfOz*+&+{jT-u!r#1>$dOagbR2 z1btyO)3Af}+(f03F9nmr=AUm@Fjx1Kj;Bp>7oSPY!*CfuHXk)!*E$7!S@_krPtM(r z#Eh11!AxEKh|C#?n%0!SN4nFzK9h@t_5Ab~|ME6_1`4jRQZI+GB2gjtohF#jf@^N_ z?#@(o;ctbdPr;FOH_zFv>lDS0T1tK+*ZBrAGcvRdN|JY(7#UfqF^ZW%=dGs7CbQ8Z zU=&{Fj8vA9m+yKLEh2!w)nze|(e&Wy^K*7FfVPS{Fs45y<)fyS)@bh6I|6tXmc@~J zB|n;fmnbVI$Fq$ONM@m>!1*;f`OS!>x=PM`25@#$8FwNk(5Iuk{`j~kADH+DH&$Ef znTbWM#`&^}B!=DnLmlxsUX?%u@!*o;h45_+<2-1}cyPvV2iy(fem_X<)wTy0IJowTqUFIjafEQ#z%^Y1QkX{bD42SA)tbPZ ziWN3~+?u%%t2mzSxzRnj!`g*t-3UkQ)Cn7ezjtOK~E62nQ<=VYGlWD_dEW`1qM@+6_etYyYa(0;ydPNQJ3)_Cv0Mor~Bc35OZb&jN z--`&A91z;sWxqrmP(WJ0dV>FRU)#(1BvOX$t!Wx&R}C;3iODam~QhhsG<^|rm;cpB)~+*h}akghy52B{8p@DTe^3f>*N)uiDa0&PJSj5l2582SXMkO+4n;85qB#c z-k*bfRnp{sh9oG#<0jfd_%fF_H;bFU!g7>+c(SUGC&oq13&h7S4%m6LnAS=d;?#g{ zdSlCDnKRox%B^JZ%@Snt5o}FwwNdo+66`Dzx9r~-oP3oIpRD))MH4!@H1g*2_}{;J z9ZA+yM=*>Yd!0L_xGZAp}H#9v6pTfB^aeD{o%_lC7JuWy)O_imz1Y2|{0A30fl zlb?46=6PYt9*cY6BfZCY${65Ipt@Gb z`})S*fuCKv$5XUx@TSaceEP04vbmigd9dF8h`@eP`#~nTV<`9)&sq1l!NS4Ab1$kV zuf%c-f}d#)6^$0F`9<|vrg>Y(Rts&+p!jpQrx&=Otx%0^@>|iH1rIcB_cw0aR`9=> ztbk}@+~*s(_6IPFp#jBidbbRr>t`X+mSv*aPbWJqEsf+xNif^!_p|gcytU)akrVVE zHHj4U&sA7nV$mr4puWBHYp(vgbgHzoXde>!m0fY)beyG{d9%#tfUVZ2*FeDG&3ee` z5WbQ8-9^2#I-d2N7Bx{{`D0*h&4@YnRstQ=&@dWe<^N5f$@B_)+Uf7GpS~%;9&_}1 z(7ms8?;nMV1?l|*PN%=zEBS$$b#bwg(lRseHHKC@SYo_Lrf(#v^ZZQxGjL3x%ueTs z@pQJe)zPLs1OVZi#&md(WhdP4S6r+LEA$%U%(nx%d;O_o#NAjN`ofNy`D8Q(MGQc; zpTdU>eGe;|34<0>A^$Tg5V;cg`SZqoyorXnCZ7Oaf4JI#n6$`4bb>v%+)BY8(^&V1 z^ZMEs2@R#zE+LnI99yfuCyAY45>L@~I$AMtJ`gi2GD~nJFs$3*_EftxL>t77W6nXG zVjWU>wBg56V)44#FU!jUcp@b_RN`iwelV!)}ipvz<2xk&xKD~SzX0!muEesLCVe3;9`Ea3hw{)$b{0h$;;U*C6V zr+1v%n8t6%mq$>#H~-F<;l8OlyzrE0ncCX%o_yhtt0CTlsKW_Nj?WEBQPHRBG?f(q>=?8;}?^b3aKa1up2AlN&l+Ub$~r+*9h? zvPk8HJm@u6HgLu9c-1TH;6q>aDP%P2Lx=ln8~9F_8s5}wF3dJ0QdAK+e;@41!OQ7tXoKF8NLt~$@S#`l^;va4 zxonhR{MlR+lb>H0_qQIhP?8`%eH7U^lSymoeU- zY_(HbtZ0Kj6>n8u&OLnLJMkZ898kk9{{a;`{pCPP8MyPFM00k z%(#6qA$YBw9wUgc4$cnlYCImf?YA+3TB)1cZ6~q*AqrE7)wcRrSvUb7qu@TdjRRox zFzu^54UG-c8BKkuOK`4E1lIL)_Gg!Z+E-`kvJod$UY{1Kf@_MTbgkL*Rs-;^La#3R zWyvTDI;HJ88Ocfbwi1q0M|eiV^zt2(F`ZSt(=p=68>mGV*6Q(8zhQ>gb~}%#$O!$9 zo$u^GqXEs6v(%|KBmiv6y%Uc}^6~#giqNDoqqwdWX%myWiSn9x?E7h0XF{o6W1O~P z^LwvY`F&ciNoU1^5rL$Lh+|>mTxUH>Zqu)!aVC@$d5-U7=Vxv(Dz9ZVcuJl#AzrGo zZ_{DZ(d$-iFu#F}HeNBPNzDAR82GcoQGDF0sfXr5<^d{SX6ZO+m5`@E7}390@trv% z-+Osk%wzRLjUt7U7yOp+9a}Ghm8s+v(m1O`r_3!H%UpDwAxP!+Oh1JGtqY>x8I#UXZ>2@twH4Y#Nq-7QVjK0I;BxQ zEMMRvm4a6EXWlZ*c6RjyDBxvQ^etx^sv%$TbOj={oiL*vL*fbcrR-W3!!{}S*RrYS za&G9HjAW5&Gdbjg^tUI!XZoigL}E>$NhlDqe0XaYYG#%W3Hmk5vz4?0Jp4gF?X#M( zSSAH&w%nP^!nHC%QBL(o(zWiZPPOjGPPILN*Df9N;q~nVWH+&xxT=Wy^UXV}zscVD zXk!%O(WV{>%K5CY(|~aHGaT}_cm?xYdz&wCa0UxWM~yP5q;Wbh=-Mqlri7iXb=Okx zk#L;C3r!3FyQkAgs&HQCu=K&*6&wKXf1M6G$8(ZYQ0rD%H#Bs+osaP54wKB(>F%l18e2-L;C?gzo!R!+q->%;%dOa944w0ya|wzXb7 z>E!1pQC&KE|ACZL#}8q@HJJE|$7d9o6c$^+Sk|_-3MOs0J8_*h0rT^p+bpeAHL&y? z=Vgaf=$SbrVwZAWlQg4yDwOWD4jO$rGV;>$lV3aV-zDOZkU{NH5Qq2)i;LCHhpEXU zJVgGt4?r)^k!a)c+V;ArNJB%zM{n-CiHC?NFfI@D!u5<9kdhmLY&XiBwo<+cq^GYh zgbwQGS4^Hku6q_lNGW0{A^HLW4#I`R~NsvljV}C{F|}fDOp84F4B^5lh=PAnp^?(Cg>|S){o>=)Cm9 z<19;xTRGODpvhY&mTja=#R@8z*w79v(?4&YUVm&^T6(OPi7E7Z5*B;)n7CCzbefs3 zjk?NyPLe0_#-LN;9urgSo6T36n61c@ttG%_!TE9%w6pRXu|v)4>u+V0&6^gTg;@mf zMh5_C128q22A=h7FhXj1{Ygd2hA)#t$3RjOQ@(;!UIR!-e3eQ(%P;>?vA1+lF)?E= zNhz)zfxgGdyT=%3%+V40#cC2|ZYkqc>hm;>l<}Y=vFxc;w4db8yl}=m09E!V@}st9 z?)WMDzd!M}d_xOMBr4kh7wm*zYGVEgcGn)vi|O7u&$RA6Y0=)@dPk`H(is9H{rn!j zkH2v7y!0d~VwvE_E3NF||I@dzu<?2U7eG!f z!9zFfTzeg2ws$CnB$XC^raPS*)YU_*udm-MIoGyTHZLcqrHKf|;coL?`lx_M>-*1q zHN>*>3!OK)n`O7Dy5NPe^R=&>(E~pB5Ir63nM7-)A^*b6f@u}bT*yzf5H|DB~oLIW>mgEU)sDp z&|D6?^W=Q9=NGgPBt>bXqgdBY65LKqcz-4(at;11smw!RW;UvTw>dbrY6Hj{fQwH% z9+P6=P1Kin=dSbM%iOJ!|6A0kqO2MBI=kCtKto;1O54VQK#th8&t5y#@@+VG$JMRD_F;CYc#OCTiqe&-&7zu?Pvd_ zg2GQ{RBRzTDeal#oQW7HK8;OJU^|OP{L7ZzxI8eKpEoqHN2)RT z9dDa`dG3&Nj@e(QSf4WE62d%aFIO||15Wi0zU397a{Kt7tWgI``OT*TBvDs06DB zHO*NtXf``8rGrMPzddJsQhAA#(H0e|u-lov$*V?!4pOn?a}qA>zo9y72Ze{6Bu3c1 zCSt6K2@hBM_@|)YzX9}#T4$i%R~|^4^YA~8ofL$>Z7wgD_;<@I6WeNkM`-e+iF+U{ zfS2}iarrI4dJYL7F&JhF7M4-9eZB8yjb4HdY$P4nI-UQ#u}{oRI-fFYs9IRLeY0(3 zVX1y=8|J)6I&jZ^f`eHt0Kwb=o?4%uoM_$E3jMDoFYY^3E+q}zZGqm+h#pW5+P*1g zMa3bmQ(jqslvf~~a(*uDnY?=|pL8%jIx31f2OYEY{PYdEyIzIsjV+{U&!^)5V#_T( z0s$;b80UJ_-g5v_tGd@p%Rc4r3XQ5?fPUktfC3`0f)k%&7M4yq{@KMSBq%Ji2EXSs*REe5In~Yr8yo#(@kGNfi4`HaYsQIj;}_6G;!tPozapF9u#^ zsR*n(k=9O)kMY@O2Ot2BY2e%6tuwH(*w`&T>3-!eLlQa!H3A&X#AU~)zMh;HA(E~Lg;SN1D{GMr&Si5<|YU6~?uj^5(o1couq+R{8#IiGr+||_7v}yyD z4&F)HUXez2y-gjGU>aIM$bw$TuRK_YC0J)VbfR07vmg^X&v+4Uny(<*YxvMixNAH4 z)n9e|r)m}2TU211+uK$ZPs8W{vukR*znAA;TFb$yuEj@xd`KQ0nT|rCF8N*!=LwIF zuAI+~JSZ{~6+PW>li4fWGO1U#KH30m0M?jjWDRurwD(={-^_)<${e*ctCML=GS(&0LD_hO)hsgbov~nQLXhhb9}j^07RozNmg3+ak>`>FA+2>?OwoM*cdHZ> z-y+Aao#rZHb(2zkmKBRzg*vheZjox7TRX`U0StAhff`Fci=arrtbIsEpz9$!!p@Pq zM)T1Sjc-?Wesr}Occ4%4T&(qlBNe|aScOwUis<&~T&VT?_wS{q4?8d1knBk0R7-bk za^&_TJ!MyqUBt9NvSO`(D56E?$~Dv#Vqjokkzewz*H;_4vNZ9513M)a&L2|pEZ5jv zxg85EO3N(sL64@qd)Vbq3`b$I!}pnk8q!GY^rFdLVcLfur!Qk=cmSiWPZz_xfM{|*)3xJAFg|== z8G)ifwwS1|(A{2MIRaAVKk|?4%vAj6ms%rrSvJRh-O3tYW&$>Hn;->?SBt>%{*xmi*;P zX=v$~{GoZ>?%;*1)K#I6!PlS|>MYP>jJOsw@2)l1hV|Wl0Em4qs))P`2UIS}=3 zbT8gZ{Cxphrs}s#(V~jU_m`W5dtM%-x%}d&d;M){PpwaZe_^F7R_`WL;M?bT5NdL;aw$-2Fr0t(?KAAjT-cJS4f<?dHn^_{U+a zVaj3k(lM^VH@=T!viEWl;7nuDUZSaBK~8vBzt?bY=w>v#BNxfe4JT(mFD2jSi`e?6 zl#_7HL1}T8q$}oEVwPB2d!JI_U z;$X98%(6+>2gG|v{X`l>!cr^=z$C`eWnM=Jgb@94_fXHx)!lYR;lp1-`gbIm+n)04 zJ@k8Zb5!>ZwXdm##dJ?r+KCSFM7UrfpJ*MMI#T{+=$xj9@(+3fv0~ONAC}m{C-W7ThjI-`cwt z`}MwELR}q>CwS%y<5d z$!9(r2nYFDpi~<^mwCCAiQhU_wY=H+J)oJm;e{V7HL=s&*OL|%z{>_OJLbF|NSmGd z4aB<E4csgy6>;N- zYi|P5cCB7SG}`>|%JGOj=GV^Q*2Z`=n`FmXrw&_N#dKenZ4#n;di0;VotIk_6=tSBH#F-xty+_^~>e|Dt zZ=$MXvZDVQXwv+jS0wfD3HD*Et_q6((5VdS_bT)fnCy?2ur9RYj$>AIo+g=$f3Prh z8MqIyB7NFcPTIrUO^)933{AiJa^F1WNtXKh-;Z zTUDBi8X?*E3&J6sAC5s&}~u zRqO@BFZx@--bF;ib*ZN)K~a%(w666wM-d<=GwZ#Gu{EWv&Vm>qF zr+itq{YwG8yN;KllM5}LBY!X=oJOQ=1fhExN0CoG{-M~>=!E$6GvYCh5ZhT+xLI7j z>ZtgTT=J*ha;^1ZMi6C~flOvi08>v(<_h1s>z632=0tGiR4^!T-=($Bsoe?i-TCGC zZ=#Dyfn-wfsehNKe|AuIHr;75FsN1Bri4w`P~e_X*WGov6#wA|gp`ND%@`Gh=NpbG z^1{q&Sv>q6(pu>WA8rlCe34Jh>wn(CY_F!CuBC6szd&1+liQzHPlKUB5f`R*ze3vMK;Mf$1n(xdMEuX(w}q@7(3oC9PoTDOO7 zSYvn~tXiU12X>iKYVpxAG4-s-U8}j}eX2vQll8vKhkG^d zB;a#9jy>tb-5-B%Y93>v&F3s;mozM92OUvbVc*fod213Ay;?`=i~a{B-Hrtno}sLp z28W0BlP7czS$n>c&Iu#StqnhiC&_YGW$#~UR+S5<6;5@#+nWRas%4x(V#Pfi3Cj_g zm_QX{zPr8uz<}QA-#vZlr}4{gNv@@QVvz=Cbl=7}Q?%Ebr^m5pKd}&c3)cZojTI4w ziNqp=D)081ln|p)EXT#noJs8YAWj>fD&c=xw@Iy}Gn-=SZ!n|aoZjj(~?If`GJmEJW$bQ9w$B2#E9^S^^3pQX-0gw1|MH zh*aqiqy?$cI{`xPArR6tJLfGkKW4sne$I7$^JjDIzzS=xdf)eRKWnd6Ui()a$fqo{ z>zJ&UJU%liO~q^a^$3s=}qc&l=~NZ|A5i9V5$>5jwQx!Vxv{# zIYAo{y{|7D85zAuk@=)oX8Eto`k@~B=+$zD^pl(FYDA-)OLj(&ruQ56b@#_d8irYW zaE?FeGH86@h07WzN;&jr{o<7(Z!ryzZ(pRtK0MZ0=&d{JOf0*{1SC?Pd{Z=iz}^DE z78v8yZq~?`Pr;z{zK^Fn-+8z5K|+6L28_FGhHZtwiyb8;NOM9-$Pp9xkoBcPoi@1Zx0l+S&${Rb=W%B0r)N)zhdX5aacfkwUxN@@ z#+c!QE>G`$53EMhQqUK7)@U5y6E6t;ceJ=nX0hWV+8)ydRQ-nKog$vmz?j;4VJm}m zTIYN+PQN}8MouRvyh6}aIPyhxmq&G0?wEd^6yL*}bT?`_<-^1htHu1R(ONHGgh*e49o#38n}tqx(% zOFQ0HL;Pq{|0Y7;-OmVy+u7GNu-F*yqm2G>b~k|;UrX-MF8r&dP?4CVrk{o$y!#Nq zW`%-&mfqpoT@Y#`U+R6;>>S92_}7aN|0FIxb1k!EPxAg*Y4}UWLwnd7B8J&mr4c_K zNZuiO)GIEHyB7JU*!aXSfIf!oe+1XJPa%o%n+e*RUJwoyKXuB&X10O7SEQ|TEc}!N z;4Sn{fupJ!L@1kBJPAFiMuyjK3?%P;Di2QnTOtp@ef{I@xSE=1n{$ftZ5Lf&0VQ^9 zVBI=QOj?DWIyCbWdO5rN8_-(nJ0sLn`vSY50z`(-)m_MN$@@PTy|^ly&KKSW5^x@7@n&UZss z<+u$q>~xjk3qAXeqR0{v5wWUta3UZ!w{uF;gsYf;I4;ciYWD{9_=+d{b7moI`#%1~ zxn7@dZY|JFx$U1~pt~tFsP5DxPKt8g#8fuy723bUtKh|(*PlT{CHJfF)qr_9dUozWGMlqOV7nI^ZiooXP!fCg zpfroE?}=i0)cXX-k8E@FeguZh4b#6MN6KQy_y#~(u$y+mMiQ>EsbF>9%nGn zti6%isoFqor6p&!Hi2dmZF-G81ZTYq87if^}j5G7xfrz>?Cso zJWoQ9+mjQ|lG-c1$8R*yhl&CKr*m>hr}gw4iWCcvj7X|TD!wuK0y)uMHi2*12A(6K zb}1|5S-N6ug;X=snI&AQr#|h5u6w)%tcQuf%DC2a|Ex#s9}{JyLCRJG!=uuDqT(6E zO{o1#7Sw$M1Iw@}JNQzNp$=E0hCbj1I?O1?54hiZ zBUVzHsM)!?4L^q53L%Ke_*M~P-|_mADl4jLx#(;PGtd!*xq#{ ziB5{}GP%$*tW#=>){92{CVnTE;3dWUs?5TdekHc0&&}R|8eD3wc+@N)P%>4&KfMMl z1Dg9Oz#3b|B*oE>fNf?Hv{vQz#c(7sdm2L+CO#`kPQ^!p$66hw!qy5aU(oA;#Wvvi z^XIcP%3D*tG2J;~j8|2GN7#D9L)~N)b90OB@p*q@no?1`)t(<#kGzyY>m7fH*1@4E zW6rhDPiVU$*=g+z!^iogePYntpP49KJ zra&=mr^rsN0DqnN*Wp3*SE7Eso=DlpFoi-}CA)06L?-|m>j6}!0I7IBv@ka(i&|GM z>DoI}0RP5r_5mBVF~ZA%&%a^1qc^XSWuu*b@nkMt-^W>PH2R1>#PUpG#l;dc`y>F{ zDs&AF#M)lG5D4=Cj8U&+K16Is7gQfjdRayis{FYs3?;^?PGZ?BSgnRAY{hVb*6jkA zIC`Se6NC+9h@zaHI-H*M{Mh21;gkFa6LpPmmUKlsaQ1HHV%fjszS-rlr7qO?z zbQoj3O1l@)PU9Oy#Ux}1)DQU+awCUb9$miBfev6KzFWAN2`GJ|sBBpl6RY@34p^o{y z3Z!A;;!e^@B&Id{SdQGY=kYwEb6>(k(^Fz`oBl-tB7T$n_?wB!KC!H7LF*HKsa3=y zo*XKMb6Tdqyg66G^BF#p{;nuAFN85ckW@O<$cYp&@fuZvA5RFH10ch(h`uSU_1Pst>7;P+`6l{xaDMiU;t435N_>7|AtP`)NUDc(mK3eH zA-4dR5+a`icS5wr@AfO1m@9L3sbKP}0YIVu0Bj!!j9}Zvpo|t5K#@GL&TdBiJ|3g@ zf*tvRt-eoYIh98!-q^UCr!vB}+;g+*YT)zuz8AAWRCBGqhxgqi*gOsl1OUg#h;^K? z_nFxfT}I3;ytFL$deCBrjbW z1V7Sfy9;NnS`7bb4f9j_c8vPV6!pggp+QaBVHqaa*6*(6nMQ5qFt1@RY2~WXoVK?7 zh?Q635%7gezc^jadLngxP#cI!d%=?D`}M1a|zF$ea26|bb6*F`Z-8%bdN$AKKXb0*#)Df#o0rG zhm^&;Qcq4i8aG(;+*7x6GEc@|=F+x#xRhDjX9ZJc3+QkM{kGM=VOe@_haL(Ur(vEP zf6+1M+YNvcP8*PxPzwLNIpz4Zu2g3{Wh`l-@L%xZSRZRI$GJ9RRe^B~@?F4ORpo&s zI*oT+nq4BVccu0kGL~J7Y92+eL)@y~Chg|rLK{XB7Iq1Y>HQ{KuW|E!$^KO?gpE?r zlf~$;t*k@YAgpqut^ZnYf`K*ty57P?Q+`L{#P)7POX*&`n8u5x4N{kG@+=`>!o4-X z{yBK$Z#~wEDai308^R$$W*35yG7|DULRFlX&Ae!&Hp>^wunFu`tc-+7r1HfS2k$-I zPsh>HrLuNFXH+>G<3HrT9ioyjXmO=;bpVs#pZH+hf!zxioO|#hlGaN{IAHjpl9-t# z>I?>Uv5{R2$jp?)Tb5{#lzxx>?Pd^2X@4pZepgoR>|Q0~XVt&ETrl`GUgAOmNK*a* zu(!kTm;`R55_As0L6Xqo`qmSxTfSRcv12k%K|lELklnI{QOKfi=%5kRdGXB`pQcE( zljFTasBWg+NAuH<&x=ncO5CW_TD)6YHOh(i49(GA$$i^oxVheV zM9U-eq9|pLnjGl?jPi(sOp@lIL-4aNHQkGib$|@|XvISW_i!+M*7Ya=dxI_@7C9Nv zee6W+1%VirXC0}{OXV<@c;f@aZaP}v0CFipumnoJH$kZJcWqy6fy7i(2lP%}CS#fM zvQJdfPjW_IxKyZI*xkYEvR{M$d``#GAs8`(T|sUz7(I98Yg(1cOFACrvdQz^mT-_J(dqS5eSoo|X;sa6gq@{?hiu8mVR3fiVeo-Kh) zJ7n^j{}eT3V43r>(MyX^4y`x8>)DBkM#JSz9Ea@%6IU)NJ4ho@R90G|4j-OhIV!M~GxA$fC*}>^l%qf0u6{ZC2wx5|9Ni!g1fdo}f9@9Gz za!~o=O+8kh>9!s3y1>;>Oy^f88ipZsID02WN(>w+w73e%=tA!l5jbNgUTfh~P?EgX zjgx;98nJX!$GNk!{CBtwc8_&PO9Cn&2KBK4e}pg7HX~4V%8_9m``4DLf3r+gY!x!w z%IL%~o3TK@$dLV?g}U4vTzShqdd!s+8);uX>;fVhff!foX!#{ce(j_;chm@=)}aoY zr;3obst{~oYSa}MAn&vDL0hM#D&g0Q+Uw}CnyPb-~jJHnS} z4FI8QCJIvzpOX}6jHNfm=@la~*h!NbpDqH*yEFuRb^GJr-zr|RXvg)YvkzD&`D@}Ghc8(q4U!MG#yHN3ExXCQD~38yonnGaI3Rk9+QlNJi2KTH=$Mq zM0ra*w>6*Ne7Wa+R(%!PS-|?~oB|54A0l-H>qoNgIACwC~VJH4U zukSk?DZL-^kJ6L3H>}VZrq;za)P#79W9(5NEs^BG`OW!^bCnQxdOR%uHX_~!_Nd9g ztUuo6cAE=!2j6nia8Am*Qq!)@7@{MR;MH+4zp6KE(^qP`9lcxW9{~YWO8XxN4<+wG zfwl%I$A`>B@HL6C?W0S9WUeXSIwKHRVS7yb8*jMoq0Z*qeE_lFwS4C_7bDB7yXLU* z2=h+hD8AR`!_k=coT}1i6V9}xOU)gJY%a~p9we|f1EXshMPVDRvHPdzneJERVqFXd z-vT zz5(1xa$=!>7~kegDVYZ3Ikyx;V4(Gm;e!E5vcy)&Jhv*+VA^AF9jUW|DiAS6x^?*Z0w!{pQ%ifEbAB*>QefA}%R;0*vzG~?k28Z{M>tOj068;T$ zt;+(Sakj%t ziKX#r9V_7rslUEPBbtY#$~CMQdma<ZF@|b+qpFET=htWqSLCMx+1_ zGBNYVZ1`jUZNypchWn7tK9T}-x(9PWEWl@S0SCw%P5JxVysff&q?n&=Y(AWTQdJ{s z3C(sUoq^JQLtaxuA=5paCUC>0b(~^z+Xkf&_oKvnQUc$P+NPF48D(j7Jln{cqv=tJ z0gE{RbDOt>wPv@k6+I;8i6W;@!Sr?#YbNjv-rsiV>h3ZG`Z5$ZAkF4RIAJbnsymkP!wr(hVq`r)nXCj zIfPr%-SP$;!h*f6*3h=zt4kRGMY$>N`GHX83@Uqe^DO4b%t9b;KLiKfOtt2je5c0Xf#mvM92%H5cFKNNgctRiiuQ`MQdA z%NVvAd)*l-HcbHzocQXM{XCeiYJ7%a4l$%7ez80`6wl~WAf)n78y3-L77aj6%}{j^ zMrHm`1$z4@Uv!}2j0*o`Azu6J_V+_c_B_+`n4v%9Km~vO_Ncm+c&z&~x{fs%(5~Dw zKq=ty=xY1aTD0>-05ibhd;ESXpr*8^F9@r#L8BhMMJDdX5z^0Yt5Ipl|cP3r7vNF zO0sChd4j~(UAXx-hE16s3OtnuX$oW>2sJ!}C`LGKrymUva8 z_F)}727J6>^?s2LvPV*Rr&;@um()S|!(Ouo4LK#IV(M;3^#ZK_p5>Hjc{~qFD$kCT zBysh`6M^&Ic!|9VxZopQ`{>5fFCYUBR&fB8(7Pxt$w2&qX6>VY8QRUUSp<$Qb2jnl zrAEf-?YZW3kD7}*KER=`wc=Tf$)y)QW|EbLE|otuH&QDq;>;h4wJpGBjU zoOqGYX)mc~5v{!shKG71d2}~Am?{@rb0tKAj4DXtHG-PkDpJt3Z)M_}--z$o5atY@ zeLr%udg%qf(&o+t{`4{?R>C(;fD|J@Mvx8fxM#iaakAu8*Vh1F)hl)`CDrT24 z{T`5smOt6cIhYd+G{BysVd9s@@Rw0KZ6xLrlu%F3+){X8Zi!BIag^Tc-4N?YL?iG; zjvhonxN^ilvC2w-#zW6S)lf9&PUv2{pa4;iv4(UQ{3GsobD3edZF!_gPlxE^n`IYB{=>AdMx_;BUk> zsb=;h#ABdip**aDukE`&1|%*p!ldTgraNl={`1N0i0kpSrN{?idI#@cd)}qdj`OF^&ViJCY*4fXkHv@grksp_K(usG zr;ER4+YxTlMy5Wiyhg9>LIxBBVMC~=xM0LhE9ZOvMqRC}mf%QbVaZc1-I4mHX`O9H z=T`t5)st-E0>JZ6d-QW1iN0iA%BAWSnvC6tc=Amk1h6;br}sb@!G3XvbA9|dxFuk7 z@{GrzM96x{ir{dcQaM^N5Dh$=Qh9X!>vuPzV->bS_d{+_%u%eE&5W{MgR~dU)I=V> z7xm9W&Sbtl{N%8_aHY$lwFC%RPzHF)+~?u6k{%#z4Sr4-vVcou6}5Emxuu{dMe_>H zzp}hqhxMASK|6xk!#(4GvF6K$s%OJq3ffUz2pW&pV)x@>#iiBQ|*bKs0x=mK8=zNR_u($rg`b(CT z%s+R0{>Ghp>W~R15*k2 zL9}QQ$FeO}xN_sw&RE3*)66M7^2Prw`MN9rv7~!pmezRrGhCse>ReT=+kUL055YQ< zZw*$BTkGApVy!g9_Nq;qEL!M?SQ7LXwzqHFYxxrDZ%+WhczoH+aobGWICTX?@$Cty z=wS(viNSau?;9xK z2paFixw^FLF?GRzvxhGD&Ff!8tpf0_cqsM$BJaVcoV#b)rokZ zh1&VyW@jS5q0G3r;ImxR?HXfn2iU^m2~RN(4;fBjpSr#^1yZ8R+QrX&(aVC%IiGK} zrpU+^^d3kG!z(K_ej*-}F+rUBc%uK)-4kR>r;G{;H?07|B_A!sTNxFsTYw)KGy&ln z!e8QJHQgDpZJ1#Q6e(G4d3h7!{g9Q%48@IY{6WSH0P;)phHv3C#LafCb$?Sr!6<+M zURk>C9S!lUdu&5$Zb^k)eS=J6pEZ$#!e(v82yMIM^x|e zSrbaD!u~`9N90%y%$?xuHmv^Y{fi?`vEc#9*j%xn`P;cD_YwrytpR8F(U)*Xe)Od2 zwdk-5PA%+PVz&Xe`1%_R)rA>@5uosks~#nl9Lc1c?p=5@XQBNaaA>!k6qf~Z5|SzV zwf)Cp$B zcj64fZR85B{%}w3h*sQ7+9~>@*vPH!sT6Ad`g;c++rJ2_=ClXSfN3F@TWSG*;hIv? zP{z2r;X-qAumR12-%>{1?uQW6C)=nbLg}679@i#K8dUe84Og7;_K5CJcJT+i9(TC^ ztmsd4t#bFvw<39p1OHt)_#JitJWW_u*1-DH&=|5q=AEa%dczy$MuXZP-1E}bw7(5Q z_LOJ0Hs0%El)urtW9i>~rNvxZ+SHE|f%=*@mO5mVHUw^f6j^}ij16~e)pQK=Bvk?- z+mkr@VFe(jyB1Qwv3d|^{t6y;hzlh40RIm6^VTB0gPpIuJLuC4Lep@(cZdE{1Yq~m z5n_ss;j2e21LDlp?To{u4g@%5@6dvVsl$Nis-xMA#0W~wt#AlLYPIe=A? zX)3+rmrd@ZSGS+=ZI(naob=4kq}(;4^6`H4T&(OR<4-uc{FD0blhN2jj}YTG<{rC@ z|0R3_A-yi|4No)v{!ti8LJ(du;x-J+WAXsw9EcG~H{I}T0HFEh0G~(Dl6yq_90roS z@6bv_Kr1DF1iFVTX)69xMENWc>#IX#r-Sbl?~71r0+I1nlj_KsVt znD}^Zw!jk`zdzM46a5kf2F0&`!hcf9PU`d#Fi+F4+*1sCS^7TwZ>x3r~*b=R`;9a zi1;$*gC+YlHzK2eJ!w*wJH;pFOnZviAs_U4`cD9mHIrIVX`x&?76;5ED$@TAR7c0n z{cJ*x{TVm$8ckzu`NH^kVD`?jA29@p!)#S9W2>N}sOGBwzA5gt zbO9VOEay!Y-pBS^mAkZ(|GWQdOBhfUA2h00Nf@}r zl9F;00*uV>Vc&8a>MC><0kob=%75JzO89jjr{4UtGyf(nF8@#ea>V~*-h=1H2iJf{ zv?Mv~|NNc4{8K=9v#wnE)T;|D;AJ$5I~%g}V~&}(ZN@YO1DEIW#0OhjJ8?A+pSiVn zlx8QWCk?l)w%`IT##4t-9j%m8Z5MxaP!w06+;DOKX2LRM^-=@@0}Sx8k-0~VqvTNw zH%WiM9j^W$pS09?8a=ugdx6M4m0w~@F;0is+9x_@<{73Qcrx@C6m8m{gNtUZ5 zPnB`0Y1tnzBDtDY4(rmk(D#l;k8Dmw8Kc^Dpy*qj5Po zRVQBi8C05mHlnp4(xPumm~t=pJ@ZYdXxG| zq3lOc+yLfHu)MoY1tP7qYj{z`1p2>q;Zad~>v0n0wbDSg5|G6B-r`e^pyT_(ZbSwu zY0%n*$ej(273vso`rk_WGXdYqz1>7yR#QLyubZ^J_4uS@ZagCW0bcF@{@d=}^UMQu zN~0S+vPLGxr#$L)b$c2jaqZiQ#ks&h(|xd{r5*c@eT5#(zi#%F|L!_oB3dt@6HR%e z4VYDh_RlPS<*ZN#fV>rH4ZTtC^Wgtj*uQ*#Q=;I5j~l8SCpFh7z8IvnHT7tuO>skB z(Go?;A?Vajl8WvX+f>YZ;Dv#JDYfby&e?P$63YGrU;ih$qOs7{#M2$f24C3SDf&-S zY%Chc9#BU8I1E^2=?^{kaQ~yBmab204d^ylT75TwpXdg@OTHUAjg9)`JLyA5hFq=9 zK;_Z!jI!T;|LvnKQsW@eJ}x-a$Mz;Mx^HMxA(Ki$GmUW{bFbc<6P)W%KD1Z&hf$2q zxTSWBaH=fFp!tnho@1ouRjGt?s8#eb-#U0*BdG$z{WaG&{~N?jF!9m32LDaHYb*Ry zrC(AOkYG&ly&UH)-5JG;Ut2hboWiA!Uv)l`bdLA2s5!>_&&?w|Z{D7}3bGGB(=?yK$6*yR8ul|S2KE;iPP{eK`Gl+f_cFEoYibGx zB+^;=r}j!1TUFx@s?(X6l(r{o_GdVy({cFG1U_7vkfEw%y@1bLKU}Y^N>CJAJo_T- z<_|)&<^7#!=&~3Q#_wpxZK!@nM3g?!e^-m9RjrSUf!o@t(aKiY55W0O92W|%_T8{`l>!bT_lF3*sMCQUQ4I#tQF&Q=HIenC#2r#Qr!KA?gB2!ay&f4S9*T{EkZ- z!mSPQHeN$=@b?0Yt})@}fK6dW*Ukib8Cvd(y(b+ry9gf^W8Ft1%46VLr&=zk*be>$*&o+)oA7^BF60U^JZBP!mzNctSV)1O`v^LYu?MvBPFjJ==w;-BcNn4O+ zySJSa(pounK}=NN-|@pOR1Tq~ck+^Qq%nI}zwz`HhN&vLg_ZLjnob+2{#hqP>5&ZE zqTfVuYp5f>BfA)^K?0tg&hC%Hr(NNw6H6!b-VK$N6?`dbWcWg-emZmX4QJ=N#2Xea^^6LhCa_Z7%COCXz&)g z7aKx!s7qtzkD-CfduRqIjaGK*;L;tURFX$s8jU=wg4Sx73ST^4ksf;HVS^g6Pvg*H z|7seV9;{0L;lx>HvsFTRGANCT59_MpQ*MX+#BB!CR@hzeGpK>0e@?q)&d0|bpN-YL!3|agJ%qB}}B}+U@s|Q+Fdgp(=9VmAh=+6q- zd|xr@5IcE`cKzktTNz^m0kD#hDY8kV^c!cML&kE9ENuPn*ANr5|1h=VMifjKo3)<7 zJ-%6QZzY;PuzdtnNE$M3nPlQVvcOk5kZ;;s61t9nq^plTetVGNJ7OD{cShAImm4$= zd%Q7WHZf8(l*BcjZCPl@{L?S-L=SzfVk4j=1h;HA0yD(osM{8kR++23CUl%6gm z{Av6)9<_GDLj-qUS@gZUih6$<)8*C&ZkI(Hy=2^ONvBnA-EwwV&=Vn@E_G1kDSmV-fWL@)zTUt7=w1hD}@hB0T z4EiDX<{T<9Fbh}+7ctw$CztwDWxJVUUD$swUHsm5NKHxTy17QSuY&taeANm6hJ_v( z0d}_rLC3vf%!yUgu<|MWlZc6?RA+H9R>RYdjsaX-l&WdK+Oh&P`rpALwbSp^$Dib= z>z*BQeljObf@^oFBt_7%QTnskjWIr>SD-v7W1|vIAFgb8r+W{py)7WB&>lG6tF`uR z7qA~)K3Lt}bSuSjuzI)OaDeOb*lp8jC^4PvMBcRZ+70TMarX?dt^vaD150}Q)w?e= z>ZIT{uX`P+(h%D1hGj26L|zm)I9?Lw7}b{V2Ctz@M^zNruF<8Eps%6JuF_3fEG@!N ziLHI6UTOc2A2oY>h-;edvRB3fsbGb5+ii>(K?XExa`9T@@i)jwVG9l3hk81sqtesM zmFIuA6a~VrK!L$Zf%r-_z0@GXRMA2aPHeYD)5RmN$TwQ@4oYX8`ieGYe|t|OQvF2I zK;=@B_APse521f=)^CM*+U-Wj!>=PxE-NE{3iQ9ZU`TJTs8VdG+M(X+!@V@*(btjx zhqEiadQ)fhrVY#E`h?gkXbDv0t8#{~M!gAV#S|SJ+#53ewyF%(e@8Zth=J;b0VX-S z3zEwXlpjULSk}7pfPJ(?GLR>bUlGSXxOQxpYtR5X&clG~^%^Juu6l?A9KZ?G3y!j* zby&!3x|LB!Bww@5TBPHUwu~I(vifXl4hI-zDX)R?)jIW3w)J>>vLXdYA<8`TN`e!!H)JKU@t1_2VBNIE#?PzA{CmH8>n+k zOFB3C!tLJlwGDXC!aJG@+oFE;e%S6uy)7m=GaSt%Lc$*V7K`2L3 z?fVC_^L8CA!7Vu^Er#zcG04Ffo-%ty_Gpx$V|QR9g}>uy-0t0 zB6tD}{Kgd85zi~h5F$OPg`z*2wDc`a@Z)IRp8XiqZqDwHqA~iM7 zxb{Hi+FZ#ihg*+I+Cr8)QnZ zhdbWM=PeZJSIFPE>1COpdGljTyTyqHwI`F#-a` zoMh@B^awu5)ajk%%K50fUkb8>8Z^y9<;ae12sN*;)8C;thMY^=A!Ly&)a+sS}}yD;eK9A4?X(Y z^P;$Si*V52@CqJ`=aXV+J##_X6b?9{`wJ_l(^`waup*ciO5+d(yC40cdpw!$*RSnJ zuy+K|oym%z^UXJM$a77l#D0WfqKuN;E+gyZnG_jRz3@vFVX!)FU>;L_t?lOI@mFfz z_FSBtD!_%crd?4^>?gO*wcWJQ6eZ^qFFp9((3e%^^_exal)dch?7cZzZFOJQevAzS zyHcrX9L37XH{cswGXj~90}PR-U9Nis`l$!8mbsg^CVQ#BCCZU;x5&E69Y)A~$G(ke zxS3XE7ACsLbd!YgRSrF{zO@%8&EXoIXod`(xn3AsZgt6^8wbWwTUYQw4R-V0K3X06^D=xupepFn{rQL+y41DD(rX{3_&8 zWWag}ezBIy4E?AT8W>@5sR~J{8L9tnj5TNVuowgm+lY9+H`&@_Y_U%rTGXByCdyC_ z?u&guoB2dZJOxf>!JIxj23eMQUj8k??ne@~-%a-TYnxraa$a}NKlDk*AZdX=r%ug2 zhwv(#bU?pONlzuqpQ(={hkWrbi6Obo0Y{+QCM2n?b+bqQ>o2^~1w;*cH}n4D?e`+X z=>RlrL>`c~17j~&l;}O6(}#cz=f;{1E4VFdV^A;F6h+wpp{Y0MR6I1xZs$$Pd=wOV zalcg=rNSu}-+B?)U$h2M1N5Yw$c{MCmhTmYPs9=>y=hG*b+`El!E1$O#{^KXm^Le4 z$mYQclC-P!a1MRseN;y2_0w~c*}4l!=KW>BzFN1vgow~FVSh0V`-=sb47g$yFO8TBCaabUe+!bW~1wqY9UQ+eZCAr>;QYW7J7c?nSfHe zdk!~>yj11u9gb1bPY2R|_|Be5-$L!zR`b*TLAr-~FUFie+ulI&?ietb>J>hZI%0VTb_~`Gm|(AmeqF;re}U2cIvrm) z-<);j(e79nBi}fE*b}^m29RDaflrgMUPjJz6!m6y5o!U0AM>w+f&bcY?=$aV_1z#k z^jlN?F-quMuUvNAO*FtRx-rXSNxchgJd$A3c7Fk|)oJrApOO}e)w=HpZu7oC)*nc~ z{8nL*k%MxB1lz9MEP5MX9^E8Q6Z5G0`|;jSvNS7nNIAJwGAPqae8|fFqG7bOsm;Z*KIHp>5u3=MeLn{D!sCXNrKit*N|Ym|h|YUH$~R zKK}%JUXTjR7Cl15dy{Q^>wqbdqsjtS_K-OX zkmTNH*u`YZR3JeQwev~xcR3 zxQR`GbpJuC9JHHG$78mpzDRwCHn26AGlKsti%Wcw&(xB16l2Mt{#_U|L;%{BL%u1A z7+i;Tvk`hXN4Y;m$k`{*nppJEUSMvyM{6v;s; zY!i6KYG&7Bb@yGg#&BLbJBjuFvZKM~^a<_tOOG^UO)^r!SZ3&X2$D$j@Xv#CG)5mi zziC%o5`F<%CDdpxrt`^U#T2)T`_Ah7Bsc<5R%^w^Du>0gydxxg!vX*!ACM}`x`?ar z0g&?rb-QNdrY|;~P=;<(&FaJd$>1ea&RlQ278UjwAb(F|hr&pZMK1@JQZ4bQ3k}x{tAxjMZAZIG=sN1oNcipuX zURKs;kQ@&V#j4SVZQ6bgBzQ%4O zATYY6^4y$?7d$IvGX(d_sZs^{NxwnF-CkD(w>rC@uENYeTG@;(EG{-&XKRmad)zMj z!{>DQS;8Zx1zha9CFhf;#+hQ61>!e}(1kEW+?V_tis0oz_GE?;Ox zxRP}{mU@jTr)`qz2g|%ue&m2Nq3N^Tx?dl_s1OFo23~2|umz}DC4)wnPy%!KXfcLOG!frUl zke~bVZrp*ag_acY{OFbLRCq$YdYKi^CjY#QdKib#Oi_k^9}B<%M8Vx+6waB@hY6S1 zGX7Xo8^A(WmrcI8!onI#d!KEkxqiPRo8fi6p+I~gM{xTdaCl-#V2dzpzEuwVK(6Cp zj4q;uNbh%t3RrNc;Sk6=@lXT=J8(j4mESOIWqeI^5IiA5S;Ab#L(rjf+Wh&M0T1zP zp=i%gqL@olB!A47bj#`O26ho@uYma~QeAq!Nz}CNbF+r<40=HxzA_-GRw1BVcZp+k z9z!M{t*;pDeeo6DVW_%ums)iH^y7Vshd5p4qbdk zld_RufZPMi{NxFwAWc$f(ehXL_#DDp!BP)MFqDx@QNphQ%dE?sb60{MeVOu6-+KIh zbPaOM`)BPXC zke@)y(>)uiB@V4pcN+HVm3240F`e#`fs@{}?`2@PsDkBdrJCiByJ;hJGE*qV#!4rg z?KAE-U|c4+cg3=TU*e&JZD!xI3K4|$$akMU4gY0nIBqGO4+7*@{!0;*{XR5nl1?6m zM&V%sXF#IV?LjDI6j6{rgkJ)Qvw<1l0TurFR=AxIwm-E3FhzH5$T$6U0~lE?#xIeh@;bp zfP(+6o*d2at~^(Lw@0Et8_qjmF}=nDDw#$7a#_@HvU`cgYk$($6xGG-kT2@mdW{2Y ziQleRP^_|NyHZvYc*P4zGyc(_&>5bBs+Qg?(m~D5O^E;CU6)?n{jSTbR>Udkh{jAu z6#Y^~o}%a%Zg$5&CBVj7j+|D~`VG}Pp$W*8Zc)lDzQWJ)4-Sf)KcF`ldVDkfnASb? zHnx@#x;E1yV%h~6f8I6~iW0>%waPoRXdIU-F&16Q&+svr%NK&~Bw`-xl{k9W4VY*z zu)?=4w(NWlte1!W_!+`Rv&mSptJtJazRuFs-d|t{QZdIoW+Mfufk)7GreSnaJVtN$ zo&R6?J7>t8{Y=O|IOS1;Phbd%xl84t6usTLK~y<}ihUy=#gvf~TU<{?MxMQpl>g-6x!m_=%zI8+N;P`H6N-Si@z@0ij=-ahnZgR0De#Qt*hMrGZ~8mRnUvj1Z4owqytvM>1|%M&^DfP-SO z$c=-BVaz$%{ok-;fr9`tH`NYkA6X&CicT)bnpTfC7ah2HH8l5<()>%*HF;K1&KHpK zxW7)jR9ns_F=V-A2P4mZ&!+5?Cvrg&oauG*^xx0R!AzVMD^6{NqJ5bb6b;qZU1*d| zE-e@&9&Xnb^m~Z65Z;t(2mj@4D_0-66SY$)ke6cCVAkNDz57Q8xT8`j$?iJsI&CrX9;O-#8aL@YUA#>@jbMf{~wx7NN=smLxCFfN~*$~e%-dg?9BhNb(;cpUX;$@ zc1z{^tC!%Z-KH5;F2VcSn2YHhdlVQ$oe)}9agC;TExivkr_EzjPU^Vzc7EP&=RdV6ml_Cb3-{(l+n_TIu@V4 zH`@aqKclF54=uSu&$)79-2R~984r{i(f&_9zJicK03LjQGWy+MTij3PjlDRO;vAngy@=g zPYhB%xZXFT;_QEr7;+K$?+n%R(_FO-8K-X7IJ*f|jLqS|(ZxDx>|mvjVeYV+s``8S z@Nn1C22`NHcXyKI6mcxx`x2*kDh{@_uP5$GM7SBy&G3(>vIG>Cjn`=}5t%>-p(lgg z)u8vxWOanPP0o#c;km0{_n(kAxaf5ot0(M88j}BCNQo4b0CH5yE~uA&Bq#Q=Znei^?-ftBnkoKR8!P*JcRM#V(#PWl}C zd)q~&;^CK^Up)FKRY{f0&zm*IpIo=Tq{NYM+FF*PdAyIpw z`)#+0Pv-LY(_O}N{7ceb2=}g!MgR{$E#Be>grCJCO^Z}W;&2zFn`v*C^skH|-E(RY zmh11z{!r+VJjyq&@_(@P=HXDcZ~S*9RAMTHvP^d>b;rn(WsDh1OcIj2kTtU1*0FD6 zNRlwaO_6N~(PGWMuQLc^Cp&{-tixao#_!|%9KYlF<9YsbjM?XNT-SBJ&-eRv4lDJ3 zTzY{S{V=R@McHT@)U3**E_^!4? zzXDMs)bgwhE6Ht)0`w{QQv?kGYd%^VjxUP~CIKu^tNUupt0;Wk%#fT*SETPfR%xC8T5+aoDR6VSUv0#(iA83F!R zQO3YC8dkR>$Ty;-B7Nryv}loaQ5-IauxyI++r91F07r#8L~4JgJbzlIouB$ zEfLA^jgP$@1#??cq1_SH5deBCyojw+cSJlMCf(os-+8a*#0R1faG(EOV^WgAvr@>c zv!Vs<_}iFHu5{ndiw;d~0TmP+TKJv-aXMCDJ%e5^X#I@e!$EDV^#Akxj{nsKMc=01 z<#Q$opFhPfajoSI;u^m2)jI#aDEhwd`A?w`an6_iC1Z=bx*`PR zNK3)`kK2UocKqZSKxF-Oq@Y)UIg_0%(U->tTnC#(m=xk|Ul;$p*fZin#UdgXVz%{FMBn^q^NjHo-qnu{Q-Ga`kT3ob0vpr z%r<-{r<-s-<{hGCXd zgX(ch+w4`zU#v&M^}UOTA{kI2Kgt?XqHL*kZ(08z%@OeD_w) z-igZvkvRuGvWyOp6BbRJMDv7zk-^V$_v zTM0BG=HR~AMlbwq=G3jcpP=W6Q4wdMsmDhh%%_LwtR>t+B4ApmcD*{Bu@L8<$^Lui zH+1z8FQE)5wJ{aTM5FU>iLM)Y!>?A~0qf3DM!0{$xhSwaoxPq%>Q1Qg$ekaMr%9oL ze~HnZ`g1yUcE@EUl--6`WYN@>lC^q5_Q&7g$0Dx>Xw|1h+;aEX)mOwV>R`*_CS~HZ zUN-tj3?=oJNhzM|UHw1E z#Gil5FO*@y_mcdqbGJB(Zpjbf??ar6CT=_IBb{Ttr(E|-=6RCKc2^SxQ7J-#TbkyI zL4C{V#j#@C0+C+n#HLCazJ;y#`|E&lTIX{rt2A(;#OhDSPD+lh46hQ|`HJdDMdGMD!)`s8KLg}C7{IPvFCVAxeP$-@*KDbo47?YlA(5@@} z4Vc9me}(@$Ddg%kL9PKULmjPQyu4yp>d;H4-zIjc^Tw^vE2EyM&ZacBc+R_wHUe+J znENZ80P*g;Oi}KD%a%7?o}0mB!@q&B`#+I=-OGC; zRD8#QUqsNGZh?uF(QNqpu>V?ldeN6@)Sb##5HI{PrKC}5jLp#3SU>)|WA zyO`jcb(ig7{@~;Wy+{=^@(E)8DPQ>r>$!Eypl`D^uk~8lQupR<(7TVEQ6Q8}@?pb) zC#4jWrH%3N7~RrR$`XUSl4Mc8qsPe3kd`7oerfZ|)c9B|2E!~-H9wIcVfM+TW^T=s z%+)1<#!Z4DJ4@G)!8UAab6*b&89}!I-ULM2N-JFk{%04cJQ9=M~8X+M}W=a zKi3PjK%39PW~%7WF~9P5Ex@YN1H!o$eUR#vJ~8uS%MsnNpjOTd;F~Qqa)O^6S1RT; za6kgkK5js59!y9a3G1O(hkO%7%jCyd01ilbX<|LdCrQ@fnYUN@gts=YnC_GMqr>&B zy$4hB$D}+weVhU>C;N^Nt7rrD0wC0k(el`&ee>WTc?3W z?o=5N(7Pm`eRa3f5&yJ<2E}Me{Q%h9;)x8{S0*&NcK7 z%T;&>L$1|aP*I|eaCndOe0&Evyg=n-_H2LlmS9G3qgG}^#qKb*%&ImwdrG-Sjf>s< zsy0`&mKJ`m>4ew)I~6!=A^bWM#IUM;%QRM-&oYsGHPk%b*TmfgaG3`JpjUwv=wT z5+^qin7IR+ts5q5f-ew3@3t@P=%2eXf72NEH03Z2PD+G|nVHTLI=^itk1w7zmG>Yw zw*Ts%()}Fg{S$Hyb^edln9kT%5&5>~&&PM_-*#w~o2xN;vOEqF5dp92jJ!zPGD)z- zvzGE(mTR5tOPeyTI_2i@2f|D$`g=}jSvM+2hjNCP^A_uR_G6q2P<2+bbB?9CGhYFJ zYWotd+TDaVwZ6eWqw3dBzv1f3uU<>y-`76^;E70ofc2BG(4CrGA%h0u&^f6-lZrr_ z!g=XGZHSiX6NT*ogZ^WxTuGPQ*uz0Nmw-z@6P^YEFJnHGjl2A>;YhoAdpQpbkYf7J zilxLD4g9Z{ehj7TUr2UM^Z2+&-WhY%!vn(W7JCTL35N<}4rqJ6k4<`YbILMPq_fk! z_HK#q4QU%ujSce+%$W9##kGAd?d9f8&q!77HfB}8%V`7E^QKKLuUX}#zb$~DJi%*; ztubsy9ZlmveH*T8t}m%lvNf(M*=0M?r+I4Wv`NZb<1#eor<8{Sg$#B=7zFk@Fy7qQGxj+ixizC73=xX$<>y~bfjzSa3Bfm~RZejafNgRO z3PIds)8b8G#@7$}L4;Elcd5_9L2osyVa5%aNJdBNIhz$uFW(YmFDKJdaEFWahbYcZ> z^2lvz9g&hvzg)kTgxI*XT60&VHXY$BCSINwqxf&);cF= ze@FA{=^Cb@4Q(nuf|!GInm&{>gpD=9oSbhyosUT9e%}7>0Oz=^H$^B5PVg#iT@vH; zdpwa&y1N9fuUD?`zUWcb9=%2(9F~(F=U`Tw=qvItID)#4>N#*jWKUY4o^*X<5iFFb ziJYAl{72MJC7!RA+m**$Hq-b0?)xyCJQvC(wK;18@$?G2l~~FdY;ULpcK#^=Q&?90 zm;5szHcRVIkwDuv9y7Fl>1eLmA@+^UQ`Sm{&6fbV&3P1%GRFch@>Pu21_CQ$8X$eH z-&$iBP)EgfQb&i=+_IR*<*@*u_w28E0{#21%Ddw-$34MyUP*fUFcG#OwKNx}*Uirs zGjroC*HK7^<>)#IaBr=X%Kr;5VEZ^YfiJB+tYSbcdi@_?6me|S%~oE9n2-B+UR2fn z68`f17d97RrM}0>9cL63s*42b_KK_fZ`Ie8`lonmnA26QX+**)EOc`~(aj_!rBIvl zO;r6Pa>!fZYzTp8)eKGDh+y;N8|axf80PS#XQ*c?AD#^VdiW^k@DZ{*F_W`E}x~tZNpB5iC!~(h>Z#*6asEIwDcdA{W-j@>Bj}9n>3soqw)--#kiB(Pijr z{iX01d^V5Yr^wQBxo|tQNG?^wR4>Dqm0!GG<+eu`k)rp0@n`?SxY<;ZtG@X?5dvFI zFcd#wQD+CQV&Q&`1lr8I$hGefKE3bmWr{&Ru>cl!_RF4j-;{1$RT5&Yi+G0!#TLoF znu}oj{UuQNCZ~cq>Y!qax!<>Ut+BcFs`M!o)d zuOReRYN*Qcbu^|b%RevxXk>+7*u3#E^ntW^nOQ~kNUNOE&A`<+>iv>b$Xms~3b7C` z{?bKam~`OkEZfe22H&_<0OQKxOw$SWs;ZR4Dh2_v32co!cZ*0pBk_%C{vFNDWrs~1 z(mk<7nCT9C-ZnyO@ED{T;av0Q-4ZQa`5NyZO--O1V!%HPkCE7P&t@7T4e@n_7ju>& z6*8FekUEo%>h{nfjeAxv2ze%cZd1;``djO(rIZh!?^7}?5yj4DW<`aMSoE3Cg7OwY zdO>y-?a`BlMlXhi8vCzMjt<_*vKF`dAOWrk6uwM>H*V=t zu{FBiH(y_0x|#V|{=Jk<>AdFPPFQ`_-RLp5+7e=r(%iUZ%7&vX(ZXcpc6eLpH=ieZ z6uiIs_cd#Zz(#>$5Is$)RqDEn(*!i=!v2pVf4k9i=7~jCc-b1gzpj-gxW)o+m;TWa z7y~lHFUt>II(F1#Wd!t{=PCHqG|?_%=t`a)5>b_|dV0slR3-c zuWR2ZPN)?}_@xUuMnf!_)aA0^0Lu2{OA{9<<3?#hr;>f<`I zni9$n+Bu!X9%I$dmqw+QyweS8vqVXa@4_hbecK#ujDa%2VxlyYC-uf$3p*4llyc^F zOp~feRpiCFbp05brKYg*ZS6UP|SHqqrT_??fu zNdBoiZEE3~$tq42s*!?aJ*{wd5!^~9rJtuK=Hv~cBR3&>XCTvT+3;|$TXr7n;9TGP z93nc1aJW^QKdHqj$oPQRolsOZ+e&C(g{$YBNrnmR!z$+c?k?>(`i*`mweY^S^~kQX z11kGC%ctpMC~2gBCv>;_u_3F-|DWm{7u_?-;{yBR)0t)%<@xWju0wBNdiTw--|mC_ z8T?DBZbU?GslHcmcZAG$GSQ|!`JX|PN~{0-pkV_R3p1RhD6>F8eIPGbKK>!N-eyo2 zuTF?26H`8K^=s7EC`wq2Lf4?IrrRI_93+5`)UE$Z*_ZSa=0ilSzD*#HPce|@@~Ev& zxi9NI9sa4N@ez!tbiWjQYn^;tMK$S7Y?#vea>A`LQ5My(9=Zz9Zvb?l?!S@09eMp@ z9<9F>z2?`eDdr!46(Zt{6bi7JkW1%PKgZ>(4dic*!F4&xJ0qgNkoE+e%nwrmH zUjvLLH429SMkvPU>6asbNqeJqJI}Ri>g6NMZWC*ZJ;0#(`=9$M!-C8GHH5 zF}YJ`k+97-{>cBm)>xFnPDhoq3gz1s^N$SD(E-V`Tahy7#Rbkf0Bj|xh)->tSG3V} z2DD?S<5HqER_mBwGBhLl@fgUxb?=_|g0=n;P*1c6nmboAsXw;-DZq!*E(n~z*AHM~ zkIJ6MCp1)YO!-aUxJd4RMhvSR6KCh8=Dw&8L@3C0RCz1)&ilMEaVqjl9(?(^^ana7 za6eFkp@tY|)c zYW&F^ey7fWu0b#JH|)fD&-_{pN9w1=onmV2Uv`u8EJ6y7gufF$$bdvcVbqQj zBP;FdKlTj6&7WKsqZPbHvz6gOdpH@f=dLT|kcA#N`rplTFVw$Y3yoI>D^_ZDha8$T zc}FW-Mm}Z>nJlZ#iNa&xewr?YI2L)g{CRud93e>#`P1~JnGJ%xKp)Rciy?mU8<;iX z%0QYbzH0vkiDK4n5&na@!b-jX+q6R^t$=!seyhInZtb+Qp7;ALly?ahJc7bbf2_F2 zGOFz^%Jm{vDF&5ve|%4(!f{5f6R77R<0hA8ml0mNv&?WyaC9-;!h8)r=}r`l0Y#VxJBHu zvI%QLnxc>2;6E07z3&K*s*B9V@*{~rSZ51X0<2CHU+x!pNyf3o3+>rsBSlIS@|_M@ z0yx0`1QkC{7Qb=qRbN2IuxG+Imrn#99v$!b#}36`Jg{yrz$ol$a}9iP?(9jg!mFsU z3!h-iYTF;d&I&2C>4Rgmwff6KOI6m+X>f9uTcFrb%SW!0;?%v0FU~dd60TYXU!Q3G zuQzKI6^8#2a2zcFSkbvo>%BM^(|0Frqrzr`Z`^jEy-bN-AIW&sQiu%aCQ0E3+e zC%196y3JtDq#SK!jh}uM_eO%cqpiGB{EZFkTH=_@{2*an=eAJnx&Pc?>vfpW>aw~^ zA=6GMw>k5X!3!wNVRnF)?9E4VsSS<5UtW>*D`ak2E;W7J<6_Ol?S16TwTo&IrZi#^ z{vB_SXg7E4j!V7mzc26CmQKl57TI=P?EGtY3Yx=wb3})|z-Ex!8AH9(2GD2(j83J` z#0qvk_nFvGN!o2FhJ^zUSePf2R4?ST%PYqaBc-e(twm5<4`1fcaDgjD>8a8VFO&R+ zzuX25HEf+(c&`W&|Gq%m-((aXy%f@>staR0zreR$5=JH;9j<19_ov|}qFa@H-K?FUHEF|uFjvvMQiQK5PIzDiz4S0fP`s9_`xkC`Re?$~{hCw&kWYQLlbwK5 zHw9sLw2~m*8`SbK&eo)FkQ5!gi5R;~D9ak$Yt|5RkHOt29x?n>G^51_|JkONirg4H zY6i1n!21-nbCGB-dk?^)rVRwQK%08^+-Kh2z{@G%=Z60dyr!94<4rrZ>C;XJw^pED zg|x!!T3X@m05!`Ys40{-8*rhFT@US0c1yV<7?kasc`Y?yJ#|$7K|$7|zf)EI1N}T- zx+u$OigF6B*2e|Trx&%6RnS`+27nQ^e&nRWXKT0g(6|%Ri&Y95L+o|Ve`(*3Ddl#y z0;ts&WS2@fT~PXL(K|PARd5xtPa~OT*URWvzzugdz8P#-T+Pq7ViQ@Nm0_<7YRHsW z(dN(T)>P$4DRUB)`HmS0*6ob#ms8MC8VMt6e)iluR7@M#2H(*YZ;4G1li1AGxXS!J z@!3Q&b#$&V2}s9QASl?qbt3{zn92~H(gH&jiGy1v5C?Z_oix!z^?W5C_cV(XG3usz z(mn=5E^z9^J+hv(Osn7fGKp(`1+qvY6O%j+EMfVGf{%hxw`{V=xVkchuRuYv)U*Jz z(!q=7BQWl8f{Zs7+;a$BcvsSvz;PLOkYZ}a9R8+^{zld|;23_4nb$C`zThxDK0#5o zS(7!XFwvp?IOq-fhD!n$lNgRoeeWLbHI4#Y_h4qPm$U>_7|_x{u3*i$Y2!k z$Z1yF2jsFgPM_A3{-0$G@{wsOKEs1pzH}~-Zz|xQ0>c(Aiy}1k2r1(Cx~@$ckfVhx zy07RW4(as&5^8QLVyP$o6cUy8id1rxo!n8knK^Jr1@pMZpgC*gSchg^$;hN7jeRgo z?00DY*WLENmKtiLZ|=!`U%O=TBHu|uIuCTkiiC~eDq?q0#m1@Wj@V8j}KgJzgbli5MfueA2@sCg5QeU#o#7vrrCUqO{Q<~L!4Z$qlHP&s$dKhHb&&}oZkk6 zM`G+~(FH2@ZOpvZ|T0Q{KR@a5juo@{3nTct?cGBK1U;}ZfYdDkj2Y~pT`O%Nm{bmVFX{Y|_MT}Pn66^2{t0(R+FZzWWNO4N*u~Us!8)?$ zQv>hyUJUB5vPR@fU-r>A7WBOQ68yXcCUm>MNh7lOycmbNgttm=(0OxVZa7cz(`w3B zhpSbO2KfT*J=H`mKo-S$SF6GNVHzIUe2DE1~ucn^ZB*7%?&l{T7joX=rHbXcPQSZ7JIh=~p2DuO75 z^=nazM$kj(?FR1F)I6EwaU(AGP+HCI0=2u{n|I8k`4Pdw%(C;Yn|o;G`lRh-+kS5n z+%-nf$B@XB@ONj!Al(n{%PR!Ma2mLz=?nM!<4<|I{G|tD{Q*8K+&3_i6=OjSw$>KD z?nR$zwf6TAk=pP(T|`cCO-_9YPLZxt(Qa9`-xRjaD4uvzCJL-8MLbcmsO`5MzX6jF zWX|jr{4pW*wL_bGPFmn=scRT)L5X#>8sE!!Mv2Nd^@*|p-l6uP-X5e~No3HO(t`S- zkXQ~~{9YA&->K&5vyOk&(ITr0zgJ*&&ebYueD6I%{MG2j8(a2OWr-d^0E1NwzDY## zSMJx-2!c84Jc>7!*ZoMp1?%*IfSyx57Jnsx#odA{7HxDu)|c>(K^$NmdVk3Qj!xs{ z6;7wcrzHhxJ!0kpG7!RvyC%-1&rQPpzpckfZrs_ZY}l9%1ueMBmgJ@$$q)k8D(y^E z_MO$j9=>eJ>{RhB{qS#OjJElr3vWOSU>B*SPTPF$A=w>%yqkfQ{&QijSS2SOwkTw8 z?Acx66EwNxmPou|x?!axVj8=9{rqcn4(Lu#xx}F=hmc~R$_tBh1K_MQw(;i+dd~E+ zXs9^5BK7iIsoCfk^w_I6Atdbicr08nj>8lEj`aMd6FD^KvV;F zHdvsf*o_PMWRUN@)%_-jv0qS4g~N6v+^q@9TS@=Bn52?}c5C2U*T}FGnwTqe9^@&9 z1(y(0I)ny=5JTgBq7;I1Uct7Eca$OKc#FfOZE+IsLMrsCs}+MT#637)LozZ!=T zuY)(L#e42Hry?E)i00um>t@*w|K7h@+l|~x^+}BAH%Qxzhg(5LDg$a(%f|ApOb+`n z{3=wO>?GULF3SJ%J+{_gQ4dff$8NoYX1z+<8K1kM0XCR6!=P@E*$3Kb_q1o9p5Zm9 zEfKuGL{>A1t)a(dn(op1(P6#k{71uu$P0lmtYq63Fa*S4jbRT~-p=68IU1#M2z@}9 z-<&aWfpPXx6!ea2D@X5&2=U)BeVE}(duy#Ho(=a|{QU-^$8jHGlb>6F<-hTh>vv#` zOMM=QFMrBI>Wtt1i=44EW3Lk#DAh{cZ`iMy9KrtM>A$p^-$7SkD>ox4`E8LeI8I*U zO_FBhDlNYsLan~p1M3NVu8JRHa17c zb0n9{DfefE4R&s|fhfXmrfV+IVZd1~x%d>;o6VCClX@Sv6O&PE&!#A6PdF!}XcHmN znDvvG`jWERnDZ28Qj#hDbgT@wt|RhO*sn0FgN@L27>ok1F_L+`m?JsD?$*8I^Ibwk ze4Q6NeLQl?A?Kkvl?6&esH21z@~n=*r8tjHbs65`({x7P&AF$+B5qYemOC0MN% zD{&lHQU0q$Cs}h0_2eCtweZ&CLS^A=-8jxQkCxD)(h5XNMS#mG=antXLB$(PTbKLY z*i!U~PqI{NeR|^#-QY|uJr98yzwBTR)(JZP5WPGbRGRN6z#defXj}R?g@s6V9-|ynn%&yA{k&G!5)~ zkqQU@n6u)74au~`a+w~sHs^497eIQh6G=~>RhYP%crne-giD3I-K*NA`YItNDWDM)Spw}fvov`$rx~yWEjE+0>pf~$NjR$)2UDsHKD?` zIL*{J?=mmeU==S|Z*tIs#sx|NjfYr^;Z^ zpsi);u|_HXWDu_i<$t*3HWsFk>0X*S@$=FZGnSD95u+#NlMOzW~5>nTJ| zaGf9+S2Hps+X7CWx+dLM$lb*{`0@BkpgxcBW3l%s8lR!pSo4WM4gF%SQT?9D{wM3D zkxx&9I%AjkZ#@gb1cR7*Xipa^HK6l6qa5&j#9?Ziwu?4f-x+)=v`cWLw}Q3`%)L zh4rB9XuM zo(gfL4+A)bKju!_$zHO4w|>S&%kIl2T>w8u{3Mns^)mQQ$+!HE;yeMw4bZdKwkv-{ zt^i)^ODJ1#|JMsPLH~8JzZ$SxZK!Yp%Gy0HTH6=mgmay!8<6lWumYjeu1$+Ar2NPL z7{3Vdze^1`t@oJ%4#t&SM@~Q97CHO%P41MH&*MMAfZ0*QNOA?WfI zV9dxLCw^sbd;8Jt*gaC0+Qv=zfbxKaE3w#?h&4dLyxI|+$cqw69* zR-6@fB@X)YE$;Cz)E4-12ekP~3$dVp+;-LLQXQ$i}1P zde#s0TKM_aoxNv@KH8PlN4>ZpSxMjdd&yV)J+r=nNZw&RRuzVLE1->! zm_Cpd)YEVq-UUYa88Fv;>XWB3DF?zPrmtt@XN_-~dvrYj#AfC*|3)tJm{cT!k8l0J z7KX_5IVPC2Le~?I6~Vo`=R~x`CeuinM;{DpZcI(EfPtBbn4M^@b3MjAWGICJdla>5Va7Wie2RlJQ!4k?Osmg|N{U5wB?iZ8>Ma^o@|B&R)FL!aAaWP4|FTHr1 zo$D$8wduB})4zPZ8asHx%=n7i9N2Qr&@-n`CUL#G?tXcU+;l3^5^-FLL{y(rV^P*HW&ukE2l?QDcbDK@bkK5CH>e^aDy zd^F6aO>yJ4JaeIX|J(jesh7M9XAZ8*k4p+8UkQ=jSC)OLXFq17?d!S#0TZ~#%xH{Y zl!cIiM@E)0Ka{1m)Crx#cpNM$-_Bq1YZxhtUZ6F@s2l@R_G1Tewq|FPXFJYnoBxbt z+f#(Et!e-0KRWI)Ox(ewsu>)5gfwp%dW0Xo21Z-(1})cLq~ z*ez1kh06CoE4W6!@2P=U7WPa@N=l4>TcH6)u4IMv-8&r?-ysbzm6H zhFv3xQ6Xp9`9DlV)A+XKi+mQXTXA(~T6ya;=?QqR4Oxt)e#!-PRo(9!xGJ7f*!vd#W%=FKMq3+K(6uN|B;R{= ziCzc2joGX$gH+N^kmL@G9i zoVkQo3cn%87GKxog6Ls)Th80y^*{fyYA1CNY5mLn}5Y{Lv9>_GZli42@ zU8dlY6R^6GqGz!6e#PC;JT9F%J&yzX)PxHL)-zJ^Xj>fxT!TF21i?+=xOxg>_EbHu znkir{%QzQa*ySSkDDKwoj5_uwPaW8{LJ5&dNsIU(=F*9r!t7(?=x37)JB* zUG!Q_kiAyAz8O{SCH&*pUDuKf_$!}WR&L~x>4}*fnh|{qj_@J-nFb!mJuNyY&kKtm z9=4HPl(}@$c%~;jtk%MpzN9cWDt>gOTJa^V_q>!Ao>G%?RpNZ}7KQ@1xaG`k~ zia*PAg>-%{Oy_;X7u5DF{f}I+XHr+0am%x5{oLxFuy;bqoT{Lh(J#tl#lkBiVj{zw zb~9nvLjsRN)pSXO1S+tEM;FnvtMvC1TNCG}|2Y!kvZ{b?H2}UCqQNz< z!~D$la=mQ0C-ZD=d-O*?ys6;AnH@7?z)iAi(3$q|OC;Ha=qp_{MP>6G)>k9FJcvbn z3q?F0A2vsg$~%SpU61+(!ya$0nov1HPh_I@n1jX@N$b?dS3(md%UqB=mhh|!_8 z{Guqjk;!}5B1WCN<#X_7j_YF)BGv_;g{o_6J;k@*$I(aWmKsxGk*yET1v&`^UPl8% zO-y2f3^b&drg5Val1AZ|XINR&}ek^HdAWDlZa_&BYe~#EjhObJA`zkO@5h z6#qrs*TFzJLs}m^`n2N>I~oIjiq{sb6ocfyhL{ZPo(iUiq@Rp%FEa2xll$|6FvpLM z8B>ME-J4Syf1eG8ZGUpo7C8DCwyyfNtZ_zt_;%Ga>Y~=fDSXqL$0p4 z9?kmp=u$hZ8xP79X?@U@V{Z^xOMQddeqjUweotF4LI8Zun!-3MlS#po^L~2Sgl&F{ z;{Qu?U8(M2FTTIq(EX){UAjVy zZ{&ISPT@%qbaT4os{Hm~s93%-AHL_#=4{e37fQZ3oKFi0SEk=(o|s@v^LojBxNqpsQdP&^K=j#5Zng#tjP1~x zr5rZXw>!d6vbK(oMHIZTl`LS0)-v6hEm_Cqr?AJ{{Q|!R0Uq0<0zr&JcAeizC-=ma zSzS&OyDxGlJ;a)=4KSL>C`7)Z_heY|)9e6$)tNS zQ+9&=vscj#eV#lxrGcrqjW?YIt&;nzmhH7ER}Ku1M$i4e$XLp zX-U#gEy@)mRef)_sM#-z%4UEHWE#amqH-imnQuRA))(0e*~sFH+9 zu~q59N!HWF9GZjvOIei7PtZ-l`OFn+2lv96%~(Sx?>~;!CHrutg?tt3nlHHSi+jDZ z)TO&rc~f^g|M83fTVui{WzWv&j)$#|wH#S_O8NNz%EoMdl+bJizy9v7gX9_Y?RRi{ z@YJQ_YM|jlG=^-@A!=zBVQ$d-(n8>?1o>To^#i2B)MD~|taDDFz@yuvfWcn`Ava+~ zE;(w%eYdKk(yZIRWDg!7&8+pYDS1eA96Yr*vvD`Q$)ul zXd^WI8zB}ct5Ce(@qYnOF_A0riS-#96{1dUsa5(+1LBp%$Twc`W4u4^Zj{pBV zVrokDE%2ON00L)(Z=TWjZH^rg`I;vxh}#nw-nDoWaT6MPLClqAf0O6(*1;xq|705~ zn0(@~{yV5APfS~nl-qSN^^`U@>E9v$MV|r-rELxr@s3%>?!-6m=3V;{|B{$IPGAcD z&Z!H{Az!_aDeY<&~RSgPfkj zr#ch*j*=Fn0bRD^&jAFgm-fClT*1+bMK?4ztfz$8=3-Sv>ipH_Mq=15A;;WJH_qIBEo8d}XnM_}ovW5Qlsu*!;smB~3Ncbs-V}+gL<#dk z*{&*#`PbfZb*#d5+-`C9V7vcwc}K!?t|G5t=Ue;*z2ollW=ox5i$swMJ5799A#IVk z3OImn912Z;*rSp27V?9OTiKt>hzQE%|-m$t9eaMf_M)By2NA%5H2u9hohP*l27gKx?qlVBs7t^(Kb&a{)(~c%m6ZsTk;Ct z!*9n0R%v1!okiM)&9u<6RMGb+Awfbb%H1h=?woa(kz)SHeH{3%pUO&yT43kid!*u` z<6~e2hcSoo^#BqPclmIH1Z;WdMMa#|*Z(<=DjhT%BX&G;ea%d*j&B`aY6rqb37|lQ zWdJ;;Ks*~sIW;8ely~!9$J@eb9FFth49o45aA?=VE1EwVFx2d{ zR)zs&Cs!Sb<0)=8NMjRg4gC&B-Pd@hGg?r8SnkQxqP)IVroeD1+a@gW9tAvsE+0X3 zF$e8ofB0Yrg*v0tZ`wmhf5d88ha{2@s?Mzw2VC3>c2m>kfhLm5dzJgo`A?_CVOb;E z{pGp}5AsY$_v1qT_-?N!6H}Ac@G#N+Fc71nQIoutT4z@~tF`1;fVksad1$*t8Ps6g zkAR?aEMU4Vsff{R*UhLnXv^tqKv4DdV5nvzhxATpog+W`_~7y#LnzHM375>T^9uZR zSk%eJcTo9HU2h#KW1aE3GbUts*>(AC3aqW@8=XQjPlN}}Y5DbrrO?LQGPyVVh4x`K zxE9~K{oe&TQ!o}~kUjK8on^9bLBGeV>E-o(V=o^!a}h_P3y^)xa`v8tDepee(??k2|LjVQ=dKN zJL;!WY@ejYk)J?%;DU^b?cv{C-Je07I(BJ+sxEkiB$;VzW#ooLqO_!tHaWuLVvcUe z3#8zn2imu@dTm`+8lVU;ifV-xFi4%9Vd! z)@@PfzH-RSbr7zqN(iRBVP#-;J&aAp|MIA&xrk>F#-O_APfRnbf_q3uQjxhdXg$&2 z9|1nlNRqSh9?C(_#mr#WY%q0@)E5$+-v0EmB|juwV%fTxw{%3VD($+safSE<`uE{d zyd>){Gc-$LsiApCOKGi0XUy<*?fV%8z}SU4N#q}$eHa?Y#k5WdX?qreyOamt?C zanM#Kp8$=YviSUnP0}mg0Q|mQ3bObo++{)4B_{{Wuo0Q&(rb+O3x>Hf-dQ+R(&;A; z6FGl>SE}?Gzkdr=zB2}9J@?P`cb_w}@O9o6@OGrxCg+(nijTYmY*rAbNPbA(=1hoZ z2R|z&zn;EB2hPGKW+z5&l&kNT$iMIlMldu_maD{xI80|_-9vkkwqElbicjT{iGr1` zgJIVKJu_XUmNM)D9CHp zqQCz8GH4`S;+)(IqR>o}v{EmbQz58T3g;XDQN-bJ$?%;=y&BN>%}XFThA z?XXr7wzP|YB2rls9(^yyT+{HU)Uc?k70KZoa3EFQFUs1b#gA>wt1^Up-w|@6w-gI@ znOjea7qo%22=I6v6lnm~CbTSMv}9_6(|=O&wLIFkIHbM z9uY0SX$7UA7Lg=R>g8p^`Iiyufh?i_XF3BZg&;j6?8ETj38&b_4Lh7qm8x@xbMB!Kjt{l1PeNRDmhEvo=M}Rm%BX4Fu8&FKQw)L zR8o1|cV)?xDQ%+`3Y9ZiQ)#Aw3xZ}zWoAt?YPpqEY6)oKuAo_>xuBzExuLn`lqtEd zXzu&IFQ}-XXeyurBD~D=yw6|UbI-kpd+zz(-}3!zQX5v6$=9BUhE3^l+ra;S7U^%E zys%g5H8H&D^A#&Wp$~qF`d?j`a(l3w{qMy-h0@__1tpYM=$H{-a3~5^T}pit59i0< zaEh(p{ZEL_n-CSi4Ta=m3X!QsbtZ~|&PM#UyH3;$uqQq!b^0?P<(1)B#-p4gUAml+ zs|pq3x@#nZulIj`c+YQ9+z0A8SCW%IBCMC#f1s~VIrq!=Pdv!0^r@Bx*zSCt$RNur z7V;~f7_)ojH7*qtggm3gpfkE;$x$UP!%>KW+8hN1NSK0d;C0}M%OeAdgi}tzPT{&b zORNZ|Oumw5Z61TwJLgLmFd0zfKImKe z7kL4BMV0fZIY*92^gOKUI9XBq#I-|aEOTvVSKFDRur|bbCx~-Bm2C=E1_gwbZPY~) z)sHU^u3Mt8AAm)w%wM*@QjGWu8tz8T6PGAs9@n~095kF;E@Wg+a=Xj^pg|kFRlm{j zf6nGY4&)Q67A8qKZ@7v%h0@d(|2siBlt|=e!HVf5w8LTSWqo&S*I_N$ru{TWDy`?% zN3qXXn108#FWRuR@b!~k(H_}#w?QWaO^WXTb>x^*)A%o(kNZ&KBfPV}OUXq!1Xqx)YN@*d5TrBk$9Qo4@DZ(z%T^~AN7D&M`Ma6%YO@ob8o{cu8)SNsNyKd`AH+@2>cUca&?|84u) z_O)ZI^xKrpi_(Xccjfk;vOFHOzqaAh3ExP7_93s=$K775zxufU$KKaY`(+qw2hn?E zLS!O4Bd>jUtkoW*y!S?s&V{i<7avyo<$n8CeffOC!vLCOeru|AT+$x!QShDfbfNmN z#DJOV-&M{`^$`0@4YVaYnl!hGmy9M`@9LN{%Y=H(-99_Q+g}x4m+n(CW|hQ_P&MpM zfUJG2<89OITzh`+y4qSge8K2~zRKDch&}#pjy&RtU9EGDQR$-){UDW=Kblfx9%(=cYZb}A=2vF)8Q4$NzD#~HSNU&A}7#=;6*j#dMj;jdTDgT4r`9wOo@1- z4OGS5o}MQj+eQZ*!|iF%QZsw3y|gD<1$AM>%wR_!;l}?Qaz7xTLI198;1C+*=U5#@ z(kQtMETBYqxn2SCjw6~9vgkaZ7!%NW^81TAJ>mRrKNtTcH3w&Vp3fXVJ$tGrVd`le zOeDOp5X?6Ora0S*%hf3_gk%50FTDpvNuG0TK7t}+lUWI%5vj51DIMwsj}X3*HmvsC zyvk$j4M;nTFvUf$n%^g>_rnOye&EqwKs7{O5iAr^LsV)n@c*xwK(kfFx9aan9 zyc#O>j=DtE2{Q7c+^bykfq~yE_80Ob< zTtUQH`_h$7T+6SySS`ln|EJAMtX`!{d@Jzc=fbzRfI#6kQq(1yA}=-#+N6M#52MGF zi?5v@w~U~D7mc^QpRfDFV=wbU$%8PEXBr#T5n?<9WQLW%jqD}*nr`-Q$zv+%4s9MF zVcNP?^Ruffg+R9Ogz(|=q&Y|E`azo4+3y#HS{AR~K`P@mml7s&hk*X2_PdObH)ZQh0a zysoCZ4~%y_sv|rffqy#Y^Qn7$E)~0PsI9jI+NK}&yuXY;_=W|tRh^1aeBT?97C`&g?nBzxig#7b;W&DT3b;A19gA*@#voF|`AGPXHyJ4`fQ*YGuzs=KTL^G@6(IU5uI2cPHA^ZgP(|1Vpm?=Ru z&O#a|A$Vq3OFM?W%C(QNm?Q2M2q5AOQ8z5b9D-R5+#>bSw}WwQnjdzAJT!d^hdKib zJxpvOfq#}qaa4>&VH?jn4zsQRYg^T}e<0m=l(Y0cg(t1IA4+Qf{$7v~uj&;zvWdl4 zjhojrq00fGT9R0qh53iv$K_Y*zvK<4=501xZqbH*(Pf@*_PkaT;#w@1B#%^5u}v%3 zb$9Hatn<`8f9khBI)CKokwj0yXOF|TRsE|@mUNvg3v06XDOO5^YdCY<*7s?8ciTCy z49i~*oVheU$V^HY+y|69>*jx!k`4Q^7;33t z-Aj7!!G81Af{T*;TcU&068>)cwE=+v#ODGZFs^%6h-$I8Qa~rnaDV&>o+~gn9J^^p z+dp$%iKLT`F*0)vd1mK7AQO0=^9V<%c=dyk#;=Fh0!FSKq{iwK#uK>Fd%jgipCV(Y z;bmS~(kSUUJahkU9vv(0HkeOXSMA>65pI1ap2qRGr9@5N!JWnMe1AB7uYL^SGE)Y2 zuI#aC`MB>P1}e3|58cy8T7Pdjv|)G7VzMN!O}=~aWpr41U0H#4szJx$J{J%0U5L&B zKUcM_G?PNRv3ya-cHfIB;dfrws;_^ApZgiw=#G~#i^8uCRiYpApX;#eUd@gZxx+j{ zYKkG&O_g60;BC+STXA-XuHD@x0lrqlMxSsCXo9dlM5pK_i?@ippU(=reWaY*FNKRt;@oimmW1b>oi7-I z(!{!B({=;X7OlhZ{70K0T>s3q^ltF9;>|=OBlC z|2zo#>4nwBHXqQ*F1neZSz>&i-Nx;!x!4{O@H0;b^+=7W&XlF@fdQQvVZMi$yWGY* zLPo$YUB>+VDII{ZD{UToy=)2$-d~=2sw)0Rah?>Fu!9+xnmpsc=p9dEMC5hloFK1& z$Q&m=16_?0p=~R>cdN93Rz|B%WiHFbVV~IVclwm2>#{#xZ$Ikc+}~bs&0D1$NzeU+ zg+`#K;?0wCiZPARKdve*^6Kkm>#m}LhZ|o*m2Pd+*I$2C;hYoYh}^VrV9hT4;9o-_ z>7VYBx_Y6OJSywYp6kI)KDJ{ujBQ$OdIH2s)82xZ>cHP>rU`l%dhd)C4~h#SOe*WB zcKVEZ)0J8n$Ef}c{^i{&qq`&m?gW>F{tM~pa@EI$jMuUFE%6O;7_f*FVk*;Iz? zoSHHBAxjFgq?bG#L2?HeU0cU$C{K*>0)*Q9#>x8nZwZko#^@YGWx7X zeU%n?Zr?tAREHGsIw%McM!Zz(Pme{1Fa=NO$c3T7U+zF;BBlvp!r=fVgY zao;KO=utqTcU#q#A>&%srrePi? z*AAWhgUsnkcMs9YAB$4K#8QwDK%SmAATzO-0W^c)@gc@;>GSe@#74k0kJava|n$q^3Q2!=RE##g4`u|1m3^C z{#>Bbp&MUOWTG2psP(>WzjsK$V!iQ_2uuHwOq@1a-S4qj`>eF>HH6;R{i9&$s*&zN zMUK`D42IKI>Qm?ue8hM1$;YArDzN1Z=*_+XIXlIYt{@;@>9Wsq1Wx3F0+5vM+KPPd z$!o%wa=IF=mjR&M?hAI2>j~Bt#EQbQ=TcXHxjFCEv0V-J+cJ=Lc)VmAMO3r%6F=le zU0l%~#_C8G5wP*{kGp_q6ksPU$x*ekaWP5%kbPQ}@XM(=;MhirzA_|G5Vy-`Cc{wC z`Pj)oo6M~jaY_iF4>g34fmk}$Y??xqiMk(2M$e2N^;tF>c@IFF(bwp0gsWitrUQ3& zZ=KsOa;j4h_I6hoZM)>iOD}*I8$b9^Icobk7ceH_X3*YsAw8(EO!YHdJ>au%UGoVg zo!-sYr6C6_2>J#{`1y;{+0{#&AOxJJDNKJ*+YV)Oiq}7*Ql*3CaxE^kaHIwf(-$*a z4>s@qO+90^PW65UdQszO0H*vgv7r?%WC2odIRq@(id8pf0%X?Eb~|I&XbW(@<-9Dk zhsMCfWC2+rO%A?-cKr(75*^t4CV|1KAdVM{6tSPV&dI@EJy5gP_15YZq1Nx765XFl@?aWh}S5UmrDnEOx6}iUqT0Yri|^!zXOR-Csr9@ytiR!mVvP z=${to(|6|OeLez4YRzAL0Bmz{taC8#^=ffncfd@JgQZl62gKVqw9v1-G#=*rEuIVR zMhNg+d4%6a3ib4zK4<2oDQ|6H8~@6kR>(*;u%Xxr{HPV3ba|k$^bc6UVahC*P#&DZ zhuE|Nm|>S;@Pz5D91zEcP}+Go(r%|vU3pb_N_7F$}XQtj4y|Cz^0Y1yKY)akcO71^F7cKjGfsg_2^cuHnh#x2=b?@O$CttvyG+-{#haV3nP~nD!)Rb2Vu71=S{}N>jA+ZG)Js; z9s~p(d@YmwrW@+%Vh{noY-@Wj&BG|CEG;)ef5pi4(Wy|SiHL88X5TeF7mX@Jz2VN5 zzlai}=zKR}p@eTG-&x}lL`DRSM8k>syiM=wEMN9!4pQ7`+7#q+R0Qr}$@#jN=Llp@ z?5i%i#{xQ}_q$&{GdB3t!1Kw>zG0gEF6e;-{2xH%zLwx*&y5G<0tk41X2vl_T)ZzV zP-QylBcQ5PII>tDm0#gopo4hXu&#x*kG`%a>BtK0YE+bvCnKE}E9$8;m6w5;)yr3a zndPGb-ZC?F6?>rU@uOf1I{6_ue!cmQbNmrgsp86_5pCc%Q2egES0D9yqV^dfDI_ly zXK$MXn%kw*~K9x)qVf4X~od0le$&Qq+4zJ9SI_V#UW?7tn|URYUri-q_uVTnXIXSgw=3H9kX z<(fg1^F`HZybRydxv^Wt7h{>QG7$SzG~G2y1$yd}T7h#$(We!Pz>kr(zGHPsw6iBx zcMQ5GZIPBqY6acy?E8+L*Tj{C@Zn6GU&xhsH7&T!zB7mZ-YAD(o0X1%#3 zHRIS^c>6VAis+us{iX1LY_PKZ35x=&^Y^f;HB}GF2IC$dx^PX!{%$(?&1HMH9x^~^ zJuvN5_o*PLZuM$5;)(6G;Mp-%hcS}<_~3O2{97w1!C~jACPr-It3e}1U59`b-SEEa zAqp%Jj5841${T1#Bw#hXz#mI3mM_wFYVGko6!9y{`mV-epgk0D%$eg1!@HE2)Z61< zvXFdM+$V>mwmwu53XxbFYnK;)dCfrM>FP6ZGEw-lVkK|6=n$I^aG#Tayu2n``q?Wm4uG}UF)k_k}rHM%C&*aPB zJ51l0DHX(PZ&7Yggf0DQ6p$97>F{7Vs9OA-Isi*X?&VyMm ztGUS$%qyHFlP+tS#$vku&ewQAQS*dbG|O9+I;KKZ{iZgn(i=tZOU{<8dD31*{yy6W zm3#h0n2T$enmn7o8oK)hT%Sv+v9&;)GdS2%9wh&MW2A6=eq-`vjQ84uM9r?eV+G}H z_?dzz6npr-V~iShIta`Hc>lAPxo)WhAG6D>o2kE}YCv^TU08iLZ-ACP%Xeib-SOt0D5j7Rts zspyxLs6|}l85^U*$07K2sjqZ(e0P*N#pWG=A{ zAKAS}J!0uy>n5&FFe zPxW;TV+k8h;xsdFllLioBau7DJTED_@!*`1z(s#aBXP9Knr%f~*y`sxutb)nhpqqF z&6HXxwcqOqxl9-scaD}<9#_NKfTBwBI-&?3drQ2!X95gKQUA3$519d*Wg^RsqtoiC ziP~%T3e@~Bc@KO{VnI^YlFnybLOIJpK^AUrJs&k-USwQ(_1{aiCHAgProsXi|0waP zk;yf{DfeH7b*L_Hx_zy(n6nX&=XWs{tF5jZN*cWb|DKJN(D{O`_Nloh+|Cb3771*a zl*;c058` zzd*)!EQsGylSf`s3C??ZI}aAp4jBT>{QYdi?IQGR6KI^;UjelNnA%Q36TfqQ8TT1? zPWm0Pp>ULp4l83s2R3eowU3*Q=W^U_>l-qFYTw9c2kB#RN_xHi4Nw_Q)AcBS^WqI5 ztNhp6J%=JRVJ=SMl$?`s(LuAXQ1b_eRes}r> z{#Q=q;gk!nTk1k0K{p;P7gBLI)&1sCmPAjDDwj^$M^T-_Eh3W`fD$IsHWqk2Xs3R4 ziO6G7n<%(l@ee&YV4?2l;@>#JZ`Jc`hqx}{`k%s4qWFtIQs@toQ6y+8_s+lBwb=`4 zT<0zmCiYFF=}DI7bpm}ph0ohan%IeQ zQvF{s?FMm2iGmBrS`n@pi8sYbHC)W7m8yiQXK+a?mAL7C(lA*PvF$^!s0|QD6njfX zR_Eka$vPI9hXA4<$`>P#r)Y&19S*tIBD2zfH9KyzXf*!1q|vVdqlA5m?eXqFE&nFl zBn$E_3DI9qZ_sz=2F_oi2^K^}O^iiK;BfaG<*Dt;!tTv~h8+YKaUH}` zzK<{+Cuyz1;_ateb(7Vm#NRZ{aiV`w{YZhoBzybx%;ood6iqF{?il_q8FBIH#wk%! zEP#gz_quU(?97G5feejtk~|ucb&;z1f3Nv}&bLE-9c^0w%l-YHbk1Q@yF+LhslIu9 z{iSWmehhgdY+R$r+`2C}0mEr1dFOLl;^)q@v0Q40K2EwldIs17O~+8d|5Hn5`WxTP zQ%5X0|3wNf-{SmEf4=c%H!+m%$`8~_xs@cRex4n4LE+#((iDje)~>}hH|p(4IVI;~ zE4#nfc?UbjUZu&!$bASLyJOflogp8{Bf)h60W6%b6Nf==y^#~du7D=@-5ZZ()>94HWV)q-=tmL^6r#{<^)Ka!ZZ+J)Pl8D9Dfcqr(26(Nv z5`~r+J*Olze2?R>%;s?PHp#VEn1IrS1o^D0r`{xP`V-$Na)?ix;YN^+kI5e0%zzJ+ zRroute|^&&PU|%FwCRp3F3v8+l^EK5so=PHbrOaw7s63Tz`7wbZ^=he^>y*jCLNP6H`Xqs1ab0LtsU^`kpbamzPhxnzF0?>;0DBm7QV9~1pE z(ws#{GY7$W^R2^j!8FoAJ0^>I1M-`gbC$kt;)HoGiCLjo5)_hK-BijEL7X1)#=fb2ZW-31o!1hZwZXM6LRS1>&P z`5zk#IVxYZQr5k@l)Co0j$zoS$n9s026r_<#rPad4J?FAR(4V%VegBhk!@Jn8cTnu ze(H(_EmgT=s!S_pBsJiZ&iQ(vB!W0teb=w^i^IE`b}Z6* zQ9F;<=(O!~=$XWn6mw=bMT)URSmfBi^dtU|JB|^3lTWT0vA%CzYt2jR1&};L>t`2E z9|U@HgOBlTM|yLxW77<(H@+d$SSjGx6T24BReoA$qdvXz#ugl3wYd7D(5gS`WBIqd zw`p-T@JtzowJ&$OqvN)=>@w3%W=x(!Xu7l9jKDjR8N2!vXc!}BRy^=T&CAH54ARx4 z`8@jiBYj`ali9%iYk%Mj4n2$y#~d!Tc*&aZVD?eOKgvxNeVfV$eQPCuQ{etOcAZJ( z9u8GKRlmLHfnU1ASEe&8ntt6WPT@|oYqopwb1kt86XCu^@A=KPVPygnQLFqy7;r~a zXeWufigng>Zv@}!jEc6>&8LgEAZ94C)ZGM?^R&Q%K|2B~uba4m73Fv{69z8g7phiL zK~9{pbs$khlYW?#?FNrY-w>i~d8)%PfA#`rt2LhMYKzPUnrE%IR)^F0jI7X%0>Z(6 zKp_qEiD?l-e^%;vcLO5s)XW@Z>a)AOx@DG~45xD00N=G}$;{wlPr8Y@{Sgm^wuiGg z@Gl=d?xg4s+ENGLtQr{7-*E(u^ByIBIw%*nq3L-^93w&O`KCRx^QMbJRfs4)Z*K0oy;}f*$Y+TmWt4NY5jO^q`GKc$DGP zu^>oA#bSR{@l6>Z;Ia{{nrBRpSE}(Tb}2==hU@2MSP+DJNwSa?l}PzS^%zfqbPrB~ zN6IC?y5r`GKiKD-0~tHJX-=_!Qfo%l+;$E#gGiOnH_01>vYqieDKg_Mh`$tj*OqWMTML!UM|K{y*c8yohG(2JX^gIm)1dd;kcER+%5%A-0*5nhBLjS*Bsx|d;zbu$K zeRG@wWq$o#j1gA&zR%H`rK-I|275->xR@1mk{CulI-Z8t1GV)3K?nQ$=Pm# z0LkKS3_q(kUKwTilvIlRW^3bW6>*z38na{ZXDHFpQIPWSY{8Ll8EWzLh)1XJ z>Mo~VmU7S}*HjVG!x@VhJw&BG({hrzkrcuOxd?)Lf?BAHpH4QvIkL~Ns2@oZ*JELX(X>-0nd% zUy9xz(^K3(Hsj&(FM?H6Ir>fkB3eqv@xB1U4&s5Hm3m%<@~*hlV z>8B1+U*oZgzsd_&vQI0mx1!=r7Gm*-Gr9roKXA%U`RQr!cxhZfk>{ZRhnj^#{(Q;C zFO{}&Vv-Nm&|PFbcl;Np{-biy3vQ3eaXy)9YPk2#Zt~9xuO%tv+OynZfk6Fq_p-xy z6H=tK#fxWMRd4k2iJ>~H>z6xU&EKpDeyxOww-PG2MM(^GK% zF`~H08N(8<081>uhw7~(T_Out7EE5x#-dL2{OOUQO`5UlzQ^1p(z)evEjc0*a;a%h z6mtgR>GESFJ6Sjf`1#rwP4GGucv<GHc7MJ|F3!o(GwerM_KP%T{E#B)6B`NU$0$ z%CScklrS<@E}^Q<67*vF9FwCoF|lCZ`B7Jv{u5-c>`DaY%V=fN+(!GQQ{srHFoAaT z-;ir3bOlaSjrf|6ZWlMN*<;=o^v zeNi{@$kC40Z<(-2fm&N+lqZxb+tK+u=)T4g-Ja&xFCZfdv?Qyi1L=`FQn4ReCdtXC z=cdgZ%IU!@gSR%WsatY#RT}=u+YOH|6UgRFYW3Yok+X7jgi94LCiSvDwe3kqCO#J+ z-2?Zee7ds|k45sYA(~|DXuHtq7u))u*{OinW%ol$jK4#K1rB%@8lq3J3FmMH_@178 zd6WN_EmBIpnKM3)oc&C2_dT5geTz9v4wznZ`=E3MW=f2np2%$AHvTRwV^EsUMSBa0jHcUaBpx54!irHtj*tj^zn` z`m;JlV@Q$_z84EhQa#}5VkGpEIYk4V^er#=p{M{mKC)|)@U9oZtB6TgkKV01wnw!( zQs#y+0ABRCH1IRZj(0fFiPF*%a^Yn!c4_TLebk<@=|T&Z3N{s#@g5O#A2G`@I&XHf zu;w3lNe>V}*sXtNj8|AP1ZN3UX-B#%KLVO2K0E}Rz_|>~7f&^vzsMPw7(sYkvk^tk zOP3BmKU=VDpKR9z`c8f2ntE$M<~KqxcX&>EmQA*OUrVDLAo6l! zRs&Yj<5BcD_8pmFFAt&9$JZPx0?IZ0z3YkEl1}ndhpE5vN{jY=qiDbiOUO}7T)xLJ z_H%g|jmnd}a=jxM8pT0lqUcvWepIe|#F7?5QxH9*z#eBtOjqOK#!iEZx^pePG|+7p zZ`D-QU(l4|m=t)HVZC@CQb(4`If9y{-C`FcoW*e3^*a)-=;|)w7}sMD5Uy&z@$$*d zu(8!!b~{*f?feT?Jf>WtX z3{&!aU2`7&bEVyaG?~k8F0n?21&*Jf4)G0EKPa^nHc<}_ZJ>F>#imDn?3otcl7> z_k@W&JW^0)=}nzPht^NQ;lIfyE__$G$O&f;tnZ**HWzFQW1qZaJo30@pqumnmNxBb zy|ZEvQ5E2Nz&XQ+X%y{9neG{7c|6{gg7|Eb^D`LXJAv<4(%E>C4{~}^_h!w#f7dUQ zNxv=y0h2H&T9P+w#3-12wX)<@y$sT;R_3Sqfw7Av_fUwjFA4$CcAMu?^ecWYyAc0^ zZH9=yD@2L2B5aiUkeadsIkky^6p&8SUi!VYQOkMbHeVx2ll*79u_5K-h)BImLfP`Y ze7-oGs^hU@+8G5WO~>6!QA_l7c5s@~@~S0hk$IQJQXfGJ+v=|n4=c8?E*T*#?~Qoc zK~{dT82hZF-8M}_%4!l@dew9t9{&v(skyFJBOOasM>NH;U;#`H$Nmp`IV0!{Gh3v6 zzeCZ&?zmyb%{kG&)`#ft#OK+(K~34%Z|0RZr?h|vwn#X>6K5)%wrJp%#_h)6LrF_= zW2{&s5K8=lFr1VOitU<$8XjF!d9Mr~bDZ>Y=9c2-O1ezn$(hP26=VH^SwT$>C8J7` zzf~mB3W2tKpS$EF4_?8&KOvx7W9L|Vn`Ot|^?Tvlnwv(VuEY>x(u33(t1GeSj8z|2 zT*#g%v2N`=I+9bHgLSJ{){uTmQ(l>UPgXcp?cZ0-9_A2D$yW%C&*Y$5gk_meat}L0F1Ce)Peo}l zZheg`c8^$ppFbDA5tbq2OCA-lkLOFfm1K@ea3K0dNq|c9R) zkku^$!YMkBq%VKHFH0lv*%`^oST5GH{>Gx)ovshBZFjjvGW`#FboYkrm;XO60B?=G zBai-!+2pXbEbN$ZCl4D*Sc*fizVxwy$|J-9(%RTO#;b& zGqFIK9E+$NIg2hYSmK42dkG@m^>q2<>k}o=3Z0V?2a~K|o9^kxN?vZCfhzhh*Zu^M zOshxJ7Q`zu`bx*J3%OkIp1J8PBed&Mn!MB!SB1*YgI^xWzToE^VoI4FJLb;2N227M z`Yf|^b8ld8sQj@eSp_@;*rnz9FV~y6wy5qV2k$xey9V$s*t0gm4q<mVhknSy8I| z1Qx9Cegj=g1bD-M*%qGmLT7lSQ{>;_u-!Jo7-V0q*>Qf_VR~*HdQrr^0@Jn7b(|43 zSx8&^kD3P-yW*~nj3~09C#o>(2?|BhT)}|4D!f43!*gmxw%nbMclvqqy;k(V@DU>a zoEA`ll6r&UP!->V^@bLC?y&e_-S?8z6jBx^_`O$W%ToF0f!7Fy5guQ6J`%H5dKG+6 z=d~qFSrhFf@3q2spY8lIgIB!-eUKNq?E7i_|HX2`BuYvK4y+$G_DZILpP}^5qfxSd zTvm8xaA{60`m5*02ubOi>mTGv|4V_7T}wtIn>*E$Jm&Pywv`1xlj&Oct0KwLXOUFj zd0yYu`)GG|!V%AtjO-Mt?XFboA(M^sPkM(v=%I) z?!esD2u)HNs6%S;9I)I8t5Ui8$nV*zZ3@gZVCp2`4jlh{bYeHgaNSDQ8N5tUwm8~+ zzheEz?DwRRWVJQ-yDh3*l0Ms^N_JOiOq@#3z~f5xv+8K;anHRqh8r#ESn#yfj*2_~ zYsmfSjB6ET82NfB=}dgue(btk(p&_*=q8Ra?!t+5(!Rxe+_2bQu~Q;=ka_}GU8GfJ zv-4nK=pom|(B27CcwuUJrtkHnyu^CS`N1y(es5)dHC1&zvAy`Ft8qIxTxPLFhOx+T z!a->kPt|Vi{(h-)bbx7x)!db-9%lTTPiAa*}R&frfY@Lf_-RKNNuB+K~h-u9sbeY zr^mKmW0TyKHp~3T>!?Isfid>>9n~A8RaFZs%C~Z@wsI}s)5uQmfbW&ECr}KHcm-R` zP7n$HXy>F-v{ZaD$eeYwLz?$>4_`gq4rm7&Vsr?iT{DoO^2AR7mdKF_(dH1)aK z-~mGD@}bQAkm;nsC?(RnSmfX$>b0nEhzhy1WZ#+^741~njzY@6EtC|kVQ2`cSOd#v zyx0*S85{A+)&`L}`1klD?;kj73y{CZ0tJMbB-0FEkM_RQ6W=H`YhP6sOW|8Veb`iq+uXTyK_7iW6;i^3J9p}9D%NUAIe z?9x!4S=w5%-U}?RD|IG8rs5Vf1}AD0QbVRQ{sDC`wrJSzAG=dvI8u#zfpIYE&%Spdgi^ER!Xh)9TYgA?vzio*RetFH7jVBR+ZTw9-$5eUw)%-d3=2I*h2@oCs(z5uDW1CLYrPSG{SMm5MB#+D|{qx zbR@O}HERv*hw9I0Da(N7H~Qfdsq?&u^~ynCG+pF=7xg~mQ)>13#2LI@MRHoOhEfn6uY8MCcF&sWi(Wi`m_8svK!^36SWp>6GBV5V~GF!z@$U& zk)BnI-0yh~q7?0*uV!<*VNv9ofHQXf-xuo6F4T>rk1sB_lXcc-Cw}*08%m;x=jdlA z=Ex&k54pufQsN=b^u{fEFY0CnnDM(s=JkO8&cFxCK|9BrRo0EUH|cr%G&C*{BPq?o zaj0nW{DzEg#^A-2@=_bsz3!J>&o;)&Y^8z6(;0^p6a%sPYr}pyV1pR!N(yf2!j!B2 z=vo~r#r#xb)F0nnUp~;Cz5Y7sZ{eH~siddLSXEDGstNDuMS=FE^wrLoG(k^cj*Y1* zDV^NxmQA{9I2NJ7PjgX%ODUkcfAS0D5=+K3bwnojWDPD%_Y?#4b@49tDm?(au=b}) zBc3ye?xbItJzH!3!5{J-uO8D)8alU zyF$+_Rk>Z6Zp^?%*V4}bQxGl0u8XO)dV)mJUmbak`l!f0l~@nP=2RoEHbLe2g1h7V z#K3z!M*-&ne~f4YlT_g_JkRp#DyCgCT>L_2u=p&IS^z zw@8nW?+dRy8gc_X^v&s?eJ?qB?B#BnSg1Vb)V}x~T{gwvic?2IGk9!Z1z@LX{cL}} zDq(zXGMp3XF_P8kz@vghi^|7w9SO$GK>D+HQf5x?x~sQfqhWR-Z^~>th8Fl`>$U&D z@J^^?GX-3qhv>Lh(BS^P@p^Ja+1vb{iLJZ<) zEwvT~Wq5u=aidm`DP<|su&odFea+1|->Y{4CXo7HPAhu;&^Abtu0oWWy02^dk*k*P z=x@}w@!b+D1Ad?6UuA0U50~@Po$gm3 zQMaouS~PKemryhP#*&-HAQjKm&5$;;{T&EZ;j!yI%&Q_0`rmFfbNe*Bixe7_Gia?g zAt_`Xbz=5MHEU$EEu=%7X0ptJE;E#=O<>gKthuppX_)#CYJI5&i(++!Y_vKV&%Ci* z0NHMQZ=GrOB7%4`&ZiEWxM77z^-!Y=pccLNm{EDH@>pg1*6)J-HTOwL zU^$m!FAslX0pFMGWO1tcTxCJ z=9xy@Lu9ReIfi{F(zAezeV;U3>O-mBeI*+sUl5-Asg)|^s_5J~)eUj6|A$LL=SqQ; z&8gR+`}uryZWCHCQ9LHd1rF~)i`A@#1_!0<=MFs7SI1}OY=2tMNx9ggfR_!^;|fu7 zP{qek{|f`^tKH* ziHcUa89~;})|@Cy-L#X2pv&8wy8`snsCx; zks2;HPQSd~`lH$ik3!J%Xc#P79nHleYOOpNKbf*gJNNVH30?4jqU{v~cWO)G<&E5lu?be6>`z%E-?`}sj{8hF==jQ2K*{yv(5x}?LCi?d!JR!WBvYz_ zCjKon0~s9w<%jKqPZ!g7i7Ew>*2R{!JF zLozQj3{Y@_fnn+D!$b+bD{4H&+_*E!9*h&KP-A{BSAP6SDpzTcIJzcJ6f_|} z4)19XTDrD4Q1^zl;F$VmL{1pG6)W=RwYD$LHgi7(Ru{T^hTQTOnHee`hWgvieb>rR z&;bt!+V-9}{|0tuB>FM7mP#f-(+T80Z8qigiaJ&IHYmVN-m1^z0>lx@pu@wZvsZByO zG?z7ffHsIubxOsm2{d!C>Vh_Gyf%sBd`l@iKP!UL;tQpJ?0b%N6{`fV=5#H$uHrx3 zQSahm4_tOSj`Io2@?_kSZcOVeVuy0&p~ME?df&_QxMN!ucIHar%iZ_1Q+Cdv$? z%m0_St|*zsxzVl@vlGV4od9l-u9=L3g=mmnVG4f9McFX`8aZ4_iv>3&fB0}Jgnyf; zSE|6(e`WoX(&f8Wkt^bLQy27KQEc3zj%>*>DnFg{#NQEZ;vP#(gLWV9A533vh}=xve;2&P^u3Flni;FI*e(Wa zzXPv?>j<(Q&|9VL<%=O>JHKsEQDk z5)}nBKvWcTgCJ5u2?@v+6clv36_64I6_gTsO%bCM5h9|Xw19}{MnHN`=mF`y6FP*R zLP$agCwu?O^FHr&-scOPbIpI&Ty4%ZW?5s-G46Yuc;AdDv622|eoFnLXt1Z0f_4S~ zh`1>Y$103BQ|J>NBr;<S? zD=|@u-WyXc5+jS!_I*!{Eo{?qtvHxVU*qOMO=ddoh4_f7TEQ{yr2YQp8q-jK9`uR} z@9bVsO*ddSrMk2yv@nV~D?q=VmDis@6?R^gq!}s!g5TZ_z^QC1I9%am+Dc!+>y%7l zRVA3BXfV|4qCNKp<_4o&Hi`F_2s^Dl8!4CJHQ>PBNcS7v%=BiTJSnh#bcd~YwBSZL z%H2X)9+@HXoun2Rx~%+`0qx8>iy0!_lA6B zqAJ?|bh|+usXJwTT<5Ry?oYNGa~ z6mlM(hn+#pUZgUI+aw=OoZ`os(z&$Zaz%(o=fGyYE^xQeT3i9bl5H!e73BNUr>IXR z&Xb1M6Qm!jI30TLKJZFisis|M-u3lz13xmG`ioIWLsG8N&$Lg*#SQjuZs%rwisHPoUtmxc>|2zA_$J7Q>Ts4o z<&*Yq_CDoG@EG~wQ(OP)bYr`m-)z}pt;i`5j4Ndd^wVzbd9LC(q}&m*S71P6cZmyD zmo{V(u2JgEbF5S0;!J?}`IL&_Nh1jT{ScUUjQ1QpB;-K}*?O`&C(a*Yu4-b=;~DG} zU$z@Ylrqw&S{d~OC<(3%Ka-)Jf=9ox& z>*vr3`Av%4!@Gjvo`w%ZtNlEV@N|I$yUG{M8L=p-D2?ApeZi>T7Had8sEa}z`;#2G zLvHkzy=r|CLSEfj%8i{mhyHdCr6*jX_rUY_dmnc8o|*hJ6)c~6eUN~-261R!7%fg- z7o9c1fK4%{(&n4)FGOUHHE-Q(^7eQGcDNBP@aavKU#>z$3;4J<&{c1hOz*u0=NC0w z4P=Tw6&Qgn1xWSg@W8mE+t%U_^Vr*@d1rhNQ1yQFxp?&{?b9HoSv?5keZo0ewh1H)Hq$7hd@19h@)W7Qh zcau`taY1KsHDc6aZdY6?aqrt|%a-E5D?vQf=0O-Dm*bNl`bp$#pko1-uFNJ6nak1N zuiDA{yx>DcHixo7JP z3%={=P1S`@t{?S^I!3qkQ7KrlTlFdW4D{?&nLKwLRiFHaDbf;?dzB~+cR%Vs>#{x^ zj=jkCcUv(mJnZwZp;j15oPY62Mh5WsB`Y1CW-fUpYPIhoy}|#f;mZDs{Q7&I-p^+) z1-(T&dJ4USo^sada+V)TxV6)#;80Rpd@+GK?t8nW7n4CHDS(k*{OD;}kX@E8{$fmZ z7JNQ$!BGt(_vxe4{jS3AHv=Z7XJPuRbmLTmph8LuZYLTWX%HS%bG1PF8S@dJIjb-2 zVXz%ik^aHyrHM^m75Dkj%~VIQzavCCAsk4#CJLNS;LeRrHYGsH7d1MMaw1?&i5A_8 z>AnxYn4*G0)FgWJJ#+Qv-#hYxeSSA}4)I8v=}2+4$4-Icmljfvocj)B4JP(RUKUt$y0 z>SV3~C%?q{Ku56I1;Hxj1ocR1%6?UR$JMJCO$|g5ZB3eEqWVgjW<-*Sy&MkLS&iX|g%I@~Cl3+29CvKAc^r;)); z$4TBF0c-(U&5yC?1p6~m!6HOuXXK2*^lhmsM3V2ymZ#WITh(OrDNnW8*gGXF$^!xB zyqS**YwQeU3N{7wa`qrGJmJj#^@ZhYc%94n%)iT0&K|$A(#x;FEN1c#lZrW7W{b9I z3=!R0&O+5*d*XSJpCDH7|E*SjC|fiiuNwox{W$H$s=mLs<)J1bH_GooiF z*e7-qMd!nO_M?vND5#)if_{|<7(?G73zr{L9*^@C45mv&w~Ma^H++y}{ZqWs%AgeW zh?T`q-o+k;+_6iig3ZStk7ER1^`CG2`QUryk5S9NV*)%Rm0ZJ@dDmeCejHwNFaHtA zuY>=q6wv<5o%a1Spi&-Op+x z#j*VELeMO&lqg(qO^Bw^s6Eqj*cSFH@HQo4_cLn67IfW1^|v-5)q(eW|IqH)^>{Z( zGMrvBl7kEBZlFn@JEwXBKs0y(u9?iQX+gNL9OI(40$rSSC8$e2V)+ig8n_l8AoCqU z^CGtrp=@L96i{MWK$;y$B|U5wY@Qyk6!<|#m(@C5ywGa0VmfG%04Zq#MpN|)74K7TVnWBQ2S0K>_hVZ$63U=e=IX_M?%?<9)D z<9t+{oLZOj-4Bn&SvH>qs;cC~TRo z`=Pc8z`VQ1jo01*Sj3vTRQ{~*-&UdiI`~w;hcekfsQM5ts?GUQYkHgX(|8qaMro%9 z*0XUlqC0!#2un&MP8Xv`@Sp&=sJcBivanr$U=z~4Y7BC zMb>5&=mYN3CN>-Ia+BZso3#ne0KdEiOU?brMx3`lKaTOwhVthg@YrYM*=BGmL-X%!wB6vFMKr3I65uDV&NtEsUxy-%&4gBgc_ME+L`f6Q@A|l3l$ZzL- zAHJ@DBq*cHU*NB$M%K8N5|CgszYqdH@esPHQk+mwFCslaTkX%nuy-%D8dxEV(mZ70;J8 z1DNn1HisC6dN7Bb1%Ru_9b@HX`X)~B)Vh*V^{m>zXEuzY8uc#GfeM)01oTPcbl(TF zh#V~ELnLoDeARtNGx{QUso?t$^L2nZzhJ^ruy=tNm|One89iQppu)MH&8$mwGT#w; z2Jc-rq^%OPnzKwEk%!>|~!2;U1W|BPTo9joN61V@=N#BB>$bQZ}iJ$mtNfLVpq)UJX z0>`QY$127{%)BtCiQA8Z{uB_t1e7~Du24ukks9yV53c)9*h?+N&ODrHbX%9N$2{V+a(A7PQ2X$ZaTdBT40vezTZyhAGF*NX+U&$W*o)3`#SuT zcX!X|XXnZ92J+qfc+pc&YA+*7f~!Vzb{{r2CTG)zhWM`5v{MrAPvR>DL`Qd9>#nSy zTN4<{0J}4aSX2rKgA-K|Qf(K#DE`($ZjALCiTASGlAFcNo7ubb2O}#L?#KVe$YMCz z!moA<8deP-4Ujw;)JpU^}iT2y3!hR{C;O_=C*S5 z&}w|Z(eHVcQ)Mi+5Cf1x%hY2`glR*bB9OIrsq zvuw^ChI5zQ)0w{yvM#EL2w1481UTDM;}C3%d-ocAx=#Ck^dMbnJ?uCbt?I@=gL0aj ze5N1T3G5;G&1KOkGtRZ7^6zR^FSc2JrSzw6uXaKbmY?v|LZZ|P@`*A@cv*p2P{~UTzfw1FV`+_dTa-k4KUoTY3lOs48t#1p-t6bbk0nqUSq~u#Ha)7 z2=(#kla}rC?4Q%2<4up0n|eDf16m27RXBh4CL$i=mdyyLk5>o>MiLKblcpBbUQhe% zDxa`_cBxF}}kos%=LRt)KUu z(;F|Xh1CP4E+$2Ur1mqMH9NpF>MAaF%bRQTXcEQ?(?uCDF#X1u5L>GMZP7RnogQ#2 zWH!2>r|46~RpOA87pLUTZvC6^8CCQd`(3Kiax8qBzA6>O%TEowAqV}I-IMQRS{WFr zN!eKT1XM>zv%cQZ&Rl0XdYb-_~&jvkA{j|*dG|w(QMU8(%WsYQ&&5a zGjA!7DX$w-Sk^(%cjC{!_=J_*D^d6sEV~(88qjOLn>!cWKh(guY2f;*>14`n%Ka6u zl(A?!dsO_1?C$-UJ#e~g!wZG@llWSe#(bfAB+Tw0{E}CifML&IywUv2rz0F&q9hsb zH!3B?-Nhpko*q2?^Tu;op0r-0nS6v`AY<2&$#kf1{|du+aU7cuxD_r{~=62o(Iddv(nUs(8P&qN67AUO_*EGCy3R zN3=T0ozHn0YicLIZ20ut8|XCM8epdUaP~+7S?|{Ug9`XE=s;+XnM_c_T)xEn|Nj;L zl7+}@tef_>hxR~lx9n!gl%O+~lQMQkd5_&(6tq{=BLv~PA2x&qrUB3^aP}(w#t{3x z_SFzUGh7)}c%K#hBuOCs(&FpN>6efE>NP36DG;#}NQV{yAN5-_S^NA2YTXHK>1x%a&6j(K-)AX^YRRQL1`PA|id8du=Z zNeJeDl&ljBLiWMPcY;4wJJ{!nH6v>wv`6W2bt)XBk7b9walNJe0c9SB4Y%nc-_8rr zcd$1n(pUMBl1ho_7nBDcn%WI7#08$Lj@Zqm{`suNh6CGbOiFTH>fUnak9P3gK%MvL-`@a&s^gDBc!h;K$O7Nujxc?7oCjO( z>|RB$7+KvOS*u(-8-K^AfhRT!BnX=61^G8e%%IA}cR4YDd-QHI_kL_YHt<2Ftj%}9 ztlUmWgm3a}p2k>z&*=dB@y{>dIUJ6F4NVc(E`rd>50&xvGQJ}inhTR=3(6oEadrGh zlDfyGZtTiX{=B&n!O?4Ur;5wl-dzdSD9A@=oi8# zs=;egd`FpN?ZfAIFnr={ub>?hJAB{Y68)ve{NVD~)+UeMk5!)gefZvht6)~NxuEo` zq`*O-O>~;+-Y)s@&&+x6S7brXkM()p!@^FHwLufKELJTBhul4)DiN9B^Mi6|}XKmURSyw6L40;%j4rO8?1<%cW)Cr&hOF15rd zC1sgI7^7%Lj>Eb{Jd&518cm`0W+e@YF=$>+dmmX$+CFBIk?)7Gx15oGEZ_~=*QvC) zg+u(2H%bq6;9afd&3B|%0J;(3kQ2|Ktg{|rQ-Dq&?`rOJWwF$t;j92&#SW@_rStwV z1vtNtCW+l_Vb+OCC$dZt9J=p%wKE9y7Wn3CS7>cmQ^uh&fg#B7*?0MG|1DYP0oYd} zk>bOK$+|vYIq0&a$o8Rz-}ME$6|*VI%ds9w9lmuEByTl8`pB`jrMp+&w> zgdERDCh4>XbY-B9t!ou{sPauX#5imfOTot5_YnL2{3b`H!x zS^q83SW<%mBC>wjye|?*o1AYo(N4$|clV?3+b!Ik8T(@KCIUcVN&-_4WL=E+7E>48 zjg7=tKrO2`uIj8;D#-Kt&NbCTRmsKoDnNWxu74|kXSot&Vp!#L)}rR1N`U`I zF?JIn&F9YEW+U}mS7sX(`kIFv=CXGkW8Q+);f}WLgc!hQf#xqztpa2E7+D=)FHA)F z?S)P~>~!cyaGz6*m@9uW|4#`_K-<;JfWZW}Q^U8spZlO&{1l~Im#ZH<5p%ux#s`8} z_h!8MCXi3o62`yOh)lw(^>n$BQs9uxU}>WjiR zu|3AuF0VOymPYE!^41Okp6h?l%Od@D$Kck#rJp{~$*ZuzcW(QJzWnr>+V=^!d>x|Z zpn{xz5oC}$+CEtMMvmm;nX^9M$ljp;PU=%o4N%Y)&?<_e-|3^W*ZDYuh;5*D@>r2) zVO6TE%<)e$z^0Bs1Iy>OM}R1&v0;E?IA>pnbj=z7Ig5={&>s8tps*u9MU?hnu&y_M zS-T;;eyA+AJSo3h`-*voi^4WA73R5HEB{g;$~u0%y2d@o$A;%VuL36l==|dguhGG| z!KyxY&NSf+(jgB@w!Z6 zwoJy+BpIMvowhb<4L-EOXeWX&bZ7l_xD4_Huv2>U&FH;k<$UByt@d=S;t)t}MHD?9 zqEFtpd)cIEg;Nt)P2Jb-9~gGKsgQ3yFFnslSZSqL8HFUc!rbT!jFk9?$8chgo{POV zlDx4``Agoa{NzJ+_R_yk+e10>8)wR@FigFpq##>ZMZz&Z?TJxh2OGd zh{M|o3n5=JBT?kXg|Bf^9{1pPk^j~he>Y6cy}+7fyQzCax3*V;YIF{STs%Jd8}M+{ zNqlq=f$-J3iChU>GheEk*L_Yu!f$DbR5iZ(@3sE-oC#T|l%BwfFE0=3mactL4_=q3 zsck*>|MGwQm*8a#fGgtb`zIF;?_iF0yRln$H_VrJt%%)>-;2Kmr~MD<0U+o>L7)Pb zM7ZXw&EvFlXy*>`z>XLDh5qN1u@FlA&Prf@h}Q;TBI4qzcULO?Dg{9w|41A7@2&A) zzpJD}2q3Yt?%zR?V=0e|V~@#zKD@VTbKn1m^6T;rEMqT$%gv-?WQ=N$;DyObI}Mhwr-^ zw8L%tg`|f24DYhrw|2p#+=17B0{`bU<_EMRdS{L$d1jL{!c+d`$%Y zRtI9mavP^PyDgECxt{;650}&l1+0w?zxHq?D6E8H@IPV_TeJd9FP`a7T?)Q#nEIp@AlK%c_h)ol48DA0{Hc6@8&PA_0v;>++x0+N}Ogv4fI5f`&H zb%q;TkjG<3?EXtvx%3DaNINZCz)k-)llXF`r_GLAO$t`sp)RO?v4n-_8lZy|$0rKa z#yb$)_3_Hm^1YLr!o2qED0wl}BWu3o6_5B?XnQN*ar)|T zg5Ny$H~Rep56Ipm4PR{ zy&`Y$Ci;aKx>t?NM~C#J3vKt{l)m;Z%j?7vnVDI=N%FAaqL#q}F*T+dEU3gZN&{g^ z*q+?(6~)rhedoR_^?v9?D@HFYjuFw42Fsw(p*D;uP3`56!`XONB9qgo~O7$zMKMD zU1a2EoSsvc$!fZUz)h>-yK5o3mYj}e)`xnWUL8n3Eh=u$Jv9C%f!HMs)+DEQ#-^js zz&Sslex94ZSWgWgPEqW)OC+D+i2n^bV3L!+c#&N=btUDUu2(DbUeuSHpH?R z9OSDY1omY<9}VBx&e3(6_8c>0-kLmaC9hZX_2TjbB|Aya6+%3h5;Wb~ zJJj%~K11a)=t7ie3e?CHRYmF>c4HR;;=7TBi5_W_w}2u$)F^^Ei9w}UVlit@RK{Sc zfZ|Ur>r?qB-;DN)EBa=}@JfQF%^}W=R02d?@*_Ei)9W zizNiFd2_#0u$QaXTYQ3Wggl_0617M76XVh#O&{=zag0z{{@AHgv0(UGFR`IsYd_D4 zlLp>+!k?1ulztw<(6y}ogeb7kZgHy$N>|s^{xPOw=z%4^6#{pLGsJyFc%||4_$O=4 ztA;C&HK6hMrYDbvyB<5372Xz^uMfJYpUyK;VKUB0SUfD+$MXQjh1msa?gU zg~LE0@mwDsv%h+>9qJThw~@5atRsCH@IpU;a{pvhg$x8D`}S$mM|YR`jdQyXdr_&| zG!SHOQ42_lo2t`2!PZ-@%J)=mr&Oh=&Mr5>cg7l-y}D{0vZ*)LgQsJe9ZC-GzA9eE zmb`LO7R5|{L{D*;EdjfB!Skiqi{mz2dfP`z+sx-%gQjfJ(eE10lNu7Ep){@)c3Exy z^t7YgPERuKje0?Dh~Y@=jEiG&kwlWR;i1EFx#S_7>Y;*TD=*3W)V!}OZa6CM^fZOa zuMRq}yB1D^^(M0{1gv~@{ANImgYVnQ#RixQ8=zNl=JznYt60OC$%eS=VzSs-|`@3j*izWQ* z-pgH|m~S)2<3wcT=iV2?nTd~@{{S=zg>;9i0Csv*zoh5|FPiEd#`s=I0AAarYl)j{ zdXcY==hq{&LO!LY7XcKOZ`#-QWO4B;aP;T7kyjFANk0KXQaFj4 zM68Lm0zzdMW5EWp8%D-bx=PYZJySEYUnDHj4d`j)gL@4G>LRVUU~$k;YMS`8eyNSZ`St!R+%|FC5^EDR}w3eX=c2S%9#?n>cotL`*WR01-$fqk3R2vLir}rW+3I;Fcj?J@!2ual-e`Vv)c#MtsM@4 zKJ8oDA4|>F8d`c5PcO`gIepNH$-HA6s(0hI#OJ;nku$Gbbs}a?9TPfZbHlp8NV{O& z7I}T$H8{01h_b$pWt8eu6?bFaR&|m(){_}4oj&nfsUhpze7tMt>sN)22K^p4yDMD^ zS#s~>;tg&(SPo>ZzrB&CB{ERUX?CtI5B=%;W=)-#`b@2<`*i1OP&B~Sw=5`aRnZ9G z3pu@Kf+fjHP+PjdOrh#=iA_mkY=x3yideJ?crLU}Z^P0+Z28G6K4#sgwg~u|_^p?`&K6e_nTb55VZ29Zhs_M0n-Dy@ngirVH zwp)?)+CZ3CnG}9j zHZr?awRi}=mET)FcvaD`z7>WooYQ;%2IDm~ie<%J4}h)i7&Ej@`IDhS?4n_#b?!3) zg}tFY5yJ7l2Muh_$|&2|o1Zp?bG0j`rs?am6Bo?c=R2h{Ij;f8lEv;Yr#u~6c(~At zVm4vt(I#y&yjOxAXYeX#apbuj?2)8enpzoyHCkdzp~bHnz&Uv(A>^%W61!C@(yd|| zowm6>vBh6aSr6`X+0s<>Ktw$~ds?{;qgTBYH!W9UO;;6I+f zKFc<%p#;wD=A+k1yP>NJrHFv|*}%SYYrHSr;24C6xY~)XFXuy#eu)krd&B=;H{APY zAby7EP@EO8p<2NSM|^@i@1%|}UhSGe_Q$s^x)91;nSpv8!0^C?cvMEG!?~=qkBL61 zB2)Hx+jv-w2xay)2GeZ>scc-x0R(@L*iNvhlI~26E=`UTc6%aiVWTcL>fP5KTTObj zagPy+$Jx;$5AMX58!>y4yh;Dn=+d@qzNIyE*iHi4fStV#Ev2A(SxdT$*bODD+dO6J z@Gnh0%JBz?<^VL)Q8OSE6ZB`^kkUQNk2I_4yY*TfBd(~girLZk->4k;KU@Iu4neJ1 z40s;1*E|fJc5^+kvbPi9_j6!^En#YLL0e01Wki}fWtC6602&FY+?X}e{-t22d6}6H z9P|@La~htM*W$xfi(xPxHB-qB^L^$aP}86D+Tz{?GPN!aYKN(zDd<(A8iiPTuF`4~ zjt}t`1<&Y>rZI1LakaK$oN&|Ac^zP1uXmxMET4T6a%%E^?l70$BuaM+E$gHKqWE}K z;AHO|{qn%q%J5cUsNA86Stdg|#(`f4Xp}<+R&41wcX`){*dKaJax8alnjEpJ_OA3I zt})6M1bh_6v;`|J_}b2tYwq|2pB11wpai2G9F;a;oY=ZhBEdVKhgn^IVqET|UcLCL zlagCD?MY_BGCPb9-8;hegV>YMgQV@$Rp*KAg2I+R_XM7V{$}=|#Zb-Y;;9{}&xufe z?|i@ruPu5$YGlksHC3BbfBzkD`GyC^0Et1hS~)%48MQp=qzN4$T8~JM=x-DgRu=Zb zpyLPJC{MvgttLS|0JrHohTOu)7^~ePgj|!Q>a47cS|;jOtbb60WKMN;@_o{Cn2s+a z9cZ;PP<9`Ta5Bz2s!HmkY34@T6F)0;4sw090Gu!-_{N5U-o!l8>x%|@W#-Q7SJjSp z<1WCwAIZOtDh5)5S6LeC!NV+`5~h(gWa@yHf>Xd|=Pf0+DKtw&adk-QQfqov*)#== zqUq^uy@ZjN`m_4J)3yQ^fyW|UkD$#@fz26q`bD3W3O9^}Bt9GKWLGy)Z1*wW89BGc z>>YfFZM?+KtFPEeh@N_gPj-a%N0(-ewMQQZD2d3HOi`!7r-bgIeC1|BN0+ZEk&!h( z#JMz5k~}-q@2BHwjWWlVl36lyZ{X65$0PIe6(=722usb;@~^ZWY!96YR3)5{Z7wOk za!+Eh6$s^o0vyEL@~R@-xp~-K@nwiSam~gOI<_a2K)>}Of2P+Rf^iFJ-(@b8fGF&W zIWRa1kuxbA9fCQYM6~-Xt)IwS#Cd13f=u%KFOM_cN{_UUwY6swQ?T1g9U2(yd}pd%gfrwC2(Vv@dEgBuVt3D0k`o( zPE(BCIoZ_bDi5SFd1^2%xxk^*gbxIGk#dokp$?`;5n1cz3tB zFpkUDG~x)T^5(3-ZbOdYU=tpY0%JEFA;F-*dcCz^;b;lri?+`gK#Axoh)&$-pbNLL zA&*&;u^b+ScequJOhA^|BCGEfGrQ)*5jAkaaAP1J7P1{aL9*W(L5!qsj1n=Gi#kdi z#)Fz5_9im0_b4q%1HpgXNwlOD3hkOBSg-v`Wd^Mb*2@|8Z?<=z?lQEr4wR1hFSDfQ zf9|#plBg>AFWg>y1EKVqKiHv-;`^kuf&zu}VAm|rBfJjxI&UX>>G@gHSgUen()LZ$ z5R%PQEHbVnAD8{IUQ$zjrEYz*G3%=k5YfD{6Cu&*?_??RwzngXsjalM;2d?tz@GLq zeQ_ou&W_10Y=PN9*)0iCs4D=MG*p@^WVf4&gS%tGwH!K5l3073KD#HMB#dzBhi0Xk zv;Cpbcb%@oX?2YaP&(Z!kmbt*tLN4Q10));F})hgu*X*PT2fw#5NTWS zqaFmMZBkM7YCR;i5K_YV6ZS(5V37SCoR&0smgecQkPXw}-X!4^4LnmFqJrkUhCE9H zWFq|{WMR)sJVb7+ey=17J*`+2@xlvlU^-7l0 zXcU$)6_W3^FmtrxId>#QWF_gPAXO$9tT!Z&C=LAkm0*7q>0PkS3 zeQ1ruCHJ5nWN~BJd zW>B{a)E8MeH@ffH@Gvmj3;{v)mS(y3M&0Y~OmJJ@$%3Se_@0fjtW+N+C*{p4foNSH zQhn>vao(LKm|ExFq2mGcN8L#v&Rw`Ybzb3wuRE6&Ov9~w0ZZf%6RWI?w*uYi=(~4q zy@b+aUnxs)MCd{uNt7M-qAjJ!fa6N?nj@^DY{dxEoi`zrsvUY>)k81NFPH}jv?^p z2S+@_t!zVb9+yunko;73o9fGIx-&giU3(KO&`E0iG}@z92k((QiSi4(-kBG}N1o}% zwQh6wctAH!0yBBpEh(x464Lj*Pa}?_eXLS{VRem#r0I^U^ZLl)3Do##36fivXX`Y| zF40zfbWxtT8%+q_367@hMYcyd*?pGG*jzZgI9aaRDN-syxDz)u6YOZfW4EaRnolS9 zLO4RMsRgYA%}D|EMJ{fuqPsP9H>-J<*0WYUpXKf4HMHXIhJ}TzxuEPJLL$g>v2vNt zyhk)fdt4ym$fB!|>+Z>5*jvUUhl^IeLVEYya0rC$N1|xghx(@s^CY4cLc~hee6TAX z%^i}d0AIGdJaUIU*|l1FAlT`-d&OQo!cdx!j5I7)w{^a2c&{h~#jSQfjG;xR_{BNT z#_!g*;u|%v1JMxzUgD#aE{fNV`{)M^l}^l(Q#>a4z39P}4P$xirYRvHxUQMBI`{?sh0G0eA}t^DW%IJ<0g14XXC?I0 zMBlpl)tRg2K>JhJ#X8`|d!dB`-t($mUqO>`jOupg6ZnpIk{F-ekYdjqSw#Ip6#3Tm z-sZWCJlc4qfkL^=4%Ng_*bPZBi%V?Ig?mBgA&ZY{h$#-*8(#s0z>~{7b>uAIq5Op*0kC!IG#wOrJz8kl}=yd`NTA>XZL3QChB%T1^a(fU}To>Q8`sM7o0%#9D zMr6oPIbgUA2puuwPHrq`CCJqbK37G`{v_{Kr+ANZD;SBu&gh|#(rgk_xx?|yuHhsX zWE*qsbX#g#^S%sJf-8uOE*G6^sDeB!o|Q)g@pXVg4Oaw->5`PlT+3 z+SPnaK}g08xU9|PcG42Nd(i^B`IMw*|KpQFJD^xMlOIh)aK=-}cHaH0MtsQpFcFzz zckQjR>tghJwf{C^cXhPm&#eWwWz#yw?rT*U{#C(8!~Gy5n6woDs6jxSreL3yhxfKQnYl9uI0Z84L1F_sGwTP_Qo z<62Tq_9`{}!xj!LX&00`amqk@N^ZG+;Pde4M^fH=CMRAl_`^=9Ldfu=aJ56pyr;cK z9I6*uJ!alC!QVcL?w)8eJL7iSy7w*Z9Mpg&UI-5S)lqga zfvu;`91KJVBMs9Am~qJn-o5sM6NFir^_4{BRj-WVsYV zq_#W%KyX*oQuB_<@};XZW;NFsHS5w`0{y+xI%lo0-7B(sF5b3e9WzH6f&~voJ9n7J zoH9chNf`<$3{Rbn7EAn`cP+y4XgWcg)I0Bt`6xPn*XO(N$9Y+Q}$+`-0{>s5m zRKzWuvSG5kHKE(I|1DdlOxC0RXwV4Nado5oLT3#$oCY*K!8t82H_X*tCNHG9yXacp*9QTnE36~gNmZ#Sa@y z5?&4$rV?O;;kS9_3s>xJme@`A$2hNvxRp+LEwDa2LotozTd#lw3C$;|pQ}0R{7L^U zo|Ub<$$RArdjefo02Q=Ur`?rb6bh`A3hT8}o~uc8D2L4pVMwMu^-`xwu?M7LZWu~q zNA$bddrC`zN+xVxI&RnH&;tRevGp z4u)Fl{H`D1U8jaFXt&oaGb?G71rE=4wTo65mOm`?y6Os@1Fbmql5zKBpS_Af)h1x* zBZ19JLRIa;I_Izq8v=YYuGKQQWvcrgZe?-st8zI?5rjS{|Csvg39H}t?bSg=gnr8W z8C0>h{mM5+KI##`J~TYevZ8-aYI}7IV|13b$DOeU&zi7=t**|5+FmZq8{_7KN|g8m z(u6trojbMRZ~<#iJBd4>QR3WgyiJDAFBM{# z&N|%@RC61C>eP_ix9;NyyQNW4XYa>l{=Pmpx%lUdbJoFI-W%a$*NoxqP$@M8jZr&( zOABr0?n_tf34ZLsb%WH4x^}BXWc~4`0>>#Deyiuo_rI+e?1{m*=&s=`qUL?H6=d-9i;3GOhX} zFjXkE6YFc}TvWX~2SL!%l=r~ERL4qQTz?0+U}X4A9>GpmDM1d(9==Vtg|YJU+Xliz@2$2FR^j3t7Jj=}2U9}4D%pVAqMVG8uLB<564zIU(JuLCg zVA^nnATVl0G3RVJxN6O5RC&U$UUnZaM7&xeA)zhNebtsE5sPuj&1#hRL>s}%9!s#; z+z39jb{N@MYB~fDd)o4;*Z2GCUWp`$4&U>IHbXl1(ks!Cmxxhe&T_t4B^gGkMdo&io#8rR3l_pGVKK z2OTWBi&}C}%RrUU41~jA(uo;J$X-3UC6BcTIg5vgA8;BM=&{>A2=%ddev8nxY{|ME zMYf&@Y&R`gM$py=?5t;ki;%E##e?Ai?cK4s8B99R2~LehtR7z_%l1ubi3^ehb69cZ7Js2w^9vrRDG z#37f{0_?U?)WajtOdoV9Dlj2ypsJJbDIvp6?p8nB`mA$xUj6h2=k=bXWk;k-Zs>rT zqNTgTjL*uAuXzWdZafFLRP(^%M$=xKK@CxpEUWIFGLQ}A(0~$kqb#%uxZPKge~S1N zXC98Erk0>KI1+&CUbVCx8ENkRlIgh&zojm&3xLuLp8{EzRJ`IH4V# z65l1|){fhqzsMVJ@7!~sMf2X-C&Iis?fEelM}B~$6cQ%pS||JE4p)3CXmWQ!C1eXb zEx)5Z=A7m$bcK^|z9pc0w@cw0b*8EIX&Gp}8Z7@45F9jTJ^=OcsZEt}03k}==we5V z`|ZQ0t}E#l`R1s@1)*P&x;<-p_mjjYN3J2R6YNB2IUFc#&2N(2x;8u}XGFA>Ts(v| z@+r+nxOxY6w=6RW=gFeDP#mUn2=^9ajxE@_AWo6&x*{P|XtN3?l_vcDB zdM)3Nvo=0$%`S%F!S>+PHYqA7=%pVJ-WQ zDwUxfeTw#81IQn|_^|t&2}s^$9ipmTBQQ3&V-`9M&Kv5zJ{e&CS#nZ;A$-8ipqtW zrmS(4%G?obnsUmLW_%_q7fLNn+(kv%G$)xd#j>*8uq}o%dh<;T#U|z3=P#+}9-?bVHXXE_Mg48l;*PLj7hqcE(N9y!1xe6COfk&lR)*U71?F)6yhiAxdO3N(`@P)J z&WB8Ga5pRw{1w`xWkP(h_;Y>DR%aWN2A-dbq3aTNmcP0^F4BF(->z01#R9c=5$V0Y z7HK+I=3xq$JJ^{`zte1c7KRF>kM$8fIOYafa6hgw35` z^l-zP3N!Rb+?zTGgn;*9Y8PHBb%i6V+#v#ls{UDwdjQdPjL@oCugdPOD70~|XkS;J znSoqaJ<|WwbHDKF@EAoW#|fyFgZ*XrcXnu9mEbm+*t7>$uLa4C*z6n=*LOZuKYZ#< zB2{*}oz56cNK(sXD8!1iAoQAV4r*x(^0C>FKl8scH`8WC<<>@f*Jd`2r z(-8s>#t7+s)S5M}>)X>Dv|8CtV$w9I2UN|Vufe^n-unOViK_6N66$V9CMUJfphx=k077y6k#`~uw!yhi@ zH4=Xa=}Uab`1KYVH{G4=)}n3S;f&6PDHF`B>jbw^klAGG zx=p>b6o7Y7yyHFO(!17#62`hN;+oyDr0)(0{`gY^v3QDs;9uM6>4;oUHuqfHUzN4s zyl(PqnCFhWwXzbAE9QCsGsZHN^NGDaRhO^-&Vn>>@;E=+2#{G5p$)86U8L;GGRRTk zQLUbvLwqF6Rxfs0n~5d|>tt11tM3m-;wM)Y{;HImi0o3{iL|bn%#6WgOFs0qX4-{u zXe)~UxxmEeGM}-lWU57_$}^8B?rLd$p;MBW-IAI3YnbfyJ<@P)^{Rko+ES6~wK>5m z+9LY4QDFsruyLUb`Wn5<{6+ozbniMNqp|rdjzHuY!bO{GA4-g6Yu^Z10rKRYu~uIN zr+3kE<&Tz9$=i30-;r(T@7pQ<9DL(Cw&$p;va>Uvh6S^whvwnXAKKy1KVyW~Y|LPrd>Ms}YT?kzJR$O%a`SGWymajVN}xg!=SWn)|&a(9n#J>ZwJ znMGN!7Jv}p5b{qR6lYLavuS{}GuFP%g<-89amS?NQ&o+LNx|!66%sJCBcp}cXfqxr z5f@*raLXYD$&K!2v~P?aHUkAx-33igAwo0y{q$wv4}70?(;7@#A%vc|1&;l=jllAP zU!#b74T|i-zv*O5VEmAma_N3mI>GmTg=jJ4_TGXf5ed}VY;rC9u5_}hqMmYzF1p`{ zNo$9=lBoX6m;&fNdAICu3$Z{Ob2)qIDE9L)Bqt2JyPVmau20pEkaqXc%(ql(fi@lp zo+K_!t`xjZ4w3XLU)8AKM~FWsT0jGBt+E1zvh9FL zo&|!>eA$w2hT??Do&js`C*>lfyW-X{wxtjdYsNk>7HqL1eacK_j=;)$(ZYY+#4*$9goZAKVwgd%`{Sc+VW1w#NW;eW$Z$s8Vs6XXX`=a6jbu?dzcg4g;RtpHIe42bNsa*Q0cv2_VijR< z_dppsZ?;-}(5iQva)+z|yv^1znCDuGmR#?~6t{d-lHcPY!8HHT*Hq zW~)&q@0L3?gwP7FoX)C_GyZz6T~6KHwneoTr>Zo*$kWAiGvIwg`x&$GK;>d7e9is_ zXxwmTe5K(JpsekR{)NR;OLrti@u?L+@ev`JA)vXsjF1oC|9l?H-%^Yd_GQscmg-QF|wYF6GoRkFpY8>P` z;=kV^!!sINk-W;KT67-*lAqvKK5p<6Q!JykOrGl~JelC@f|&fe#8kVh#P^DZLw%!{ zY;wbdEd%2wFE&PlFG?CP+y$@!e(CkcgUhE|leyN)U#VcYj z>_L6>dGn!RddfGPr$ZT85Y$1mXs&`ybak6XIbN4-Q>1s^+a{fTak3$Du9+PjmV1DgKvz>wB??<+c%C>$s z=$gHO4y8Q2uf-Ss-MCOpaX-ioy*!aOnZG?1uT+LQbqnsfi6DG~6qR)7PLtpcz)x`R zkPF}_4J-ZAQ|?3!l61OQnViCJ8^IKq5nAt3i{K{Z9BBtnbP1AI#rOCj%!vxL8$ENP z=TYb-VqJMgXdqEDo1jox6N_+Z(lU)P8yW(sm1SDpp1&u!V(5OOC}l!tTzRe}>i1j| z(VzM>R@-)}ykWVXF;!nZp=z0^8@K<>CNvZGeI5$AjttAQdwc21X_tA8@***d)H&r2 zA6Yj;yF3JM;|4a4JCHZlCO)yQdm?2N>duNAgXl#dalmGu`Vuv!sx3g6gUsPZG2d-8pnO1dPNy0?&U{QTYM)-TVviqwi&~b zszLe*xj13t^Gk1%F}CO2y1kg=l0*mgwNwBV(gJ?jnGd7V)cV2c4Co;+v=JyJ;%ScP z<={k=Ahn22K+nbc9D|stUN$4}-`CEyRL*^T&O4i5A07(wB7%%*0b@^gjC`l)spgVl zdXx_))!ggSJAF{s_<0+HI#(tTwy`+><(pUs3#%H|iI};5SKqc3yEtKo_|5CrWZ5R= zOKR7egKk@-kB`gLp~;2movV|cE%yz&j1mrIP?_&Elj0WaB=0{JIvFJ#**#Yq9LI4f zFH-$G71pF9{o91;pX^=T(~o_1I2quo?_5*9{z5xWW)>UtZSAREbn9M zV+t1zUUOI2N?az1swFm`68G)UDj7X}hKcoz8IM}YaBLxz%X?i+=ws3AQ(gDscQH3% zB0ZhL9*5j*IlChJ~baSk&sU@C|)$oqq*akIvB!71eE4|!B` z>#y!e*5Kf_ByiX1zZyAyfYqiIe|_+3hhlDHtzPGhZ(qv4_4B-p*pk%`TI)toy7BYX z7d}UdUqn~3z|~*NTJ*AG@n3ZvivbeZQo-gN*6L1AasWN~&#x{?z*=Lf?AE=HcM=%t z=vw@*BZt)CXrG{J?{3~E4!vCKbNTdM&$N=Y-9OY7*zVFn={K>R_u3fp@8s`m7k&k+ zUak9*+B|PUAU7z=!;bu_|~nAs$#w*hXyND(-@EH2@duSj6zH^smJ=<8@2m!QreQ+t9Op$c6DO__PVk zGk|#794xI!gmxFq1f^t|`cmMw#KdW~X&eu&*DX5hP>a7rq?wHjgY(&^PV#)t{F;Z> z!HcKzb&MgCNaBpn@E!xHUu4EbYgrmnc4lxqiEb*uAtuX<2PPKuQ=$A>uG#HVn(3z1 zlP)VrW0@)sh;=xMBWpVPjF8f8VGhd0H3 z;$#C0#MI|kUH+J0-_xmZ7)R*~U|1EToGXxRp^nXU7fNStd-M5rlnF@DHJ;9GkP+ed zWYpce3qS9OZ;H5{LJkQ&{oUoCzcy96yl*bd*M0~v{=>v;O*4nzY{~Gg4c7Zon0@EJ z3uW8LCTm*d+@-N|w?dc)>+FW`Zj1kY{m2C88Cc}f^-XvzhRac~R*$*E@6=CKQ$lLS zVm~@OP^SkIQ*^xI%}XZ?=Ku1aQr?6zhWc%8OPe)rtmocmAiFzMEA^afYR?F@lSh~X zrRo{CU8rx&hJTb8`|5LVCyw_Kqp+RJgCnh+{cpER+p$@P0zX6<|3g8?r7iZ$hhYP% z9$53tjvp9w2pqq?Ak_7RGuHUC7t?mueyPN8TcWAWId@jca1Aks7zTW%)zuefbq#sd z=-h^Mgj2JH0c>a?jd1xJu}CE}lV0n(a#HbCTH##_p>jherUmv7k&ZyBBX8bDZJZ{% zrndw&f~j~8;*uykB06z)wlb=2fM(lD_;$@=a!>A3M*z*r!P@9^O7nih=ona-au>*9 zabAnzOs>kZkURwEC8&VkXPfs^n`tofuQyHp?IXo-+uHU+D)UK802!28!`9#P#L79k zd@-quJJNYr&HFZY&dZ|L9VjjQ?E6)V2-9k;{Sf+<-)TuR$qwJa9IEO3S2Ql*6Htut8!E#Jy;HtmCEX@S@@uI^< z7HUWLTKfK5llc&Rg#H8?6??=m#rTw_G}tl@_$t{E6#@HWNZC#+RPIq*^M^I9}};qWabn;eN3W;t+1~TVet^#kPGt0<-Pa zPqydp9IvcMZufho^JIsd|K?1Nrhsbp(=Cq_kRMX0*QSyG@INpsMmzpCxB~2)gOh|q zpFevT(mnfjcNb3vC*)a0r+C;}X<%iAR1!m9Q`BV87oUzy#P%b+vwUig6*AN=^jO6q zltd%#irMPVUxra~&gy7xL~D9AVna;?58Ok0_D85vkZR5{TRDKJ-r$ioyhg~O^^%~( z6L7BdAt8dgGQV!c;OUM~)tRe9sv*io%t%xWO1(8}qOSz|U9x~u8jong;Fp$9P(B7) zOs@`)hqu&MlSBj5VU=o8C3_L7EC{rPdhJqGKp^L-9MHKon zV9-s|3;Bk@*bqCQA|zj)#-6)U)LOsmE2Mg;c(OH;L+c`RSeZmzp?_P}DNL?n)03+P z+RyxLLn*REvkzVt)YTxv$*mr@X?2)^4S9)*FI|fT{6=0`L-D3^8k_!pm{_LcaEttb6v12M{VhXZPIIUqu#0NElfAtI{ie;t$K<*;Y@Jm4XL;edtWqm=! zC0wWSfOW%OiD1aA)v4OEkR+BB0^@Qt z|H;M(0%z`(QC=%;Y{43?n>r>=MxKW{R0#qq&LaJjgxv{G;FvlQIf&T(r>bL9Lz^E> zCj}Z14>Q^b3&^u>)XF7RGqqr0esf21WCYKT*r)W2C<6h`;SS<^T$0<3J0^8{dAUYDJ~{WeQqW#`2v0K z28^!YJ#*Tv{fxie-1hxOV|?D6VWw4nit|hNhA@R~55L81`cp=T)nzl~P2@|qYVCY`bNyIUNuR|YI-62>96B)es?2+8C)|tVv{|KlInO7_?zorniQTY@Si)WFE zw-ha!8Uv9xt?qz%b%UXSu0rSDh zeTjW|(AsGFrmP8)yofeJ*F+9YOI9e2p^9ddbZU7G5-XB?bcRRcnimLj5`S-gdkrn_ zdt}Y3oVPl@^3mVIY1LOWV|f%FWhhIj(GY!nG|>+?o=&aUXohYyjv(-3jG++5Lh7tJ4slq(>7o`gPnW9x&O|>HGB)Oy7S%4flJ;>S?PAimHd~v3<)Vr@R6X!<* z7a@dvcRk>!6UniAuYI=B+jVj<-aow5K^&zsb#%3KjFkY_>F8+L>yQERwLDQ=qg!yK zX4=r(iVDsA5gYk!?}$ea*RAsDjTBRdcB2w$l7%&L&m6vS>cm>_iE8m&FAMAhnP{Cq zmt^SF$v)f2CrOXqK2Xy(v38*wKZ$@bygr-)dW~qDs`WYbi4b}IyS3f5pHVl%dC1+=AV+q2gj*_wjg6OL zpem%;>*RMfL-=k)v~Xaf5xOz4XT`EiCUZ3l&@pK7HHli2AV?cj6j`~de8(ssg8?wo zny#1)luYFwOv6unsAjCyt2q)fb)$G>0yl;I$Z)?|L(&wVE~_Q1!h9!%`Ns-nWt3JX&n z*>t3$pi@nRR9-P&;TswQA_4W+zPVUC77NyXmvt<>e{Hy3fqpF6^|ILU7RD}&wmOT% zd9jQZexu22Cc0^?@#z}ya2AU?L;nVU6aCSLool*>jMgwfjVr|3?JZON?SO%1&#x_v zS&H>wjFLj1>RY|7+lV#+jVEMN<5Pv3Yi`SWKy^?3=FZ~;mx|gp8{0lHgihp;q*B~E ze|H5Z)V$-~-p3=9ch%)>;=L3@o8?Ztf6T^?0q&j_uXM(4QTIUTAw5@?bKSS6QHO4Y zg}lO)H5xIRNc$(ArhBREyZsP&wj1fPmB0Ox^^gabp z_n3vhdB_2WG6YDn>SZOXad(LTWQ3fr1&NIch6O#aaZ23YG0U+2BX`uKkV*`euSdEU zVWza#QuGn&>?7)`9$|uBlVK`DL$hYp%Q;@5lQoj$eJRlI;&)~|aANjtcNUQGM0hr) zTpXC;YcDk47s20Vbi-{lV1CC$M^9oQd`#vA7o^iruKX=?&o1TB(r&udXCX0G zXPpGJE*)hBVwR*FZ^1L5JuO>(jv|S@25fFN?)W4ySf>`5);!(dcghyyawV(G>9o#i zka2$imis>V?p};eVEL=3$K$xS$-s>tuhlmXBaa9#M9A(;O~q*c>kY&3bTC9sm2eF0 z1GeMTkQlw-QFeB)(0RB2Yf>4 zJmUVFIKPJ)ia!>ELAQSZO=^*5gV`vP{-srg-_TC?QXjgaYq@nb6Hu9{$X@90*E zJ4&K6QXDg0C*^N~HwYVP9AX@hr|uW2Iwagqld7c(gT}h>uNh0X($xp3ncI~uA1Kus zhYYB(tq{A*m4e4M^t^07#o}J-cg+V%;LuzZPi11mD8_XI*+FUF{_Bg;1L>=uJ)D85 z6>qyF=aGSfpl(*&W?_IA=itB;(XXmew-in;3^nCHiLp+P$$XXv9=m~v24bEw)b(-#toi{k?h8@j<3NbTw^pMZZMrI*cSrrv?1ovP<;sb z;5Zp&v@|`FA+5_!JyNpvdzOhHHM{XcmX_ovReo`n=GrA%VTdq(yS6*_S~Y-l!!f4p zE7%6OlFfdr@r1?)vH;FFKYQi!+%u^226kvqvNe^176|%@TR+c|cMhl5M7iDi6G%0L zgSZ``8&;&$x;4lzlQtf$VX7#|h|lTvcIT5`rhIft=VYLv2i|XXAEF!O3#)=1WqH8@ zFz?o?D%>wQmtzt)MvE!W2ytRrHoknR8;ls?;HbQRS^%M*ysclh=lb=?inQQb!l^)0 zFhlOf^0J;AMzf_A?MZ07y|$sxC%2qcIR`6=1k)COb)sPVrzaNnPnc%a`*lAJnnPpd zCL3I5s*Gw}y-w$e&X{zjR6_!05q70D@64U0L%JB@S?#5ae1e0C)wQ!(!Lq;mT=x8@ z@236>w6N7%xA-|9trI6Cvjt6$&I3d7g0vKJS0e-~c-iuy)2*Su^|77@^L4(_6OjD# zF>ssZzU6@n(zAFiQb-+d6s=UKU#;SMS^_|l`$+t!eZ_-s*gL4N1f@8(7k``N|GbR< z0@l`lWSvg-QmCvM&tB+H!EG2bZ@jafRY`n9<@cB0chW|^m6hP!;J{$wgs>ss4^DFI?u8 zEDEi)l@!O*ia1<|jo*G%EcDKvO}}NM)I2%<=W&dB_t)Ja6rWw&p%VNv7>5FEl+ENV z+z7Nn(^|fVuz#yaEH>?|SaEz&lRIMYt?wFnNTNru*|lTNdbXPAo?c6^7?72) zOR#%_l|!QGslqH1vzQjLh8Vs8H+10sw)+8rhz*-*`{W%eJA*>JZtvQ;L=_%9=R0=; zSl9^M=bMFEO#0G8iVUPt-^-VoN^4iAEMQ#*G;sznZuKmm;uwpv*_ncGRb z3k0XRSl7Wl=5wqy&iU}c|4>0=@n66Z5B3iK1`zbU^y+$$g^$3IG8F-N*vh^{#;Az$ zP;_T7D5#gZG`>eAZZeY&e>g{@6_*~Q2iZWrAV~Z-ZiadJJzh&;+}0mxsFjX8E%&!h z7B}tyO|nyL#<6X!Z5z!u-HpHRj;uNQQTW9y5T3``!@hYQoENX%ez-XP@E^ZvWk=h( zUO1J#Io<3$=Gjq<&O5eAEWRI8n4wSaehLY=;FRiBw`uwDIUwlhxhU1|zNVT&Pf+9i z?gP_i*434~PH2Q*$E)3iA7_~E_~vn_>US4pbj3Z0AC&sQc>L|p0Jgda*8t66vK z5!`im)fm#^S|kABID8{Lcw_qAZNTJC2l%~^yfNt`O72S3OWapx-+awhZ~2P5#YFj8 z=hy=Eh7EB?AWnFQTB

|<0@v3w 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 aM1obxbA2B^pWMfP?%y@PQ+oUP>;DChUmDi{ literal 0 HcmV?d00001 diff --git a/deps/uv/docs/src/static/diagrams.key/Data/st0-311.jpg b/deps/uv/docs/src/static/diagrams.key/Data/st0-311.jpg new file mode 100644 index 0000000000000000000000000000000000000000..439f58109369c37760ce8f9b4710711c17993d8e GIT binary patch literal 19328 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 literal 0 HcmV?d00001 diff --git a/deps/uv/docs/src/static/diagrams.key/Data/st1-475.jpg b/deps/uv/docs/src/static/diagrams.key/Data/st1-475.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ffb21ff22457dac44441fb7e83272c72fbc4d59e GIT binary patch literal 12655 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 N?>yyS+aZMU{|8A0VY&bS literal 0 HcmV?d00001 diff --git a/deps/uv/docs/src/static/diagrams.key/Index.zip b/deps/uv/docs/src/static/diagrams.key/Index.zip new file mode 100644 index 0000000000000000000000000000000000000000..17aedace14faf8f2990df3232565328901209d5a GIT binary patch literal 71160 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 + + + + Template: White (2014-02-28 09:41) + M6.2.2-1878-1 + + diff --git a/deps/uv/docs/src/static/diagrams.key/Metadata/DocumentIdentifier b/deps/uv/docs/src/static/diagrams.key/Metadata/DocumentIdentifier new file mode 100644 index 00000000000..ddb18f01f99 --- /dev/null +++ b/deps/uv/docs/src/static/diagrams.key/Metadata/DocumentIdentifier @@ -0,0 +1 @@ +F69E9CD9-EEF1-4223-9DA4-A1EA7FE112BA \ No newline at end of file diff --git a/deps/uv/docs/src/static/diagrams.key/Metadata/Properties.plist b/deps/uv/docs/src/static/diagrams.key/Metadata/Properties.plist new file mode 100644 index 0000000000000000000000000000000000000000..74bc69317de4fc4ae87da8c71d1615385d70d1f2 GIT binary patch literal 340 zcmYc)$jK}&F)+B!$i&RT%Er#Y$;HjX%NJ3UT9#RynV%Pylb@WJlNytfpIn-onpYAU z>gf_)mRbao1G6)WeM@snG6NFRQ{x2$(=u~X-SUfa6HCG%Y9fm>5{ptnD&qyz4Xmup z3`|U&4UCL+jhsv!bxoX{O?55Y%*}M23@scDT}@4m%q)yTQ}g2eeBuRE+{`RpEuCE~ zbzNQE40TP6fZ8lw98GkADjm(;Tn!D4oE(A5h%u8h)KJez&wxln88{fk859`Q8B7=) l75HPbcg8&-~3o|P_8#_BY8yg!t2RA1> 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

2KUY7yz-7_`p(lc`HgEPC5(QDJ#Lr#t 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 Y>c{6t4Sw{%j~@8Z1FJo-=6lco0p?d?5&!@I literal 0 HcmV?d00001 diff --git a/deps/uv/docs/src/static/favicon.ico b/deps/uv/docs/src/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..2c40694cd282ff3d0db2c495c23f3beca40c17fa GIT binary patch literal 15086 zcmeI3J!oE47{^bE(6L>dlR?3;f?AMDoTP|gC(+GON^N!X18j$O66~NjsaQd=(xSMC zL)z#dI2x#nOSZwR!m3x7+NM_xVsKV)SFb<|EpaeeASlj(+q}%U2&yoPD*;Lm&Ey_UhK~ z_4og5Xr+DRP_sk!#l?%;Y8ZWV*^pfGuZHnl8XJu9Yiq#y(Ek|pp24Oo_K^744vEX% z&VG-&+OikQSk~Z?A1-gL|EIsK{O26#L%+nJ84qMmd3jchtG#hWC&Nw%vpc1cK(nJjju2B;@Lx= zdb$)`edHiu4|NQ8|RdXF;=Y~_aQds zM-KRv4+sy(@ZfC92gKI6;H2E;6K(qX-UX~%j0>mIj{8FYL$I_j$2@PzKi(Uqj$`zO z#4L5N(?>*Nx>uvT*8k+fg{fl8rQ8qrD`mB~$cC=BvHB2S^BB zo_6@a7e4Xb##oy-YQyg-4(0Y@Zd<>ncpwkI?I z#(nm2&Rk}dLs#8nOwJ%bGaw_^Z@yn{`_@$KJMZd%`rc^{L%16&qPZZ8yy&yXqHe8E zp4v^DL$+J0`R4$#?Y4)|~%PII2w6MbC!=E%c&^QfI|YuvXc=!{*1Y4?qsL2`h* z$o-C7&RrON*x$_I{LppiJ7@Zwgz&bZi%;^2d%G)#^1eckdtnIwS=8R#;7=cfx8p9} zQLZlb%I^mM$iuvbtO1gd?cjn{}^(OGIzMtu55|%vU*fmf#WDj|cBmZ3E&ULE z^DEBxoq?V3_c`Snao@w)J2O5Htv$MtTiLJ8Ps<-ZzF*?kddj;CIdjfw6M5D+I$xWc zhQGY!fnWQebuQ(MwWVLXOObWGTVP`@;#mIJ;fE&YSX18%)QRXmF?Jtf*EjFnSpH>g zJddJ&XMw)QMPI~mOn)r@Xj{7voZk&B*MxEA-}y5>b8-Dk``zH!=QGwGJ^1uJznGg9 z|1$TION}?{8}*_O`a|A9*KPP*J_HMHIpwG&wQL$C-RQE%*QsQ_U2XFL*_t?GB)|p zoTFdrz*D)r%G#KV^AR(r&U;7R5&a!b^kMysGZx8@XQ0nP@+p19c=pHC-WnK_JFI=lYsh%FxQ85$b^U(; zyvsXi2xoM5o45Q$;<>lsOiqr6az+ok?5p#43dY+lgu~eV!XCTR_3p~Qe5cL4mf+UW zmb(1x$@eO7H!864g(1E`#3$lv{^Anj&Bm9F=&$E59)YX*%ShmI{=yP?CV$TeB#Hb_ z`=8LKQ_5!f8%mqFnE#H7@%+D--L>Nu^WRyOxXOI~8?33Y;%}S(z@z1r`L%pA%3o~Y ik^kAsb9poGOsuT~U&vzKIyJc*jGI?B>sZ!zWBd=1T7Db= literal 0 HcmV?d00001 diff --git a/deps/uv/docs/src/static/logo.png b/deps/uv/docs/src/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..eaf1eee577b6774c345d5e21be51130a23b16627 GIT binary patch literal 33545 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 W3*P8um*8Y!7&$3rXpMwP!2bZAf*ghb literal 0 HcmV?d00001 diff --git a/deps/uv/docs/src/static/loop_iteration.png b/deps/uv/docs/src/static/loop_iteration.png new file mode 100644 index 0000000000000000000000000000000000000000..e769cf338b4456ea688b0abf888b646a4253e0eb GIT binary patch literal 80528 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

IMPORTANT

To install an old and unsupported version of npm that works on node 0.3 and prior, clone the git repo and dig through the old tags and branches.

Super Easy Install

-

npm comes with node now.

+

npm comes with node now.

Windows Computers

-

Get the MSI. npm is in it.

+

Get the MSI. npm is in it.

Apple Macintosh Computers

-

Get the pkg. npm is in it.

+

Get the pkg. npm is in it.

Other Sorts of Unices

Run make install. npm will be installed with node.

If you want a more fancy pants install (a different version, customized @@ -141,7 +141,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.

@@ -161,7 +161,7 @@

BUGS

  • web: https://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.

    @@ -186,5 +186,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/api/npm-bin.html b/deps/npm/html/doc/api/npm-bin.html index 3a170b0244e..ec775346b5f 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 1ab1393fff2..cc941e0233c 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 ed67808303f..2bd5bb527c0 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 9ab89fb5cd0..577eae8d06e 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 2fe37f217cb..37313a90ba2 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 557d2efe3c4..dda88578a82 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 d42b27b037f..076e9b4f820 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 f6f4617e128..c9702a0b463 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 0136e705a2a..be8556656ff 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 e2bb08abbd0..852f0bc46e0 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 ca23df8f483..dac576d345e 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 c0e0eb78bff..204f1dfb893 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 aff1250a4cc..4eef789e6b7 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 7451a75728e..64a9bd4b09a 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 f1c2504918d..a3807d8fd31 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 a7e88b882c2..c566630a402 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 eb8f9abafa1..d2b336bd95a 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 c2476f20e00..1adb04959b9 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 583079e336d..605bc497044 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 fabfab57d3c..d85c01e42a8 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 9d338cebbd7..ae352eb5651 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 821becbf543..1cb5fffc23f 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 d624659c155..2c40c8ed1fa 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 67729df285d..382d44ac97f 100644 --- a/deps/npm/html/doc/api/npm-restart.html +++ b/deps/npm/html/doc/api/npm-restart.html @@ -36,5 +36,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/api/npm-root.html b/deps/npm/html/doc/api/npm-root.html index 4f9b5293166..c9d4b17435e 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 c7ca6138338..b5ef6879973 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 72fa33509da..a4484a37802 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 172646a9ee5..e5bf33ae4cd 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 813b28ce2aa..fa8a3db835e 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 65f5c9f26e6..bdcf72bde8e 100644 --- a/deps/npm/html/doc/api/npm-stop.html +++ b/deps/npm/html/doc/api/npm-stop.html @@ -28,5 +28,5 @@

    SYNOPSIS

           - + diff --git a/deps/npm/html/doc/api/npm-submodule.html b/deps/npm/html/doc/api/npm-submodule.html index 35364403c35..f7dfcca4343 100644 --- a/deps/npm/html/doc/api/npm-submodule.html +++ b/deps/npm/html/doc/api/npm-submodule.html @@ -42,5 +42,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/api/npm-tag.html b/deps/npm/html/doc/api/npm-tag.html index cf9c71c3c50..2f94ed7f23a 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 f2d37483ac3..3247238ef98 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 2abfd089964..ffd317e4844 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 f6412cf7d18..e35acac1d1d 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 60bcde26543..18da44c1ee5 100644 --- a/deps/npm/html/doc/api/npm-update.html +++ b/deps/npm/html/doc/api/npm-update.html @@ -27,5 +27,5 @@

    SYNOPSIS

           - + diff --git a/deps/npm/html/doc/api/npm-version.html b/deps/npm/html/doc/api/npm-version.html index 89858221647..376d8b9807a 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 59f68ee64ac..482d912677c 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 9380f8664a7..1a41af4ef69 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 2335b7a226d..72265ec71ad 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

    -

    1.4.28

    +

    2.0.0

    DESCRIPTION

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

    ABBREVS

           - + diff --git a/deps/npm/html/doc/cli/npm-adduser.html b/deps/npm/html/doc/cli/npm-adduser.html index 9a0e55ee607..9c2b20b51ef 100644 --- a/deps/npm/html/doc/cli/npm-adduser.html +++ b/deps/npm/html/doc/cli/npm-adduser.html @@ -11,20 +11,31 @@

    npm-adduser

    Add a registry user account

    SYNOPSIS

    -
    npm adduser
    +
    npm adduser [--registry=url] [--scope=@orgname]
     

    DESCRIPTION

    -

    Create or verify a user named <username> in the npm registry, and -save the credentials to the .npmrc file.

    +

    Create or verify a user named <username> in the specified registry, and +save the credentials to the .npmrc file. If no registry is specified, +the default registry will be used (see npm-config(7)).

    The username, password, and email are read in from prompts.

    You may use this command to change your email address, but not username or password.

    -

    To reset your password, go to https://npmjs.org/forgot

    +

    To reset your password, go to https://www.npmjs.org/forgot

    You may use this command multiple times with the same user account to authorize on a new machine.

    +

    npm login is an alias to adduser and behaves exactly the same way.

    CONFIGURATION

    registry

    Default: http://registry.npmjs.org/

    -

    The base URL of the npm package registry.

    +

    The base URL of the npm package registry. If scope is also specified, +this registry will only be used for packages with that scope. See npm-scope(7).

    +

    scope

    +

    Default: none

    +

    If specified, the user and login credentials given will be associated +with the specified scope. See npm-scope(7). You can use both at the same time, +e.g.

    +
    npm adduser --registry=http://myregistry.example.com --scope=@myco
    +

    This will set a registry for the given scope and login or create a user for +that registry at the same time.

    SEE ALSO

    • npm-registry(7)
    • @@ -46,5 +57,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-bin.html b/deps/npm/html/doc/cli/npm-bin.html index d6e055aaa3d..e3c993f506d 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 8693485aa3b..e7ce93bc9d6 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 58dfd36fde0..e2f60bb1181 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 47355abbf21..0bdbb1ef979 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 3b84f979dcc..a384b71b2fb 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 cc56d45623d..2d0dae8c8d9 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 52efed825b9..cf19f65265a 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 f2d9794de90..0e40c7e30ee 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 01640248b57..f4c568cc6d8 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-docs.html b/deps/npm/html/doc/cli/npm-docs.html index 05b445cdaed..14f447987c7 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 50d21486a0e..542404cd913 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 c3c3127de6c..15d7761ce08 100644 --- a/deps/npm/html/doc/cli/npm-explore.html +++ b/deps/npm/html/doc/cli/npm-explore.html @@ -50,5 +50,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 d09aecf8c1b..22ddb9dd519 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 bb5a2e16677..52096aa57e7 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 ec53ca25679..6b4bfe10cb9 100644 --- a/deps/npm/html/doc/cli/npm-init.html +++ b/deps/npm/html/doc/cli/npm-init.html @@ -38,5 +38,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-install.html b/deps/npm/html/doc/cli/npm-install.html index 28b6afe39dd..38d160fac2b 100644 --- a/deps/npm/html/doc/cli/npm-install.html +++ b/deps/npm/html/doc/cli/npm-install.html @@ -15,10 +15,10 @@

      SYNOPSIS

      npm install <tarball file> npm install <tarball url> npm install <folder> -npm install <name> [--save|--save-dev|--save-optional] [--save-exact] -npm install <name>@<tag> -npm install <name>@<version> -npm install <name>@<version range> +npm install [@<scope>/]<name> [--save|--save-dev|--save-optional] [--save-exact] +npm install [@<scope>/]<name>@<tag> +npm install [@<scope>/]<name>@<version> +npm install [@<scope>/]<name>@<version range> npm i (with any of the previous argument usage)

    DESCRIPTION

    This command installs a package, and any packages that it depends on. If the @@ -64,7 +64,7 @@

    SYNOPSIS

    Example:

        npm install https://github.com/indexzero/forever/tarball/v0.5.6
     
    -
  • npm install <name> [--save|--save-dev|--save-optional]:

    +
  • npm install [@<scope>/]<name> [--save|--save-dev|--save-optional]:

    Do a <name>@<tag> install, where <tag> is the "tag" config. (See npm-config(7).)

    In most cases, this will install the latest version @@ -85,8 +85,16 @@

    SYNOPSIS

  • --save-exact: Saved dependencies will be configured with an exact version rather than using npm's default semver range operator.

    +

    <scope> is optional. The package will be downloaded from the registry +associated with the specified scope. If no registry is associated with +the given scope the default registry is assumed. See npm-scope(7).

    +

    Note: if you do not include the @-symbol on your scope name, npm will +interpret this as a GitHub repository instead, see below. Scopes names +must also be followed by a slash.

    Examples:

    npm install sax --save
    +npm install githubname/reponame
    +npm install @myorg/privatepackage
     npm install node-tap --save-dev
     npm install dtrace-provider --save-optional
     npm install readable-stream --save --save-exact
    @@ -98,27 +106,38 @@ 

    SYNOPSIS

    working directory, then it will try to install that, and only try to fetch the package by name if it is not valid.
      -
    • npm install <name>@<tag>:

      +
    • npm install [@<scope>/]<name>@<tag>:

      Install the version of the package that is referenced by the specified tag. If the tag does not exist in the registry data for that package, then this will fail.

      Example:

          npm install sax@latest
      +    npm install @myorg/mypackage@latest
       
    • -
    • npm install <name>@<version>:

      -

      Install the specified version of the package. This will fail if the version - has not been published to the registry.

      +
    • npm install [@<scope>/]<name>@<version>:

      +

      Install the specified version of the package. This will fail if the + version has not been published to the registry.

      Example:

          npm install sax@0.1.1
      +    npm install @myorg/privatepackage@1.5.0
       
    • -
    • npm install <name>@<version range>:

      +
    • npm install [@<scope>/]<name>@<version range>:

      Install a version of the package matching the specified version range. This will follow the same rules for resolving dependencies described in package.json(5).

      Note that most version ranges must be put in quotes so that your shell will treat it as a single argument.

      Example:

          npm install sax@">=0.1.0 <0.2.0"
      +    npm install @myorg/privatepackage@">=0.1.0 <0.2.0"
       
    • +
    • npm install <githubname>/<githubrepo>:

      +

      Install the package at https://github.com/githubname/githubrepo" by + attempting to clone it usinggit`.

      +

      Example:

      +
          npm install mygithubuser/myproject
      +

      To reference a package in a git repo that is not on GitHub, see git + remote urls below.

      +
    • npm install <git remote url>:

      Install a package by cloning a git remote url. The format of the git url is:

      @@ -220,5 +239,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-link.html b/deps/npm/html/doc/cli/npm-link.html index 0324ca130ee..0d28a7ddf85 100644 --- a/deps/npm/html/doc/cli/npm-link.html +++ b/deps/npm/html/doc/cli/npm-link.html @@ -12,21 +12,23 @@

      npm-link

      Symlink a package folder

      SYNOPSIS

      npm link (in package folder)
      -npm link <pkgname>
      +npm link [@<scope>/]<pkgname>
       npm ln (with any of the previous argument usage)
       

      DESCRIPTION

      Package linking is a two-step process.

      First, npm link in a package folder will create a globally-installed -symbolic link from prefix/package-name to the current folder.

      +symbolic link from prefix/package-name to the current folder (see +npm-config(7) for the value of prefix).

      Next, in some other location, npm link package-name will create a symlink from the local node_modules folder to the global symlink.

      Note that package-name is taken from package.json, not from directory name.

      +

      The package name can be optionally prefixed with a scope. See npm-scope(7). +The scope must by preceded by an @-symbol and followed by a slash.

      When creating tarballs for npm publish, the linked packages are "snapshotted" to their current state by resolving the symbolic links.

      -

      This is -handy for installing your own stuff, so that you can work on it and test it -iteratively without having to continually rebuild.

      +

      This is handy for installing your own stuff, so that you can work on it and +test it iteratively without having to continually rebuild.

      For example:

      cd ~/projects/node-redis    # go into the package directory
       npm link                    # creates global link
      @@ -43,7 +45,10 @@ 

      SYNOPSIS

      npm link redis

      That is, it first creates a global link, and then links the global installation target into your project's node_modules folder.

      -

      SEE ALSO

      +

      If your linked package is scoped (see npm-scope(7)) your link command must +include that scope, e.g.

      +
      npm link @myorg/privatepackage
      +

      SEE ALSO

      • npm-developers(7)
      • npm-faq(7)
      • @@ -66,5 +71,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-ls.html b/deps/npm/html/doc/cli/npm-ls.html index 0e1fe6f358c..a52b117c330 100644 --- a/deps/npm/html/doc/cli/npm-ls.html +++ b/deps/npm/html/doc/cli/npm-ls.html @@ -11,10 +11,10 @@

        npm-ls

        List installed packages

        SYNOPSIS

        -
        npm list [<pkg> ...]
        -npm ls [<pkg> ...]
        -npm la [<pkg> ...]
        -npm ll [<pkg> ...]
        +
        npm list [[@<scope>/]<pkg> ...]
        +npm ls [[@<scope>/]<pkg> ...]
        +npm la [[@<scope>/]<pkg> ...]
        +npm ll [[@<scope>/]<pkg> ...]
         

        DESCRIPTION

        This command will print to stdout all the versions of packages that are installed, as well as their dependencies, in a tree-structure.

        @@ -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@1.4.28 /path/to/npm
        +
        npm@2.0.0 /path/to/npm
         └─┬ init-package-json@0.0.4
           └── promzard@0.1.5
         

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

        @@ -85,5 +85,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-outdated.html b/deps/npm/html/doc/cli/npm-outdated.html index f4b3e1307e6..6d12d1a337d 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 4dd7b386d63..b2f8f84e579 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 b5a68f27b7c..5518eb188d9 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 56ef84cbc93..95780b9b100 100644 --- a/deps/npm/html/doc/cli/npm-prefix.html +++ b/deps/npm/html/doc/cli/npm-prefix.html @@ -11,9 +11,12 @@

        npm-prefix

        Display prefix

        SYNOPSIS

        -
        npm prefix
        +
        npm prefix [-g]
         

        DESCRIPTION

        -

        Print the prefix to standard out.

        +

        Print the local prefix to standard out. This is the closest parent directory +to contain a package.json file unless -g is also specified.

        +

        If -g is specified, this will be the value of the global prefix. See +npm-config(7) for more detail.

        SEE ALSO

        • npm-root(1)
        • @@ -35,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 9db5665b33b..49bb31e37a3 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 573f72314f0..3969f350405 100644 --- a/deps/npm/html/doc/cli/npm-publish.html +++ b/deps/npm/html/doc/cli/npm-publish.html @@ -15,6 +15,9 @@

          SYNOPSIS

          npm publish <folder> [--tag <tag>]

        DESCRIPTION

        Publishes a package to the registry so that it can be installed by name.

        +

        By default npm will publish to the public registry. This can be overridden by +specifying a different default registry or using a npm-scope(7) in the name +(see package.json(5)).

        • <folder>: A folder containing a package.json file

          @@ -30,7 +33,7 @@

          SYNOPSIS

        Fails if the package name and version combination already exists in -the registry.

        +the specified registry.

        Once a package is published with a given name and version, that specific name and version combination can never be used again, even if it is removed with npm-unpublish(1).

        @@ -54,5 +57,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-rebuild.html b/deps/npm/html/doc/cli/npm-rebuild.html index 3334c695f8d..01d0f33eaf7 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 3ad91979de1..350f2fd9c08 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 115765cb07c..c4a0acefd3f 100644 --- a/deps/npm/html/doc/cli/npm-restart.html +++ b/deps/npm/html/doc/cli/npm-restart.html @@ -11,7 +11,7 @@

        npm-restart

        Start a package

        SYNOPSIS

        -
        npm restart <name>
        +
        npm restart [-- <args>]
         

        DESCRIPTION

        This runs a package's "restart" script, if one was provided. Otherwise it runs package's "stop" script, if one was provided, and then @@ -37,5 +37,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-rm.html b/deps/npm/html/doc/cli/npm-rm.html index 8622174552d..188cb517c88 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 b7be0eab402..4eeb0ae2a5f 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 efaed0d9455..dec511ccbcf 100644 --- a/deps/npm/html/doc/cli/npm-run-script.html +++ b/deps/npm/html/doc/cli/npm-run-script.html @@ -11,8 +11,8 @@

        npm-run-script

        Run arbitrary package scripts

        SYNOPSIS

        -
        npm run-script [<pkg>] [command]
        -npm run [<pkg>] [command]
        +
        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 @@ -40,5 +40,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-search.html b/deps/npm/html/doc/cli/npm-search.html index cbed4886460..fac2fac7d71 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 37c8c9c05c8..ec54bc8eb7d 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 5e98d0f272d..9b7035784b0 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 c13ede22b8f..9c3b24da52d 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 305050e41a6..8e98cc3b045 100644 --- a/deps/npm/html/doc/cli/npm-start.html +++ b/deps/npm/html/doc/cli/npm-start.html @@ -11,7 +11,7 @@

        npm-start

        Start a package

        SYNOPSIS

        -
        npm start <name>
        +
        npm start [-- <args>]
         

        DESCRIPTION

        This runs a package's "start" script, if one was provided.

        SEE ALSO

        @@ -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 519fa856ce3..95268807811 100644 --- a/deps/npm/html/doc/cli/npm-stop.html +++ b/deps/npm/html/doc/cli/npm-stop.html @@ -11,7 +11,7 @@

        npm-stop

        Stop a package

        SYNOPSIS

        -
        npm stop <name>
        +
        npm stop [-- <args>]
         

        DESCRIPTION

        This runs a package's "stop" script, if one was provided.

        SEE ALSO

        @@ -34,5 +34,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-submodule.html b/deps/npm/html/doc/cli/npm-submodule.html index 6716c4a11cc..899005f061b 100644 --- a/deps/npm/html/doc/cli/npm-submodule.html +++ b/deps/npm/html/doc/cli/npm-submodule.html @@ -42,5 +42,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-tag.html b/deps/npm/html/doc/cli/npm-tag.html index 40a2ffe89fa..7dfbd1849f6 100644 --- a/deps/npm/html/doc/cli/npm-tag.html +++ b/deps/npm/html/doc/cli/npm-tag.html @@ -44,5 +44,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-test.html b/deps/npm/html/doc/cli/npm-test.html index cc3d56d010b..4d9779e8260 100644 --- a/deps/npm/html/doc/cli/npm-test.html +++ b/deps/npm/html/doc/cli/npm-test.html @@ -11,8 +11,8 @@

        npm-test

        Test a package

        SYNOPSIS

        -
          npm test <name>
        -  npm tst <name>
        +
          npm test [-- <args>]
        +  npm tst [-- <args>]
         

        DESCRIPTION

        This runs a package's "test" script, if one was provided.

        To run tests as a condition of installation, set the npat config to @@ -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 4f5a064606d..c4e7858ebfc 100644 --- a/deps/npm/html/doc/cli/npm-uninstall.html +++ b/deps/npm/html/doc/cli/npm-uninstall.html @@ -11,7 +11,7 @@

        npm-rm

        Remove a package

        SYNOPSIS

        -
        npm uninstall <name> [--save|--save-dev|--save-optional]
        +
        npm uninstall [@<scope>/]<package> [--save|--save-dev|--save-optional]
         npm rm (with any of the previous argument usage)
         

        DESCRIPTION

        This uninstalls a package, completely removing everything npm installed @@ -30,8 +30,10 @@

        SYNOPSIS

      • --save-optional: Package will be removed from your optionalDependencies.

      +

      Scope is optional and follows the usual rules for npm-scope(7).

      Examples:

      npm uninstall sax --save
      +npm uninstall @myorg/privatepackage --save
       npm uninstall node-tap --save-dev
       npm uninstall dtrace-provider --save-optional
       

      SEE ALSO

      @@ -55,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 be9430a15c5..eb175920eb6 100644 --- a/deps/npm/html/doc/cli/npm-unpublish.html +++ b/deps/npm/html/doc/cli/npm-unpublish.html @@ -11,7 +11,7 @@

      npm-unpublish

      Remove a package from the registry

      SYNOPSIS

      -
      npm unpublish <name>[@<version>]
      +
      npm unpublish [@<scope>/]<name>[@<version>]
       

      WARNING

      It is generally considered bad behavior to remove versions of a library that others are depending on!

      @@ -26,6 +26,7 @@

      DESCRIPTION

      Even if a package version is unpublished, that specific name and version combination can never be reused. In order to publish the package again, a new version number must be used.

      +

      The scope is optional and follows the usual rules for npm-scope(7).

      SEE ALSO

      • npm-deprecate(1)
      • @@ -46,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 650fd89f56d..0c2d19ea743 100644 --- a/deps/npm/html/doc/cli/npm-update.html +++ b/deps/npm/html/doc/cli/npm-update.html @@ -16,8 +16,10 @@

        SYNOPSIS

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

        It will also install missing packages.

        -

        If the -g flag is specified, this command will update globally installed packages. -If no package name is specified, all packages in the specified location (global or local) will be updated.

        +

        If the -g flag is specified, this command will update globally installed +packages.

        +

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

        SEE ALSO

        • npm-install(1)
        • @@ -38,5 +40,5 @@

          SEE ALSO

                 - + diff --git a/deps/npm/html/doc/cli/npm-version.html b/deps/npm/html/doc/cli/npm-version.html index 47ca7e58234..de67a1b666a 100644 --- a/deps/npm/html/doc/cli/npm-version.html +++ b/deps/npm/html/doc/cli/npm-version.html @@ -55,5 +55,5 @@

          SYNOPSIS

                 - + diff --git a/deps/npm/html/doc/cli/npm-view.html b/deps/npm/html/doc/cli/npm-view.html index c30cc69f126..bc134c92825 100644 --- a/deps/npm/html/doc/cli/npm-view.html +++ b/deps/npm/html/doc/cli/npm-view.html @@ -11,8 +11,8 @@

          npm-view

          View registry info

          SYNOPSIS

          -
          npm view <name>[@<version>] [<field>[.<subfield>]...]
          -npm v <name>[@<version>] [<field>[.<subfield>]...]
          +
          npm view [@<scope>/]<name>[@<version>] [<field>[.<subfield>]...]
          +npm v [@<scope>/]<name>[@<version>] [<field>[.<subfield>]...]
           

          DESCRIPTION

          This command shows data about a package and prints it to the stream referenced by the outfd config, which defaults to stdout.

          @@ -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 70dc893cd3e..2cd0f274e9b 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 36ae925064a..66b87539306 100644 --- a/deps/npm/html/doc/cli/npm.html +++ b/deps/npm/html/doc/cli/npm.html @@ -13,7 +13,7 @@

          npm

          node package manager

          SYNOPSIS

          npm <command> [args]
           

          VERSION

          -

          1.4.28

          +

          2.0.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

        • npm-help(1)
        • @@ -154,5 +154,5 @@

          SEE ALSO

                 - + diff --git a/deps/npm/html/doc/files/npm-folders.html b/deps/npm/html/doc/files/npm-folders.html index 637b45c3821..cb2b56c29e3 100644 --- a/deps/npm/html/doc/files/npm-folders.html +++ b/deps/npm/html/doc/files/npm-folders.html @@ -41,6 +41,11 @@

          Node Modules

          Global installs on Unix systems go to {prefix}/lib/node_modules. Global installs on Windows go to {prefix}/node_modules (that is, no lib folder.)

          +

          Scoped packages are installed the same way, except they are grouped together +in a sub-folder of the relevant node_modules folder with the name of that +scope prefix by the @ symbol, e.g. npm install @myorg/package would place +the package in {prefix}/node_modules/@myorg/package. See scopes(7) for +more details.

          If you wish to require() a package, then install it locally.

          Executables

          When in global mode, executables are linked into {prefix}/bin on Unix, @@ -179,5 +184,5 @@

          SEE ALSO

                 - + diff --git a/deps/npm/html/doc/files/npm-global.html b/deps/npm/html/doc/files/npm-global.html index 637b45c3821..cb2b56c29e3 100644 --- a/deps/npm/html/doc/files/npm-global.html +++ b/deps/npm/html/doc/files/npm-global.html @@ -41,6 +41,11 @@

          Node Modules

          Global installs on Unix systems go to {prefix}/lib/node_modules. Global installs on Windows go to {prefix}/node_modules (that is, no lib folder.)

          +

          Scoped packages are installed the same way, except they are grouped together +in a sub-folder of the relevant node_modules folder with the name of that +scope prefix by the @ symbol, e.g. npm install @myorg/package would place +the package in {prefix}/node_modules/@myorg/package. See scopes(7) for +more details.

          If you wish to require() a package, then install it locally.

          Executables

          When in global mode, executables are linked into {prefix}/bin on Unix, @@ -179,5 +184,5 @@

          SEE ALSO

                 - + diff --git a/deps/npm/html/doc/files/npm-json.html b/deps/npm/html/doc/files/npm-json.html index 129661d526f..b00032dba98 100644 --- a/deps/npm/html/doc/files/npm-json.html +++ b/deps/npm/html/doc/files/npm-json.html @@ -34,6 +34,8 @@

          name

        • You may want to check the npm registry to see if there's something by that name already, before you get too attached to it. http://registry.npmjs.org/
        +

        A name can be optionally prefixed by a scope, e.g. @myorg/mypackage. See +npm-scope(7) for more detail.

        version

        The most important things in your package.json are the name and version fields. Those are actually required, and your package won't install without @@ -234,6 +236,8 @@

        dependencies

      • range1 || range2 Passes if either range1 or range2 are satisfied.
      • git... See 'Git URLs as Dependencies' below
      • user/repo See 'GitHub URLs' below
      • +
      • tag A specific version tagged and published as tag See npm-tag(1)
      • +
      • path/path/path See Local Paths below

      For example, these are all valid:

      { "dependencies" :
      @@ -247,6 +251,8 @@ 

      dependencies

      , "elf" : "~1.2.3" , "two" : "2.x" , "thr" : "3.3.x" + , "lat" : "latest" + , "dyl" : "~/projects/dyl" } }

      URLs as Dependencies

      @@ -271,7 +277,18 @@

      GitHub URLs

      "express": "visionmedia/express" } } -

      devDependencies

      +

      Local Paths

      +

      As of version 2.0.0 you can provide a path to a local directory that +contains a package. Local paths can be in the form:

      +
      ../foo/bar
      +~/foo/bar
      +./foo/bar
      +/foo/bar
      +

      This feature is helpful for local offline development and creating +tests that require npm installing where you don't want to hit an +external server, but should not be used when publishing packages +to the public registry.

      +

      devDependencies

      If someone is planning on downloading and using your module in their program, then they probably don't want or need to download and build the external test or documentation framework that you use.

      @@ -459,5 +476,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/files/npmrc.html b/deps/npm/html/doc/files/npmrc.html index ee029cfe8f9..f1f4817eb34 100644 --- a/deps/npm/html/doc/files/npmrc.html +++ b/deps/npm/html/doc/files/npmrc.html @@ -73,5 +73,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/files/package.json.html b/deps/npm/html/doc/files/package.json.html index 129661d526f..b00032dba98 100644 --- a/deps/npm/html/doc/files/package.json.html +++ b/deps/npm/html/doc/files/package.json.html @@ -34,6 +34,8 @@

      name

    • You may want to check the npm registry to see if there's something by that name already, before you get too attached to it. http://registry.npmjs.org/
    +

    A name can be optionally prefixed by a scope, e.g. @myorg/mypackage. See +npm-scope(7) for more detail.

    version

    The most important things in your package.json are the name and version fields. Those are actually required, and your package won't install without @@ -234,6 +236,8 @@

    dependencies

  • range1 || range2 Passes if either range1 or range2 are satisfied.
  • git... See 'Git URLs as Dependencies' below
  • user/repo See 'GitHub URLs' below
  • +
  • tag A specific version tagged and published as tag See npm-tag(1)
  • +
  • path/path/path See Local Paths below
  • For example, these are all valid:

    { "dependencies" :
    @@ -247,6 +251,8 @@ 

    dependencies

    , "elf" : "~1.2.3" , "two" : "2.x" , "thr" : "3.3.x" + , "lat" : "latest" + , "dyl" : "~/projects/dyl" } }

    URLs as Dependencies

    @@ -271,7 +277,18 @@

    GitHub URLs

    "express": "visionmedia/express" } } -

    devDependencies

    +

    Local Paths

    +

    As of version 2.0.0 you can provide a path to a local directory that +contains a package. Local paths can be in the form:

    +
    ../foo/bar
    +~/foo/bar
    +./foo/bar
    +/foo/bar
    +

    This feature is helpful for local offline development and creating +tests that require npm installing where you don't want to hit an +external server, but should not be used when publishing packages +to the public registry.

    +

    devDependencies

    If someone is planning on downloading and using your module in their program, then they probably don't want or need to download and build the external test or documentation framework that you use.

    @@ -459,5 +476,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/index.html b/deps/npm/html/doc/index.html index 90c300c88f3..bae85662626 100644 --- a/deps/npm/html/doc/index.html +++ b/deps/npm/html/doc/index.html @@ -214,6 +214,8 @@

    npm-index(7)

    Index of all npm documentation

    npm-registry(7)

    The JavaScript Package Registry

    +

    npm-scope(7)

    +

    Scoped packages

    npm-scripts(7)

    How npm handles the "scripts" field

    removing-npm(7)

    @@ -232,5 +234,5 @@

    semver(7)

           - + diff --git a/deps/npm/html/doc/misc/index.html b/deps/npm/html/doc/misc/index.html deleted file mode 100644 index 4db393c7c48..00000000000 --- a/deps/npm/html/doc/misc/index.html +++ /dev/null @@ -1,438 +0,0 @@ - - - index - - - - -
    -

    npm-index

    Index of all npm documentation

    - -

    README

    - -

    node package manager

    - -

    Command Line Documentation

    - -

    npm(1)

    - -

    node package manager

    - -

    npm-adduser(1)

    - -

    Add a registry user account

    - -

    npm-bin(1)

    - -

    Display npm bin folder

    - -

    npm-bugs(1)

    - -

    Bugs for a package in a web browser maybe

    - -

    npm-build(1)

    - -

    Build a package

    - -

    npm-bundle(1)

    - -

    REMOVED

    - -

    npm-cache(1)

    - -

    Manipulates packages cache

    - -

    npm-completion(1)

    - -

    Tab Completion for npm

    - -

    npm-config(1)

    - -

    Manage the npm configuration files

    - -

    npm-dedupe(1)

    - -

    Reduce duplication

    - -

    npm-deprecate(1)

    - -

    Deprecate a version of a package

    - -

    npm-docs(1)

    - -

    Docs for a package in a web browser maybe

    - -

    npm-edit(1)

    - -

    Edit an installed package

    - -

    npm-explore(1)

    - -

    Browse an installed package

    - -

    npm-help-search(1)

    - -

    Search npm help documentation

    - -

    npm-help(1)

    - -

    Get help on npm

    - -

    npm-init(1)

    - -

    Interactively create a package.json file

    - -

    npm-install(1)

    - -

    Install a package

    - - - -

    Symlink a package folder

    - -

    npm-ls(1)

    - -

    List installed packages

    - -

    npm-outdated(1)

    - -

    Check for outdated packages

    - -

    npm-owner(1)

    - -

    Manage package owners

    - -

    npm-pack(1)

    - -

    Create a tarball from a package

    - -

    npm-prefix(1)

    - -

    Display prefix

    - -

    npm-prune(1)

    - -

    Remove extraneous packages

    - -

    npm-publish(1)

    - -

    Publish a package

    - -

    npm-rebuild(1)

    - -

    Rebuild a package

    - -

    npm-restart(1)

    - -

    Start a package

    - -

    npm-rm(1)

    - -

    Remove a package

    - -

    npm-root(1)

    - -

    Display npm root

    - -

    npm-run-script(1)

    - -

    Run arbitrary package scripts

    - -

    npm-search(1)

    - -

    Search for packages

    - -

    npm-shrinkwrap(1)

    - -

    Lock down dependency versions

    - -

    npm-star(1)

    - -

    Mark your favorite packages

    - -

    npm-stars(1)

    - -

    View packages marked as favorites

    - -

    npm-start(1)

    - -

    Start a package

    - -

    npm-stop(1)

    - -

    Stop a package

    - -

    npm-submodule(1)

    - -

    Add a package as a git submodule

    - -

    npm-tag(1)

    - -

    Tag a published version

    - -

    npm-test(1)

    - -

    Test a package

    - -

    npm-uninstall(1)

    - -

    Remove a package

    - -

    npm-unpublish(1)

    - -

    Remove a package from the registry

    - -

    npm-update(1)

    - -

    Update a package

    - -

    npm-version(1)

    - -

    Bump a package version

    - -

    npm-view(1)

    - -

    View registry info

    - -

    npm-whoami(1)

    - -

    Display npm username

    - -

    API Documentation

    - -

    npm(3)

    - -

    node package manager

    - -

    npm-bin(3)

    - -

    Display npm bin folder

    - -

    npm-bugs(3)

    - -

    Bugs for a package in a web browser maybe

    - -

    npm-commands(3)

    - -

    npm commands

    - -

    npm-config(3)

    - -

    Manage the npm configuration files

    - -

    npm-deprecate(3)

    - -

    Deprecate a version of a package

    - -

    npm-docs(3)

    - -

    Docs for a package in a web browser maybe

    - -

    npm-edit(3)

    - -

    Edit an installed package

    - -

    npm-explore(3)

    - -

    Browse an installed package

    - -

    npm-help-search(3)

    - -

    Search the help pages

    - -

    npm-init(3)

    - -

    Interactively create a package.json file

    - -

    npm-install(3)

    - -

    install a package programmatically

    - - - -

    Symlink a package folder

    - -

    npm-load(3)

    - -

    Load config settings

    - -

    npm-ls(3)

    - -

    List installed packages

    - -

    npm-outdated(3)

    - -

    Check for outdated packages

    - -

    npm-owner(3)

    - -

    Manage package owners

    - -

    npm-pack(3)

    - -

    Create a tarball from a package

    - -

    npm-prefix(3)

    - -

    Display prefix

    - -

    npm-prune(3)

    - -

    Remove extraneous packages

    - -

    npm-publish(3)

    - -

    Publish a package

    - -

    npm-rebuild(3)

    - -

    Rebuild a package

    - -

    npm-restart(3)

    - -

    Start a package

    - -

    npm-root(3)

    - -

    Display npm root

    - -

    npm-run-script(3)

    - -

    Run arbitrary package scripts

    - -

    npm-search(3)

    - -

    Search for packages

    - -

    npm-shrinkwrap(3)

    - -

    programmatically generate package shrinkwrap file

    - -

    npm-start(3)

    - -

    Start a package

    - -

    npm-stop(3)

    - -

    Stop a package

    - -

    npm-submodule(3)

    - -

    Add a package as a git submodule

    - -

    npm-tag(3)

    - -

    Tag a published version

    - -

    npm-test(3)

    - -

    Test a package

    - -

    npm-uninstall(3)

    - -

    uninstall a package programmatically

    - -

    npm-unpublish(3)

    - -

    Remove a package from the registry

    - -

    npm-update(3)

    - -

    Update a package

    - -

    npm-version(3)

    - -

    Bump a package version

    - -

    npm-view(3)

    - -

    View registry info

    - -

    npm-whoami(3)

    - -

    Display npm username

    - -

    Files

    - -

    npm-folders(5)

    - -

    Folder Structures Used by npm

    - -

    npmrc(5)

    - -

    The npm config files

    - -

    package.json(5)

    - -

    Specifics of npm's package.json handling

    - -

    Misc

    - -

    npm-coding-style(7)

    - -

    npm's "funny" coding style

    - -

    npm-config(7)

    - -

    More than you probably want to know about npm configuration

    - -

    npm-developers(7)

    - -

    Developer Guide

    - -

    npm-disputes(7)

    - -

    Handling Module Name Disputes

    - -

    npm-faq(7)

    - -

    Frequently Asked Questions

    - -

    npm-registry(7)

    - -

    The JavaScript Package Registry

    - -

    npm-scripts(7)

    - -

    How npm handles the "scripts" field

    - -

    removing-npm(7)

    - -

    Cleaning the Slate

    - -

    semver(7)

    - -

    The semantic versioner for npm

    -
    - - diff --git a/deps/npm/html/doc/misc/npm-coding-style.html b/deps/npm/html/doc/misc/npm-coding-style.html index cd523ac9106..5d94f84bf0e 100644 --- a/deps/npm/html/doc/misc/npm-coding-style.html +++ b/deps/npm/html/doc/misc/npm-coding-style.html @@ -147,5 +147,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/misc/npm-config.html b/deps/npm/html/doc/misc/npm-config.html index aa4c300bfa2..e7696f491ea 100644 --- a/deps/npm/html/doc/misc/npm-config.html +++ b/deps/npm/html/doc/misc/npm-config.html @@ -48,6 +48,7 @@

    Shorthands and Other CLI Niceties

    -dd, --verbose: --loglevel verbose
  • -ddd: --loglevel silly
  • -g: --global
  • +
  • -C: --prefix
  • -l: --long
  • -m: --message
  • -p, --porcelain: --parseable
  • @@ -215,9 +216,6 @@

    editor

  • Type: path
  • The command to run for npm edit or npm config edit.

    -

    email

    -

    The email of the logged-in user.

    -

    Set by the npm adduser command. Should not be set explicitly.

    engine-strict

    • Default: false
    • @@ -359,6 +357,13 @@

      init.license

    • Type: String

    The value npm init should use by default for the package license.

    +

    init.version

    +
      +
    • Default: "0.0.0"
    • +
    • Type: semver
    • +
    +

    The value that npm init should use by default for the package +version number, if not already set in package.json.

    json

    • Default: false
    • @@ -400,7 +405,7 @@

      loglevel

      • Default: "http"
      • Type: String
      • -
      • Values: "silent", "win", "error", "warn", "http", "info", "verbose", "silly"
      • +
      • Values: "silent", "error", "warn", "http", "info", "verbose", "silly"

      What level of logs to report. On failure, all logs are written to npm-debug.log in the current working directory.

      @@ -568,11 +573,22 @@

      save-prefix

    • Default: '^'
    • Type: String
    -

    Configure how versions of packages installed to a package.json file via +

    Configure how versions of packages installed to a package.json file via --save or --save-dev get prefixed.

    For example if a package has version 1.2.3, by default it's version is -set to ^1.2.3 which allows minor upgrades for that package, but after
    npm config set save-prefix='~' it would be set to ~1.2.3 which only allows +set to ^1.2.3 which allows minor upgrades for that package, but after +npm config set save-prefix='~' it would be set to ~1.2.3 which only allows patch upgrades.

    +

    scope

    +
      +
    • Default: ""
    • +
    • Type: String
    • +
    +

    Associate an operation with a scope for a scoped registry. Useful when logging +in to a private registry for the first time: +npm login --scope=@organization --registry=registry.organization.com, which +will cause @organization to be mapped to the registry for future installation +of packages specified according to the pattern @organization/package.

    searchopts

    • Default: ""
    • @@ -678,12 +694,6 @@

      user

    • Type: String or Number

    The UID to set to when running package scripts as root.

    -

    username

    -
      -
    • Default: null
    • -
    • Type: String
    • -
    -

    The username on the npm registry. Set with npm adduser

    userconfig

    • Default: ~/.npmrc
    • @@ -749,5 +759,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/misc/npm-developers.html b/deps/npm/html/doc/misc/npm-developers.html index 3cc1b0466cf..1734785f4b5 100644 --- a/deps/npm/html/doc/misc/npm-developers.html +++ b/deps/npm/html/doc/misc/npm-developers.html @@ -181,5 +181,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/misc/npm-disputes.html b/deps/npm/html/doc/misc/npm-disputes.html index 7a45340936b..e6bc9a6180f 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 cdde512eee0..85536d6f124 100644 --- a/deps/npm/html/doc/misc/npm-faq.html +++ b/deps/npm/html/doc/misc/npm-faq.html @@ -59,17 +59,16 @@

      Whatever, in a shell script if you really wanted to.

      npm will not help you do something that is known to be a bad idea.

      Should I check my node_modules folder into git?

      -

      Mikeal Rogers answered this question very well:

      -

      http://www.futurealoof.com/posts/nodemodules-in-git.html

      -

      tl;dr

      -
        -
      • Check node_modules into git for things you deploy, such as -websites and apps.
      • -
      • Do not check node_modules into git for libraries and modules -intended to be reused.
      • -
      • Use npm to manage dependencies in your dev environment, but not in -your deployment scripts.
      • -
      +

      Usually, no. Allow npm to resolve dependencies for your packages.

      +

      For packages you deploy, such as websites and apps, +you should use npm shrinkwrap to lock down your full dependency tree:

      +

      https://www.npmjs.org/doc/cli/npm-shrinkwrap.html

      +

      If you are paranoid about depending on the npm ecosystem, +you should run a private npm mirror or a private cache.

      +

      If you want 100% confidence in being able to reproduce the specific bytes +included in a deployment, you should use an additional mechanism that can +verify contents rather than versions. For example, +Amazon machine images, DigitalOcean snapshots, Heroku slugs, or simple tarballs.

      Is it 'npm' or 'NPM' or 'Npm'?

      npm should never be capitalized unless it is being displayed in a location that is customarily all-caps (such as the title of man pages.)

      @@ -237,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.

      @@ -285,5 +284,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/misc/npm-index.html b/deps/npm/html/doc/misc/npm-index.html index 3346d1ce98a..6de20ca4427 100644 --- a/deps/npm/html/doc/misc/npm-index.html +++ b/deps/npm/html/doc/misc/npm-index.html @@ -214,6 +214,8 @@

      npm-index(7)

      Index of all npm documentation

      npm-registry(7)

      The JavaScript Package Registry

      +

      npm-scope(7)

      +

      Scoped packages

      npm-scripts(7)

      How npm handles the "scripts" field

      removing-npm(7)

      @@ -232,5 +234,5 @@

      semver(7)

             - + diff --git a/deps/npm/html/doc/misc/npm-registry.html b/deps/npm/html/doc/misc/npm-registry.html index d08e8f877df..530e350d718 100644 --- a/deps/npm/html/doc/misc/npm-registry.html +++ b/deps/npm/html/doc/misc/npm-registry.html @@ -18,14 +18,13 @@

      DESCRIPTION

      write APIs as well, to allow for publishing packages and managing user account information.

      The official public npm registry is at http://registry.npmjs.org/. It -is powered by a CouchDB database at -http://isaacs.iriscouch.com/registry. The code for the couchapp is -available at http://github.com/npm/npmjs.org. npm user accounts -are CouchDB users, stored in the http://isaacs.iriscouch.com/_users -database.

      -

      The registry URL is supplied by the registry config parameter. See -npm-config(1), npmrc(5), and npm-config(7) for more on managing -npm's configuration.

      +is powered by a CouchDB database, of which there is a public mirror at +http://skimdb.npmjs.com/registry. The code for the couchapp is +available at http://github.com/npm/npm-registry-couchapp.

      +

      The registry URL used is determined by the scope of the package (see +npm-scope(7)). If no scope is specified, the default registry is used, which is +supplied by the registry config parameter. See npm-config(1), +npmrc(5), and npm-config(7) for more on managing npm's configuration.

      Can I run my own private registry?

      Yes!

      The easiest way is to replicate the couch database, and use the same (or @@ -71,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 ae8dfa60376..91ac0ae8e1c 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 0c2c697a50a..8b65e871cd1 100644 --- a/deps/npm/html/doc/misc/npm-scripts.html +++ b/deps/npm/html/doc/misc/npm-scripts.html @@ -41,8 +41,9 @@

      DESCRIPTION

      Run by the npm restart command. Note: npm restart will run the stop and start scripts if no restart script is provided.
    -

    Additionally, arbitrary scripts can be run by doing -npm run-script <pkg> <stage>.

    +

    Additionally, arbitrary scripts can be executed by running `npm 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.

    @@ -218,5 +219,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/misc/removing-npm.html b/deps/npm/html/doc/misc/removing-npm.html index afd747c9560..576c7343477 100644 --- a/deps/npm/html/doc/misc/removing-npm.html +++ b/deps/npm/html/doc/misc/removing-npm.html @@ -57,5 +57,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/misc/semver.html b/deps/npm/html/doc/misc/semver.html index 5ab35fa819d..2a360ea08f3 100644 --- a/deps/npm/html/doc/misc/semver.html +++ b/deps/npm/html/doc/misc/semver.html @@ -42,52 +42,150 @@

    Usage

    http://semver.org/.

    A leading "=" or "v" character is stripped off and ignored.

    Ranges

    -

    The following range styles are supported:

    +

    A version range is a set of comparators which specify versions +that satisfy the range.

    +

    A comparator is composed of an operator and a version. The set +of primitive operators is:

    +
      +
    • < Less than
    • +
    • <= Less than or equal to
    • +
    • > Greater than
    • +
    • >= Greater than or equal to
    • +
    • = Equal. If no operator is specified, then equality is assumed, +so this operator is optional, but MAY be included.
    • +
    +

    For example, the comparator >=1.2.7 would match the versions +1.2.7, 1.2.8, 2.5.3, and 1.3.9, but not the versions 1.2.6 +or 1.1.0.

    +

    Comparators can be joined by whitespace to form a comparator set, +which is satisfied by the intersection of all of the comparators +it includes.

    +

    A range is composed of one or more comparator sets, joined by ||. A +version matches a range if and only if every comparator in at least +one of the ||-separated comparator sets is satisfied by the version.

    +

    For example, the range >=1.2.7 <1.3.0 would match the versions +1.2.7, 1.2.8, and 1.2.99, but not the versions 1.2.6, 1.3.0, +or 1.1.0.

    +

    The range 1.2.7 || >=1.2.9 <2.0.0 would match the versions 1.2.7, +1.2.9, and 1.4.6, but not the versions 1.2.8 or 2.0.0.

    +

    Prerelease Tags

    +

    If a version has a prerelease tag (for example, 1.2.3-alpha.3) then +it will only be allowed to satisfy comparator sets if at least one +comparator with the same [major, minor, patch] tuple also has a +prerelease tag.

    +

    For example, the range >1.2.3-alpha.3 would be allowed to match the +version 1.2.3-alpha.7, but it would not be satisfied by +3.4.5-alpha.9, even though 3.4.5-alpha.9 is technically "greater +than" 1.2.3-alpha.3 according to the SemVer sort rules. The version +range only accepts prerelease tags on the 1.2.3 version. The +version 3.4.5 would satisfy the range, because it does not have a +prerelease flag, and 3.4.5 is greater than 1.2.3-alpha.7.

    +

    The purpose for this behavior is twofold. First, prerelease versions +frequently are updated very quickly, and contain many breaking changes +that are (by the author's design) not yet fit for public consumption. +Therefore, by default, they are excluded from range matching +semantics.

    +

    Second, a user who has opted into using a prerelease version has +clearly indicated the intent to use that specific set of +alpha/beta/rc versions. By including a prerelease tag in the range, +the user is indicating that they are aware of the risk. However, it +is still not appropriate to assume that they have opted into taking a +similar risk on the next set of prerelease versions.

    +

    Advanced Range Syntax

    +

    Advanced range syntax desugars to primitive comparators in +deterministic ways.

    +

    Advanced ranges may be combined in the same way as primitive +comparators using white space or ||.

    +

    Hyphen Ranges X.Y.Z - A.B.C

    +

    Specifies an inclusive set.

      -
    • 1.2.3 A specific version. When nothing else will do. Must be a full -version number, with major, minor, and patch versions specified. -Note that build metadata is still ignored, so 1.2.3+build2012 will -satisfy this range.
    • -
    • >1.2.3 Greater than a specific version.
    • -
    • <1.2.3 Less than a specific version. If there is no prerelease -tag on the version range, then no prerelease version will be allowed -either, even though these are technically "less than".
    • -
    • >=1.2.3 Greater than or equal to. Note that prerelease versions -are NOT equal to their "normal" equivalents, so 1.2.3-beta will -not satisfy this range, but 2.3.0-beta will.
    • -
    • <=1.2.3 Less than or equal to. In this case, prerelease versions -ARE allowed, so 1.2.3-beta would satisfy.
    • 1.2.3 - 2.3.4 := >=1.2.3 <=2.3.4
    • -
    • ~1.2.3 := >=1.2.3-0 <1.3.0-0 "Reasonably close to 1.2.3". When -using tilde operators, prerelease versions are supported as well, -but a prerelease of the next significant digit will NOT be -satisfactory, so 1.3.0-beta will not satisfy ~1.2.3.
    • -
    • ^1.2.3 := >=1.2.3-0 <2.0.0-0 "Compatible with 1.2.3". When -using caret operators, anything from the specified version (including -prerelease) will be supported up to, but not including, the next -major version (or its prereleases). 1.5.1 will satisfy ^1.2.3, -while 1.2.2 and 2.0.0-beta will not.
    • -
    • ^0.1.3 := >=0.1.3-0 <0.2.0-0 "Compatible with 0.1.3". 0.x.x versions are -special: the first non-zero component indicates potentially breaking changes, -meaning the caret operator matches any version with the same first non-zero -component starting at the specified version.
    • -
    • ^0.0.2 := =0.0.2 "Only the version 0.0.2 is considered compatible"
    • -
    • ~1.2 := >=1.2.0-0 <1.3.0-0 "Any version starting with 1.2"
    • -
    • ^1.2 := >=1.2.0-0 <2.0.0-0 "Any version compatible with 1.2"
    • -
    • 1.2.x := >=1.2.0-0 <1.3.0-0 "Any version starting with 1.2"
    • -
    • 1.2.* Same as 1.2.x.
    • -
    • 1.2 Same as 1.2.x.
    • -
    • ~1 := >=1.0.0-0 <2.0.0-0 "Any version starting with 1"
    • -
    • ^1 := >=1.0.0-0 <2.0.0-0 "Any version compatible with 1"
    • -
    • 1.x := >=1.0.0-0 <2.0.0-0 "Any version starting with 1"
    • -
    • 1.* Same as 1.x.
    • -
    • 1 Same as 1.x.
    • -
    • * Any version whatsoever.
    • -
    • x Same as *.
    • -
    • "" (just an empty string) Same as *.
    -

    Ranges can be joined with either a space (which implies "and") or a -|| (which implies "or").

    +

    If a partial version is provided as the first version in the inclusive +range, then the missing pieces are replaced with zeroes.

    +
      +
    • 1.2 - 2.3.4 := >=1.2.0 <=2.3.4
    • +
    +

    If a partial version is provided as the second version in the +inclusive range, then all versions that start with the supplied parts +of the tuple are accepted, but nothing that would be greater than the +provided tuple parts.

    +
      +
    • 1.2.3 - 2.3 := >=1.2.3 <2.4.0
    • +
    • 1.2.3 - 2 := >=1.2.3 <3.0.0
    • +
    +

    X-Ranges 1.2.x 1.X 1.2.* *

    +

    Any of X, x, or * may be used to "stand in" for one of the +numeric values in the [major, minor, patch] tuple.

    +
      +
    • * := >=0.0.0 (Any version satisfies)
    • +
    • 1.x := >=1.0.0 <2.0.0 (Matching major version)
    • +
    • 1.2.x := >=1.2.0 <1.3.0 (Matching major and minor versions)
    • +
    +

    A partial version range is treated as an X-Range, so the special +character is in fact optional.

    +
      +
    • ` (empty string) :=*:=>=0.0.0`
    • +
    • 1 := 1.x.x := >=1.0.0 <2.0.0
    • +
    • 1.2 := 1.2.x := >=1.2.0 <1.3.0
    • +
    +

    Tilde Ranges ~1.2.3 ~1.2 ~1

    +

    Allows patch-level changes if a minor version is specified on the +comparator. Allows minor-level changes if not.

    +
      +
    • ~1.2.3 := >=1.2.3 <1.(2+1).0 := >=1.2.3 <1.3.0
    • +
    • ~1.2 := >=1.2.0 <1.(2+1).0 := >=1.2.0 <1.3.0 (Same as 1.2.x)
    • +
    • ~1 := >=1.0.0 <(1+1).0.0 := >=1.0.0 <2.0.0 (Same as 1.x)
    • +
    • ~0.2.3 := >=0.2.3 <0.(2+1).0 := >=0.2.3 <0.3.0
    • +
    • ~0.2 := >=0.2.0 <0.(2+1).0 := >=0.2.0 <0.3.0 (Same as 0.2.x)
    • +
    • ~0 := >=0.0.0 <(0+1).0.0 := >=0.0.0 <1.0.0 (Same as 0.x)
    • +
    • ~1.2.3-beta.2 := >=1.2.3-beta.2 <1.3.0 Note that prereleases in +the 1.2.3 version will be allowed, if they are greater than or +equal to beta.2. So, 1.2.3-beta.4 would be allowed, but +1.2.4-beta.2 would not, because it is a prerelease of a +different [major, minor, patch] tuple.
    • +
    +

    Note: this is the same as the ~> operator in rubygems.

    +

    Caret Ranges ^1.2.3 ^0.2.5 ^0.0.4

    +

    Allows changes that do not modify the left-most non-zero digit in the +[major, minor, patch] tuple. In other words, this allows patch and +minor updates for versions 1.0.0 and above, patch updates for +versions 0.X >=0.1.0, and no updates for versions 0.0.X.

    +

    Many authors treat a 0.x version as if the x were the major +"breaking-change" indicator.

    +

    Caret ranges are ideal when an author may make breaking changes +between 0.2.4 and 0.3.0 releases, which is a common practice. +However, it presumes that there will not be breaking changes between +0.2.4 and 0.2.5. It allows for changes that are presumed to be +additive (but non-breaking), according to commonly observed practices.

    +
      +
    • ^1.2.3 := >=1.2.3 <2.0.0
    • +
    • ^0.2.3 := >=0.2.3 <0.3.0
    • +
    • ^0.0.3 := >=0.0.3 <0.0.4
    • +
    • ^1.2.3-beta.2 := >=1.2.3-beta.2 <2.0.0 Note that prereleases in +the 1.2.3 version will be allowed, if they are greater than or +equal to beta.2. So, 1.2.3-beta.4 would be allowed, but +1.2.4-beta.2 would not, because it is a prerelease of a +different [major, minor, patch] tuple.
    • +
    • ^0.0.3-beta := >=0.0.3-beta <0.0.4 Note that prereleases in the +0.0.3 version only will be allowed, if they are greater than or +equal to beta. So, 0.0.3-pr.2 would be allowed.
    • +
    +

    When parsing caret ranges, a missing patch value desugars to the +number 0, but will allow flexibility within that value, even if the +major and minor versions are both 0.

    +
      +
    • ^1.2.x := >=1.2.0 <2.0.0
    • +
    • ^0.0.x := >=0.0.0 <0.1.0
    • +
    • ^0.0 := >=0.0.0 <0.1.0
    • +
    +

    A missing minor and patch values will desugar to zero, but also +allow flexibility within those values, even if the major version is +zero.

    +
      +
    • ^1.x := >=1.0.0 <2.0.0
    • +
    • ^0.x := >=0.0.0 <1.0.0
    • +

    Functions

    All methods and classes take a final loose boolean argument that, if true, will be more forgiving about not-quite-valid semver strings. @@ -165,5 +263,5 @@

    Ranges

           - + diff --git a/deps/npm/lib/adduser.js b/deps/npm/lib/adduser.js index 579ecb0a9f8..7e933ea7dfd 100644 --- a/deps/npm/lib/adduser.js +++ b/deps/npm/lib/adduser.js @@ -19,9 +19,10 @@ function adduser (args, cb) { if (!crypto) return cb(new Error( "You must compile node with ssl support to use the adduser feature")) - var c = { u : npm.config.get("username") || "" - , p : npm.config.get("_password") || "" - , e : npm.config.get("email") || "" + var creds = npm.config.getCredentialsByURI(npm.config.get("registry")) + var c = { u : creds.username || "" + , p : creds.password || "" + , e : creds.email || "" } , u = {} , fns = [readUsername, readPassword, readEmail, save] @@ -94,7 +95,7 @@ function readPassword (c, u, cb) { return readPassword(c, u, cb) } - c.changed = c.changed || c.p != pw + c.changed = c.changed || c.p !== pw u.p = pw cb(er) }) @@ -132,17 +133,45 @@ function save (c, u, cb) { registry.password = u.p } npm.spinner.start() + // save existing configs, but yank off for this PUT - registry.adduser(npm.config.get("registry"), u.u, u.p, u.e, function (er) { + var uri = npm.config.get("registry") + var scope = npm.config.get("scope") + + // there may be a saved scope and no --registry (for login) + if (scope) { + if (scope.charAt(0) !== "@") scope = "@" + scope + + var scopedRegistry = npm.config.get(scope + ":registry") + if (scopedRegistry) uri = scopedRegistry + } + + registry.adduser(uri, u.u, u.p, u.e, function (er, doc) { npm.spinner.stop() if (er) return cb(er) + registry.username = u.u registry.password = u.p registry.email = u.e - npm.config.set("username", u.u, "user") - npm.config.set("_password", u.p, "user") - npm.config.set("email", u.e, "user") + + // don't want this polluting the configuration npm.config.del("_token", "user") + + if (scope) npm.config.set(scope + ":registry", uri, "user") + + if (doc && doc.token) { + npm.config.setCredentialsByURI(uri, { + token : doc.token + }) + } + else { + npm.config.setCredentialsByURI(uri, { + username : u.u, + password : u.p, + email : u.e + }) + } + log.info("adduser", "Authorized user %s", u.u) npm.config.save("user", cb) }) diff --git a/deps/npm/lib/bugs.js b/deps/npm/lib/bugs.js index b3022bf2a20..16744cd5c84 100644 --- a/deps/npm/lib/bugs.js +++ b/deps/npm/lib/bugs.js @@ -9,19 +9,23 @@ var npm = require("./npm.js") , opener = require("opener") , path = require("path") , readJson = require("read-package-json") + , npa = require("npm-package-arg") , fs = require("fs") - , url = require("url") + , mapToRegistry = require("./utils/map-to-registry.js") bugs.completion = function (opts, cb) { if (opts.conf.argv.remain.length > 2) return cb() - var uri = url.resolve(npm.config.get("registry"), "-/short") - registry.get(uri, { timeout : 60000 }, function (er, list) { - return cb(null, list || []) + mapToRegistry("-/short", npm.config, function (er, uri) { + if (er) return cb(er) + + registry.get(uri, { timeout : 60000 }, function (er, list) { + return cb(null, list || []) + }) }) } function bugs (args, cb) { - var n = args.length && args[0].split("@").shift() || '.' + var n = args.length && npa(args[0]).name || '.' fs.stat(n, function (er, s) { if (er && er.code === "ENOENT") return callRegistry(n, cb) else if (er) return cb (er) @@ -56,9 +60,13 @@ function getUrlAndOpen (d, cb) { } function callRegistry (n, cb) { - var uri = url.resolve(npm.config.get("registry"), n + "/latest") - registry.get(uri, { timeout : 3600 }, function (er, d) { + mapToRegistry(n, npm.config, function (er, uri) { if (er) return cb(er) - getUrlAndOpen (d, cb) + + registry.get(uri + "/latest", { timeout : 3600 }, function (er, d) { + if (er) return cb(er) + + getUrlAndOpen (d, cb) + }) }) } diff --git a/deps/npm/lib/build.js b/deps/npm/lib/build.js index 350774a453f..f1c61bdb8ce 100644 --- a/deps/npm/lib/build.js +++ b/deps/npm/lib/build.js @@ -75,7 +75,7 @@ function linkStuff (pkg, folder, global, didRB, cb) { // if it's global, and folder is in {prefix}/node_modules, // then bins are in {prefix}/bin // otherwise, then bins are in folder/../.bin - var parent = path.dirname(folder) + var parent = pkg.name[0] === "@" ? path.dirname(path.dirname(folder)) : path.dirname(folder) , gnm = global && npm.globalDir , gtop = parent === gnm @@ -95,7 +95,7 @@ function linkStuff (pkg, folder, global, didRB, cb) { function shouldWarn(pkg, folder, global, cb) { var parent = path.dirname(folder) , top = parent === npm.dir - , cwd = process.cwd() + , cwd = npm.localPrefix readJson(path.resolve(cwd, "package.json"), function(er, topPkg) { if (er) return cb(er) diff --git a/deps/npm/lib/cache.js b/deps/npm/lib/cache.js index 37bba5a0653..281d6100a9b 100644 --- a/deps/npm/lib/cache.js +++ b/deps/npm/lib/cache.js @@ -47,9 +47,15 @@ adding a name@range: adding a local tarball: 1. untar to tmp/random/{blah} 2. goto folder(2) + +adding a namespaced package: +1. lookup registry for @namespace +2. namespace_registry.get('name') +3. add url(namespace/latest.tarball) */ exports = module.exports = cache + cache.unpack = unpack cache.clean = clean cache.read = read @@ -61,17 +67,18 @@ var npm = require("./npm.js") , readJson = require("read-package-json") , log = require("npmlog") , path = require("path") - , url = require("url") , asyncMap = require("slide").asyncMap , tar = require("./utils/tar.js") , fileCompletion = require("./utils/completion/file-completion.js") - , isGitUrl = require("./utils/is-git-url.js") , deprCheck = require("./utils/depr-check.js") , addNamed = require("./cache/add-named.js") , addLocal = require("./cache/add-local.js") , addRemoteTarball = require("./cache/add-remote-tarball.js") , addRemoteGit = require("./cache/add-remote-git.js") + , maybeGithub = require("./cache/maybe-github.js") , inflight = require("inflight") + , npa = require("npm-package-arg") + , getStat = require("./cache/get-stat.js") cache.usage = "npm cache add " + "\nnpm cache add " @@ -108,9 +115,8 @@ function cache (args, cb) { switch (cmd) { case "rm": case "clear": case "clean": return clean(args, cb) case "list": case "sl": case "ls": return ls(args, cb) - case "add": return add(args, cb) - default: return cb(new Error( - "Invalid cache action: "+cmd)) + case "add": return add(args, npm.prefix, cb) + default: return cb("Usage: "+cache.usage) } } @@ -147,15 +153,30 @@ function read (name, ver, forceBypass, cb) { }) } +function normalize (args) { + var normalized = "" + if (args.length > 0) { + var a = npa(args[0]) + if (a.name) normalized = a.name + if (a.rawSpec) normalized = [normalized, a.rawSpec].join("/") + if (args.length > 1) normalized = [normalized].concat(args.slice(1)).join("/") + } + + if (normalized.substr(-1) === "/") { + normalized = normalized.substr(0, normalized.length - 1) + } + log.silly("ls", "normalized", normalized) + + return normalized +} + // npm cache ls [] function ls (args, cb) { - args = args.join("/").split("@").join("/") - if (args.substr(-1) === "/") args = args.substr(0, args.length - 1) var prefix = npm.config.get("cache") - if (0 === prefix.indexOf(process.env.HOME)) { + if (prefix.indexOf(process.env.HOME) === 0) { prefix = "~" + prefix.substr(process.env.HOME.length) } - ls_(args, npm.config.get("depth"), function (er, files) { + ls_(normalize(args), npm.config.get("depth"), function (er, files) { console.log(files.map(function (f) { return path.join(prefix, f) }).join("\n").trim()) @@ -174,9 +195,7 @@ function clean (args, cb) { if (!args) args = [] - args = args.join("/").split("@").join("/") - if (args.substr(-1) === "/") args = args.substr(0, args.length - 1) - var f = path.join(npm.cache, path.normalize(args)) + var f = path.join(npm.cache, path.normalize(normalize(args))) if (f === npm.cache) { fs.readdir(npm.cache, function (er, files) { if (er) return cb() @@ -187,30 +206,30 @@ function clean (args, cb) { }) , rm, cb ) }) - } else rm(path.join(npm.cache, path.normalize(args)), cb) + } else rm(path.join(npm.cache, path.normalize(normalize(args))), cb) } // npm cache add // npm cache add // npm cache add // npm cache add -cache.add = function (pkg, ver, scrub, cb) { +cache.add = function (pkg, ver, where, scrub, cb) { assert(typeof pkg === "string", "must include name of package to install") assert(typeof cb === "function", "must include callback") if (scrub) { return clean([], function (er) { if (er) return cb(er) - add([pkg, ver], cb) + add([pkg, ver], where, cb) }) } log.verbose("cache add", [pkg, ver]) - return add([pkg, ver], cb) + return add([pkg, ver], where, cb) } var adding = 0 -function add (args, cb) { +function add (args, where, cb) { // this is hot code. almost everything passes through here. // the args can be any of: // ["url"] @@ -226,60 +245,69 @@ function add (args, cb) { + " npm cache add @\n" + " npm cache add \n" + " npm cache add \n" - , name , spec + , p if (args[1] === undefined) args[1] = null // at this point the args length must ==2 if (args[1] !== null) { - name = args[0] - spec = args[1] + spec = args[0]+"@"+args[1] } else if (args.length === 2) { spec = args[0] } - log.verbose("cache add", "name=%j spec=%j args=%j", name, spec, args) + log.verbose("cache add", "spec=%j args=%j", spec, args) - if (!name && !spec) return cb(usage) + if (!spec) return cb(usage) if (adding <= 0) { npm.spinner.start() } adding ++ - cb = afterAdd([name, spec], cb) - - // see if the spec is a url - // otherwise, treat as name@version - var p = url.parse(spec) || {} - log.verbose("parsed url", p) - - // If there's a /, and it's a path, then install the path. - // If not, and there's a @, it could be that we got name@http://blah - // in that case, we will not have a protocol now, but if we - // split and check, we will. - if (!name && !p.protocol) { - return maybeFile(spec, cb) - } - else { - switch (p.protocol) { - case "http:": - case "https:": - return addRemoteTarball(spec, { name: name }, null, cb) + cb = afterAdd(cb) + + // package.json can have local URI ("file:") dependencies which require + // normalization + p = npa(spec) + if (p.type === "local" && where) spec = path.resolve(where, p.spec) + log.verbose("parsed spec", p) + + // short-circuit local installs + fs.stat(spec, function (er, s) { + if (er) return addNonLocal(spec, cb) + if (!s.isDirectory()) return addAndLogLocal(spec, cb) + fs.stat(path.join(spec, "package.json"), function (er) { + if (er) return addNonLocal(spec, cb) + addAndLogLocal(spec, cb) + }) + }) +} + +function addAndLogLocal (spec, cb) { + log.verbose("cache add", "local package", path.resolve(spec)) + return addLocal(spec, null, cb) +} +function addNonLocal (spec, cb) { + var p = npa(spec) + log.verbose("parsed spec", p) + + switch (p.type) { + case "remote": + addRemoteTarball(p.spec, {name : p.name}, null, cb) + break + case "git": + addRemoteGit(p.spec, false, cb) + break + case "github": + maybeGithub(p.spec, cb) + break default: - if (isGitUrl(p)) return addRemoteGit(spec, p, false, cb) + if (p.name) return addNamed(p.name, p.spec, null, cb) - // if we have a name and a spec, then try name@spec - if (name) { - addNamed(name, spec, null, cb) - } - // if not, then try just spec (which may try name@"" if not found) - else { - addLocal(spec, {}, cb) - } + cb(new Error("couldn't figure out how to install " + spec)) } - } } function unpack (pkg, ver, unpackTarget, dMode, fMode, uid, gid, cb) { @@ -304,7 +332,7 @@ function unpack (pkg, ver, unpackTarget, dMode, fMode, uid, gid, cb) { }) } -function afterAdd (arg, cb) { return function (er, data) { +function afterAdd (cb) { return function (er, data) { adding -- if (adding <= 0) { npm.spinner.stop() @@ -322,49 +350,32 @@ function afterAdd (arg, cb) { return function (er, data) { var done = inflight(pj, cb) - if (!done) return + if (!done) return undefined fs.writeFile(tmp, JSON.stringify(data), "utf8", function (er) { if (er) return done(er) - fs.rename(tmp, pj, function (er) { - done(er, data) + getStat(function (er, cs) { + if (er) return done(er) + fs.rename(tmp, pj, function (er) { + if (cs.uid && cs.gid) { + fs.chown(pj, cs.uid, cs.gid, function (er) { + return done(er, data) + }) + } else { + done(er, data) + } + }) }) }) }} -function maybeFile (spec, cb) { - // split name@2.3.4 only if name is a valid package name, - // don't split in case of "./test@example.com/" (local path) - fs.stat(spec, function (er) { - if (!er) { - // definitely a local thing - return addLocal(spec, {}, cb) - } - - maybeAt(spec, cb) - }) -} - -function maybeAt (spec, cb) { - if (spec.indexOf("@") !== -1) { - var tmp = spec.split("@") - - var name = tmp.shift() - spec = tmp.join("@") - add([name, spec], cb) - } else { - // already know it's not a url, so must be local - addLocal(spec, {}, cb) - } -} - -function needName(er, data) { +function needName (er, data) { return er ? er : (data && !data.name) ? new Error("No name provided") : null } -function needVersion(er, data) { +function needVersion (er, data) { return er ? er : (data && !data.version) ? new Error("No version provided") : null diff --git a/deps/npm/lib/cache/add-local-tarball.js b/deps/npm/lib/cache/add-local-tarball.js index bcb938fa972..f7cd7610373 100644 --- a/deps/npm/lib/cache/add-local-tarball.js +++ b/deps/npm/lib/cache/add-local-tarball.js @@ -191,7 +191,15 @@ function addTmpTarball_ (tgz, data, shasum, cb) { var target = path.resolve(root, "package.tgz") getCacheStat(function (er, cs) { if (er) return cb(er) - mkdir(pkg, function (er) { + mkdir(pkg, function (er, created) { + + // chown starting from the first dir created by mkdirp, + // or the root dir, if none had to be created, so that + // we know that we get all the children. + function chown (er) { + chownr(created || root, cs.uid, cs.gid, done) + } + if (er) return cb(er) var read = fs.createReadStream(tgz) var write = fs.createWriteStream(target) @@ -199,9 +207,6 @@ function addTmpTarball_ (tgz, data, shasum, cb) { read.on("error", cb).pipe(write).on("error", cb).on("close", fin) }) - function chown () { - chownr(root, cs.uid, cs.gid, done) - } }) function done() { diff --git a/deps/npm/lib/cache/add-local.js b/deps/npm/lib/cache/add-local.js index 2a6d8cf884f..bedf34bac12 100644 --- a/deps/npm/lib/cache/add-local.js +++ b/deps/npm/lib/cache/add-local.js @@ -13,9 +13,7 @@ var fs = require("graceful-fs") , lock = locker.lock , unlock = locker.unlock , getCacheStat = require("./get-stat.js") - , addNamed = require("./add-named.js") , addLocalTarball = require("./add-local-tarball.js") - , maybeGithub = require("./maybe-github.js") , sha = require("sha") module.exports = addLocal @@ -29,16 +27,12 @@ function addLocal (p, pkgData, cb_) { function cb (er, data) { unlock(p, function () { if (er) { - // if it doesn't have a / in it, it might be a - // remote thing. - if (p.indexOf("/") === -1 && p.charAt(0) !== "." - && (process.platform !== "win32" || p.indexOf("\\") === -1)) { - return addNamed(p, "", null, cb_) - } log.error("addLocal", "Could not install %s", p) return cb_(er) } - if (data && !data._fromGithub) data._from = p + if (data && !data._fromGithub) { + data._from = path.relative(npm.prefix, p) || "." + } return cb_(er, data) }) } @@ -47,14 +41,8 @@ function addLocal (p, pkgData, cb_) { if (er) return cb(er) // figure out if this is a folder or file. fs.stat(p, function (er, s) { - if (er) { - // might be username/project - // in that case, try it as a github url. - if (p.split("/").length === 2) { - return maybeGithub(p, er, cb) - } - return cb(er) - } + if (er) return cb(er) + if (s.isDirectory()) addLocalDirectory(p, pkgData, null, cb) else addLocalTarball(p, pkgData, null, cb) }) diff --git a/deps/npm/lib/cache/add-named.js b/deps/npm/lib/cache/add-named.js index 7137cc9b569..091d43c016f 100644 --- a/deps/npm/lib/cache/add-named.js +++ b/deps/npm/lib/cache/add-named.js @@ -13,8 +13,8 @@ var path = require("path") , locker = require("../utils/locker.js") , lock = locker.lock , unlock = locker.unlock - , maybeGithub = require("./maybe-github.js") , addRemoteTarball = require("./add-remote-tarball.js") + , mapToRegistry = require("../utils/map-to-registry.js") module.exports = addNamed @@ -48,7 +48,7 @@ function addNamed (name, version, data, cb_) { }) } -function addNameTag (name, tag, data, cb_) { +function addNameTag (name, tag, data, cb) { log.info("addNameTag", [name, tag]) var explicit = true if (!tag) { @@ -56,17 +56,13 @@ function addNameTag (name, tag, data, cb_) { tag = npm.config.get("tag") } - function cb(er, data) { - // might be username/project - // in that case, try it as a github url. - if (er && tag.split("/").length === 2) { - return maybeGithub(tag, er, cb_) - } - return cb_(er, data) - } + mapToRegistry(name, npm.config, function (er, uri) { + if (er) return cb(er) - var uri = url.resolve(npm.config.get("registry"), name) - registry.get(uri, null, function (er, data, json, resp) { + registry.get(uri, null, next) + }) + + function next (er, data, json, resp) { if (!er) { er = errorResponse(name, resp) } @@ -83,7 +79,7 @@ function addNameTag (name, tag, data, cb_) { er = installTargetsError(tag, data) return cb(er) - }) + } } function engineFilter (data) { @@ -114,22 +110,28 @@ function addNameVersion (name, v, data, cb) { response = null return next() } - var uri = url.resolve(npm.config.get("registry"), name) - registry.get(uri, null, function (er, d, json, resp) { + + mapToRegistry(name, npm.config, function (er, uri) { + if (er) return cb(er) + + registry.get(uri, null, setData) + }) + + function setData (er, d, json, resp) { if (!er) { er = errorResponse(name, resp) } if (er) return cb(er) data = d && d.versions[ver] if (!data) { - er = new Error('version not found: ' + name + '@' + ver) + er = new Error("version not found: "+name+"@"+ver) er.package = name er.statusCode = 404 return cb(er) } response = resp next() - }) + } function next () { deprCheck(data) @@ -166,10 +168,9 @@ function addNameVersion (name, v, data, cb) { return cb(new Error("Cannot fetch: "+dist.tarball)) } - // use the same protocol as the registry. - // https registry --> https tarballs, but - // only if they're the same hostname, or else - // detached tarballs may not work. + // Use the same protocol as the registry. https registry --> https + // tarballs, but only if they're the same hostname, or else detached + // tarballs may not work. var tb = url.parse(dist.tarball) var rp = url.parse(npm.config.get("registry")) if (tb.hostname === rp.hostname @@ -179,8 +180,8 @@ function addNameVersion (name, v, data, cb) { } tb = url.format(tb) - // only add non-shasum'ed packages if --forced. - // only ancient things would lack this for good reasons nowadays. + // Only add non-shasum'ed packages if --forced. Only ancient things + // would lack this for good reasons nowadays. if (!dist.shasum && !npm.config.get("force")) { return cb(new Error("package lacks shasum: " + data._id)) } @@ -197,15 +198,21 @@ function addNameRange (name, range, data, cb) { log.silly("addNameRange", {name:name, range:range, hasData:!!data}) if (data) return next() - var uri = url.resolve(npm.config.get("registry"), name) - registry.get(uri, null, function (er, d, json, resp) { + + mapToRegistry(name, npm.config, function (er, uri) { + if (er) return cb(er) + + registry.get(uri, null, setData) + }) + + function setData (er, d, json, resp) { if (!er) { er = errorResponse(name, resp) } if (er) return cb(er) data = d next() - }) + } function next () { log.silly( "addNameRange", "number 2" diff --git a/deps/npm/lib/cache/add-remote-git.js b/deps/npm/lib/cache/add-remote-git.js index 7743aa4a450..304d2f3f0e9 100644 --- a/deps/npm/lib/cache/add-remote-git.js +++ b/deps/npm/lib/cache/add-remote-git.js @@ -8,9 +8,7 @@ var mkdir = require("mkdirp") , url = require("url") , chownr = require("chownr") , zlib = require("zlib") - , which = require("which") , crypto = require("crypto") - , chmodr = require("chmodr") , npm = require("../npm.js") , rm = require("../utils/gently-rm.js") , inflight = require("inflight") @@ -28,9 +26,8 @@ var mkdir = require("mkdirp") // 5. git archive /tmp/random.tgz // 6. addLocalTarball(/tmp/random.tgz) --format=tar --prefix=package/ // silent flag is used if this should error quietly -module.exports = function addRemoteGit (u, parsed, silent, cb_) { +module.exports = function addRemoteGit (u, silent, cb_) { assert(typeof u === "string", "must have git URL") - assert(typeof parsed === "object", "must have parsed query") assert(typeof cb_ === "function", "must have callback") function cb (er, data) { @@ -41,6 +38,10 @@ module.exports = function addRemoteGit (u, parsed, silent, cb_) { if (!cb_) return + log.verbose("addRemoteGit", "u=%j silent=%j", u, silent) + var parsed = url.parse(u, true) + log.silly("addRemoteGit", "parsed", parsed) + // git is so tricky! // if the path is like ssh://foo:22/some/path then it works, but // it needs the ssh:// @@ -62,16 +63,16 @@ module.exports = function addRemoteGit (u, parsed, silent, cb_) { var co = parsed.hash && parsed.hash.substr(1) || "master" var v = crypto.createHash("sha1").update(u).digest("hex").slice(0, 8) - v = u.replace(/[^a-zA-Z0-9]+/g, '-') + '-' + v + v = u.replace(/[^a-zA-Z0-9]+/g, "-")+"-"+v log.verbose("addRemoteGit", [u, co]) var p = path.join(npm.config.get("cache"), "_git-remotes", v) checkGitDir(p, u, co, origUrl, silent, function(er, data) { - chmodr(p, npm.modes.file, function(erChmod) { + addModeRecursive(p, npm.modes.file, function(erAddMode) { if (er) return cb(er, data) - return cb(erChmod, data) + return cb(erAddMode, data) }) }) }) @@ -181,16 +182,20 @@ function archiveGitRemote (p, u, co, origUrl, cb) { parsed.hash = stdout resolved = url.format(parsed) + if (parsed.protocol !== "git:") { + resolved = "git+" + resolved + } + // https://github.com/npm/npm/issues/3224 // node incorrectly sticks a / at the start of the path // We know that the host won't change, so split and detect this var spo = origUrl.split(parsed.host) var spr = resolved.split(parsed.host) - if (spo[1].charAt(0) === ':' && spr[1].charAt(0) === '/') + if (spo[1].charAt(0) === ":" && spr[1].charAt(0) === "/") spr[1] = spr[1].slice(1) resolved = spr.join(parsed.host) - log.verbose('resolved git url', resolved) + log.verbose("resolved git url", resolved) next() }) } @@ -226,8 +231,48 @@ function gitEnv () { if (gitEnv_) return gitEnv_ gitEnv_ = {} for (var k in process.env) { - if (!~['GIT_PROXY_COMMAND','GIT_SSH','GIT_SSL_NO_VERIFY'].indexOf(k) && k.match(/^GIT/)) continue + if (!~["GIT_PROXY_COMMAND","GIT_SSH","GIT_SSL_NO_VERIFY"].indexOf(k) && k.match(/^GIT/)) continue gitEnv_[k] = process.env[k] } return gitEnv_ } + +// similar to chmodr except it add permissions rather than overwriting them +// adapted from https://github.com/isaacs/chmodr/blob/master/chmodr.js +function addModeRecursive(p, mode, cb) { + fs.readdir(p, function (er, children) { + // Any error other than ENOTDIR means it's not readable, or doesn't exist. + // Give up. + if (er && er.code !== "ENOTDIR") return cb(er) + if (er || !children.length) return addMode(p, mode, cb) + + var len = children.length + var errState = null + children.forEach(function (child) { + addModeRecursive(path.resolve(p, child), mode, then) + }) + + function then (er) { + if (errState) return undefined + if (er) return cb(errState = er) + if (--len === 0) return addMode(p, dirMode(mode), cb) + } + }) +} + +function addMode(p, mode, cb) { + fs.stat(p, function (er, stats) { + if (er) return cb(er) + mode = stats.mode | mode + fs.chmod(p, mode, cb) + }) +} + +// taken from https://github.com/isaacs/chmodr/blob/master/chmodr.js +function dirMode(mode) { + if (mode & parseInt("0400", 8)) mode |= parseInt("0100", 8) + if (mode & parseInt( "040", 8)) mode |= parseInt( "010", 8) + if (mode & parseInt( "04", 8)) mode |= parseInt( "01", 8) + return mode +} + diff --git a/deps/npm/lib/cache/add-remote-tarball.js b/deps/npm/lib/cache/add-remote-tarball.js index db9a05d8254..2c7d013039d 100644 --- a/deps/npm/lib/cache/add-remote-tarball.js +++ b/deps/npm/lib/cache/add-remote-tarball.js @@ -4,8 +4,9 @@ var mkdir = require("mkdirp") , path = require("path") , sha = require("sha") , retry = require("retry") + , createWriteStream = require("graceful-fs").createWriteStream , npm = require("../npm.js") - , fetch = require("../utils/fetch.js") + , registry = npm.registry , inflight = require("inflight") , locker = require("../utils/locker.js") , lock = locker.lock @@ -80,27 +81,39 @@ function addRemoteTarball_(u, tmp, shasum, cb) { } function fetchAndShaCheck (u, tmp, shasum, cb) { - fetch(u, tmp, function (er, response) { + registry.fetch(u, null, function (er, response) { if (er) { log.error("fetch failed", u) return cb(er, response) } - if (!shasum) { - // Well, we weren't given a shasum, so at least sha what we have - // in case we want to compare it to something else later - return sha.get(tmp, function (er, shasum) { - cb(er, response, shasum) - }) - } + var tarball = createWriteStream(tmp, { mode : npm.modes.file }) + tarball.on("error", function (er) { + cb(er) + tarball.destroy() + }) - // validate that the url we just downloaded matches the expected shasum. - sha.check(tmp, shasum, function (er) { - if (er && er.message) { - // add original filename for better debuggability - er.message = er.message + '\n' + 'From: ' + u + tarball.on("finish", function () { + if (!shasum) { + // Well, we weren't given a shasum, so at least sha what we have + // in case we want to compare it to something else later + return sha.get(tmp, function (er, shasum) { + log.silly("fetchAndShaCheck", "shasum", shasum) + cb(er, response, shasum) + }) } - return cb(er, response, shasum) + + // validate that the url we just downloaded matches the expected shasum. + log.silly("fetchAndShaCheck", "shasum", shasum) + sha.check(tmp, shasum, function (er) { + if (er && er.message) { + // add original filename for better debuggability + er.message = er.message + "\n" + "From: " + u + } + return cb(er, response, shasum) + }) }) + + response.pipe(tarball) }) } diff --git a/deps/npm/lib/cache/get-stat.js b/deps/npm/lib/cache/get-stat.js index 913f5af851f..372a86d61fc 100644 --- a/deps/npm/lib/cache/get-stat.js +++ b/deps/npm/lib/cache/get-stat.js @@ -24,7 +24,9 @@ module.exports = function getCacheStat (cb) { } function makeCacheDir (cb) { - if (!process.getuid) return mkdir(npm.cache, cb) + if (!process.getuid) return mkdir(npm.cache, function (er) { + return cb(er, {}) + }) var uid = +process.getuid() , gid = +process.getgid() diff --git a/deps/npm/lib/cache/maybe-github.js b/deps/npm/lib/cache/maybe-github.js index fee64c5dfdf..5ecdb691552 100644 --- a/deps/npm/lib/cache/maybe-github.js +++ b/deps/npm/lib/cache/maybe-github.js @@ -1,29 +1,26 @@ -var url = require("url") - , assert = require("assert") +var assert = require("assert") , log = require("npmlog") , addRemoteGit = require("./add-remote-git.js") -module.exports = function maybeGithub (p, er, cb) { +module.exports = function maybeGithub (p, cb) { assert(typeof p === "string", "must pass package name") - assert(er instanceof Error, "must include error") assert(typeof cb === "function", "must pass callback") var u = "git://github.com/" + p - , up = url.parse(u) log.info("maybeGithub", "Attempting %s from %s", p, u) - return addRemoteGit(u, up, true, function (er2, data) { - if (er2) { + return addRemoteGit(u, true, function (er, data) { + if (er) { var upriv = "git+ssh://git@github.com:" + p - , uppriv = url.parse(upriv) - log.info("maybeGithub", "Attempting %s from %s", p, upriv) - return addRemoteGit(upriv, uppriv, false, function (er3, data) { - if (er3) return cb(er) + return addRemoteGit(upriv, false, function (er, data) { + if (er) return cb(er) + success(upriv, data) }) } + success(u, data) }) diff --git a/deps/npm/lib/dedupe.js b/deps/npm/lib/dedupe.js index e6762e15bc5..74397d0cb95 100644 --- a/deps/npm/lib/dedupe.js +++ b/deps/npm/lib/dedupe.js @@ -7,7 +7,6 @@ // much better "put pkg X at folder Y" abstraction. Oh well, // whatever. Perfect enemy of the good, and all that. -var url = require("url") var fs = require("fs") var asyncMap = require("slide").asyncMap var path = require("path") @@ -16,6 +15,7 @@ var semver = require("semver") var rm = require("./utils/gently-rm.js") var log = require("npmlog") var npm = require("./npm.js") +var mapToRegistry = require("./utils/map-to-registry.js") module.exports = dedupe @@ -61,7 +61,7 @@ function dedupe_ (dir, filter, unavoidable, dryrun, silent, cb) { Object.keys(obj.children).forEach(function (k) { U(obj.children[k]) }) - }) + })(data) // then collect them up and figure out who needs them ;(function C (obj) { @@ -240,13 +240,19 @@ function findVersions (npm, summary, cb) { var versions = data.versions var ranges = data.ranges - var uri = url.resolve(npm.config.get("registry"), name) - npm.registry.get(uri, null, function (er, data) { + mapToRegistry(name, npm.config, function (er, uri) { + if (er) return cb(er) + + npm.registry.get(uri, null, next) + }) + + function next (er, data) { var regVersions = er ? [] : Object.keys(data.versions) var locMatch = bestMatch(versions, ranges) - var regMatch; var tag = npm.config.get("tag") var distTag = data["dist-tags"] && data["dist-tags"][tag] + + var regMatch if (distTag && data.versions[distTag] && matches(distTag, ranges)) { regMatch = distTag } else { @@ -254,7 +260,7 @@ function findVersions (npm, summary, cb) { } cb(null, [[name, has, loc, locMatch, regMatch, locs]]) - }) + } }, cb) } diff --git a/deps/npm/lib/deprecate.js b/deps/npm/lib/deprecate.js index 175b69ceb13..17dd4eab0c1 100644 --- a/deps/npm/lib/deprecate.js +++ b/deps/npm/lib/deprecate.js @@ -1,5 +1,6 @@ -var url = require("url") - , npm = require("./npm.js") +var npm = require("./npm.js") + , mapToRegistry = require("./utils/map-to-registry.js") + , npa = require("npm-package-arg") module.exports = deprecate @@ -8,16 +9,20 @@ deprecate.usage = "npm deprecate [@] " deprecate.completion = function (opts, cb) { // first, get a list of remote packages this user owns. // once we have a user account, then don't complete anything. - var un = npm.config.get("username") - if (!npm.config.get("username")) return cb() if (opts.conf.argv.remain.length > 2) return cb() // get the list of packages by user - var path = "/-/by-user/"+encodeURIComponent(un) - , uri = url.resolve(npm.config.get("registry"), path) - npm.registry.get(uri, { timeout : 60000 }, function (er, list) { - if (er) return cb() - console.error(list) - return cb(null, list[un]) + var path = "/-/by-user/" + mapToRegistry(path, npm.config, function (er, uri) { + if (er) return cb(er) + + var c = npm.config.getCredentialsByURI(uri) + if (!(c && c.username)) return cb() + + npm.registry.get(uri + c.username, { timeout : 60000 }, function (er, list) { + if (er) return cb() + console.error(list) + return cb(null, list[c.username]) + }) }) } @@ -25,11 +30,15 @@ function deprecate (args, cb) { var pkg = args[0] , msg = args[1] if (msg === undefined) return cb("Usage: " + deprecate.usage) + // fetch the data and make sure it exists. - pkg = pkg.split(/@/) - var name = pkg.shift() - , ver = pkg.join("@") - , uri = url.resolve(npm.config.get("registry"), name) + var p = npa(pkg) + + mapToRegistry(p.name, npm.config, next) + + function next (er, uri) { + if (er) return cb(er) - npm.registry.deprecate(uri, ver, msg, cb) + npm.registry.deprecate(uri, p.spec, msg, cb) + } } diff --git a/deps/npm/lib/docs.js b/deps/npm/lib/docs.js index 77073fbb9c1..dead3f7551c 100644 --- a/deps/npm/lib/docs.js +++ b/deps/npm/lib/docs.js @@ -5,18 +5,21 @@ docs.usage += "\n" docs.usage += "npm docs ." docs.completion = function (opts, cb) { - var uri = url_.resolve(npm.config.get("registry"), "/-/short") - registry.get(uri, { timeout : 60000 }, function (er, list) { - return cb(null, list || []) + mapToRegistry("/-/short", npm.config, function (er, uri) { + if (er) return cb(er) + + registry.get(uri, { timeout : 60000 }, function (er, list) { + return cb(null, list || []) + }) }) } -var url_ = require("url") - , npm = require("./npm.js") +var npm = require("./npm.js") , registry = npm.registry , opener = require("opener") , path = require("path") , log = require("npmlog") + , mapToRegistry = require("./utils/map-to-registry.js") function url (json) { return json.homepage ? json.homepage : "https://npmjs.org/package/" + json.name @@ -38,7 +41,7 @@ function docs (args, cb) { function getDoc (project, cb) { project = project || '.' - var package = path.resolve(process.cwd(), "package.json") + var package = path.resolve(npm.localPrefix, "package.json") if (project === '.' || project === './') { var json @@ -54,8 +57,13 @@ function getDoc (project, cb) { return opener(url(json), { command: npm.config.get("browser") }, cb) } - var uri = url_.resolve(npm.config.get("registry"), project + "/latest") - registry.get(uri, { timeout : 3600 }, function (er, json) { + mapToRegistry(project, npm.config, function (er, uri) { + if (er) return cb(er) + + registry.get(uri + "/latest", { timeout : 3600 }, next) + }) + + function next (er, json) { var github = "https://github.com/" + project + "#readme" if (er) { @@ -64,5 +72,5 @@ function getDoc (project, cb) { } return opener(url(json), { command: npm.config.get("browser") }, cb) - }) + } } diff --git a/deps/npm/lib/install.js b/deps/npm/lib/install.js index 9d2c2cfa279..82d872525a7 100644 --- a/deps/npm/lib/install.js +++ b/deps/npm/lib/install.js @@ -34,28 +34,34 @@ install.completion = function (opts, cb) { // if it starts with https?://, then just give up, because it's a url // for now, not yet implemented. var registry = npm.registry - , uri = url.resolve(npm.config.get("registry"), "-/short") - registry.get(uri, null, function (er, pkgs) { - if (er) return cb() - if (!opts.partialWord) return cb(null, pkgs) + mapToRegistry("-/short", npm.config, function (er, uri) { + if (er) return cb(er) - var name = opts.partialWord.split("@").shift() - pkgs = pkgs.filter(function (p) { - return p.indexOf(name) === 0 - }) + registry.get(uri, null, function (er, pkgs) { + if (er) return cb() + if (!opts.partialWord) return cb(null, pkgs) - if (pkgs.length !== 1 && opts.partialWord === name) { - return cb(null, pkgs) - } + var name = npa(opts.partialWord).name + pkgs = pkgs.filter(function (p) { + return p.indexOf(name) === 0 + }) - uri = url.resolve(npm.config.get("registry"), pkgs[0]) - registry.get(uri, null, 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 - })) + if (pkgs.length !== 1 && opts.partialWord === name) { + return cb(null, pkgs) + } + + mapToRegistry(pkgs[0], npm.config, function (er, uri) { + if (er) return cb(er) + + registry.get(uri, null, 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 + })) + }) + }) }) }) } @@ -74,9 +80,10 @@ var npm = require("./npm.js") , mkdir = require("mkdirp") , lifecycle = require("./utils/lifecycle.js") , archy = require("archy") - , isGitUrl = require("./utils/is-git-url.js") , npmInstallChecks = require("npm-install-checks") , sortedObject = require("sorted-object") + , mapToRegistry = require("./utils/map-to-registry.js") + , npa = require("npm-package-arg") function install (args, cb_) { var hasArguments = !!args.length @@ -112,7 +119,7 @@ function install (args, cb_) { where = args args = [].concat(cb_) // pass in [] to do default dep-install cb_ = arguments[2] - log.verbose("install", "where,what", [where, args]) + log.verbose("install", "where, what", [where, args]) } if (!npm.config.get("global")) { @@ -206,7 +213,7 @@ function findPeerInvalid_ (packageMap, fpiList) { var pkg = packageMap[packageName] if (pkg.peerInvalid) { - var peersDepending = {}; + var peersDepending = {} for (var peerName in packageMap) { var peer = packageMap[peerName] if (peer.peerDependencies && peer.peerDependencies[packageName]) { @@ -338,21 +345,33 @@ function save (where, installed, tree, pretty, hasArguments, cb) { return cb(null, installed, tree, pretty) } - var saveBundle = npm.config.get('save-bundle') - var savePrefix = npm.config.get('save-prefix') || "^"; + var saveBundle = npm.config.get("save-bundle") + var savePrefix = npm.config.get("save-prefix") || "^" // each item in the tree is a top-level thing that should be saved // to the package.json file. // The relevant tree shape is { : {what:} } var saveTarget = path.resolve(where, "package.json") - , things = Object.keys(tree).map(function (k) { - // if "what" was a url, then save that instead. - var t = tree[k] - , u = url.parse(t.from) - , w = t.what.split("@") - if (u && u.protocol) w[1] = t.from - return w - }).reduce(function (set, k) { + + asyncMap(Object.keys(tree), function (k, cb) { + // if "what" was a url, then save that instead. + var t = tree[k] + , u = url.parse(t.from) + , a = npa(t.what) + , w = [a.name, a.spec] + + + fs.stat(t.from, function (er){ + if (!er) { + w[1] = "file:" + t.from + } else if (u && u.protocol) { + w[1] = t.from + } + cb(null, [w]) + }) + } + , function (er, arr) { + var things = arr.reduce(function (set, k) { var rangeDescriptor = semver.valid(k[1], true) && semver.gte(k[1], "0.1.0", true) && !npm.config.get("save-exact") @@ -361,47 +380,49 @@ function save (where, installed, tree, pretty, hasArguments, cb) { return set }, {}) - // don't use readJson, because we don't want to do all the other - // tricky npm-specific stuff that's in there. - fs.readFile(saveTarget, function (er, data) { - // ignore errors here, just don't save it. - try { - data = JSON.parse(data.toString("utf8")) - } catch (ex) { - er = ex - } - if (er) { - return cb(null, installed, tree, pretty) - } + // don't use readJson, because we don't want to do all the other + // tricky npm-specific stuff that's in there. + fs.readFile(saveTarget, function (er, data) { + // ignore errors here, just don't save it. + try { + data = JSON.parse(data.toString("utf8")) + } catch (ex) { + er = ex + } - var deps = npm.config.get("save-optional") ? "optionalDependencies" - : npm.config.get("save-dev") ? "devDependencies" - : "dependencies" + if (er) { + return cb(null, installed, tree, pretty) + } - if (saveBundle) { - var bundle = data.bundleDependencies || data.bundledDependencies - delete data.bundledDependencies - if (!Array.isArray(bundle)) bundle = [] - data.bundleDependencies = bundle.sort() - } + var deps = npm.config.get("save-optional") ? "optionalDependencies" + : npm.config.get("save-dev") ? "devDependencies" + : "dependencies" - log.verbose('saving', things) - data[deps] = data[deps] || {} - Object.keys(things).forEach(function (t) { - data[deps][t] = things[t] if (saveBundle) { - var i = bundle.indexOf(t) - if (i === -1) bundle.push(t) + var bundle = data.bundleDependencies || data.bundledDependencies + delete data.bundledDependencies + if (!Array.isArray(bundle)) bundle = [] data.bundleDependencies = bundle.sort() } - }) - data[deps] = sortedObject(data[deps]) + log.verbose("saving", things) + data[deps] = data[deps] || {} + Object.keys(things).forEach(function (t) { + data[deps][t] = things[t] + if (saveBundle) { + var i = bundle.indexOf(t) + if (i === -1) bundle.push(t) + data.bundleDependencies = bundle.sort() + } + }) - data = JSON.stringify(data, null, 2) + "\n" - fs.writeFile(saveTarget, data, function (er) { - cb(er, installed, tree, pretty) + data[deps] = sortedObject(data[deps]) + + data = JSON.stringify(data, null, 2) + "\n" + fs.writeFile(saveTarget, data, function (er) { + cb(er, installed, tree, pretty) + }) }) }) } @@ -412,22 +433,22 @@ function save (where, installed, tree, pretty, hasArguments, cb) { // that the submodules are not immediately require()able. // TODO: Show the complete tree, ls-style, but only if --long is provided function prettify (tree, installed) { - if (npm.config.get("json")) { - function red (set, kv) { - set[kv[0]] = kv[1] - return set - } + function red (set, kv) { + set[kv[0]] = kv[1] + return set + } + if (npm.config.get("json")) { tree = Object.keys(tree).map(function (p) { if (!tree[p]) return null - var what = tree[p].what.split("@") - , name = what.shift() - , version = what.join("@") + var what = npa(tree[p].what) + , name = what.name + , version = what.spec , o = { name: name, version: version, from: tree[p].from } o.dependencies = tree[p].children.map(function P (dep) { - var what = dep.what.split("@") - , name = what.shift() - , version = what.join("@") + var what = npa(dep.what) + , name = what.name + , version = what.spec , o = { version: version, from: dep.from } o.dependencies = dep.children.map(P).reduce(red, {}) return [name, o] @@ -615,60 +636,70 @@ function installMany (what, where, context, cb) { } function targetResolver (where, context, deps) { - var alreadyInstalledManually = context.explicit ? [] : null + var alreadyInstalledManually = [] + , resolveLeft = 0 , nm = path.resolve(where, "node_modules") , parent = context.parent , wrap = context.wrap - if (!context.explicit) fs.readdir(nm, function (er, inst) { - if (er) return alreadyInstalledManually = [] + if (!context.explicit) readdir(nm) - // don't even mess with non-package looking things - inst = inst.filter(function (p) { - return !p.match(/^[\._-]/) - }) + function readdir(name) { + resolveLeft++ + fs.readdir(name, function (er, inst) { + if (er) return resolveLeft-- - asyncMap(inst, function (pkg, cb) { - readJson(path.resolve(nm, pkg, "package.json"), log.warn, function (er, d) { - if (er && er.code !== "ENOENT" && er.code !== "ENOTDIR") return cb(er) - // error means it's not a package, most likely. - if (er) return cb(null, []) - - // if it's a bundled dep, then assume that anything there is valid. - // otherwise, make sure that it's a semver match with what we want. - var bd = parent.bundleDependencies - if (bd && bd.indexOf(d.name) !== -1 || - semver.satisfies(d.version, deps[d.name] || "*", true) || - deps[d.name] === d._resolved) { - return cb(null, d.name) - } + // don't even mess with non-package looking things + inst = inst.filter(function (p) { + if (!p.match(/^[@\._-]/)) return true + // scope pacakges + var scopepath = path.join(name, p) + readdir(scopepath) + }) - // see if the package had been previously linked - fs.lstat(path.resolve(nm, pkg), function(err, s) { - if (err) return cb(null, []) - if (s.isSymbolicLink()) { + asyncMap(inst, function (pkg, cb) { + readJson(path.resolve(name, pkg, "package.json"), log.warn, function (er, d) { + if (er && er.code !== "ENOENT" && er.code !== "ENOTDIR") return cb(er) + // error means it's not a package, most likely. + if (er) return cb(null, []) + + // if it's a bundled dep, then assume that anything there is valid. + // otherwise, make sure that it's a semver match with what we want. + var bd = parent.bundleDependencies + if (bd && bd.indexOf(d.name) !== -1 || + semver.satisfies(d.version, deps[d.name] || "*", true) || + deps[d.name] === d._resolved) { return cb(null, d.name) } - // something is there, but it's not satisfactory. Clobber it. - return cb(null, []) + // see if the package had been previously linked + fs.lstat(path.resolve(nm, pkg), function(err, s) { + if (err) return cb(null, []) + if (s.isSymbolicLink()) { + return cb(null, d.name) + } + + // something is there, but it's not satisfactory. Clobber it. + return cb(null, []) + }) }) + }, function (er, inst) { + // this is the list of things that are valid and should be ignored. + alreadyInstalledManually = alreadyInstalledManually.concat(inst) + resolveLeft-- }) - }, function (er, inst) { - // this is the list of things that are valid and should be ignored. - alreadyInstalledManually = inst }) - }) + } var to = 0 return function resolver (what, cb) { - if (!alreadyInstalledManually) return setTimeout(function () { + if (resolveLeft) return setTimeout(function () { resolver(what, cb) }, to++) // now we know what's been installed here manually, // or tampered with in some way that npm doesn't want to overwrite. - if (alreadyInstalledManually.indexOf(what.split("@").shift()) !== -1) { + if (alreadyInstalledManually.indexOf(npa(what).name) !== -1) { log.verbose("already installed", "skipping %s %s", what, where) return cb(null, []) } @@ -692,7 +723,7 @@ function targetResolver (where, context, deps) { } if (wrap) { - var name = what.split(/@/).shift() + var name = npa(what).name if (wrap[name]) { var wrapTarget = readWrap(wrap[name]) what = name + "@" + wrapTarget @@ -709,19 +740,16 @@ function targetResolver (where, context, deps) { // already has a matching copy. // If it's not a git repo, and the parent already has that pkg, then // we can skip installing it again. - cache.add(what, null, false, function (er, data) { + var pkgroot = path.resolve(npm.prefix, (parent && parent._from) || "") + cache.add(what, null, pkgroot, false, function (er, data) { if (er && parent && parent.optionalDependencies && - parent.optionalDependencies.hasOwnProperty(what.split("@")[0])) { + parent.optionalDependencies.hasOwnProperty(npa(what).name)) { log.warn("optional dep failed, continuing", what) log.verbose("optional dep failed, continuing", [what, er]) return cb(null, []) } - var isGit = false - , maybeGit = what.split("@").slice(1).join() - - if (maybeGit) - isGit = isGitUrl(url.parse(maybeGit)) + var isGit = npa(what).type === "git" if (!er && data && @@ -733,6 +761,7 @@ function targetResolver (where, context, deps) { return cb(null, []) } + if (data && !data._from) data._from = what if (er && parent && parent.name) er.parent = parent.name return cb(er, data || []) @@ -771,6 +800,13 @@ function localLink (target, where, context, cb) { , parent = context.parent readJson(jsonFile, log.warn, function (er, data) { + function thenLink () { + npm.commands.link([target.name], function (er, d) { + log.silly("localLink", "back from link", [er, d]) + cb(er, [resultList(target, where, parent && parent._id)]) + }) + } + if (er && er.code !== "ENOENT" && er.code !== "ENOTDIR") return cb(er) if (er || data._id === target._id) { if (er) { @@ -781,14 +817,6 @@ function localLink (target, where, context, cb) { thenLink() }) } else thenLink() - - function thenLink () { - npm.commands.link([target.name], function (er, d) { - log.silly("localLink", "back from link", [er, d]) - cb(er, [resultList(target, where, parent && parent._id)]) - }) - } - } else { log.verbose("localLink", "install locally (no link)", target._id) installOne_(target, where, context, cb) diff --git a/deps/npm/lib/link.js b/deps/npm/lib/link.js index 8022fc78dfe..8c6a9302905 100644 --- a/deps/npm/lib/link.js +++ b/deps/npm/lib/link.js @@ -10,6 +10,7 @@ var npm = require("./npm.js") , path = require("path") , rm = require("./utils/gently-rm.js") , build = require("./build.js") + , npa = require("npm-package-arg") module.exports = link @@ -49,25 +50,26 @@ function link (args, cb) { function linkInstall (pkgs, cb) { asyncMap(pkgs, function (pkg, cb) { + var t = path.resolve(npm.globalDir, "..") + , pp = path.resolve(npm.globalDir, pkg) + , rp = null + , target = path.resolve(npm.dir, pkg) + function n (er, data) { if (er) return cb(er, data) // install returns [ [folder, pkgId], ... ] // but we definitely installed just one thing. var d = data.filter(function (d) { return !d[3] }) + var what = npa(d[0][0]) pp = d[0][1] - pkg = path.basename(pp) + pkg = what.name target = path.resolve(npm.dir, pkg) next() } - var t = path.resolve(npm.globalDir, "..") - , pp = path.resolve(npm.globalDir, pkg) - , rp = null - , target = path.resolve(npm.dir, pkg) - - // if it's a folder or a random not-installed thing, then - // link or install it first - if (pkg.indexOf("/") !== -1 || pkg.indexOf("\\") !== -1) { + // if it's a folder, a random not-installed thing, or not a scoped package, + // then link or install it first + if (pkg[0] !== "@" && (pkg.indexOf("/") !== -1 || pkg.indexOf("\\") !== -1)) { return fs.lstat(path.resolve(pkg), function (er, st) { if (er || !st.isDirectory()) { npm.commands.install(t, pkg, n) diff --git a/deps/npm/lib/ls.js b/deps/npm/lib/ls.js index 781b6443b99..ed329d19e1b 100644 --- a/deps/npm/lib/ls.js +++ b/deps/npm/lib/ls.js @@ -14,8 +14,8 @@ var npm = require("./npm.js") , archy = require("archy") , semver = require("semver") , url = require("url") - , isGitUrl = require("./utils/is-git-url.js") , color = require("ansicolors") + , npa = require("npm-package-arg") ls.usage = "npm ls" @@ -29,9 +29,9 @@ function ls (args, silent, cb) { // npm ls 'foo@~1.3' bar 'baz@<2' if (!args) args = [] else args = args.map(function (a) { - var nv = a.split("@") - , name = nv.shift() - , ver = semver.validRange(nv.join("@")) || "" + var p = npa(a) + , name = p.name + , ver = semver.validRange(p.rawSpec) || "" return [ name, ver ] }) @@ -39,6 +39,7 @@ function ls (args, silent, cb) { var depth = npm.config.get("depth") var opt = { depth: depth, log: log.warn, dev: true } readInstalled(dir, opt, function (er, data) { + pruneNestedExtraneous(data) var bfs = bfsify(data, args) , lite = getLite(bfs) @@ -75,6 +76,18 @@ function ls (args, silent, cb) { }) } +function pruneNestedExtraneous (data, visited) { + visited = visited || [] + visited.push(data) + for (var i in data.dependencies) { + if (data.dependencies[i].extraneous) { + data.dependencies[i].dependencies = {} + } else if (visited.indexOf(data.dependencies[i]) === -1) { + pruneNestedExtraneous(data.dependencies[i], visited) + } + } +} + function alphasort (a, b) { a = a.toLowerCase() b = b.toLowerCase() @@ -265,7 +278,7 @@ function makeArchy_ (data, long, dir, depth, parent, d) { // add giturl to name@version if (data._resolved) { - if (isGitUrl(url.parse(data._resolved))) + if (npa(data._resolved).type === "git") out.label += " (" + data._resolved + ")" } diff --git a/deps/npm/lib/npm.js b/deps/npm/lib/npm.js index 3139b1d1452..c811be5a96b 100644 --- a/deps/npm/lib/npm.js +++ b/deps/npm/lib/npm.js @@ -46,16 +46,6 @@ try { var j = JSON.parse(fs.readFileSync( path.join(__dirname, "../package.json"))+"") npm.version = j.version - npm.nodeVersionRequired = j.engines.node - if (!semver.satisfies(pv, j.engines.node)) { - log.warn("unsupported version", ["" - ,"npm requires node version: "+j.engines.node - ,"And you have: "+pv - ,"which is not satisfactory." - ,"" - ,"Bad things will likely happen. You have been warned." - ,""].join("\n")) - } } catch (ex) { try { log.info("error reading version", ex) @@ -153,6 +143,7 @@ var commandCache = {} ] , plumbing = [ "build" , "unbuild" + , "isntall" , "xmas" , "substack" , "visnup" diff --git a/deps/npm/lib/outdated.js b/deps/npm/lib/outdated.js index a71df7fe76a..fdfd7624db2 100644 --- a/deps/npm/lib/outdated.js +++ b/deps/npm/lib/outdated.js @@ -28,12 +28,13 @@ var path = require("path") , asyncMap = require("slide").asyncMap , npm = require("./npm.js") , url = require("url") - , isGitUrl = require("./utils/is-git-url.js") , color = require("ansicolors") , styles = require("ansistyles") , table = require("text-table") , semver = require("semver") , os = require("os") + , mapToRegistry = require("./utils/map-to-registry.js") + , npa = require("npm-package-arg") function outdated (args, silent, cb) { if (typeof cb !== "function") cb = silent, silent = false @@ -43,7 +44,7 @@ function outdated (args, silent, cb) { if (npm.config.get("json")) { console.log(makeJSON(list)) } else if (npm.config.get("parseable")) { - console.log(makeParseable(list)); + console.log(makeParseable(list)) } else { var outList = list.map(makePretty) var outTable = [[ "Package" @@ -99,7 +100,7 @@ function makePretty (p) { function ansiTrim (str) { var r = new RegExp("\x1b(?:\\[(?:\\d+[ABCDEFGJKSTm]|\\d+;\\d+[Hfm]|" + - "\\d+;\\d+;\\d+m|6n|s|u|\\?25[lh])|\\w)", "g"); + "\\d+;\\d+;\\d+m|6n|s|u|\\?25[lh])|\\w)", "g") return str.replace(r, "") } @@ -114,7 +115,7 @@ function makeParseable (list) { , dir = path.resolve(p[0], "node_modules", dep) , has = p[2] , want = p[3] - , latest = p[4]; + , latest = p[4] return [ dir , dep + "@" + want @@ -264,20 +265,25 @@ function shouldUpdate (args, dir, dep, has, req, depth, cb) { return skip() } - if (isGitUrl(url.parse(req))) + if (npa(req).type === "git") return doIt("git", "git") // search for the latest package - var uri = url.resolve(npm.config.get("registry"), dep) - npm.registry.get(uri, null, function (er, d) { + mapToRegistry(dep, npm.config, function (er, uri) { + if (er) return cb(er) + + npm.registry.get(uri, null, updateDeps) + }) + + function updateDeps (er, d) { if (er) return cb() - if (!d || !d['dist-tags'] || !d.versions) return cb() - var l = d.versions[d['dist-tags'].latest] + if (!d || !d["dist-tags"] || !d.versions) return cb() + var l = d.versions[d["dist-tags"].latest] if (!l) return cb() var r = req - if (d['dist-tags'][req]) - r = d['dist-tags'][req] + if (d["dist-tags"][req]) + r = d["dist-tags"][req] if (semver.validRange(r, true)) { // some kind of semver range. @@ -290,13 +296,13 @@ function shouldUpdate (args, dir, dep, has, req, depth, cb) { } // We didn't find the version in the doc. See if cache can find it. - cache.add(dep, req, false, onCacheAdd) + cache.add(dep, req, null, false, onCacheAdd) function onCacheAdd(er, d) { // if this fails, then it means we can't update this thing. // it's probably a thing that isn't published. if (er) { - if (er.code && er.code === 'ETARGET') { + if (er.code && er.code === "ETARGET") { // no viable version found return skip(er) } @@ -315,6 +321,5 @@ function shouldUpdate (args, dir, dep, has, req, depth, cb) { else skip() } - - }) + } } diff --git a/deps/npm/lib/owner.js b/deps/npm/lib/owner.js index 34dbbc24722..2fdee7adb69 100644 --- a/deps/npm/lib/owner.js +++ b/deps/npm/lib/owner.js @@ -5,6 +5,12 @@ owner.usage = "npm owner add " + "\nnpm owner rm " + "\nnpm owner ls " +var npm = require("./npm.js") + , registry = npm.registry + , log = require("npmlog") + , readJson = require("read-package-json") + , mapToRegistry = require("./utils/map-to-registry.js") + owner.completion = function (opts, cb) { var argv = opts.conf.argv.remain if (argv.length > 4) return cb() @@ -14,65 +20,78 @@ owner.completion = function (opts, cb) { else subs.push("ls", "list") return cb(null, subs) } - var un = encodeURIComponent(npm.config.get("username")) - var theUser, uri - switch (argv[2]) { - case "ls": - if (argv.length > 3) return cb() - uri = url.resolve(npm.config.get("registry"), "-/short") - return registry.get(uri, null, cb) - - case "rm": - if (argv.length > 3) { - theUser = encodeURIComponent(argv[3]) - uri = url.resolve(npm.config.get("registry"), "-/by-user/"+theUser+"|"+un) - console.error(uri) - return registry.get(uri, null, function (er, d) { + + npm.commands.whoami([], true, function (er, username) { + if (er) return cb() + + var un = encodeURIComponent(username) + var byUser, theUser + switch (argv[2]) { + case "ls": + if (argv.length > 3) return cb() + return mapToRegistry("-/short", npm.config, function (er, uri) { if (er) return cb(er) - // return the intersection - return cb(null, d[theUser].filter(function (p) { - // kludge for server adminery. - return un === "isaacs" || d[un].indexOf(p) === -1 - })) + + registry.get(uri, null, cb) }) - } - // else fallthrough - case "add": - if (argv.length > 3) { - theUser = encodeURIComponent(argv[3]) - uri = url.resolve(npm.config.get("registry"), "-/by-user/"+theUser+"|"+un) - console.error(uri) - return registry.get(uri, null, function (er, d) { - console.error(uri, er || d) - // return mine that they're not already on. + + case "rm": + if (argv.length > 3) { + theUser = encodeURIComponent(argv[3]) + byUser = "-/by-user/" + theUser + "|" + un + return mapToRegistry(byUser, npm.config, function (er, uri) { + if (er) return cb(er) + + console.error(uri) + registry.get(uri, null, function (er, d) { + if (er) return cb(er) + // return the intersection + return cb(null, d[theUser].filter(function (p) { + // kludge for server adminery. + return un === "isaacs" || d[un].indexOf(p) === -1 + })) + }) + }) + } + // else fallthrough + case "add": + if (argv.length > 3) { + theUser = encodeURIComponent(argv[3]) + byUser = "-/by-user/" + theUser + "|" + un + return mapToRegistry(byUser, npm.config, function (er, uri) { + if (er) return cb(er) + + console.error(uri) + registry.get(uri, null, function (er, d) { + console.error(uri, er || d) + // return mine that they're not already on. + if (er) return cb(er) + var mine = d[un] || [] + , theirs = d[theUser] || [] + return cb(null, mine.filter(function (p) { + return theirs.indexOf(p) === -1 + })) + }) + }) + } + // just list all users who aren't me. + return mapToRegistry("-/users", npm.config, function (er, uri) { if (er) return cb(er) - var mine = d[un] || [] - , theirs = d[theUser] || [] - return cb(null, mine.filter(function (p) { - return theirs.indexOf(p) === -1 - })) + + registry.get(uri, null, function (er, list) { + if (er) return cb() + return cb(null, Object.keys(list).filter(function (n) { + return n !== un + })) + }) }) - } - // just list all users who aren't me. - uri = url.resolve(npm.config.get("registry"), "-/users") - return registry.get(uri, null, function (er, list) { - if (er) return cb() - return cb(null, Object.keys(list).filter(function (n) { - return n !== un - })) - }) - default: - return cb() - } + default: + return cb() + } + }) } -var npm = require("./npm.js") - , registry = npm.registry - , log = require("npmlog") - , readJson = require("read-package-json") - , url = require("url") - function owner (args, cb) { var action = args.shift() switch (action) { @@ -90,18 +109,23 @@ function ls (pkg, cb) { ls(pkg, cb) }) - var uri = url.resolve(npm.config.get("registry"), pkg) - registry.get(uri, null, function (er, data) { - var msg = "" - if (er) { - log.error("owner ls", "Couldn't get owner data", pkg) - return cb(er) - } - var owners = data.maintainers - if (!owners || !owners.length) msg = "admin party!" - else msg = owners.map(function (o) { return o.name +" <"+o.email+">" }).join("\n") - console.log(msg) - cb(er, owners) + mapToRegistry(pkg, npm.config, function (er, uri) { + if (er) return cb(er) + + registry.get(uri, null, function (er, data) { + var msg = "" + if (er) { + log.error("owner ls", "Couldn't get owner data", pkg) + return cb(er) + } + var owners = data.maintainers + if (!owners || !owners.length) msg = "admin party!" + else msg = owners.map(function (o) { + return o.name + " <" + o.email + ">" + }).join("\n") + console.log(msg) + cb(er, owners) + }) }) } @@ -120,7 +144,7 @@ function add (user, pkg, cb) { var o = owners[i] if (o.name === u.name) { log.info( "owner add" - , "Already a package owner: "+o.name+" <"+o.email+">") + , "Already a package owner: " + o.name + " <" + o.email + ">") return false } } @@ -145,7 +169,7 @@ function rm (user, pkg, cb) { return !match }) if (!found) { - log.info("owner rm", "Not a package owner: "+user) + log.info("owner rm", "Not a package owner: " + user) return false } if (!m.length) return new Error( @@ -156,15 +180,19 @@ function rm (user, pkg, cb) { function mutate (pkg, user, mutation, cb) { if (user) { - var uri = url.resolve(npm.config.get("registry"), "-/user/org.couchdb.user:"+user) - registry.get(uri, null, mutate_) + var byUser = "-/user/org.couchdb.user:" + user + mapToRegistry(byUser, npm.config, function (er, uri) { + if (er) return cb(er) + + registry.get(uri, null, mutate_) + }) } else { mutate_(null, null) } function mutate_ (er, u) { if (!er && user && (!u || u.error)) er = new Error( - "Couldn't get user data for "+user+": "+JSON.stringify(u)) + "Couldn't get user data for " + user + ": " + JSON.stringify(u)) if (er) { log.error("owner mutate", "Error getting user data for %s", user) @@ -172,27 +200,34 @@ function mutate (pkg, user, mutation, cb) { } if (u) u = { "name" : u.name, "email" : u.email } - var uri = url.resolve(npm.config.get("registry"), pkg) - registry.get(uri, null, function (er, data) { - if (er) { - log.error("owner mutate", "Error getting package data for %s", pkg) - return cb(er) - } - var m = mutation(u, data.maintainers) - if (!m) return cb() // handled - if (m instanceof Error) return cb(m) // error - data = { _id : data._id - , _rev : data._rev - , maintainers : m - } - var uri = url.resolve(npm.config.get("registry"), pkg+"/-rev/"+data._rev) - registry.request("PUT", uri, { body : data }, function (er, data) { - if (!er && data.error) er = new Error( - "Failed to update package metadata: "+JSON.stringify(data)) + mapToRegistry(pkg, npm.config, function (er, uri) { + if (er) return cb(er) + + registry.get(uri, null, function (er, data) { if (er) { - log.error("owner mutate", "Failed to update package metadata") + log.error("owner mutate", "Error getting package data for %s", pkg) + return cb(er) } - cb(er, data) + var m = mutation(u, data.maintainers) + if (!m) return cb() // handled + if (m instanceof Error) return cb(m) // error + data = { _id : data._id + , _rev : data._rev + , maintainers : m + } + var dataPath = pkg + "/-rev/" + data._rev + mapToRegistry(dataPath, npm.config, function (er, uri) { + if (er) return cb(er) + + registry.request("PUT", uri, { body : data }, function (er, data) { + if (!er && data.error) er = new Error( + "Failed to update package metadata: " + JSON.stringify(data)) + if (er) { + log.error("owner mutate", "Failed to update package metadata") + } + cb(er, data) + }) + }) }) }) } @@ -207,5 +242,5 @@ function readLocalPkg (cb) { } function unknown (action, cb) { - cb("Usage: \n"+owner.usage) + cb("Usage: \n" + owner.usage) } diff --git a/deps/npm/lib/pack.js b/deps/npm/lib/pack.js index ea94dd15422..f955cb71a83 100644 --- a/deps/npm/lib/pack.js +++ b/deps/npm/lib/pack.js @@ -40,9 +40,14 @@ function printFiles (files, cb) { // add to cache, then cp to the cwd function pack_ (pkg, cb) { - cache.add(pkg, null, false, function (er, data) { + cache.add(pkg, null, null, false, function (er, data) { if (er) return cb(er) - var fname = path.resolve(data._id.replace(/@/g, "-") + ".tgz") + + var name = data.name + // scoped packages get special treatment + if (name[0] === "@") name = name.substr(1).replace(/\//g, "-") + + var fname = name + "-" + data.version + ".tgz" , cached = path.resolve( npm.cache , data.name , data.version diff --git a/deps/npm/lib/publish.js b/deps/npm/lib/publish.js index ccad3ea8270..701dc2b92ea 100644 --- a/deps/npm/lib/publish.js +++ b/deps/npm/lib/publish.js @@ -1,7 +1,8 @@ module.exports = publish -var npm = require("./npm.js") +var url = require("url") + , npm = require("./npm.js") , log = require("npmlog") , path = require("path") , readJson = require("read-package-json") @@ -9,6 +10,7 @@ var npm = require("./npm.js") , chain = require("slide").chain , Conf = require("npmconf").Conf , RegClient = require("npm-registry-client") + , mapToRegistry = require("./utils/map-to-registry.js") publish.usage = "npm publish " + "\nnpm publish " @@ -22,7 +24,10 @@ publish.completion = function (opts, cb) { } function publish (args, isRetry, cb) { - if (typeof cb !== "function") cb = isRetry, isRetry = false + if (typeof cb !== "function") { + cb = isRetry + isRetry = false + } if (args.length === 0) args = ["."] if (args.length !== 1) return cb(publish.usage) @@ -47,15 +52,15 @@ function publish (args, isRetry, cb) { // That means that we can run publish/postpublish in the dir, rather than // in the cache dir. function cacheAddPublish (dir, didPre, isRetry, cb) { - npm.commands.cache.add(dir, null, false, function (er, data) { + npm.commands.cache.add(dir, null, null, false, function (er, data) { if (er) return cb(er) log.silly("publish", data) var cachedir = path.resolve( npm.cache , data.name , data.version , "package" ) - chain - ( [ !didPre && [lifecycle, data, "prepublish", cachedir] + chain([ !didPre && + [lifecycle, data, "prepublish", cachedir] , [publish_, dir, data, isRetry, cachedir] , [lifecycle, data, "publish", didPre ? dir : cachedir] , [lifecycle, data, "postpublish", didPre ? dir : cachedir] ] @@ -66,48 +71,61 @@ function cacheAddPublish (dir, didPre, isRetry, cb) { function publish_ (arg, data, isRetry, cachedir, cb) { if (!data) return cb(new Error("no package.json file found")) - // check for publishConfig hash var registry = npm.registry - var registryURI = npm.config.get("registry") + var config = npm.config + + // check for publishConfig hash if (data.publishConfig) { - var pubConf = new Conf(npm.config) - pubConf.save = npm.config.save.bind(npm.config) + config = new Conf(npm.config) + config.save = npm.config.save.bind(npm.config) // don't modify the actual publishConfig object, in case we have // to set a login token or some other data. - pubConf.unshift(Object.keys(data.publishConfig).reduce(function (s, k) { + config.unshift(Object.keys(data.publishConfig).reduce(function (s, k) { s[k] = data.publishConfig[k] return s }, {})) - registry = new RegClient(pubConf) - registryURI = pubConf.get("registry") + registry = new RegClient(config) } data._npmVersion = npm.version - data._npmUser = { name: npm.config.get("username") - , email: npm.config.get("email") } delete data.modules - if (data.private) return cb(new Error - ("This package has been marked as private\n" - +"Remove the 'private' field from the package.json to publish it.")) - - var tarball = cachedir + ".tgz" - registry.publish(registryURI, data, tarball, function (er) { - if (er && er.code === "EPUBLISHCONFLICT" - && npm.config.get("force") && !isRetry) { - log.warn("publish", "Forced publish over "+data._id) - return npm.commands.unpublish([data._id], function (er) { - // ignore errors. Use the force. Reach out with your feelings. - // but if it fails again, then report the first error. - publish([arg], er || true, cb) - }) - } - // report the unpublish error if this was a retry and unpublish failed - if (er && isRetry && isRetry !== true) return cb(isRetry) + if (data.private) return cb( + new Error( + "This package has been marked as private\n" + + "Remove the 'private' field from the package.json to publish it." + ) + ) + + mapToRegistry(data.name, config, function (er, registryURI) { if (er) return cb(er) - console.log("+ " + data._id) - cb() + + var tarball = cachedir + ".tgz" + + // we just want the base registry URL in this case + var registryBase = url.resolve(registryURI, ".") + log.verbose("publish", "registryBase", registryBase) + + var c = config.getCredentialsByURI(registryBase) + data._npmUser = {name: c.username, email: c.email} + + registry.publish(registryBase, data, tarball, function (er) { + if (er && er.code === "EPUBLISHCONFLICT" + && npm.config.get("force") && !isRetry) { + log.warn("publish", "Forced publish over " + data._id) + return npm.commands.unpublish([data._id], function (er) { + // ignore errors. Use the force. Reach out with your feelings. + // but if it fails again, then report the first error. + publish([arg], er || true, cb) + }) + } + // report the unpublish error if this was a retry and unpublish failed + if (er && isRetry && isRetry !== true) return cb(isRetry) + if (er) return cb(er) + console.log("+ " + data._id) + cb() + }) }) } diff --git a/deps/npm/lib/rebuild.js b/deps/npm/lib/rebuild.js index e296451b705..ab372c6ec07 100644 --- a/deps/npm/lib/rebuild.js +++ b/deps/npm/lib/rebuild.js @@ -5,6 +5,7 @@ var readInstalled = require("read-installed") , semver = require("semver") , log = require("npmlog") , npm = require("./npm.js") + , npa = require("npm-package-arg") rebuild.usage = "npm rebuild [[@] [name[@] ...]]" @@ -46,9 +47,9 @@ function filter (data, args, set, seen) { else if (data.name && data._id) { for (var i = 0, l = args.length; i < l; i ++) { var arg = args[i] - , nv = arg.split("@") - , n = nv.shift() - , v = nv.join("@") + , nv = npa(arg) + , n = nv.name + , v = nv.rawSpec if (n !== data.name) continue if (!semver.satisfies(data.version, v, true)) continue pass = true diff --git a/deps/npm/lib/repo.js b/deps/npm/lib/repo.js index d209c3ca836..c6db8e37b01 100644 --- a/deps/npm/lib/repo.js +++ b/deps/npm/lib/repo.js @@ -5,9 +5,12 @@ repo.usage = "npm repo " repo.completion = function (opts, cb) { if (opts.conf.argv.remain.length > 2) return cb() - var uri = url_.resolve(npm.config.get("registry"), "/-/short") - registry.get(uri, { timeout : 60000 }, function (er, list) { - return cb(null, list || []) + mapToRegistry("/-/short", npm.config, function (er, uri) { + if (er) return cb(er) + + registry.get(uri, { timeout : 60000 }, function (er, list) { + return cb(null, list || []) + }) }) } @@ -19,10 +22,12 @@ var npm = require("./npm.js") , path = require("path") , readJson = require("read-package-json") , fs = require("fs") - , url_ = require('url') + , url_ = require("url") + , mapToRegistry = require("./utils/map-to-registry.js") + , npa = require("npm-package-arg") function repo (args, cb) { - var n = args.length && args[0].split("@").shift() || '.' + var n = args.length && npa(args[0]).name || "." fs.stat(n, function (er, s) { if (er && er.code === "ENOENT") return callRegistry(n, cb) else if (er) return cb(er) @@ -35,8 +40,8 @@ function repo (args, cb) { } function getUrlAndOpen (d, cb) { - var r = d.repository; - if (!r) return cb(new Error('no repository')); + var r = d.repository + if (!r) return cb(new Error('no repository')) // XXX remove this when npm@v1.3.10 from node 0.10 is deprecated // from https://github.com/npm/npm-www/issues/418 if (githubUserRepo(r.url)) @@ -52,10 +57,13 @@ function getUrlAndOpen (d, cb) { } function callRegistry (n, cb) { - var uri = url_.resolve(npm.config.get("registry"), n + "/latest") - registry.get(uri, { timeout : 3600 }, function (er, d) { + mapToRegistry(n, npm.config, function (er, uri) { if (er) return cb(er) - getUrlAndOpen(d, cb) + + registry.get(uri + "/latest", { timeout : 3600 }, function (er, d) { + if (er) return cb(er) + getUrlAndOpen(d, cb) + }) }) } diff --git a/deps/npm/lib/run-script.js b/deps/npm/lib/run-script.js index 25e98f01d65..6cb7bf7fb97 100644 --- a/deps/npm/lib/run-script.js +++ b/deps/npm/lib/run-script.js @@ -8,7 +8,7 @@ var lifecycle = require("./utils/lifecycle.js") , log = require("npmlog") , chain = require("slide").chain -runScript.usage = "npm run-script [] " +runScript.usage = "npm run-script [-- ]" runScript.completion = function (opts, cb) { @@ -21,7 +21,7 @@ runScript.completion = function (opts, cb) { if (argv.length === 3) { // either specified a script locally, in which case, done, // or a package, in which case, complete against its scripts - var json = path.join(npm.prefix, "package.json") + var json = path.join(npm.localPrefix, "package.json") return readJson(json, function (er, d) { if (er && er.code !== "ENOENT" && er.code !== "ENOTDIR") return cb(er) if (er) d = {} @@ -30,7 +30,7 @@ runScript.completion = function (opts, cb) { if (scripts.indexOf(argv[2]) !== -1) return cb() // ok, try to find out which package it was, then var pref = npm.config.get("global") ? npm.config.get("prefix") - : npm.prefix + : npm.localPrefix var pkgDir = path.resolve( pref, "node_modules" , argv[2], "package.json" ) readJson(pkgDir, function (er, d) { @@ -54,7 +54,7 @@ runScript.completion = function (opts, cb) { }) if (npm.config.get("global")) scripts = [], next() - else readJson(path.join(npm.prefix, "package.json"), function (er, d) { + else readJson(path.join(npm.localPrefix, "package.json"), function (er, d) { if (er && er.code !== "ENOENT" && er.code !== "ENOTDIR") return cb(er) d = d || {} scripts = Object.keys(d.scripts || {}) @@ -69,18 +69,18 @@ runScript.completion = function (opts, cb) { function runScript (args, cb) { if (!args.length) return list(cb) - var pkgdir = args.length === 1 ? process.cwd() - : path.resolve(npm.dir, args[0]) - , cmd = args.pop() + + var pkgdir = npm.localPrefix + , cmd = args.shift() readJson(path.resolve(pkgdir, "package.json"), function (er, d) { if (er) return cb(er) - run(d, pkgdir, cmd, cb) + run(d, pkgdir, cmd, args, cb) }) } function list(cb) { - var json = path.join(npm.prefix, 'package.json') + var json = path.join(npm.localPrefix, 'package.json') return readJson(json, function(er, d) { if (er && er.code !== 'ENOENT' && er.code !== 'ENOTDIR') return cb(er) if (er) d = {} @@ -109,7 +109,7 @@ function list(cb) { }) } -function run (pkg, wd, cmd, cb) { +function run (pkg, wd, cmd, args, cb) { var cmds = [] if (!pkg.scripts) pkg.scripts = {} if (cmd === "restart") { @@ -124,7 +124,21 @@ function run (pkg, wd, cmd, cb) { } log.verbose("run-script", cmds) chain(cmds.map(function (c) { + // pass cli arguments after -- to script. + if (pkg.scripts[c]) pkg.scripts[c] = pkg.scripts[c] + joinArgs(args) + // when running scripts explicitly, assume that they're trusted. return [lifecycle, pkg, c, wd, true] }), cb) } + +// join arguments after '--' and pass them to script, +// handle special characters such as ', ", ' '. +function joinArgs (args) { + var joinedArgs = '' + args.forEach(function(arg, i) { + if (arg.match(/[ '"]/)) arg = '"' + arg.replace(/"/g, '\\"') + '"' + joinedArgs += ' ' + arg + }) + return joinedArgs +} diff --git a/deps/npm/lib/search.js b/deps/npm/lib/search.js index e7892350ca6..3be8b0d27db 100644 --- a/deps/npm/lib/search.js +++ b/deps/npm/lib/search.js @@ -1,10 +1,10 @@ module.exports = exports = search -var url = require("url") - , npm = require("./npm.js") +var npm = require("./npm.js") , registry = npm.registry , columnify = require('columnify') + , mapToRegistry = require("./utils/map-to-registry.js") search.usage = "npm search [some search terms ...]" @@ -63,10 +63,13 @@ function getFilteredData (staleness, args, notArgs, cb) { follow : true, staleOk : true } - var uri = url.resolve(npm.config.get("registry"), "-/all") - registry.get(uri, opts, function (er, data) { + mapToRegistry("-/all", npm.config, function (er, uri) { if (er) return cb(er) - return cb(null, filter(data, args, notArgs)) + + registry.get(uri, opts, function (er, data) { + if (er) return cb(er) + return cb(null, filter(data, args, notArgs)) + }) }) } diff --git a/deps/npm/lib/star.js b/deps/npm/lib/star.js index 9c0b4ea9ed9..123c4ebbb44 100644 --- a/deps/npm/lib/star.js +++ b/deps/npm/lib/star.js @@ -1,19 +1,22 @@ module.exports = star -var url = require("url") - , npm = require("./npm.js") +var npm = require("./npm.js") , registry = npm.registry , log = require("npmlog") , asyncMap = require("slide").asyncMap + , mapToRegistry = require("./utils/map-to-registry.js") star.usage = "npm star [pkg, pkg, ...]\n" + "npm unstar [pkg, pkg, ...]" star.completion = function (opts, cb) { - var uri = url.resolve(npm.config.get("registry"), "-/short") - registry.get(uri, { timeout : 60000 }, function (er, list) { - return cb(null, list || []) + mapToRegistry("-/short", npm.config, function (er, uri) { + if (er) return cb(er) + + registry.get(uri, { timeout : 60000 }, function (er, list) { + return cb(null, list || []) + }) }) } @@ -24,13 +27,16 @@ function star (args, cb) { , using = !(npm.command.match(/^un/)) if (!using) s = u asyncMap(args, function (pkg, cb) { - var uri = url.resolve(npm.config.get("registry"), pkg) - registry.star(uri, using, function (er, data, raw, req) { - if (!er) { - console.log(s + " "+pkg) - log.verbose("star", data) - } - cb(er, data, raw, req) + mapToRegistry(pkg, npm.config, function (er, uri) { + if (er) return cb(er) + + registry.star(uri, using, function (er, data, raw, req) { + if (!er) { + console.log(s + " "+pkg) + log.verbose("star", data) + } + cb(er, data, raw, req) + }) }) }, cb) } diff --git a/deps/npm/lib/stars.js b/deps/npm/lib/stars.js index f0d2ef73aeb..dee5c152afa 100644 --- a/deps/npm/lib/stars.js +++ b/deps/npm/lib/stars.js @@ -2,23 +2,26 @@ module.exports = stars stars.usage = "npm stars [username]" -var url = require("url") - , npm = require("./npm.js") +var npm = require("./npm.js") , registry = npm.registry , log = require("npmlog") + , mapToRegistry = require("./utils/map-to-registry.js") function stars (args, cb) { - var name = args.length === 1 ? args[0] : npm.config.get("username") - , uri = url.resolve(npm.config.get("registry"), name) - registry.stars(uri, showstars) + npm.commands.whoami([], true, function (er, username) { + var name = args.length === 1 ? args[0] : username + mapToRegistry("", npm.config, function (er, uri) { + if (er) return cb(er) + + registry.stars(uri, name, showstars) + }) + }) function showstars (er, data) { - if (er) { - return cb(er) - } + if (er) return cb(er) if (data.rows.length === 0) { - log.warn('stars', 'user has not starred any packages.') + log.warn("stars", "user has not starred any packages.") } else { data.rows.forEach(function(a) { console.log(a.value) diff --git a/deps/npm/lib/submodule.js b/deps/npm/lib/submodule.js index 2231ced9cfb..eab4d21b05c 100644 --- a/deps/npm/lib/submodule.js +++ b/deps/npm/lib/submodule.js @@ -9,7 +9,6 @@ var npm = require("./npm.js") , git = require("./utils/git.js") , asyncMap = require("slide").asyncMap , chain = require("slide").chain - , which = require("which") submodule.usage = "npm submodule " @@ -23,7 +22,7 @@ function submodule (args, cb) { if (args.length === 0) return cb(submodule.usage) asyncMap(args, function (arg, cb) { - cache.add(arg, null, false, cb) + cache.add(arg, null, null, false, cb) }, function (er, pkgs) { if (er) return cb(er) chain(pkgs.map(function (pkg) { return function (cb) { @@ -71,7 +70,7 @@ function addSubmodule (name, url, cb) { var getSubmodules = function (cb) { var args = [ "submodule", "status" ] - + git.whichAndExec(args, function _(er, stdout) { if (er) return cb(er) var res = stdout.trim().split(/\n/).map(function (line) { diff --git a/deps/npm/lib/tag.js b/deps/npm/lib/tag.js index 1d04ad1f7e0..47e9a8c0ac7 100644 --- a/deps/npm/lib/tag.js +++ b/deps/npm/lib/tag.js @@ -5,16 +5,30 @@ tag.usage = "npm tag @ []" tag.completion = require("./unpublish.js").completion -var url = require("url") - , npm = require("./npm.js") +var npm = require("./npm.js") , registry = npm.registry + , mapToRegistry = require("./utils/map-to-registry.js") + , npa = require("npm-package-arg") + , semver = require("semver") function tag (args, cb) { - var thing = (args.shift() || "").split("@") - , project = thing.shift() - , version = thing.join("@") + var thing = npa(args.shift() || "") + , project = thing.name + , version = thing.rawSpec , t = args.shift() || npm.config.get("tag") + + t = t.trim() + if (!project || !version || !t) return cb("Usage:\n"+tag.usage) - var uri = url.resolve(npm.config.get("registry"), project) - registry.tag(uri, version, t, cb) + + if (semver.validRange(t)) { + var er = new Error("Tag name must not be a valid SemVer range: " + t) + return cb(er) + } + + mapToRegistry(project, npm.config, function (er, uri) { + if (er) return cb(er) + + registry.tag(uri, version, t, cb) + }) } diff --git a/deps/npm/lib/unbuild.js b/deps/npm/lib/unbuild.js index b594f28a9ba..797762436bb 100644 --- a/deps/npm/lib/unbuild.js +++ b/deps/npm/lib/unbuild.js @@ -2,7 +2,6 @@ module.exports = unbuild unbuild.usage = "npm unbuild \n(this is plumbing)" var readJson = require("read-package-json") - , rm = require("./utils/gently-rm.js") , gentlyRm = require("./utils/gently-rm.js") , npm = require("./npm.js") , path = require("path") @@ -15,7 +14,7 @@ var readJson = require("read-package-json") // args is a list of folders. // remove any bins/etc, and then delete the folder. function unbuild (args, silent, cb) { - if (typeof silent === 'function') cb = silent, silent = false + if (typeof silent === "function") cb = silent, silent = false asyncMap(args, unbuild_(silent), cb) } @@ -28,7 +27,7 @@ function unbuild_ (silent) { return function (folder, cb_) { log.verbose(folder.substr(npm.prefix.length + 1), "unbuild") readJson(path.resolve(folder, "package.json"), function (er, pkg) { // if no json, then just trash it, but no scripts or whatever. - if (er) return rm(folder, cb) + if (er) return gentlyRm(folder, false, cb) readJson.cache.del(folder) chain ( [ [lifecycle, pkg, "preuninstall", folder, false, true] @@ -39,7 +38,7 @@ function unbuild_ (silent) { return function (folder, cb_) { } , [rmStuff, pkg, folder] , [lifecycle, pkg, "postuninstall", folder, false, true] - , [rm, folder] ] + , [gentlyRm, folder, undefined] ] , cb ) }) }} @@ -66,8 +65,8 @@ function rmBins (pkg, folder, parent, top, cb) { log.verbose([binRoot, pkg.bin], "binRoot") asyncMap(Object.keys(pkg.bin), function (b, cb) { if (process.platform === "win32") { - chain([ [rm, path.resolve(binRoot, b) + ".cmd"] - , [rm, path.resolve(binRoot, b) ] ], cb) + chain([ [gentlyRm, path.resolve(binRoot, b) + ".cmd", undefined] + , [gentlyRm, path.resolve(binRoot, b), undefined] ], cb) } else { gentlyRm( path.resolve(binRoot, b) , !npm.config.get("force") && folder diff --git a/deps/npm/lib/unpublish.js b/deps/npm/lib/unpublish.js index 225c1c3c455..2566cd5ae62 100644 --- a/deps/npm/lib/unpublish.js +++ b/deps/npm/lib/unpublish.js @@ -1,40 +1,51 @@ module.exports = unpublish -var url = require("url") - , log = require("npmlog") +var log = require("npmlog") , npm = require("./npm.js") , registry = npm.registry , readJson = require("read-package-json") , path = require("path") + , mapToRegistry = require("./utils/map-to-registry.js") + , npa = require("npm-package-arg") unpublish.usage = "npm unpublish [@]" unpublish.completion = function (opts, cb) { if (opts.conf.argv.remain.length >= 3) return cb() - var un = encodeURIComponent(npm.config.get("username")) - if (!un) return cb() - var uri = url.resolve(npm.config.get("registry"), "-/by-user/"+un) - registry.get(uri, null, function (er, pkgs) { - // do a bit of filtering at this point, so that we don't need - // to fetch versions for more than one thing, but also don't - // accidentally a whole project. - pkgs = pkgs[un] - if (!pkgs || !pkgs.length) return cb() - var partial = opts.partialWord.split("@") - , pp = partial.shift() - pkgs = pkgs.filter(function (p) { - return p.indexOf(pp) === 0 - }) - if (pkgs.length > 1) return cb(null, pkgs) - var uri = url.resolve(npm.config.get("registry"), pkgs[0]) - registry.get(uri, null, function (er, d) { + npm.commands.whoami([], true, function (er, username) { + if (er) return cb() + + var un = encodeURIComponent(username) + if (!un) return cb() + var byUser = "-/by-user/" + un + mapToRegistry(byUser, npm.config, function (er, uri) { if (er) return cb(er) - var vers = Object.keys(d.versions) - if (!vers.length) return cb(null, pkgs) - return cb(null, vers.map(function (v) { - return pkgs[0]+"@"+v - })) + + registry.get(uri, null, function (er, pkgs) { + // do a bit of filtering at this point, so that we don't need + // to fetch versions for more than one thing, but also don't + // accidentally a whole project. + pkgs = pkgs[un] + if (!pkgs || !pkgs.length) return cb() + var pp = npa(opts.partialWord).name + pkgs = pkgs.filter(function (p) { + return p.indexOf(pp) === 0 + }) + if (pkgs.length > 1) return cb(null, pkgs) + mapToRegistry(pkgs[0], npm.config, function (er, uri) { + if (er) return cb(er) + + registry.get(uri, null, function (er, d) { + if (er) return cb(er) + var vers = Object.keys(d.versions) + if (!vers.length) return cb(null, pkgs) + return cb(null, vers.map(function (v) { + return pkgs[0] + "@" + v + })) + }) + }) + }) }) }) } @@ -42,23 +53,25 @@ unpublish.completion = function (opts, cb) { function unpublish (args, cb) { if (args.length > 1) return cb(unpublish.usage) - var thing = args.length ? args.shift().split("@") : [] - , project = thing.shift() - , version = thing.join("@") + var thing = args.length ? npa(args[0]) : {} + , project = thing.name + , version = thing.rawSpec + log.silly("unpublish", "args[0]", args[0]) + log.silly("unpublish", "thing", thing) if (!version && !npm.config.get("force")) { return cb("Refusing to delete entire project.\n" - +"Run with --force to do this.\n" - +unpublish.usage) + + "Run with --force to do this.\n" + + unpublish.usage) } - if (!project || path.resolve(project) === npm.prefix) { + if (!project || path.resolve(project) === npm.localPrefix) { // if there's a package.json in the current folder, then // read the package name and version out of that. - var cwdJson = path.join(process.cwd(), "package.json") + var cwdJson = path.join(npm.localPrefix, "package.json") return readJson(cwdJson, function (er, data) { if (er && er.code !== "ENOENT" && er.code !== "ENOTDIR") return cb(er) - if (er) return cb("Usage:\n"+unpublish.usage) + if (er) return cb("Usage:\n" + unpublish.usage) gotProject(data.name, data.version, cb) }) } @@ -79,7 +92,10 @@ function gotProject (project, version, cb_) { return cb(er) } - var uri = url.resolve(npm.config.get("registry"), project) - registry.unpublish(uri, version, cb) + mapToRegistry(project, npm.config, function (er, uri) { + if (er) return cb(er) + + registry.unpublish(uri, version, cb) + }) }) } diff --git a/deps/npm/lib/utils/error-handler.js b/deps/npm/lib/utils/error-handler.js index 5c4f4c99e80..788d3f8ccc9 100644 --- a/deps/npm/lib/utils/error-handler.js +++ b/deps/npm/lib/utils/error-handler.js @@ -24,13 +24,18 @@ process.on("exit", function (code) { } if (wroteLogFile) { - log.error("", ["" - ,"Additional logging details can be found in:" + // just a line break + if (log.levels[log.level] <= log.levels.error) console.error("") + + log.error("", + ["Please include the following file with any support request:" ," " + path.resolve("npm-debug.log") ].join("\n")) wroteLogFile = false } - log.error("not ok", "code", code) + if (code) { + log.error("code", code) + } } var doExit = npm.config.get("_exit") @@ -87,7 +92,6 @@ function exit (code, noLog) { function errorHandler (er) { - var printStack = false // console.error("errorHandler", er) if (!npm.config || !npm.config.loaded) { // logging won't work unless we pretend that it's ready @@ -112,13 +116,55 @@ function errorHandler (er) { var m = er.code || er.message.match(/^(?:Error: )?(E[A-Z]+)/) if (m && !er.code) er.code = m + ; [ "type" + , "fstream_path" + , "fstream_unc_path" + , "fstream_type" + , "fstream_class" + , "fstream_finish_call" + , "fstream_linkpath" + , "stack" + , "fstream_stack" + , "statusCode" + , "pkgid" + ].forEach(function (k) { + var v = er[k] + if (!v) return + if (k === "fstream_stack") v = v.join("\n") + log.verbose(k, v) + }) + + log.verbose("cwd", process.cwd()) + + var os = require("os") + // log.error("System", os.type() + " " + os.release()) + // log.error("command", process.argv.map(JSON.stringify).join(" ")) + // log.error("node -v", process.version) + // log.error("npm -v", npm.version) + log.error("", os.type() + " " + os.release()) + log.error("argv", process.argv.map(JSON.stringify).join(" ")) + log.error("node", process.version) + log.error("npm ", "v" + npm.version) + + ; [ "file" + , "path" + , "code" + , "errno" + , "syscall" + ].forEach(function (k) { + var v = er[k] + if (v) log.error(k, v) + }) + + // just a line break + if (log.levels[log.level] <= log.levels.error) console.error("") + switch (er.code) { case "ECONNREFUSED": log.error("", er) log.error("", ["\nIf you are behind a proxy, please make sure that the" ,"'proxy' config is set properly. See: 'npm help config'" ].join("\n")) - printStack = true break case "EACCES": @@ -126,7 +172,6 @@ function errorHandler (er) { log.error("", er) log.error("", ["\nPlease try running this command again as root/Administrator." ].join("\n")) - printStack = true break case "ELIFECYCLE": @@ -160,24 +205,22 @@ function errorHandler (er) { ].join("\n"), "JSON.parse") break + // TODO(isaacs) + // Add a special case here for E401 and E403 explaining auth issues? + case "E404": var msg = [er.message] if (er.pkgid && er.pkgid !== "-") { msg.push("", "'"+er.pkgid+"' is not in the npm registry." - ,"You should bug the author to publish it") + ,"You should bug the author to publish it (or use the name yourself!)") if (er.parent) { msg.push("It was specified as a dependency of '"+er.parent+"'") } - if (er.pkgid.match(/^node[\.\-]|[\.\-]js$/)) { - var s = er.pkgid.replace(/^node[\.\-]|[\.\-]js$/g, "") - if (s !== er.pkgid) { - s = s.replace(/[^a-z0-9]/g, ' ') - msg.push("\nMaybe try 'npm search " + s + "'") - } - } msg.push("\nNote that you can also install from a" - ,"tarball, folder, or http url, or git url.") + ,"tarball, folder, http url, or git url.") } + // There's no need to have 404 in the message as well. + msg[0] = msg[0].replace(/^404\s+/, "") log.error("404", msg.join("\n")) break @@ -185,9 +228,6 @@ function errorHandler (er) { log.error("publish fail", ["Cannot publish over existing version." ,"Update the 'version' field in package.json and try again." ,"" - ,"If the previous version was published in error, see:" - ," npm help unpublish" - ,"" ,"To automatically increment version numbers, see:" ," npm help version" ].join("\n")) @@ -295,50 +335,13 @@ function errorHandler (er) { break default: - log.error("", er.stack || er.message || er) - log.error("", ["If you need help, you may report this *entire* log," - ,"including the npm and node versions, at:" + log.error("", er.message || er) + log.error("", ["", "If you need help, you may report this error at:" ," " ].join("\n")) - printStack = false break } - var os = require("os") - // just a line break - if (log.levels[log.level] <= log.levels.error) console.error("") - log.error("System", os.type() + " " + os.release()) - log.error("command", process.argv - .map(JSON.stringify).join(" ")) - log.error("cwd", process.cwd()) - log.error("node -v", process.version) - log.error("npm -v", npm.version) - - ; [ "file" - , "path" - , "type" - , "syscall" - , "fstream_path" - , "fstream_unc_path" - , "fstream_type" - , "fstream_class" - , "fstream_finish_call" - , "fstream_linkpath" - , "code" - , "errno" - , "stack" - , "fstream_stack" - ].forEach(function (k) { - var v = er[k] - if (k === "stack") { - if (!printStack) return - if (!v) v = er.message - } - if (!v) return - if (k === "fstream_stack") v = v.join("\n") - log.error(k, v) - }) - exit(typeof er.errno === "number" ? er.errno : 1) } @@ -350,17 +353,16 @@ function writeLogFile (cb) { var fs = require("graceful-fs") , fstr = fs.createWriteStream("npm-debug.log") - , util = require("util") , os = require("os") , out = "" log.record.forEach(function (m) { var pref = [m.id, m.level] if (m.prefix) pref.push(m.prefix) - pref = pref.join(' ') + pref = pref.join(" ") m.message.trim().split(/\r?\n/).map(function (line) { - return (pref + ' ' + line).trim() + return (pref + " " + line).trim() }).forEach(function (line) { out += line + os.EOL }) diff --git a/deps/npm/lib/utils/fetch.js b/deps/npm/lib/utils/fetch.js deleted file mode 100644 index f6e5166ff5f..00000000000 --- a/deps/npm/lib/utils/fetch.js +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Fetch an HTTP url to a local file. - **/ - -var request = require("request") - , fs = require("graceful-fs") - , npm = require("../npm.js") - , url = require("url") - , log = require("npmlog") - , path = require("path") - , mkdir = require("mkdirp") - , chownr = require("chownr") - , regHost - , once = require("once") - , crypto = require("crypto") - -module.exports = fetch - -function fetch (remote, local, headers, cb) { - if (typeof cb !== "function") cb = headers, headers = {} - cb = once(cb) - log.verbose("fetch", "to=", local) - mkdir(path.dirname(local), function (er, made) { - if (er) return cb(er) - fetch_(remote, local, headers, cb) - }) -} - -function fetch_ (remote, local, headers, cb) { - var fstr = fs.createWriteStream(local, { mode : npm.modes.file }) - var response = null - - fstr.on("error", function (er) { - cb(er) - fstr.destroy() - }) - - var req = makeRequest(remote, fstr, headers) - req.on("response", function (res) { - log.http(res.statusCode, remote) - response = res - response.resume() - // Work around bug in node v0.10.0 where the CryptoStream - // gets stuck and never starts reading again. - if (process.version === "v0.10.0") { - response.resume = function (orig) { return function() { - var ret = orig.apply(response, arguments) - if (response.socket.encrypted) - response.socket.encrypted.read(0) - return ret - }}(response.resume) - } - }) - - fstr.on("close", function () { - var er - if (response && response.statusCode && response.statusCode >= 400) { - er = new Error(response.statusCode + " " - + require("http").STATUS_CODES[response.statusCode]) - } - cb(er, response) - }) -} - -function makeRequest (remote, fstr, headers) { - remote = url.parse(remote) - log.http("GET", remote.href) - regHost = regHost || url.parse(npm.config.get("registry")).host - - if (remote.host === regHost && npm.config.get("always-auth")) { - remote.auth = new Buffer( npm.config.get("_auth") - , "base64" ).toString("utf8") - if (!remote.auth) return fstr.emit("error", new Error( - "Auth required and none provided. Please run 'npm adduser'")) - } - - var proxy - if (remote.protocol !== "https:" || !(proxy = npm.config.get("https-proxy"))) { - proxy = npm.config.get("proxy") - } - - var sessionToken = npm.registry.sessionToken - if (!sessionToken) { - sessionToken = crypto.randomBytes(8).toString("hex") - npm.registry.sessionToken = sessionToken - } - - var ca = remote.host === regHost ? npm.config.get("ca") : undefined - var opts = { url: remote - , proxy: proxy - , strictSSL: npm.config.get("strict-ssl") - , rejectUnauthorized: npm.config.get("strict-ssl") - , ca: ca - , headers: - { "user-agent": npm.config.get("user-agent") - , "npm-session": sessionToken - , referer: npm.registry.refer - } - } - var req = request(opts) - req.on("error", function (er) { - fstr.emit("error", er) - }) - req.pipe(fstr) - return req -} diff --git a/deps/npm/lib/utils/gently-rm.js b/deps/npm/lib/utils/gently-rm.js index 241740fed6a..d43d0725ebb 100644 --- a/deps/npm/lib/utils/gently-rm.js +++ b/deps/npm/lib/utils/gently-rm.js @@ -3,54 +3,159 @@ module.exports = gentlyRm -var rimraf = require("rimraf") - , fs = require("graceful-fs") - , npm = require("../npm.js") - , path = require("path") +var npm = require("../npm.js") + , log = require("npmlog") + , resolve = require("path").resolve + , dirname = require("path").dirname + , lstat = require("graceful-fs").lstat + , readlink = require("graceful-fs").readlink + , isInside = require("path-is-inside") + , vacuum = require("fs-vacuum") + , rimraf = require("rimraf") + , some = require("async-some") -function gentlyRm (p, gently, cb) { - if (!cb) cb = gently, gently = null +function gentlyRm (path, gently, cb) { + if (!cb) { + cb = gently + gently = null + } // never rm the root, prefix, or bin dirs. // just a safety precaution. - p = path.resolve(p) - if (p === npm.dir || - p === npm.root || - p === npm.bin || - p === npm.prefix || - p === npm.globalDir || - p === npm.globalRoot || - p === npm.globalBin || - p === npm.globalPrefix) { - return cb(new Error("May not delete: " + p)) + var prefixes = [ + npm.dir, npm.root, npm.bin, npm.prefix, + npm.globalDir, npm.globalRoot, npm.globalBin, npm.globalPrefix + ] + + var resolved = resolve(path) + if (prefixes.indexOf(resolved) !== -1) { + log.verbose("gentlyRm", resolved, "is part of npm and can't be removed") + return cb(new Error("May not delete: "+resolved)) } - if (npm.config.get("force") || !gently) { - return rimraf(p, cb) + var options = {log : log.silly.bind(log, "gentlyRm")} + if (npm.config.get("force") || !gently) options.purge = true + + if (!gently) { + log.verbose("gentlyRm", "vacuuming", resolved) + return vacuum(resolved, options, cb) } - gently = path.resolve(gently) + var parent = resolve(gently) + log.verbose("gentlyRm", "verifying that", parent, "is managed by npm") + some(prefixes, isManaged(parent), function (er, matched) { + if (er) return cb(er) + + if (!matched) { + log.verbose("gentlyRm", parent, "is not managed by npm") + return clobberFail(resolved, parent, cb) + } + + log.silly("gentlyRm", parent, "is managed by npm") + + if (isInside(resolved, parent)) { + log.silly("gentlyRm", resolved, "is under", parent) + log.verbose("gentlyRm", "vacuuming", resolved, "up to", parent) + options.base = parent + return vacuum(resolved, options, cb) + } + + log.silly("gentlyRm", resolved, "is not under", parent) + log.silly("gentlyRm", "checking to see if", resolved, "is a link") + lstat(resolved, function (er, stat) { + if (er) { + if (er.code === "ENOENT") return cb(null) + return cb(er) + } + + if (!stat.isSymbolicLink()) { + log.verbose("gentlyRm", resolved, "is outside", parent, "and not a link") + return clobberFail(resolved, parent, cb) + } + + log.silly("gentlyRm", resolved, "is a link") + readlink(resolved, function (er, link) { + if (er) { + if (er.code === "ENOENT") return cb(null) + return cb(er) + } - // lstat it, see if it's a symlink. - fs.lstat(p, function (er, s) { - if (er) return rimraf(p, cb) - if (!s.isSymbolicLink()) next(null, path.resolve(p)) - realish(p, next) + var source = resolve(dirname(resolved), link) + if (isInside(source, parent)) { + log.silly("gentlyRm", source, "inside", parent) + log.verbose("gentlyRm", "vacuuming", resolved) + return vacuum(resolved, options, cb) + } + + log.silly("gentlyRm", "checking to see if", source, "is managed by npm") + some(prefixes, isManaged(source), function (er, matched) { + if (er) return cb(er) + + if (matched) { + log.silly("gentlyRm", source, "is under", matched) + log.verbose("gentlyRm", "removing", resolved) + rimraf(resolved, cb) + } + + log.verbose("gentlyRm", source, "is not managed by npm") + return clobberFail(path, parent, cb) + }) + }) + }) }) +} - function next (er, rp) { - if (rp && rp.indexOf(gently) !== 0) { - return clobberFail(p, gently, cb) +var resolvedPaths = {} +function isManaged (target) { + return predicate + + function predicate (path, cb) { + if (!path) { + log.verbose("isManaged", "no path") + return cb(null, false) + } + + path = resolve(path) + + // if the path has already been memoized, return immediately + var resolved = resolvedPaths[path] + if (resolved) { + var inside = isInside(target, resolved) + log.silly("isManaged", target, inside ? "is" : "is not", "inside", resolved) + + return cb(null, inside && path) } - rimraf(p, cb) + + // otherwise, check the path + lstat(path, function (er, stat) { + if (er) { + if (er.code === "ENOENT") return cb(null, false) + + return cb(er) + } + + // if it's not a link, cache & test the path itself + if (!stat.isSymbolicLink()) return cacheAndTest(path, path, target, cb) + + // otherwise, cache & test the link's source + readlink(path, function (er, source) { + if (er) { + if (er.code === "ENOENT") return cb(null, false) + + return cb(er) + } + + cacheAndTest(resolve(path, source), path, target, cb) + }) + }) } -} -function realish (p, cb) { - fs.readlink(p, function (er, r) { - if (er) return cb(er) - return cb(null, path.resolve(path.dirname(p), r)) - }) + function cacheAndTest (resolved, source, target, cb) { + resolvedPaths[source] = resolved + var inside = isInside(target, resolved) + log.silly("cacheAndTest", target, inside ? "is" : "is not", "inside", resolved) + cb(null, inside && source) + } } function clobberFail (p, g, cb) { diff --git a/deps/npm/lib/utils/is-git-url.js b/deps/npm/lib/utils/is-git-url.js deleted file mode 100644 index 7ded4b602a2..00000000000 --- a/deps/npm/lib/utils/is-git-url.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = isGitUrl - -function isGitUrl (url) { - switch (url.protocol) { - case "git:": - case "git+http:": - case "git+https:": - case "git+rsync:": - case "git+ftp:": - case "git+ssh:": - return true - } -} diff --git a/deps/npm/lib/utils/lifecycle.js b/deps/npm/lib/utils/lifecycle.js index 8bcb99689f4..c0eb83dfb1d 100644 --- a/deps/npm/lib/utils/lifecycle.js +++ b/deps/npm/lib/utils/lifecycle.js @@ -71,11 +71,6 @@ function lifecycle_ (pkg, stage, wd, env, unsafe, failOk, cb) { , p = wd.split("node_modules") , acc = path.resolve(p.shift()) - // first add the directory containing the `node` executable currently - // running, so that any lifecycle script that invoke "node" will execute - // this same one. - pathArr.unshift(path.dirname(process.execPath)) - p.forEach(function (pp) { pathArr.unshift(path.join(acc, "node_modules", ".bin")) acc = path.join(acc, "node_modules", pp) @@ -353,13 +348,9 @@ function makeEnv (data, prefix, env) { function cmd (stage) { function CMD (args, cb) { - if (args.length) { - chain(args.map(function (p) { - return [npm.commands, "run-script", [p, stage]] - }), cb) - } else npm.commands["run-script"]([stage], cb) + npm.commands["run-script"]([stage].concat(args), cb) } - CMD.usage = "npm "+stage+" " + CMD.usage = "npm "+stage+" [-- ]" var installedShallow = require("./completion/installed-shallow.js") CMD.completion = function (opts, cb) { installedShallow(opts, function (d) { diff --git a/deps/npm/lib/utils/map-to-registry.js b/deps/npm/lib/utils/map-to-registry.js new file mode 100644 index 00000000000..cf665e4f656 --- /dev/null +++ b/deps/npm/lib/utils/map-to-registry.js @@ -0,0 +1,54 @@ +var url = require("url") + +var log = require("npmlog") + , npa = require("npm-package-arg") + +module.exports = mapToRegistry + +function mapToRegistry(name, config, cb) { + var uri + var scopedRegistry + + // the name itself takes precedence + var data = npa(name) + if (data.scope) { + // the name is definitely scoped, so escape now + name = name.replace("/", "%2f") + + log.silly("mapToRegistry", "scope", data.scope) + + scopedRegistry = config.get(data.scope + ":registry") + if (scopedRegistry) { + log.silly("mapToRegistry", "scopedRegistry (scoped package)", scopedRegistry) + uri = url.resolve(scopedRegistry, name) + } + else { + log.verbose("mapToRegistry", "no registry URL found for scope", data.scope) + } + } + + // ...then --scope=@scope or --scope=scope + var scope = config.get("scope") + if (!uri && scope) { + // I'm an enabler, sorry + if (scope.charAt(0) !== "@") scope = "@" + scope + + scopedRegistry = config.get(scope + ":registry") + if (scopedRegistry) { + log.silly("mapToRegistry", "scopedRegistry (scope in config)", scopedRegistry) + uri = url.resolve(scopedRegistry, name) + } + else { + log.verbose("mapToRegistry", "no registry URL found for scope", scope) + } + } + + // ...and finally use the default registry + if (!uri) { + uri = url.resolve(config.get("registry"), name) + } + + log.verbose("mapToRegistry", "name", name) + log.verbose("mapToRegistry", "uri", uri) + cb(null, uri) +} diff --git a/deps/npm/lib/version.js b/deps/npm/lib/version.js index 95d5ff2ee2b..5091ab9e2df 100644 --- a/deps/npm/lib/version.js +++ b/deps/npm/lib/version.js @@ -23,7 +23,7 @@ version.usage = "npm version [ | major | minor | patch | prerelease function version (args, silent, cb_) { if (typeof cb_ !== "function") cb_ = silent, silent = false if (args.length > 1) return cb_(version.usage) - fs.readFile(path.join(process.cwd(), "package.json"), function (er, data) { + fs.readFile(path.join(npm.localPrefix, "package.json"), function (er, data) { if (!args.length) { var v = {} Object.keys(process.versions).forEach(function (k) { @@ -63,7 +63,7 @@ function version (args, silent, cb_) { if (data.version === newVer) return cb_(new Error("Version not changed")) data.version = newVer - fs.stat(path.join(process.cwd(), ".git"), function (er, s) { + fs.stat(path.join(npm.localPrefix, ".git"), function (er, s) { function cb (er) { if (!er && !silent) console.log("v" + newVer) cb_(er) @@ -111,7 +111,7 @@ function checkGit (data, cb) { } function write (data, cb) { - fs.writeFile( path.join(process.cwd(), "package.json") + fs.writeFile( path.join(npm.localPrefix, "package.json") , new Buffer(JSON.stringify(data, null, 2) + "\n") , cb ) } diff --git a/deps/npm/lib/view.js b/deps/npm/lib/view.js index 33bf550dd9f..43d09cbbccf 100644 --- a/deps/npm/lib/view.js +++ b/deps/npm/lib/view.js @@ -4,21 +4,26 @@ module.exports = view view.usage = "npm view pkg[@version] [[.subfield]...]" view.completion = function (opts, cb) { - var uri if (opts.conf.argv.remain.length <= 2) { - uri = url.resolve(npm.config.get("registry"), "-/short") - return registry.get(uri, null, cb) + return mapToRegistry("-/short", npm.config, function (er, uri) { + if (er) return cb(er) + + registry.get(uri, null, cb) + }) } // have the package, get the fields. var tag = npm.config.get("tag") - uri = url.resolve(npm.config.get("registry"), opts.conf.argv.remain[2]) - registry.get(uri, null, function (er, d) { + mapToRegistry(opts.conf.argv.remain[2], npm.config, function (er, uri) { if (er) return cb(er) - var dv = d.versions[d["dist-tags"][tag]] - , fields = [] - d.versions = Object.keys(d.versions).sort(semver.compareLoose) - fields = getFields(d).concat(getFields(dv)) - cb(null, fields) + + registry.get(uri, null, function (er, d) { + if (er) return cb(er) + var dv = d.versions[d["dist-tags"][tag]] + , fields = [] + d.versions = Object.keys(d.versions).sort(semver.compareLoose) + fields = getFields(d).concat(getFields(dv)) + cb(null, fields) + }) }) function getFields (d, f, pref) { @@ -42,71 +47,75 @@ view.completion = function (opts, cb) { } } -var url = require("url") - , npm = require("./npm.js") +var npm = require("./npm.js") , registry = npm.registry , log = require("npmlog") , util = require("util") , semver = require("semver") + , mapToRegistry = require("./utils/map-to-registry.js") + , npa = require("npm-package-arg") function view (args, silent, cb) { if (typeof cb !== "function") cb = silent, silent = false if (!args.length) return cb("Usage: "+view.usage) var pkg = args.shift() - , nv = pkg.split("@") - , name = nv.shift() - , version = nv.join("@") || npm.config.get("tag") + , nv = npa(pkg) + , name = nv.name + , version = nv.rawSpec || npm.config.get("tag") if (name === ".") return cb(view.usage) // get the data about this package - var uri = url.resolve(npm.config.get("registry"), name) - registry.get(uri, null, function (er, data) { + mapToRegistry(name, npm.config, function (er, uri) { if (er) return cb(er) - if (data["dist-tags"] && data["dist-tags"].hasOwnProperty(version)) { - version = data["dist-tags"][version] - } - if (data.time && data.time.unpublished) { - var u = data.time.unpublished - er = new Error("Unpublished by " + u.name + " on " + u.time) - er.statusCode = 404 - er.code = "E404" - er.pkgid = data._id - return cb(er, data) - } + registry.get(uri, null, function (er, data) { + if (er) return cb(er) + if (data["dist-tags"] && data["dist-tags"].hasOwnProperty(version)) { + version = data["dist-tags"][version] + } + if (data.time && data.time.unpublished) { + var u = data.time.unpublished + er = new Error("Unpublished by " + u.name + " on " + u.time) + er.statusCode = 404 + er.code = "E404" + er.pkgid = data._id + return cb(er, data) + } - var results = [] - , error = null - , versions = data.versions || {} - data.versions = Object.keys(versions).sort(semver.compareLoose) - if (!args.length) args = [""] - // remove readme unless we asked for it - if (-1 === args.indexOf("readme")) { - delete data.readme - } + var results = [] + , error = null + , versions = data.versions || {} + data.versions = Object.keys(versions).sort(semver.compareLoose) + if (!args.length) args = [""] + + // remove readme unless we asked for it + if (-1 === args.indexOf("readme")) { + delete data.readme + } - Object.keys(versions).forEach(function (v) { - if (semver.satisfies(v, version, true)) args.forEach(function (args) { - // remove readme unless we asked for it - if (-1 === args.indexOf("readme")) { - delete versions[v].readme - } - results.push(showFields(data, versions[v], args)) + Object.keys(versions).forEach(function (v) { + if (semver.satisfies(v, version, true)) args.forEach(function (args) { + // remove readme unless we asked for it + if (-1 === args.indexOf("readme")) { + delete versions[v].readme + } + results.push(showFields(data, versions[v], args)) + }) }) - }) - results = results.reduce(reducer, {}) - var retval = results + results = results.reduce(reducer, {}) + var retval = results - if (args.length === 1 && args[0] === "") { - retval = cleanBlanks(retval) - log.silly("cleanup", retval) - } + if (args.length === 1 && args[0] === "") { + retval = cleanBlanks(retval) + log.silly("cleanup", retval) + } - if (error || silent) cb(error, retval) - else printData(results, data._id, cb.bind(null, error, retval)) + if (error || silent) cb(error, retval) + else printData(results, data._id, cb.bind(null, error, retval)) + }) }) } diff --git a/deps/npm/lib/whoami.js b/deps/npm/lib/whoami.js index f1c67e2b0df..b33f93743d2 100644 --- a/deps/npm/lib/whoami.js +++ b/deps/npm/lib/whoami.js @@ -1,13 +1,39 @@ -module.exports = whoami - var npm = require("./npm.js") -whoami.usage = "npm whoami\n(just prints the 'username' config)" +module.exports = whoami + +whoami.usage = "npm whoami\n(just prints username according to given registry)" function whoami (args, silent, cb) { - if (typeof cb !== "function") cb = silent, silent = false - var me = npm.config.get("username") - var msg = me ? me : "Not authed. Run 'npm adduser'" + // FIXME: need tighter checking on this, but is a breaking change + if (typeof cb !== "function") { + cb = silent + silent = false + } + + var registry = npm.config.get("registry") + if (!registry) return cb(new Error("no default registry set")) + + var credentials = npm.config.getCredentialsByURI(registry) + if (credentials) { + if (credentials.username) { + if (!silent) console.log(credentials.username) + return process.nextTick(cb.bind(this, null, credentials.username)) + } + else if (credentials.token) { + return npm.registry.whoami(registry, function (er, username) { + if (er) return cb(er) + + if (!silent) console.log(username) + cb(null, username) + }) + } + } + + // At this point, if they have a credentials object, it doesn't + // have a token or auth in it. Probably just the default + // registry. + var msg = "Not authed. Run 'npm adduser'" if (!silent) console.log(msg) - process.nextTick(cb.bind(this, null, me)) + process.nextTick(cb.bind(this, null, msg)) } diff --git a/deps/npm/man/man1/npm-README.1 b/deps/npm/man/man1/npm-README.1 index cfa8b459836..8f7d01ba7a1 100644 --- a/deps/npm/man/man1/npm-README.1 +++ b/deps/npm/man/man1/npm-README.1 @@ -1,221 +1,177 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm\fR \-\- node package manager![Build Status \fIhttps://img\.shields\.io/travis/npm/npm/master\.svg)](https://travis\-ci\.org/npm/npm\fR -## SYNOPSIS -. +\fBnpm\fR \- node package manager +.P +Build Status \fIhttps://img\.shields\.io/travis/npm/npm/master\.svg\fR \fIhttps://travis\-ci\.org/npm/npm\fR +.SH SYNOPSIS .P This is just enough info to get you up and running\. -. .P -Much more info available via \fBnpm help\fR once it\'s installed\. -. -.SH "IMPORTANT" +Much more info available via \fBnpm help\fR once it's installed\. +.SH IMPORTANT +.P \fBYou need node v0\.8 or higher to run this program\.\fR -. .P To install an old \fBand unsupported\fR version of npm that works on node 0\.3 and prior, clone the git repo and dig through the old tags and branches\. -. -.SH "Super Easy Install" -npm comes with node now\. -. -.SS "Windows Computers" -Get the MSI\. npm is in it\. -. -.SS "Apple Macintosh Computers" -Get the pkg\. npm is in it\. -. -.SS "Other Sorts of Unices" +.SH Super Easy Install +.P +npm comes with node \fIhttp://nodejs\.org/download/\fR now\. +.SS Windows Computers +.P +Get the MSI \fIhttp://nodejs\.org/download/\fR\|\. npm is in it\. +.SS Apple Macintosh Computers +.P +Get the pkg \fIhttp://nodejs\.org/download/\fR\|\. npm is in it\. +.SS Other Sorts of Unices +.P Run \fBmake install\fR\|\. npm will be installed with node\. -. .P If you want a more fancy pants install (a different version, customized paths, etc\.) then read on\. -. -.SH "Fancy Install (Unix)" -There\'s a pretty robust install script at \fIhttps://www\.npmjs\.org/install\.sh\fR\|\. You can download that and run it\. -. -.P -Here\'s an example using curl: -. -.IP "" 4 -. -.nf +.SH Fancy Install (Unix) +.P +There's a pretty robust install script at +https://www\.npmjs\.org/install\.sh\|\. You can download that and run it\. +.P +Here's an example using curl: +.P +.RS 2 +.EX curl \-L https://npmjs\.org/install\.sh | sh -. -.fi -. -.IP "" 0 -. -.SS "Slightly Fancier" +.EE +.RE +.SS Slightly Fancier +.P You can set any npm configuration params with that script: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm_config_prefix=/some/path sh install\.sh -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Or, you can run it in uber\-debuggery mode: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm_debug=1 sh install\.sh -. -.fi -. -.IP "" 0 -. -.SS "Even Fancier" +.EE +.RE +.SS Even Fancier +.P Get the code with git\. Use \fBmake\fR to build the docs and do other stuff\. If you plan on hacking on npm, \fBmake link\fR is your friend\. -. .P -If you\'ve got the npm source code, you can also semi\-permanently set +If you've got the npm source code, you can also semi\-permanently set arbitrary config keys using the \fB\|\./configure \-\-key=val \.\.\.\fR, and then run npm commands by doing \fBnode cli\.js \fR\|\. (This is helpful for testing, or running stuff without actually installing npm itself\.) -. -.SH "Fancy Windows Install" -You can download a zip file from \fIhttps://npmjs\.org/dist/\fR, and unpack it +.SH Fancy Windows Install +.P +You can download a zip file from https://npmjs\.org/dist/, and unpack it in the same folder where node\.exe lives\. -. .P -If that\'s not fancy enough for you, then you can fetch the code with +If that's not fancy enough for you, then you can fetch the code with git, and mess with it directly\. -. -.SH "Installing on Cygwin" +.SH Installing on Cygwin +.P No\. -. -.SH "Permissions when Using npm to Install Other Stuff" +.SH Permissions when Using npm to Install Other Stuff +.P \fBtl;dr\fR -. -.IP "\(bu" 4 -Use \fBsudo\fR for greater safety\. Or don\'t, if you prefer not to\. -. -.IP "\(bu" 4 -npm will downgrade permissions if it\'s root before running any build +.RS 0 +.IP \(bu 2 +Use \fBsudo\fR for greater safety\. Or don't, if you prefer not to\. +.IP \(bu 2 +npm will downgrade permissions if it's root before running any build scripts that package authors specified\. -. -.IP "" 0 -. -.SS "More details\.\.\." + +.RE +.SS More details\.\.\. +.P As of version 0\.3, it is recommended to run npm as root\. This allows npm to change the user identifier to the \fBnobody\fR user prior to running any package build or test commands\. -. .P If you are not the root user, or if you are on a platform that does not support uid switching, then npm will not attempt to change the userid\. -. .P If you would like to ensure that npm \fBalways\fR runs scripts as the "nobody" user, and have it fail if it cannot downgrade permissions, then set the following configuration param: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm config set unsafe\-perm false -. -.fi -. -.IP "" 0 -. +.EE +.RE .P This will prevent running in unsafe mode, even as non\-root users\. -. -.SH "Uninstalling" +.SH Uninstalling +.P So sad to see you go\. -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX sudo npm uninstall npm \-g -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Or, if that fails, -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX sudo make uninstall -. -.fi -. -.IP "" 0 -. -.SH "More Severe Uninstalling" +.EE +.RE +.SH More Severe Uninstalling +.P Usually, the above instructions are sufficient\. That will remove -npm, but leave behind anything you\'ve installed\. -. +npm, but leave behind anything you've installed\. .P If you would like to remove all the packages that you have installed, then you can use the \fBnpm ls\fR command to find them, and then \fBnpm rm\fR to remove them\. -. .P -To remove cruft left behind by npm 0\.x, you can use the included \fBclean\-old\.sh\fR script file\. You can run it conveniently like this: -. -.IP "" 4 -. -.nf +To remove cruft left behind by npm 0\.x, you can use the included +\fBclean\-old\.sh\fR script file\. You can run it conveniently like this: +.P +.RS 2 +.EX npm explore npm \-g \-\- sh scripts/clean\-old\.sh -. -.fi -. -.IP "" 0 -. +.EE +.RE .P npm uses two configuration files, one for per\-user configs, and another for global (every\-user) configs\. You can view them by doing: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm config get userconfig # defaults to ~/\.npmrc npm config get globalconfig # defaults to /usr/local/etc/npmrc -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Uninstalling npm does not remove configuration files by default\. You must remove them yourself manually if you want them gone\. Note that this means that future npm installs will not remember the settings that you have chosen\. -. -.SH "Using npm Programmatically" +.SH Using npm Programmatically +.P If you would like to use npm programmatically, you can do that\. -It\'s not very well documented, but it \fIis\fR rather simple\. -. +It's not very well documented, but it \fIis\fR rather simple\. .P Most of the time, unless you actually want to do all the things that -npm does, you should try using one of npm\'s dependencies rather than +npm does, you should try using one of npm's dependencies rather than using npm itself, if possible\. -. .P Eventually, npm will be just a thin cli wrapper around the modules that it depends on, but for now, there are some things that you must use npm itself to do\. -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX var npm = require("npm") npm\.load(myConfigObject, function (er) { if (er) return handlError(er) @@ -225,117 +181,98 @@ npm\.load(myConfigObject, function (er) { }) npm\.on("log", function (message) { \.\.\.\. }) }) -. -.fi -. -.IP "" 0 -. +.EE +.RE .P The \fBload\fR function takes an object hash of the command\-line configs\. The various \fBnpm\.commands\.\fR functions take an \fBarray\fR of -positional argument \fBstrings\fR\|\. The last argument to any \fBnpm\.commands\.\fR function is a callback\. Some commands take other +positional argument \fBstrings\fR\|\. The last argument to any +\fBnpm\.commands\.\fR function is a callback\. Some commands take other optional arguments\. Read the source\. -. .P You cannot set configs individually for any single npm function at this time\. Since \fBnpm\fR is a singleton, any call to \fBnpm\.config\.set\fR will change the value for \fIall\fR npm commands in that process\. -. .P See \fB\|\./bin/npm\-cli\.js\fR for an example of pulling config values off of the command line arguments using nopt\. You may also want to check out \fBnpm help config\fR to learn about all the options you can set there\. -. -.SH "More Docs" +.SH More Docs +.P Check out the docs \fIhttps://www\.npmjs\.org/doc/\fR, especially the faq \fIhttps://www\.npmjs\.org/doc/faq\.html\fR\|\. -. .P You can use the \fBnpm help\fR command to read any of them\. -. .P -If you\'re a developer, and you want to use npm to publish your program, +If you're a developer, and you want to use npm to publish your program, you should read this \fIhttps://www\.npmjs\.org/doc/developers\.html\fR -. -.SH "Legal Stuff" +.SH Legal Stuff +.P "npm" and "The npm Registry" are owned by npm, Inc\. All rights reserved\. See the included LICENSE file for more details\. -. .P "Node\.js" and "node" are trademarks owned by Joyent, Inc\. -. .P Modules published on the npm registry are not officially endorsed by npm, Inc\. or the Node\.js project\. -. .P Data published to the npm registry is not part of npm itself, and is the sole property of the publisher\. While every effort is made to ensure accountability, there is absolutely no guarantee, warrantee, or assertion expressed or implied as to the quality, fitness for a specific purpose, or lack of malice in any given npm package\. -. .P If you have a complaint about a package in the public npm registry, and cannot resolve it with the package -owner \fIhttps://www\.npmjs\.org/doc/misc/npm\-disputes\.html\fR, please email \fIsupport@npmjs\.com\fR and explain the situation\. -. +owner \fIhttps://www\.npmjs\.org/doc/misc/npm\-disputes\.html\fR, please email +support@npmjs\.com and explain the situation\. .P 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\. -. -.SS "In plainer english" +.SS In plainer english +.P npm is the property of npm, Inc\. -. .P -If you publish something, it\'s yours, and you are solely accountable +If you publish something, it's yours, and you are solely accountable for it\. -. .P -If other people publish something, it\'s theirs\. -. +If other people publish something, it's theirs\. .P Users can publish Bad Stuff\. It will be removed promptly if reported\. But there is no vetting process for published modules, and you use them at your own risk\. Please inspect the source\. -. .P If you publish Bad Stuff, we may delete it from the registry, or even -ban your account in extreme cases\. So don\'t do that\. -. -.SH "BUGS" +ban your account in extreme cases\. So don't do that\. +.SH BUGS +.P When you find issues, please report them: -. -.IP "\(bu" 4 -web: \fIhttps://github\.com/npm/npm/issues\fR -. -.IP "\(bu" 4 -email: \fInpm\-@googlegroups\.com\fR -. -.IP "" 0 -. -.P -Be sure to include \fIall\fR of the output from the npm command that didn\'t work +.RS 0 +.IP \(bu 2 +web: +https://github\.com/npm/npm/issues +.IP \(bu 2 +email: +npm\-@googlegroups\.com + +.RE +.P +Be sure to include \fIall\fR of the output from the npm command that didn't work as expected\. The \fBnpm\-debug\.log\fR file is also helpful to provide\. -. .P You can also look for isaacs in #node\.js on irc://irc\.freenode\.net\. He will no doubt tell you to put the output in a gist or email\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help npm -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 faq -. -.IP "\(bu" 4 +.IP \(bu 2 npm help help -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 index -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-adduser.1 b/deps/npm/man/man1/npm-adduser.1 index da1dcdbc3f3..5db7ee28a71 100644 --- a/deps/npm/man/man1/npm-adduser.1 +++ b/deps/npm/man/man1/npm-adduser.1 @@ -1,63 +1,67 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-ADDUSER" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-adduser\fR \-\- Add a registry user account -. -.SH "SYNOPSIS" -. -.nf -npm adduser -. -.fi -. -.SH "DESCRIPTION" -Create or verify a user named \fB\fR in the npm registry, and -save the credentials to the \fB\|\.npmrc\fR file\. -. +\fBnpm-adduser\fR \- Add a registry user account +.SH SYNOPSIS +.P +.RS 2 +.EX +npm adduser [\-\-registry=url] [\-\-scope=@orgname] +.EE +.RE +.SH DESCRIPTION +.P +Create or verify a user named \fB\fR in the specified registry, and +save the credentials to the \fB\|\.npmrc\fR file\. If no registry is specified, +the default registry will be used (see npm help 7 \fBnpm\-config\fR)\. .P The username, password, and email are read in from prompts\. -. .P You may use this command to change your email address, but not username or password\. -. .P -To reset your password, go to \fIhttps://npmjs\.org/forgot\fR -. +To reset your password, go to https://www\.npmjs\.org/forgot .P You may use this command multiple times with the same user account to authorize on a new machine\. -. -.SH "CONFIGURATION" -. -.SS "registry" +.P +\fBnpm login\fR is an alias to \fBadduser\fR and behaves exactly the same way\. +.SH CONFIGURATION +.SS registry +.P Default: http://registry\.npmjs\.org/ -. .P -The base URL of the npm package registry\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +The base URL of the npm package registry\. If \fBscope\fR is also specified, +this registry will only be used for packages with that scope\. See npm help 7 \fBnpm\-scope\fR\|\. +.SS scope +.P +Default: none +.P +If specified, the user and login credentials given will be associated +with the specified scope\. See npm help 7 \fBnpm\-scope\fR\|\. You can use both at the same time, +e\.g\. +.P +.RS 2 +.EX +npm adduser \-\-registry=http://myregistry\.example\.com \-\-scope=@myco +.EE +.RE +.P +This will set a registry for the given scope and login or create a user for +that registry at the same time\. +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 7 registry -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 npm help owner -. -.IP "\(bu" 4 +.IP \(bu 2 npm help whoami -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-bin.1 b/deps/npm/man/man1/npm-bin.1 index 548bb6ad347..b4963914e98 100644 --- a/deps/npm/man/man1/npm-bin.1 +++ b/deps/npm/man/man1/npm-bin.1 @@ -1,40 +1,30 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-BIN" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-bin\fR \-\- Display npm bin folder -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-bin\fR \- Display npm bin folder +.SH SYNOPSIS +.P +.RS 2 +.EX npm bin -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Print the folder where npm will install executables\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help prefix -. -.IP "\(bu" 4 +.IP \(bu 2 npm help root -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 folders -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-bugs.1 b/deps/npm/man/man1/npm-bugs.1 index 328ac304515..67c0a6114bd 100644 --- a/deps/npm/man/man1/npm-bugs.1 +++ b/deps/npm/man/man1/npm-bugs.1 @@ -1,78 +1,59 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-BUGS" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-bugs\fR \-\- Bugs for a package in a web browser maybe -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-bugs\fR \- Bugs for a package in a web browser maybe +.SH SYNOPSIS +.P +.RS 2 +.EX npm bugs npm bugs (with no args in a package dir) -. -.fi -. -.SH "DESCRIPTION" -This command tries to guess at the likely location of a package\'s +.EE +.RE +.SH DESCRIPTION +.P +This command tries to guess at the likely location of a package's bug tracker URL, and then tries to open it using the \fB\-\-browser\fR config param\. If no package name is provided, it will search for a \fBpackage\.json\fR in the current folder and use the \fBname\fR property\. -. -.SH "CONFIGURATION" -. -.SS "browser" -. -.IP "\(bu" 4 +.SH CONFIGURATION +.SS browser +.RS 0 +.IP \(bu 2 Default: OS X: \fB"open"\fR, Windows: \fB"start"\fR, Others: \fB"xdg\-open"\fR -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "" 0 -. + +.RE .P The browser that is called by the \fBnpm bugs\fR command to open websites\. -. -.SS "registry" -. -.IP "\(bu" 4 +.SS registry +.RS 0 +.IP \(bu 2 Default: https://registry\.npmjs\.org/ -. -.IP "\(bu" 4 +.IP \(bu 2 Type: url -. -.IP "" 0 -. + +.RE .P The base URL of the npm package registry\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help docs -. -.IP "\(bu" 4 +.IP \(bu 2 npm help view -. -.IP "\(bu" 4 +.IP \(bu 2 npm help publish -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 registry -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 package\.json -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-build.1 b/deps/npm/man/man1/npm-build.1 index cc815b63b51..ed530b38607 100644 --- a/deps/npm/man/man1/npm-build.1 +++ b/deps/npm/man/man1/npm-build.1 @@ -1,43 +1,34 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-BUILD" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-build\fR \-\- Build a package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-build\fR \- Build a package +.SH SYNOPSIS +.P +.RS 2 +.EX npm build -. -.fi -. -.IP "\(bu" 4 +.EE +.RE +.RS 0 +.IP \(bu 2 \fB\fR: A folder containing a \fBpackage\.json\fR file in its root\. -. -.IP "" 0 -. -.SH "DESCRIPTION" + +.RE +.SH DESCRIPTION +.P This is the plumbing command called by \fBnpm link\fR and \fBnpm install\fR\|\. -. .P It should generally not be called directly\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help install -. -.IP "\(bu" 4 +.IP \(bu 2 npm help link -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 scripts -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 package\.json -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-bundle.1 b/deps/npm/man/man1/npm-bundle.1 index 5799f4b19d9..7a8355d888b 100644 --- a/deps/npm/man/man1/npm-bundle.1 +++ b/deps/npm/man/man1/npm-bundle.1 @@ -1,23 +1,17 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-BUNDLE" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-bundle\fR \-\- REMOVED -. -.SH "DESCRIPTION" +\fBnpm-bundle\fR \- REMOVED +.SH DESCRIPTION +.P The \fBnpm bundle\fR command has been removed in 1\.0, for the simple reason that it is no longer necessary, as the default behavior is now to install packages into the local space\. -. .P Just use \fBnpm install\fR now to do what \fBnpm bundle\fR used to do\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help install -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-cache.1 b/deps/npm/man/man1/npm-cache.1 index 3977da0b1af..5a99d11a240 100644 --- a/deps/npm/man/man1/npm-cache.1 +++ b/deps/npm/man/man1/npm-cache.1 @@ -1,100 +1,86 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-CACHE" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-cache\fR \-\- Manipulates packages cache -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-cache\fR \- Manipulates packages cache +.SH SYNOPSIS +.P +.RS 2 +.EX npm cache add npm cache add npm cache add npm cache add @ + npm cache ls [] + npm cache clean [] -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Used to add, list, or clear the npm cache folder\. -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 add: Add the specified package to the local cache\. This command is primarily intended to be used internally by npm, but it can provide a way to add data to the local installation cache explicitly\. -. -.IP "\(bu" 4 +.IP \(bu 2 ls: Show the data in the cache\. Argument is a path to show in the cache -folder\. Works a bit like the \fBfind\fR program, but limited by the \fBdepth\fR config\. -. -.IP "\(bu" 4 +folder\. Works a bit like the \fBfind\fR program, but limited by the +\fBdepth\fR config\. +.IP \(bu 2 clean: Delete data out of the cache folder\. If an argument is provided, then it specifies a subpath to delete\. If no argument is provided, then the entire cache is cleared\. -. -.IP "" 0 -. -.SH "DETAILS" + +.RE +.SH DETAILS +.P npm stores cache data in the directory specified in \fBnpm config get cache\fR\|\. For each package that is added to the cache, three pieces of information are stored in \fB{cache}/{name}/{version}\fR: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 \|\.\.\./package/package\.json: The package\.json file, as npm sees it\. -. -.IP "\(bu" 4 +.IP \(bu 2 \|\.\.\./package\.tgz: The tarball for that version\. -. -.IP "" 0 -. + +.RE .P Additionally, whenever a registry request is made, a \fB\|\.cache\.json\fR file is placed at the corresponding URI, to store the ETag and the requested data\. This is stored in \fB{cache}/{hostname}/{path}/\.cache\.json\fR\|\. -. .P -Commands that make non\-essential registry requests (such as \fBsearch\fR and \fBview\fR, or the completion scripts) generally specify a minimum timeout\. +Commands that make non\-essential registry requests (such as \fBsearch\fR and +\fBview\fR, or the completion scripts) generally specify a minimum timeout\. If the \fB\|\.cache\.json\fR file is younger than the specified timeout, then they do not make an HTTP request to the registry\. -. -.SH "CONFIGURATION" -. -.SS "cache" +.SH CONFIGURATION +.SS cache +.P Default: \fB~/\.npm\fR on Posix, or \fB%AppData%/npm\-cache\fR on Windows\. -. .P The root cache folder\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 5 folders -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 npm help install -. -.IP "\(bu" 4 +.IP \(bu 2 npm help publish -. -.IP "\(bu" 4 +.IP \(bu 2 npm help pack -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-completion.1 b/deps/npm/man/man1/npm-completion.1 index 2ae25687a68..bbd224f76c2 100644 --- a/deps/npm/man/man1/npm-completion.1 +++ b/deps/npm/man/man1/npm-completion.1 @@ -1,47 +1,37 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-COMPLETION" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-completion\fR \-\- Tab Completion for npm -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-completion\fR \- Tab Completion for npm +.SH SYNOPSIS +.P +.RS 2 +.EX \|\. <(npm completion) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Enables tab\-completion in all npm commands\. -. .P The synopsis above loads the completions into your current shell\. Adding it to your ~/\.bashrc or ~/\.zshrc will make the completions available everywhere\. -. .P You may of course also pipe the output of npm completion to a file such as \fB/usr/local/etc/bash_completion\.d/npm\fR if you have a system that will read that file for you\. -. .P When \fBCOMP_CWORD\fR, \fBCOMP_LINE\fR, and \fBCOMP_POINT\fR are defined in the environment, \fBnpm completion\fR acts in "plumbing mode", and outputs completions based on the arguments\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 7 developers -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 faq -. -.IP "\(bu" 4 +.IP \(bu 2 npm help npm -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-config.1 b/deps/npm/man/man1/npm-config.1 index 0b019c7c025..ca7d69d1bae 100644 --- a/deps/npm/man/man1/npm-config.1 +++ b/deps/npm/man/man1/npm-config.1 @@ -1,14 +1,10 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-CONFIG" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-config\fR \-\- Manage the npm configuration files -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-config\fR \- Manage the npm configuration files +.SH SYNOPSIS +.P +.RS 2 +.EX npm config set [\-\-global] npm config get npm config delete @@ -17,97 +13,83 @@ npm config edit npm c [set|get|delete|list] npm get npm set [\-\-global] -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P npm gets its config settings from the command line, environment variables, \fBnpmrc\fR files, and in some cases, the \fBpackage\.json\fR file\. -. .P See npm help 5 npmrc for more information about the npmrc files\. -. .P See npm help 7 \fBnpm\-config\fR for a more thorough discussion of the mechanisms involved\. -. .P The \fBnpm config\fR command can be used to update and edit the contents of the user and global npmrc files\. -. -.SH "Sub\-commands" +.SH Sub\-commands +.P Config supports the following sub\-commands: -. -.SS "set" -. -.nf +.SS set +.P +.RS 2 +.EX npm config set key value -. -.fi -. +.EE +.RE .P Sets the config key to the value\. -. .P If value is omitted, then it sets it to "true"\. -. -.SS "get" -. -.nf +.SS get +.P +.RS 2 +.EX npm config get key -. -.fi -. +.EE +.RE .P Echo the config value to stdout\. -. -.SS "list" -. -.nf +.SS list +.P +.RS 2 +.EX npm config list -. -.fi -. +.EE +.RE .P Show all the config settings\. -. -.SS "delete" -. -.nf +.SS delete +.P +.RS 2 +.EX npm config delete key -. -.fi -. +.EE +.RE .P Deletes the key from all configuration files\. -. -.SS "edit" -. -.nf +.SS edit +.P +.RS 2 +.EX npm config edit -. -.fi -. +.EE +.RE .P Opens the config file in an editor\. Use the \fB\-\-global\fR flag to edit the global config\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 5 folders -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 package\.json -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 npm help npm -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-dedupe.1 b/deps/npm/man/man1/npm-dedupe.1 index cdfa3520f68..58c01ca287f 100644 --- a/deps/npm/man/man1/npm-dedupe.1 +++ b/deps/npm/man/man1/npm-dedupe.1 @@ -1,96 +1,74 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-DEDUPE" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-dedupe\fR \-\- Reduce duplication -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-dedupe\fR \- Reduce duplication +.SH SYNOPSIS +.P +.RS 2 +.EX npm dedupe [package names\.\.\.] npm ddp [package names\.\.\.] -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Searches the local package tree and attempts to simplify the overall structure by moving dependencies further up the tree, where they can be more effectively shared by multiple dependent packages\. -. .P For example, consider this dependency graph: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX a +\-\- b <\-\- depends on c@1\.0\.x | `\-\- c@1\.0\.3 `\-\- d <\-\- depends on c@~1\.0\.9 `\-\- c@1\.0\.10 -. -.fi -. -.IP "" 0 -. +.EE +.RE .P In this case, npm help \fBnpm\-dedupe\fR will transform the tree to: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX a +\-\- b +\-\- d `\-\- c@1\.0\.10 -. -.fi -. -.IP "" 0 -. +.EE +.RE .P -Because of the hierarchical nature of node\'s module lookup, b and d +Because of the hierarchical nature of node's module lookup, b and d will both get their dependency met by the single c package at the root level of the tree\. -. .P If a suitable version exists at the target location in the tree already, then it will be left untouched, but the other duplicates will be deleted\. -. .P If no suitable version can be found, then a warning is printed, and nothing is done\. -. .P If any arguments are supplied, then they are filters, and only the named packages will be touched\. -. .P Note that this operation transforms the dependency tree, and may result in packages getting updated versions, perhaps from the npm registry\. -. .P This feature is experimental, and may change in future versions\. -. .P The \fB\-\-tag\fR argument will apply to all of the affected dependencies\. If a tag with the given name exists, the tagged version is preferred over newer versions\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help ls -. -.IP "\(bu" 4 +.IP \(bu 2 npm help update -. -.IP "\(bu" 4 +.IP \(bu 2 npm help install -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-deprecate.1 b/deps/npm/man/man1/npm-deprecate.1 index cc2d18ee52f..3ff2f88e9cb 100644 --- a/deps/npm/man/man1/npm-deprecate.1 +++ b/deps/npm/man/man1/npm-deprecate.1 @@ -1,48 +1,37 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-DEPRECATE" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-deprecate\fR \-\- Deprecate a version of a package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-deprecate\fR \- Deprecate a version of a package +.SH SYNOPSIS +.P +.RS 2 +.EX npm deprecate [@] -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This command will update the npm registry entry for a package, providing a deprecation warning to all who attempt to install it\. -. .P It works on version ranges as well as specific versions, so you can do something like this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm deprecate my\-thing@"< 0\.2\.3" "critical bug fixed in v0\.2\.3" -. -.fi -. -.IP "" 0 -. +.EE +.RE .P -Note that you must be the package owner to deprecate something\. See the \fBowner\fR and \fBadduser\fR help topics\. -. +Note that you must be the package owner to deprecate something\. See the +\fBowner\fR and \fBadduser\fR help topics\. .P To un\-deprecate a package, specify an empty string (\fB""\fR) for the \fBmessage\fR argument\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help publish -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 registry -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-docs.1 b/deps/npm/man/man1/npm-docs.1 index db3d4e768fb..0a55953b0c5 100644 --- a/deps/npm/man/man1/npm-docs.1 +++ b/deps/npm/man/man1/npm-docs.1 @@ -1,78 +1,60 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-DOCS" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-docs\fR \-\- Docs for a package in a web browser maybe -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-docs\fR \- Docs for a package in a web browser maybe +.SH SYNOPSIS +.P +.RS 2 +.EX npm docs [ [ \.\.\.]] npm docs (with no args in a package dir) npm home [ [ \.\.\.]] npm home (with no args in a package dir) -. -.fi -. -.SH "DESCRIPTION" -This command tries to guess at the likely location of a package\'s +.EE +.RE +.SH DESCRIPTION +.P +This command tries to guess at the likely location of a package's documentation URL, and then tries to open it using the \fB\-\-browser\fR config param\. You can pass multiple package names at once\. If no package name is provided, it will search for a \fBpackage\.json\fR in the current folder and use the \fBname\fR property\. -. -.SH "CONFIGURATION" -. -.SS "browser" -. -.IP "\(bu" 4 +.SH CONFIGURATION +.SS browser +.RS 0 +.IP \(bu 2 Default: OS X: \fB"open"\fR, Windows: \fB"start"\fR, Others: \fB"xdg\-open"\fR -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "" 0 -. + +.RE .P The browser that is called by the \fBnpm docs\fR command to open websites\. -. -.SS "registry" -. -.IP "\(bu" 4 +.SS registry +.RS 0 +.IP \(bu 2 Default: https://registry\.npmjs\.org/ -. -.IP "\(bu" 4 +.IP \(bu 2 Type: url -. -.IP "" 0 -. + +.RE .P The base URL of the npm package registry\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help view -. -.IP "\(bu" 4 +.IP \(bu 2 npm help publish -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 registry -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 package\.json -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-edit.1 b/deps/npm/man/man1/npm-edit.1 index 036d0715a4f..d7f40561548 100644 --- a/deps/npm/man/man1/npm-edit.1 +++ b/deps/npm/man/man1/npm-edit.1 @@ -1,66 +1,50 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-EDIT" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-edit\fR \-\- Edit an installed package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-edit\fR \- Edit an installed package +.SH SYNOPSIS +.P +.RS 2 +.EX npm edit [@] -. -.fi -. -.SH "DESCRIPTION" -Opens the package folder in the default editor (or whatever you\'ve +.EE +.RE +.SH DESCRIPTION +.P +Opens the package folder in the default editor (or whatever you've configured as the npm \fBeditor\fR config \-\- see npm help 7 \fBnpm\-config\fR\|\.) -. .P After it has been edited, the package is rebuilt so as to pick up any changes in compiled packages\. -. .P For instance, you can do \fBnpm install connect\fR to install connect into your package, and then \fBnpm edit connect\fR to make a few changes to your locally installed copy\. -. -.SH "CONFIGURATION" -. -.SS "editor" -. -.IP "\(bu" 4 +.SH CONFIGURATION +.SS editor +.RS 0 +.IP \(bu 2 Default: \fBEDITOR\fR environment variable if set, or \fB"vi"\fR on Posix, or \fB"notepad"\fR on Windows\. -. -.IP "\(bu" 4 +.IP \(bu 2 Type: path -. -.IP "" 0 -. + +.RE .P The command to run for \fBnpm edit\fR or \fBnpm config edit\fR\|\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 5 folders -. -.IP "\(bu" 4 +.IP \(bu 2 npm help explore -. -.IP "\(bu" 4 +.IP \(bu 2 npm help install -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-explore.1 b/deps/npm/man/man1/npm-explore.1 index c7d570745cf..01f91bff912 100644 --- a/deps/npm/man/man1/npm-explore.1 +++ b/deps/npm/man/man1/npm-explore.1 @@ -1,76 +1,57 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-EXPLORE" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-explore\fR \-\- Browse an installed package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-explore\fR \- Browse an installed package +.SH SYNOPSIS +.P +.RS 2 +.EX npm explore [ \-\- ] -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Spawn a subshell in the directory of the installed package specified\. -. .P If a command is specified, then it is run in the subshell, which then immediately terminates\. -. .P -This is particularly handy in the case of git submodules in the \fBnode_modules\fR folder: -. -.IP "" 4 -. -.nf +This is particularly handy in the case of git submodules in the +\fBnode_modules\fR folder: +.P +.RS 2 +.EX npm explore some\-dependency \-\- git pull origin master -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Note that the package is \fInot\fR automatically rebuilt afterwards, so be sure to use \fBnpm rebuild \fR if you make any changes\. -. -.SH "CONFIGURATION" -. -.SS "shell" -. -.IP "\(bu" 4 +.SH CONFIGURATION +.SS shell +.RS 0 +.IP \(bu 2 Default: SHELL environment variable, or "bash" on Posix, or "cmd" on Windows -. -.IP "\(bu" 4 +.IP \(bu 2 Type: path -. -.IP "" 0 -. + +.RE .P The shell to run for the \fBnpm explore\fR command\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help submodule -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 folders -. -.IP "\(bu" 4 +.IP \(bu 2 npm help edit -. -.IP "\(bu" 4 +.IP \(bu 2 npm help rebuild -. -.IP "\(bu" 4 +.IP \(bu 2 npm help build -. -.IP "\(bu" 4 +.IP \(bu 2 npm help install -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-help-search.1 b/deps/npm/man/man1/npm-help-search.1 index 37ba03c7960..78864694ac5 100644 --- a/deps/npm/man/man1/npm-help-search.1 +++ b/deps/npm/man/man1/npm-help-search.1 @@ -1,59 +1,45 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-HELP\-SEARCH" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-help-search\fR \-\- Search npm help documentation -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-help-search\fR \- Search npm help documentation +.SH SYNOPSIS +.P +.RS 2 +.EX npm help\-search some search terms -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This command will search the npm markdown documentation files for the terms provided, and then list the results, sorted by relevance\. -. .P If only one result is found, then it will show that help topic\. -. .P If the argument to \fBnpm help\fR is not a known help topic, then it will call \fBhelp\-search\fR\|\. It is rarely if ever necessary to call this command directly\. -. -.SH "CONFIGURATION" -. -.SS "long" -. -.IP "\(bu" 4 +.SH CONFIGURATION +.SS long +.RS 0 +.IP \(bu 2 Type: Boolean -. -.IP "\(bu" 4 +.IP \(bu 2 Default false -. -.IP "" 0 -. + +.RE .P If true, the "long" flag will cause help\-search to output context around where the terms were found in the documentation\. -. .P If false, then help\-search will just list out the help topics found\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help npm -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 faq -. -.IP "\(bu" 4 +.IP \(bu 2 npm help help -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-help.1 b/deps/npm/man/man1/npm-help.1 index 7cc361f463b..b0456ef22e6 100644 --- a/deps/npm/man/man1/npm-help.1 +++ b/deps/npm/man/man1/npm-help.1 @@ -1,77 +1,57 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-HELP" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-help\fR \-\- Get help on npm -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-help\fR \- Get help on npm +.SH SYNOPSIS +.P +.RS 2 +.EX npm help npm help some search terms -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P If supplied a topic, then show the appropriate documentation page\. -. .P If the topic does not exist, or if multiple terms are provided, then run the \fBhelp\-search\fR command to find a match\. Note that, if \fBhelp\-search\fR finds a single subject, then it will run \fBhelp\fR on that topic, so unique matches are equivalent to specifying a topic name\. -. -.SH "CONFIGURATION" -. -.SS "viewer" -. -.IP "\(bu" 4 +.SH CONFIGURATION +.SS viewer +.RS 0 +.IP \(bu 2 Default: "man" on Posix, "browser" on Windows -. -.IP "\(bu" 4 +.IP \(bu 2 Type: path -. -.IP "" 0 -. + +.RE .P The program to use to view help content\. -. .P Set to \fB"browser"\fR to view html help content in the default web browser\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help npm -. -.IP "\(bu" 4 +.IP \(bu 2 README -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 faq -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 folders -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 package\.json -. -.IP "\(bu" 4 +.IP \(bu 2 npm help help\-search -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 index -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-init.1 b/deps/npm/man/man1/npm-init.1 index 5091fdefd83..93e3845754b 100644 --- a/deps/npm/man/man1/npm-init.1 +++ b/deps/npm/man/man1/npm-init.1 @@ -1,43 +1,33 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-INIT" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-init\fR \-\- Interactively create a package\.json file -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-init\fR \- Interactively create a package\.json file +.SH SYNOPSIS +.P +.RS 2 +.EX npm init -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This will ask you a bunch of questions, and then write a package\.json for you\. -. .P It attempts to make reasonable guesses about what you want things to be set to, -and then writes a package\.json file with the options you\'ve selected\. -. +and then writes a package\.json file with the options you've selected\. .P -If you already have a package\.json file, it\'ll read that first, and default to +If you already have a package\.json file, it'll read that first, and default to the options in there\. -. .P It is strictly additive, so it does not delete options from your package\.json without a really good reason to do so\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 -\fIhttps://github\.com/isaacs/init\-package\-json\fR -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 +https://github\.com/isaacs/init\-package\-json +.IP \(bu 2 npm help 5 package\.json -. -.IP "\(bu" 4 +.IP \(bu 2 npm help version -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-install.1 b/deps/npm/man/man1/npm-install.1 index 7e874f34900..ad6bdf55bb3 100644 --- a/deps/npm/man/man1/npm-install.1 +++ b/deps/npm/man/man1/npm-install.1 @@ -1,335 +1,270 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-INSTALL" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-install\fR \-\- Install a package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-install\fR \- Install a package +.SH SYNOPSIS +.P +.RS 2 +.EX npm install (with no args in a package dir) npm install npm install npm install -npm install [\-\-save|\-\-save\-dev|\-\-save\-optional] [\-\-save\-exact] -npm install @ -npm install @ -npm install @ +npm install [@/] [\-\-save|\-\-save\-dev|\-\-save\-optional] [\-\-save\-exact] +npm install [@/]@ +npm install [@/]@ +npm install [@/]@ npm i (with any of the previous argument usage) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This command installs a package, and any packages that it depends on\. If the package has a shrinkwrap file, the installation of dependencies will be driven by that\. See npm help shrinkwrap\. -. .P A \fBpackage\fR is: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 a) a folder containing a program described by a package\.json file -. -.IP "\(bu" 4 +.IP \(bu 2 b) a gzipped tarball containing (a) -. -.IP "\(bu" 4 +.IP \(bu 2 c) a url that resolves to (b) -. -.IP "\(bu" 4 +.IP \(bu 2 d) a \fB@\fR that is published on the registry (see npm help 7 \fBnpm\-registry\fR) with (c) -. -.IP "\(bu" 4 +.IP \(bu 2 e) a \fB@\fR that points to (d) -. -.IP "\(bu" 4 +.IP \(bu 2 f) a \fB\fR that has a "latest" tag satisfying (e) -. -.IP "\(bu" 4 +.IP \(bu 2 g) a \fB\fR that resolves to (b) -. -.IP "" 0 -. + +.RE .P Even if you never publish your package, you can still get a lot of benefits of using npm if you just want to write a node program (a), and perhaps if you also want to be able to easily install it elsewhere after packing it up into a tarball (b)\. -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 \fBnpm install\fR (in package directory, no arguments): -. -.IP -Install the dependencies in the local node_modules folder\. -. -.IP -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\. -. -.IP -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\|\. -. -.IP "\(bu" 4 + Install the dependencies in the local node_modules folder\. + 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\|\. +.IP \(bu 2 \fBnpm install \fR: -. -.IP -Install a package that is sitting in a folder on the filesystem\. -. -.IP "\(bu" 4 + Install a package that is sitting in a folder on the filesystem\. +.IP \(bu 2 \fBnpm install \fR: -. -.IP -Install a package that is sitting on the filesystem\. Note: if you just want -to link a dev directory into your npm root, you can do this more easily by -using \fBnpm link\fR\|\. -. -.IP -Example: -. -.IP "" 4 -. -.nf - npm install \./package\.tgz -. -.fi -. -.IP "" 0 - -. -.IP "\(bu" 4 + Install a package that is sitting on the filesystem\. Note: if you just want + to link a dev directory into your npm root, you can do this more easily by + using \fBnpm link\fR\|\. + Example: +.P +.RS 2 +.EX + npm install \./package\.tgz +.EE +.RE +.IP \(bu 2 \fBnpm install \fR: -. -.IP -Fetch the tarball url, and then install it\. In order to distinguish between -this and other options, the argument must start with "http://" or "https://" -. -.IP -Example: -. -.IP "" 4 -. -.nf - npm install https://github\.com/indexzero/forever/tarball/v0\.5\.6 -. -.fi -. -.IP "" 0 - -. -.IP "\(bu" 4 -\fBnpm install [\-\-save|\-\-save\-dev|\-\-save\-optional]\fR: -. -.IP -Do a \fB@\fR install, where \fB\fR is the "tag" config\. (See npm help 7 \fBnpm\-config\fR\|\.) -. -.IP -In most cases, this will install the latest version -of the module published on npm\. -. -.IP -Example: -. -.IP - npm install sax -. -.IP -\fBnpm install\fR takes 3 exclusive, optional flags which save or update -the package version in your main package\.json: -. -.IP "\(bu" 4 + Fetch the tarball url, and then install it\. In order to distinguish between + this and other options, the argument must start with "http://" or "https://" + Example: +.P +.RS 2 +.EX + npm install https://github\.com/indexzero/forever/tarball/v0\.5\.6 +.EE +.RE +.IP \(bu 2 +\fBnpm install [@/] [\-\-save|\-\-save\-dev|\-\-save\-optional]\fR: + Do a \fB@\fR install, where \fB\fR is the "tag" config\. (See + npm help 7 \fBnpm\-config\fR\|\.) + In most cases, this will install the latest version + of the module published on npm\. + Example: +.P +.RS 2 +.EX + npm install sax +.EE +.RE + \fBnpm install\fR takes 3 exclusive, optional flags which save or update + the package version in your main package\.json: +.RS 0 +.IP \(bu 2 \fB\-\-save\fR: Package will appear in your \fBdependencies\fR\|\. -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-\-save\-dev\fR: Package will appear in your \fBdevDependencies\fR\|\. -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-\-save\-optional\fR: Package will appear in your \fBoptionalDependencies\fR\|\. -. -.IP When using any of the above options to save dependencies to your package\.json, there is an additional, optional flag: -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-\-save\-exact\fR: Saved dependencies will be configured with an -exact version rather than using npm\'s default semver range +exact version rather than using npm's default semver range operator\. -. -.IP +\fB\fR is optional\. The package will be downloaded from the registry +associated with the specified scope\. If no registry is associated with +the given scope the default registry is assumed\. See npm help 7 \fBnpm\-scope\fR\|\. +Note: if you do not include the @\-symbol on your scope name, npm will +interpret this as a GitHub repository instead, see below\. Scopes names +must also be followed by a slash\. Examples: -. -.IP - npm install sax \-\-save - npm install node\-tap \-\-save\-dev - npm install dtrace\-provider \-\-save\-optional - npm install readable\-stream \-\-save \-\-save\-exact -. -.IP -\fBNote\fR: If there is a file or folder named \fB\fR in the current -working directory, then it will try to install that, and only try to -fetch the package by name if it is not valid\. -. -.IP "" 0 - -. -.IP "\(bu" 4 -\fBnpm install @\fR: -. -.IP -Install the version of the package that is referenced by the specified tag\. -If the tag does not exist in the registry data for that package, then this -will fail\. -. -.IP -Example: -. -.IP "" 4 -. -.nf - npm install sax@latest -. -.fi -. -.IP "" 0 +.P +.RS 2 +.EX +npm install sax \-\-save +npm install githubname/reponame +npm install @myorg/privatepackage +npm install node\-tap \-\-save\-dev +npm install dtrace\-provider \-\-save\-optional +npm install readable\-stream \-\-save \-\-save\-exact +.EE +.RE -. -.IP "\(bu" 4 -\fBnpm install @\fR: -. -.IP -Install the specified version of the package\. This will fail if the version -has not been published to the registry\. -. -.IP -Example: -. -.IP "" 4 -. -.nf - npm install sax@0\.1\.1 -. -.fi -. -.IP "" 0 +.RE -. -.IP "\(bu" 4 -\fBnpm install @\fR: -. -.IP -Install a version of the package matching the specified version range\. This -will follow the same rules for resolving dependencies described in npm help 5 \fBpackage\.json\fR\|\. -. -.IP -Note that most version ranges must be put in quotes so that your shell will -treat it as a single argument\. -. -.IP -Example: -. -.IP - npm install sax@">=0\.1\.0 <0\.2\.0" -. -.IP "\(bu" 4 +.RE +.P +.RS 2 +.EX +**Note**: If there is a file or folder named `` in the current +working directory, then it will try to install that, and only try to +fetch the package by name if it is not valid\. +.EE +.RE +.RS 0 +.IP \(bu 2 +\fBnpm install [@/]@\fR: + Install the version of the package that is referenced by the specified tag\. + If the tag does not exist in the registry data for that package, then this + will fail\. + Example: +.P +.RS 2 +.EX + npm install sax@latest + npm install @myorg/mypackage@latest +.EE +.RE +.IP \(bu 2 +\fBnpm install [@/]@\fR: + Install the specified version of the package\. This will fail if the + version has not been published to the registry\. + Example: +.P +.RS 2 +.EX + npm install sax@0\.1\.1 + npm install @myorg/privatepackage@1\.5\.0 +.EE +.RE +.IP \(bu 2 +\fBnpm install [@/]@\fR: + Install a version of the package matching the specified version range\. This + will follow the same rules for resolving dependencies described in npm help 5 \fBpackage\.json\fR\|\. + Note that most version ranges must be put in quotes so that your shell will + treat it as a single argument\. + Example: +.P +.RS 2 +.EX + npm install sax@">=0\.1\.0 <0\.2\.0" + npm install @myorg/privatepackage@">=0\.1\.0 <0\.2\.0" +.EE +.RE +.IP \(bu 2 +\fBnpm install /\fR: + Install the package at \fBhttps://github\.com/githubname/githubrepo" by + attempting to clone it using\fRgit`\. + Example: +.P +.RS 2 +.EX + npm install mygithubuser/myproject +.EE +.RE + To reference a package in a git repo that is not on GitHub, see git + remote urls below\. +.IP \(bu 2 \fBnpm install \fR: -. -.IP -Install a package by cloning a git remote url\. The format of the git -url is: -. -.IP - ://[@][#] -. -.IP -\fB\fR is one of \fBgit\fR, \fBgit+ssh\fR, \fBgit+http\fR, or \fBgit+https\fR\|\. If no \fB\fR is specified, then \fBmaster\fR is -used\. -. -.IP -Examples: -. -.IP "" 4 -. -.nf - git+ssh://git@github\.com:npm/npm\.git#v1\.0\.27 - git+https://isaacs@github\.com/npm/npm\.git - git://github\.com/npm/npm\.git#v1\.0\.27 -. -.fi -. -.IP "" 0 + Install a package by cloning a git remote url\. The format of the git + url is: +.P +.RS 2 +.EX + ://[@][#] +.EE +.RE + \fB\fR is one of \fBgit\fR, \fBgit+ssh\fR, \fBgit+http\fR, or + \fBgit+https\fR\|\. If no \fB\fR is specified, then \fBmaster\fR is + used\. + Examples: +.P +.RS 2 +.EX + git+ssh://git@github\.com:npm/npm\.git#v1\.0\.27 + git+https://isaacs@github\.com/npm/npm\.git + git://github\.com/npm/npm\.git#v1\.0\.27 +.EE +.RE -. -.IP "" 0 -. +.RE .P You may combine multiple arguments, and even multiple types of arguments\. For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm install sax@">=0\.1\.0 <0\.2\.0" bench supervisor -. -.fi -. -.IP "" 0 -. +.EE +.RE .P The \fB\-\-tag\fR argument will apply to all of the specified install targets\. If a tag with the given name exists, the tagged version is preferred over newer versions\. -. .P The \fB\-\-force\fR argument will force npm to fetch remote resources even if a local copy exists on disk\. -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm install sax \-\-force -. -.fi -. -.IP "" 0 -. +.EE +.RE .P The \fB\-\-global\fR argument will cause npm to install the package globally rather than locally\. See npm help 5 \fBnpm\-folders\fR\|\. -. .P The \fB\-\-link\fR argument will cause npm to link global installs into the local space in some cases\. -. .P The \fB\-\-no\-bin\-links\fR argument will prevent npm from creating symlinks for any binaries the package might contain\. -. .P The \fB\-\-no\-optional\fR argument will prevent optional dependencies from being installed\. -. .P The \fB\-\-no\-shrinkwrap\fR argument, which will ignore an available shrinkwrap file and use the package\.json instead\. -. .P The \fB\-\-nodedir=/path/to/node/source\fR argument will allow npm to find the node source code so that npm can compile native modules\. -. .P See npm help 7 \fBnpm\-config\fR\|\. Many of the configuration params have some -effect on installation, since that\'s most of what npm does\. -. -.SH "ALGORITHM" +effect on installation, since that's most of what npm does\. +.SH ALGORITHM +.P To install a package, npm uses the following algorithm: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX install(where, what, family, ancestors) fetch what, unpack to /node_modules/ for each dep in what\.dependencies @@ -339,103 +274,78 @@ for each dep@version in what\.dependencies and not in add precise version deps to install(/node_modules/, dep, family) -. -.fi -. -.IP "" 0 -. +.EE +.RE .P For this \fBpackage{dep}\fR structure: \fBA{B,C}, B{C}, C{D}\fR, this algorithm produces: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX A +\-\- B `\-\- C `\-\- D -. -.fi -. -.IP "" 0 -. +.EE +.RE .P That is, the dependency from B to C is satisfied by the fact that A already caused C to be installed at a higher level\. -. .P See npm help 5 folders for a more detailed description of the specific folder structures that npm creates\. -. -.SS "Limitations of npm's Install Algorithm" +.SS Limitations of npm's Install Algorithm +.P There are some very rare and pathological edge\-cases where a cycle can cause npm to try to install a never\-ending tree of packages\. Here is the simplest case: -. -.IP "" 4 -. -.nf -A \-> B \-> A\' \-> B\' \-> A \-> B \-> A\' \-> B\' \-> A \-> \.\.\. -. -.fi -. -.IP "" 0 -. -.P -where \fBA\fR is some version of a package, and \fBA\'\fR is a different version +.P +.RS 2 +.EX +A \-> B \-> A' \-> B' \-> A \-> B \-> A' \-> B' \-> A \-> \.\.\. +.EE +.RE +.P +where \fBA\fR is some version of a package, and \fBA'\fR is a different version of the same package\. Because \fBB\fR depends on a different version of \fBA\fR than the one that is already in the tree, it must install a separate -copy\. The same is true of \fBA\'\fR, which must install \fBB\'\fR\|\. Because \fBB\'\fR +copy\. The same is true of \fBA'\fR, which must install \fBB'\fR\|\. Because \fBB'\fR depends on the original version of \fBA\fR, which has been overridden, the cycle falls into infinite regress\. -. .P -To avoid this situation, npm flat\-out refuses to install any \fBname@version\fR that is already present anywhere in the tree of package +To avoid this situation, npm flat\-out refuses to install any +\fBname@version\fR that is already present anywhere in the tree of package folder ancestors\. A more correct, but more complex, solution would be to symlink the existing version into the new location\. If this ever affects a real use\-case, it will be investigated\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 5 folders -. -.IP "\(bu" 4 +.IP \(bu 2 npm help update -. -.IP "\(bu" 4 +.IP \(bu 2 npm help link -. -.IP "\(bu" 4 +.IP \(bu 2 npm help rebuild -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 scripts -. -.IP "\(bu" 4 +.IP \(bu 2 npm help build -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 registry -. -.IP "\(bu" 4 +.IP \(bu 2 npm help tag -. -.IP "\(bu" 4 +.IP \(bu 2 npm help rm -. -.IP "\(bu" 4 +.IP \(bu 2 npm help shrinkwrap -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-link.1 b/deps/npm/man/man1/npm-link.1 index 15d45e4e079..11ef2dca14a 100644 --- a/deps/npm/man/man1/npm-link.1 +++ b/deps/npm/man/man1/npm-link.1 @@ -1,119 +1,100 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-LINK" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-link\fR \-\- Symlink a package folder -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-link\fR \- Symlink a package folder +.SH SYNOPSIS +.P +.RS 2 +.EX npm link (in package folder) -npm link +npm link [@/] npm ln (with any of the previous argument usage) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Package linking is a two\-step process\. -. .P First, \fBnpm link\fR in a package folder will create a globally\-installed -symbolic link from \fBprefix/package\-name\fR to the current folder\. -. +symbolic link from \fBprefix/package\-name\fR to the current folder (see +npm help 7 \fBnpm\-config\fR for the value of \fBprefix\fR)\. .P Next, in some other location, \fBnpm link package\-name\fR will create a symlink from the local \fBnode_modules\fR folder to the global symlink\. -. .P Note that \fBpackage\-name\fR is taken from \fBpackage\.json\fR, not from directory name\. -. +.P +The package name can be optionally prefixed with a scope\. See npm help 7 \fBnpm\-scope\fR\|\. +The scope must by preceded by an @\-symbol and followed by a slash\. .P When creating tarballs for \fBnpm publish\fR, the linked packages are "snapshotted" to their current state by resolving the symbolic links\. -. .P -This is -handy for installing your own stuff, so that you can work on it and test it -iteratively without having to continually rebuild\. -. +This is handy for installing your own stuff, so that you can work on it and +test it iteratively without having to continually rebuild\. .P For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX cd ~/projects/node\-redis # go into the package directory npm link # creates global link cd ~/projects/node\-bloggy # go into some other package directory\. npm link redis # link\-install the package -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Now, any changes to ~/projects/node\-redis will be reflected in ~/projects/node\-bloggy/node_modules/redis/ -. .P You may also shortcut the two steps in one\. For example, to do the above use\-case in a shorter way: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX cd ~/projects/node\-bloggy # go into the dir of your main project npm link \.\./node\-redis # link the dir of your dependency -. -.fi -. -.IP "" 0 -. +.EE +.RE .P The second line is the equivalent of doing: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX (cd \.\./node\-redis; npm link) npm link redis -. -.fi -. -.IP "" 0 -. +.EE +.RE .P That is, it first creates a global link, and then links the global -installation target into your project\'s \fBnode_modules\fR folder\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +installation target into your project's \fBnode_modules\fR folder\. +.P +If your linked package is scoped (see npm help 7 \fBnpm\-scope\fR) your link command must +include that scope, e\.g\. +.P +.RS 2 +.EX +npm link @myorg/privatepackage +.EE +.RE +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 7 developers -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 faq -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 package\.json -. -.IP "\(bu" 4 +.IP \(bu 2 npm help install -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 folders -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-ls.1 b/deps/npm/man/man1/npm-ls.1 index 1584fb0f28c..64db5a46ebd 100644 --- a/deps/npm/man/man1/npm-ls.1 +++ b/deps/npm/man/man1/npm-ls.1 @@ -1,146 +1,111 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-LS" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-ls\fR \-\- List installed packages -. -.SH "SYNOPSIS" -. -.nf -npm list [ \.\.\.] -npm ls [ \.\.\.] -npm la [ \.\.\.] -npm ll [ \.\.\.] -. -.fi -. -.SH "DESCRIPTION" +\fBnpm-ls\fR \- List installed packages +.SH SYNOPSIS +.P +.RS 2 +.EX +npm list [[@/] \.\.\.] +npm ls [[@/] \.\.\.] +npm la [[@/] \.\.\.] +npm ll [[@/] \.\.\.] +.EE +.RE +.SH DESCRIPTION +.P This command will print to stdout all the versions of packages that are installed, as well as their dependencies, in a tree\-structure\. -. .P Positional arguments are \fBname@version\-range\fR identifiers, which will limit the results to only the paths to the packages named\. Note that nested packages will \fIalso\fR show the paths to the specified packages\. -For example, running \fBnpm ls promzard\fR in npm\'s source tree will show: -. -.IP "" 4 -. -.nf -npm@1.4.28 /path/to/npm +For example, running \fBnpm ls promzard\fR in npm's source tree will show: +.P +.RS 2 +.EX +npm@2.0.0 /path/to/npm └─┬ init\-package\-json@0\.0\.4 └── promzard@0\.1\.5 -. -.fi -. -.IP "" 0 -. +.EE +.RE .P It will print out extraneous, missing, and invalid packages\. -. .P If a project specifies git urls for dependencies these are shown in parentheses after the name@version to make it easier for users to recognize potential forks of a project\. -. .P When run as \fBll\fR or \fBla\fR, it shows extended information by default\. -. -.SH "CONFIGURATION" -. -.SS "json" -. -.IP "\(bu" 4 +.SH CONFIGURATION +.SS json +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Show information in JSON format\. -. -.SS "long" -. -.IP "\(bu" 4 +.SS long +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Show extended information\. -. -.SS "parseable" -. -.IP "\(bu" 4 +.SS parseable +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Show parseable output instead of tree view\. -. -.SS "global" -. -.IP "\(bu" 4 +.SS global +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P List packages in the global install prefix instead of in the current project\. -. -.SS "depth" -. -.IP "\(bu" 4 +.SS depth +.RS 0 +.IP \(bu 2 Type: Int -. -.IP "" 0 -. + +.RE .P Max display depth of the dependency tree\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 folders -. -.IP "\(bu" 4 +.IP \(bu 2 npm help install -. -.IP "\(bu" 4 +.IP \(bu 2 npm help link -. -.IP "\(bu" 4 +.IP \(bu 2 npm help prune -. -.IP "\(bu" 4 +.IP \(bu 2 npm help outdated -. -.IP "\(bu" 4 +.IP \(bu 2 npm help update -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-outdated.1 b/deps/npm/man/man1/npm-outdated.1 index 7376fcd24af..589bd6d527b 100644 --- a/deps/npm/man/man1/npm-outdated.1 +++ b/deps/npm/man/man1/npm-outdated.1 @@ -1,102 +1,79 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-OUTDATED" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-outdated\fR \-\- Check for outdated packages -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-outdated\fR \- Check for outdated packages +.SH SYNOPSIS +.P +.RS 2 +.EX npm outdated [ [ \.\.\.]] -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This command will check the registry to see if any (or, specific) installed packages are currently outdated\. -. .P -The resulting field \'wanted\' shows the latest version according to the -version specified in the package\.json, the field \'latest\' the very latest +The resulting field 'wanted' shows the latest version according to the +version specified in the package\.json, the field 'latest' the very latest version of the package\. -. -.SH "CONFIGURATION" -. -.SS "json" -. -.IP "\(bu" 4 +.SH CONFIGURATION +.SS json +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Show information in JSON format\. -. -.SS "long" -. -.IP "\(bu" 4 +.SS long +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Show extended information\. -. -.SS "parseable" -. -.IP "\(bu" 4 +.SS parseable +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Show parseable output instead of tree view\. -. -.SS "global" -. -.IP "\(bu" 4 +.SS global +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Check packages in the global install prefix instead of in the current project\. -. -.SS "depth" -. -.IP "\(bu" 4 +.SS depth +.RS 0 +.IP \(bu 2 Type: Int -. -.IP "" 0 -. + +.RE .P Max depth for checking dependency tree\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help update -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 registry -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 folders -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-owner.1 b/deps/npm/man/man1/npm-owner.1 index f204431e5dc..c073a8b8739 100644 --- a/deps/npm/man/man1/npm-owner.1 +++ b/deps/npm/man/man1/npm-owner.1 @@ -1,58 +1,47 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-OWNER" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-owner\fR \-\- Manage package owners -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-owner\fR \- Manage package owners +.SH SYNOPSIS +.P +.RS 2 +.EX npm owner ls npm owner add npm owner rm -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Manage ownership of published packages\. -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 ls: List all the users who have access to modify a package and push new versions\. Handy when you need to know who to bug for help\. -. -.IP "\(bu" 4 +.IP \(bu 2 add: Add a new user as a maintainer of a package\. This user is enabled to modify metadata, publish new versions, and add other owners\. -. -.IP "\(bu" 4 +.IP \(bu 2 rm: Remove a user from the package owner list\. This immediately revokes their privileges\. -. -.IP "" 0 -. + +.RE .P Note that there is only one level of access\. Either you can modify a package, -or you can\'t\. Future versions may contain more fine\-grained access levels, but +or you can't\. Future versions may contain more fine\-grained access levels, but that is not implemented at this time\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help publish -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 registry -. -.IP "\(bu" 4 +.IP \(bu 2 npm help adduser -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 disputes -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-pack.1 b/deps/npm/man/man1/npm-pack.1 index 951d209adb1..e90f3789bd8 100644 --- a/deps/npm/man/man1/npm-pack.1 +++ b/deps/npm/man/man1/npm-pack.1 @@ -1,48 +1,37 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-PACK" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-pack\fR \-\- Create a tarball from a package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-pack\fR \- Create a tarball from a package +.SH SYNOPSIS +.P +.RS 2 +.EX npm pack [ [ \.\.\.]] -. -.fi -. -.SH "DESCRIPTION" -For anything that\'s installable (that is, a package folder, tarball, +.EE +.RE +.SH DESCRIPTION +.P +For anything that's installable (that is, a package folder, tarball, tarball url, name@tag, name@version, or name), this command will fetch it to the cache, and then copy the tarball to the current working directory as \fB\-\.tgz\fR, and then write the filenames out to stdout\. -. .P If the same package is specified multiple times, then the file will be overwritten the second time\. -. .P If no arguments are supplied, then npm packs the current package folder\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help cache -. -.IP "\(bu" 4 +.IP \(bu 2 npm help publish -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-prefix.1 b/deps/npm/man/man1/npm-prefix.1 index 9cc3f7cadd6..373f5e4abea 100644 --- a/deps/npm/man/man1/npm-prefix.1 +++ b/deps/npm/man/man1/npm-prefix.1 @@ -1,40 +1,34 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-PREFIX" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-prefix\fR \-\- Display prefix -. -.SH "SYNOPSIS" -. -.nf -npm prefix -. -.fi -. -.SH "DESCRIPTION" -Print the prefix to standard out\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +\fBnpm-prefix\fR \- Display prefix +.SH SYNOPSIS +.P +.RS 2 +.EX +npm prefix [\-g] +.EE +.RE +.SH DESCRIPTION +.P +Print the local prefix to standard out\. This is the closest parent directory +to contain a package\.json file unless \fB\-g\fR is also specified\. +.P +If \fB\-g\fR is specified, this will be the value of the global prefix\. See +npm help 7 \fBnpm\-config\fR for more detail\. +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help root -. -.IP "\(bu" 4 +.IP \(bu 2 npm help bin -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 folders -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-prune.1 b/deps/npm/man/man1/npm-prune.1 index 71bb77c407d..3c8a66a7fcd 100644 --- a/deps/npm/man/man1/npm-prune.1 +++ b/deps/npm/man/man1/npm-prune.1 @@ -1,42 +1,33 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-PRUNE" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-prune\fR \-\- Remove extraneous packages -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-prune\fR \- Remove extraneous packages +.SH SYNOPSIS +.P +.RS 2 +.EX npm prune [ [ [ [\-\-tag ] npm publish [\-\-tag ] -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Publishes a package to the registry so that it can be installed by name\. -. -.IP "\(bu" 4 +.P +By default npm will publish to the public registry\. This can be overridden by +specifying a different default registry or using a npm help 7 \fBnpm\-scope\fR in the name +(see npm help 5 \fBpackage\.json\fR)\. +.RS 0 +.IP \(bu 2 \fB\fR: A folder containing a package\.json file -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\fR: A url or file path to a gzipped tar archive containing a single folder with a package\.json file inside\. -. -.IP "\(bu" 4 +.IP \(bu 2 \fB[\-\-tag ]\fR Registers the published package with the given tag, such that \fBnpm install @\fR will install this version\. By default, \fBnpm publish\fR updates and \fBnpm install\fR installs the \fBlatest\fR tag\. -. -.IP "" 0 -. + +.RE .P Fails if the package name and version combination already exists in -the registry\. -. +the specified registry\. .P Once a package is published with a given name and version, that specific name and version combination can never be used again, even if it is removed with npm help unpublish\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 7 registry -. -.IP "\(bu" 4 +.IP \(bu 2 npm help adduser -. -.IP "\(bu" 4 +.IP \(bu 2 npm help owner -. -.IP "\(bu" 4 +.IP \(bu 2 npm help deprecate -. -.IP "\(bu" 4 +.IP \(bu 2 npm help tag -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-rebuild.1 b/deps/npm/man/man1/npm-rebuild.1 index 4130eb773f2..f8d52a9a1a6 100644 --- a/deps/npm/man/man1/npm-rebuild.1 +++ b/deps/npm/man/man1/npm-rebuild.1 @@ -1,37 +1,31 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-REBUILD" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-rebuild\fR \-\- Rebuild a package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-rebuild\fR \- Rebuild a package +.SH SYNOPSIS +.P +.RS 2 +.EX npm rebuild [ [ \.\.\.]] npm rb [ [ \.\.\.]] -. -.fi -. -.IP "\(bu" 4 +.EE +.RE +.RS 0 +.IP \(bu 2 \fB\fR: The package to rebuild -. -.IP "" 0 -. -.SH "DESCRIPTION" + +.RE +.SH DESCRIPTION +.P This command runs the \fBnpm build\fR command on the matched folders\. This is useful when you install a new version of node, and must recompile all your C++ addons with the new binary\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help build -. -.IP "\(bu" 4 +.IP \(bu 2 npm help install -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-repo.1 b/deps/npm/man/man1/npm-repo.1 index 557a3566eaa..57c48fb3f51 100644 --- a/deps/npm/man/man1/npm-repo.1 +++ b/deps/npm/man/man1/npm-repo.1 @@ -1,47 +1,37 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-REPO" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-repo\fR \-\- Open package repository page in the browser -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-repo\fR \- Open package repository page in the browser +.SH SYNOPSIS +.P +.RS 2 +.EX npm repo npm repo (with no args in a package dir) -. -.fi -. -.SH "DESCRIPTION" -This command tries to guess at the likely location of a package\'s +.EE +.RE +.SH DESCRIPTION +.P +This command tries to guess at the likely location of a package's repository URL, and then tries to open it using the \fB\-\-browser\fR config param\. If no package name is provided, it will search for a \fBpackage\.json\fR in the current folder and use the \fBname\fR property\. -. -.SH "CONFIGURATION" -. -.SS "browser" -. -.IP "\(bu" 4 +.SH CONFIGURATION +.SS browser +.RS 0 +.IP \(bu 2 Default: OS X: \fB"open"\fR, Windows: \fB"start"\fR, Others: \fB"xdg\-open"\fR -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "" 0 -. + +.RE .P The browser that is called by the \fBnpm repo\fR command to open websites\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help docs -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-restart.1 b/deps/npm/man/man1/npm-restart.1 index 828a43f30fc..a4f95db7580 100644 --- a/deps/npm/man/man1/npm-restart.1 +++ b/deps/npm/man/man1/npm-restart.1 @@ -1,42 +1,32 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-RESTART" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-restart\fR \-\- Start a package -. -.SH "SYNOPSIS" -. -.nf -npm restart -. -.fi -. -.SH "DESCRIPTION" -This runs a package\'s "restart" script, if one was provided\. -Otherwise it runs package\'s "stop" script, if one was provided, and then +\fBnpm-restart\fR \- Start a package +.SH SYNOPSIS +.P +.RS 2 +.EX +npm restart [\-\- ] +.EE +.RE +.SH DESCRIPTION +.P +This runs a package's "restart" script, if one was provided\. +Otherwise it runs package's "stop" script, if one was provided, and then the "start" script\. -. .P If no version is specified, then it restarts the "active" version\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help run\-script -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 scripts -. -.IP "\(bu" 4 +.IP \(bu 2 npm help test -. -.IP "\(bu" 4 +.IP \(bu 2 npm help start -. -.IP "\(bu" 4 +.IP \(bu 2 npm help stop -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-rm.1 b/deps/npm/man/man1/npm-rm.1 index 424314c7d57..e9df0ff14fe 100644 --- a/deps/npm/man/man1/npm-rm.1 +++ b/deps/npm/man/man1/npm-rm.1 @@ -1,44 +1,34 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-RM" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-rm\fR \-\- Remove a package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-rm\fR \- Remove a package +.SH SYNOPSIS +.P +.RS 2 +.EX npm rm npm r npm uninstall npm un -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This uninstalls a package, completely removing everything npm installed on its behalf\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help prune -. -.IP "\(bu" 4 +.IP \(bu 2 npm help install -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 folders -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-root.1 b/deps/npm/man/man1/npm-root.1 index 463eeaf934f..b80a8550e4b 100644 --- a/deps/npm/man/man1/npm-root.1 +++ b/deps/npm/man/man1/npm-root.1 @@ -1,40 +1,30 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-ROOT" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-root\fR \-\- Display npm root -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-root\fR \- Display npm root +.SH SYNOPSIS +.P +.RS 2 +.EX npm root -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Print the effective \fBnode_modules\fR folder to standard out\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help prefix -. -.IP "\(bu" 4 +.IP \(bu 2 npm help bin -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 folders -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-run-script.1 b/deps/npm/man/man1/npm-run-script.1 index aa2740c1198..7ee4fc79123 100644 --- a/deps/npm/man/man1/npm-run-script.1 +++ b/deps/npm/man/man1/npm-run-script.1 @@ -1,45 +1,35 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-RUN\-SCRIPT" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-run-script\fR \-\- Run arbitrary package scripts -. -.SH "SYNOPSIS" -. -.nf -npm run\-script [] [command] -npm run [] [command] -. -.fi -. -.SH "DESCRIPTION" -This runs an arbitrary command from a package\'s \fB"scripts"\fR object\. +\fBnpm-run-script\fR \- Run arbitrary package scripts +.SH SYNOPSIS +.P +.RS 2 +.EX +npm run\-script [command] [\-\- ] +npm run [command] [\-\- ] +.EE +.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\. -. .P It is used by the test, start, restart, and stop commands, but can be called directly, as well\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 7 scripts -. -.IP "\(bu" 4 +.IP \(bu 2 npm help test -. -.IP "\(bu" 4 +.IP \(bu 2 npm help start -. -.IP "\(bu" 4 +.IP \(bu 2 npm help restart -. -.IP "\(bu" 4 +.IP \(bu 2 npm help stop -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-search.1 b/deps/npm/man/man1/npm-search.1 index 2c7edcd2ad0..16b3fa4fffd 100644 --- a/deps/npm/man/man1/npm-search.1 +++ b/deps/npm/man/man1/npm-search.1 @@ -1,62 +1,48 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-SEARCH" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-search\fR \-\- Search for packages -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-search\fR \- Search for packages +.SH SYNOPSIS +.P +.RS 2 +.EX npm search [\-\-long] [search terms \.\.\.] npm s [search terms \.\.\.] npm se [search terms \.\.\.] -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Search the registry for packages matching the search terms\. -. .P -If a term starts with \fB/\fR, then it\'s interpreted as a regular expression\. +If a term starts with \fB/\fR, then it's interpreted as a regular expression\. A trailing \fB/\fR will be ignored in this case\. (Note that many regular expression characters must be escaped or quoted in most shells\.) -. -.SH "CONFIGURATION" -. -.SS "long" -. -.IP "\(bu" 4 +.SH CONFIGURATION +.SS long +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Display full package descriptions and other long text across multiple lines\. When disabled (default) search results are truncated to fit neatly on a single line\. Modules with extremely long names will fall on multiple lines\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 7 registry -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 npm help view -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-shrinkwrap.1 b/deps/npm/man/man1/npm-shrinkwrap.1 index 2a053a5b0b7..e154851b217 100644 --- a/deps/npm/man/man1/npm-shrinkwrap.1 +++ b/deps/npm/man/man1/npm-shrinkwrap.1 @@ -1,44 +1,37 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-SHRINKWRAP" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-shrinkwrap\fR \-\- Lock down dependency versions -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-shrinkwrap\fR \- Lock down dependency versions +.SH SYNOPSIS +.P +.RS 2 +.EX npm shrinkwrap -. -.fi -. -.SH "DESCRIPTION" -This command locks down the versions of a package\'s dependencies so +.EE +.RE +.SH DESCRIPTION +.P +This command locks down the versions of a package's dependencies so that you can control exactly which versions of each dependency will be used when your package is installed\. The "package\.json" file is still required if you want to use "npm install"\. -. .P -By default, "npm install" recursively installs the target\'s +By default, "npm install" recursively installs the target's dependencies (as specified in package\.json), choosing the latest -available version that satisfies the dependency\'s semver pattern\. In +available version that satisfies the dependency's semver pattern\. In some situations, particularly when shipping software where each change -is tightly managed, it\'s desirable to fully specify each version of +is tightly managed, it's desirable to fully specify each version of each dependency recursively so that subsequent builds and deploys do not inadvertently pick up newer versions of a dependency that satisfy the semver pattern\. Specifying specific semver patterns in each -dependency\'s package\.json would facilitate this, but that\'s not always +dependency's package\.json would facilitate this, but that's not always possible or desirable, as when another author owns the npm package\. -It\'s also possible to check dependencies directly into source control, +It's also possible to check dependencies directly into source control, but that may be undesirable for other reasons\. -. .P As an example, consider package A: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name": "A", "version": "0\.1\.0", @@ -46,17 +39,13 @@ As an example, consider package A: "B": "<0\.1\.0" } } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P package B: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name": "B", "version": "0\.0\.1", @@ -64,83 +53,62 @@ package B: "C": "<0\.1\.0" } } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P and package C: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name": "C, "version": "0\.0\.1" } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P If these are the only versions of A, B, and C available in the registry, then a normal "npm install A" will install: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX A@0\.1\.0 `\-\- B@0\.0\.1 `\-\- C@0\.0\.1 -. -.fi -. -.IP "" 0 -. +.EE +.RE .P However, if B@0\.0\.2 is published, then a fresh "npm install A" will install: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX A@0\.1\.0 `\-\- B@0\.0\.2 `\-\- C@0\.0\.1 -. -.fi -. -.IP "" 0 -. +.EE +.RE .P -assuming the new version did not modify B\'s dependencies\. Of course, +assuming the new version did not modify B's dependencies\. Of course, the new version of B could include a new version of C and any number of new dependencies\. If such changes are undesirable, the author of A -could specify a dependency on B@0\.0\.1\. However, if A\'s author and B\'s -author are not the same person, there\'s no way for A\'s author to say +could specify a dependency on B@0\.0\.1\. However, if A's author and B's +author are not the same person, there's no way for A's author to say that he or she does not want to pull in newly published versions of C -when B hasn\'t changed at all\. -. +when B hasn't changed at all\. +.P +In this case, A's author can run .P -In this case, A\'s author can run -. -.IP "" 4 -. -.nf +.RS 2 +.EX npm shrinkwrap -. -.fi -. -.IP "" 0 -. +.EE +.RE .P This generates npm\-shrinkwrap\.json, which will look something like this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name": "A", "version": "0\.1\.0", @@ -155,79 +123,68 @@ This generates npm\-shrinkwrap\.json, which will look something like this: } } } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P The shrinkwrap command has locked down the dependencies based on -what\'s currently installed in node_modules\. When "npm install" +what's currently installed in node_modules\. When "npm install" installs a package with a npm\-shrinkwrap\.json file in the package root, the shrinkwrap file (rather than package\.json files) completely drives the installation of that package and all of its dependencies (recursively)\. So now the author publishes A@0\.1\.0, and subsequent installs of this package will use B@0\.0\.1 and C@0\.1\.0, regardless the -dependencies and versions listed in A\'s, B\'s, and C\'s package\.json +dependencies and versions listed in A's, B's, and C's package\.json files\. -. -.SS "Using shrinkwrapped packages" +.SS Using shrinkwrapped packages +.P Using a shrinkwrapped package is no different than using any other package: you can "npm install" it by hand, or add a dependency to your package\.json file and "npm install" it\. -. -.SS "Building shrinkwrapped packages" +.SS Building shrinkwrapped packages +.P To shrinkwrap an existing package: -. -.IP "1" 4 +.RS 0 +.IP 1. 3 Run "npm install" in the package root to install the current versions of all dependencies\. -. -.IP "2" 4 +.IP 2. 3 Validate that the package works as expected with these versions\. -. -.IP "3" 4 +.IP 3. 3 Run "npm shrinkwrap", add npm\-shrinkwrap\.json to git, and publish your package\. -. -.IP "" 0 -. + +.RE .P To add or update a dependency in a shrinkwrapped package: -. -.IP "1" 4 +.RS 0 +.IP 1. 3 Run "npm install" in the package root to install the current versions of all dependencies\. -. -.IP "2" 4 +.IP 2. 3 Add or update dependencies\. "npm install" each new or updated package individually and then update package\.json\. Note that they must be explicitly named in order to be installed: running \fBnpm install\fR with no arguments will merely reproduce the existing shrinkwrap\. -. -.IP "3" 4 +.IP 3. 3 Validate that the package works as expected with the new dependencies\. -. -.IP "4" 4 +.IP 4. 3 Run "npm shrinkwrap", commit the new npm\-shrinkwrap\.json, and publish your package\. -. -.IP "" 0 -. + +.RE .P You can use npm help outdated to view dependencies with newer versions available\. -. -.SS "Other Notes" -A shrinkwrap file must be consistent with the package\'s package\.json +.SS Other Notes +.P +A shrinkwrap file must be consistent with the package's package\.json file\. "npm shrinkwrap" will fail if required dependencies are not already installed, since that would result in a shrinkwrap that -wouldn\'t actually work\. Similarly, the command will fail if there are +wouldn't actually work\. Similarly, the command will fail if there are extraneous packages (not referenced by package\.json), since that would indicate that package\.json is not correct\. -. .P Since "npm shrinkwrap" is intended to lock down your dependencies for production use, \fBdevDependencies\fR will not be included unless you @@ -235,31 +192,27 @@ explicitly set the \fB\-\-dev\fR flag when you run \fBnpm shrinkwrap\fR\|\. If installed \fBdevDependencies\fR are excluded, then npm will print a warning\. If you want them to be installed with your module by default, please consider adding them to \fBdependencies\fR instead\. -. .P -If shrinkwrapped package A depends on shrinkwrapped package B, B\'s +If shrinkwrapped package A depends on shrinkwrapped package B, B's shrinkwrap will not be used as part of the installation of A\. However, -because A\'s shrinkwrap is constructed from a valid installation of B -and recursively specifies all dependencies, the contents of B\'s -shrinkwrap will implicitly be included in A\'s shrinkwrap\. -. -.SS "Caveats" +because A's shrinkwrap is constructed from a valid installation of B +and recursively specifies all dependencies, the contents of B's +shrinkwrap will implicitly be included in A's shrinkwrap\. +.SS Caveats +.P If you wish to lock down the specific bytes included in a package, for example to have 100% confidence in being able to reproduce a deployment or build, then you ought to check your dependencies into source control, or pursue some other mechanism that can verify contents rather than versions\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help install -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 package\.json -. -.IP "\(bu" 4 +.IP \(bu 2 npm help ls -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-star.1 b/deps/npm/man/man1/npm-star.1 index bbcfee19eb1..211225b2592 100644 --- a/deps/npm/man/man1/npm-star.1 +++ b/deps/npm/man/man1/npm-star.1 @@ -1,39 +1,30 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-STAR" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-star\fR \-\- Mark your favorite packages -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-star\fR \- Mark your favorite packages +.SH SYNOPSIS +.P +.RS 2 +.EX npm star [, \.\.\.] npm unstar [, \.\.\.] -. -.fi -. -.SH "DESCRIPTION" -"Starring" a package means that you have some interest in it\. It\'s +.EE +.RE +.SH DESCRIPTION +.P +"Starring" a package means that you have some interest in it\. It's a vaguely positive way to show that you care\. -. .P "Unstarring" is the same thing, but in reverse\. -. .P -It\'s a boolean thing\. Starring repeatedly has no additional effect\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +It's a boolean thing\. Starring repeatedly has no additional effect\. +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help view -. -.IP "\(bu" 4 +.IP \(bu 2 npm help whoami -. -.IP "\(bu" 4 +.IP \(bu 2 npm help adduser -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-stars.1 b/deps/npm/man/man1/npm-stars.1 index 9b2d6d187e4..455cf4fcbc7 100644 --- a/deps/npm/man/man1/npm-stars.1 +++ b/deps/npm/man/man1/npm-stars.1 @@ -1,40 +1,31 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-STARS" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-stars\fR \-\- View packages marked as favorites -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-stars\fR \- View packages marked as favorites +.SH SYNOPSIS +.P +.RS 2 +.EX npm stars npm stars [username] -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P If you have starred a lot of neat things and want to find them again quickly this command lets you do just that\. -. .P -You may also want to see your friend\'s favorite packages, in this case +You may also want to see your friend's favorite packages, in this case you will most certainly enjoy this command\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help star -. -.IP "\(bu" 4 +.IP \(bu 2 npm help view -. -.IP "\(bu" 4 +.IP \(bu 2 npm help whoami -. -.IP "\(bu" 4 +.IP \(bu 2 npm help adduser -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-start.1 b/deps/npm/man/man1/npm-start.1 index c76e2c92a5d..866cfd3a2a3 100644 --- a/deps/npm/man/man1/npm-start.1 +++ b/deps/npm/man/man1/npm-start.1 @@ -1,37 +1,28 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-START" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-start\fR \-\- Start a package -. -.SH "SYNOPSIS" -. -.nf -npm start -. -.fi -. -.SH "DESCRIPTION" -This runs a package\'s "start" script, if one was provided\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +\fBnpm-start\fR \- Start a package +.SH SYNOPSIS +.P +.RS 2 +.EX +npm start [\-\- ] +.EE +.RE +.SH DESCRIPTION +.P +This runs a package's "start" script, if one was provided\. +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help run\-script -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 scripts -. -.IP "\(bu" 4 +.IP \(bu 2 npm help test -. -.IP "\(bu" 4 +.IP \(bu 2 npm help restart -. -.IP "\(bu" 4 +.IP \(bu 2 npm help stop -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-stop.1 b/deps/npm/man/man1/npm-stop.1 index 37c1a5fe03f..1c4a6a67758 100644 --- a/deps/npm/man/man1/npm-stop.1 +++ b/deps/npm/man/man1/npm-stop.1 @@ -1,37 +1,28 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-STOP" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-stop\fR \-\- Stop a package -. -.SH "SYNOPSIS" -. -.nf -npm stop -. -.fi -. -.SH "DESCRIPTION" -This runs a package\'s "stop" script, if one was provided\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +\fBnpm-stop\fR \- Stop a package +.SH SYNOPSIS +.P +.RS 2 +.EX +npm stop [\-\- ] +.EE +.RE +.SH DESCRIPTION +.P +This runs a package's "stop" script, if one was provided\. +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help run\-script -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 scripts -. -.IP "\(bu" 4 +.IP \(bu 2 npm help test -. -.IP "\(bu" 4 +.IP \(bu 2 npm help start -. -.IP "\(bu" 4 +.IP \(bu 2 npm help restart -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-submodule.1 b/deps/npm/man/man1/npm-submodule.1 index 71853335c59..bfb210d6ebb 100644 --- a/deps/npm/man/man1/npm-submodule.1 +++ b/deps/npm/man/man1/npm-submodule.1 @@ -1,42 +1,35 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-SUBMODULE" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-submodule\fR \-\- Add a package as a git submodule -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-submodule\fR \- Add a package as a git submodule +.SH SYNOPSIS +.P +.RS 2 +.EX npm submodule -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P If the specified package has a git repository url in its package\.json -description, then this command will add it as a git submodule at \fBnode_modules/\fR\|\. -. +description, then this command will add it as a git submodule at +\fBnode_modules/\fR\|\. .P -This is a convenience only\. From then on, it\'s up to you to manage +This is a convenience only\. From then on, it's up to you to manage updates by using the appropriate git commands\. npm will stubbornly refuse to update, modify, or remove anything with a \fB\|\.git\fR subfolder in it\. -. .P This command also does not install missing dependencies, if the package does not include them in its git repository\. If \fBnpm ls\fR reports that things are missing, you can either install, link, or submodule them yourself, or you can do \fBnpm explore \-\- npm install\fR to install the dependencies into the submodule folder\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 5 package\.json -. -.IP "\(bu" 4 +.IP \(bu 2 git help submodule -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-tag.1 b/deps/npm/man/man1/npm-tag.1 index c1d463f8cef..03fdbdb428b 100644 --- a/deps/npm/man/man1/npm-tag.1 +++ b/deps/npm/man/man1/npm-tag.1 @@ -1,74 +1,54 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-TAG" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-tag\fR \-\- Tag a published version -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-tag\fR \- Tag a published version +.SH SYNOPSIS +.P +.RS 2 +.EX npm tag @ [] -. -.fi -. -.SH "DESCRIPTION" -Tags the specified version of the package with the specified tag, or the \fB\-\-tag\fR config if not specified\. -. +.EE +.RE +.SH DESCRIPTION +.P +Tags the specified version of the package with the specified tag, or the +\fB\-\-tag\fR config if not specified\. .P A tag can be used when installing packages as a reference to a version instead of using a specific version number: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm install @ -. -.fi -. -.IP "" 0 -. +.EE +.RE .P When installing dependencies, a preferred tagged version may be specified: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm install \-\-tag -. -.fi -. -.IP "" 0 -. +.EE +.RE .P This also applies to \fBnpm dedupe\fR\|\. -. .P Publishing a package always sets the "latest" tag to the published version\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help publish -. -.IP "\(bu" 4 +.IP \(bu 2 npm help install -. -.IP "\(bu" 4 +.IP \(bu 2 npm help dedupe -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 registry -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-test.1 b/deps/npm/man/man1/npm-test.1 index 063fc926793..8e92115ac4e 100644 --- a/deps/npm/man/man1/npm-test.1 +++ b/deps/npm/man/man1/npm-test.1 @@ -1,42 +1,32 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-TEST" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-test\fR \-\- Test a package -. -.SH "SYNOPSIS" -. -.nf - npm test - npm tst -. -.fi -. -.SH "DESCRIPTION" -This runs a package\'s "test" script, if one was provided\. -. +\fBnpm-test\fR \- Test a package +.SH SYNOPSIS +.P +.RS 2 +.EX + npm test [\-\- ] + npm tst [\-\- ] +.EE +.RE +.SH DESCRIPTION +.P +This runs a package's "test" script, if one was provided\. .P To run tests as a condition of installation, set the \fBnpat\fR config to true\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help run\-script -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 scripts -. -.IP "\(bu" 4 +.IP \(bu 2 npm help start -. -.IP "\(bu" 4 +.IP \(bu 2 npm help restart -. -.IP "\(bu" 4 +.IP \(bu 2 npm help stop -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-uninstall.1 b/deps/npm/man/man1/npm-uninstall.1 index 364d9c1d7c4..2ade4acd039 100644 --- a/deps/npm/man/man1/npm-uninstall.1 +++ b/deps/npm/man/man1/npm-uninstall.1 @@ -1,87 +1,68 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-RM" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-rm\fR \-\- Remove a package -. -.SH "SYNOPSIS" -. -.nf -npm uninstall [\-\-save|\-\-save\-dev|\-\-save\-optional] +\fBnpm-rm\fR \- Remove a package +.SH SYNOPSIS +.P +.RS 2 +.EX +npm uninstall [@/] [\-\-save|\-\-save\-dev|\-\-save\-optional] npm rm (with any of the previous argument usage) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This uninstalls a package, completely removing everything npm installed on its behalf\. -. .P Example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm uninstall sax -. -.fi -. -.IP "" 0 -. +.EE +.RE .P In global mode (ie, with \fB\-g\fR or \fB\-\-global\fR appended to the command), it uninstalls the current package context as a global package\. -. .P \fBnpm uninstall\fR takes 3 exclusive, optional flags which save or update the package version in your main package\.json: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 \fB\-\-save\fR: Package will be removed from your \fBdependencies\fR\|\. -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-\-save\-dev\fR: Package will be removed from your \fBdevDependencies\fR\|\. -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-\-save\-optional\fR: Package will be removed from your \fBoptionalDependencies\fR\|\. -. -.IP "" 0 -. + +.RE +.P +Scope is optional and follows the usual rules for npm help 7 \fBnpm\-scope\fR\|\. .P Examples: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm uninstall sax \-\-save +npm uninstall @myorg/privatepackage \-\-save npm uninstall node\-tap \-\-save\-dev npm uninstall dtrace\-provider \-\-save\-optional -. -.fi -. -.IP "" 0 -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.EE +.RE +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help prune -. -.IP "\(bu" 4 +.IP \(bu 2 npm help install -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 folders -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-unpublish.1 b/deps/npm/man/man1/npm-unpublish.1 index e5b8a656010..9aec7540b0d 100644 --- a/deps/npm/man/man1/npm-unpublish.1 +++ b/deps/npm/man/man1/npm-unpublish.1 @@ -1,58 +1,47 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-UNPUBLISH" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-unpublish\fR \-\- Remove a package from the registry -. -.SH "SYNOPSIS" -. -.nf -npm unpublish [@] -. -.fi -. -.SH "WARNING" +\fBnpm-unpublish\fR \- Remove a package from the registry +.SH SYNOPSIS +.P +.RS 2 +.EX +npm unpublish [@/][@] +.EE +.RE +.SH WARNING +.P \fBIt is generally considered bad behavior to remove versions of a library that others are depending on!\fR -. .P Consider using the \fBdeprecate\fR command instead, if your intent is to encourage users to upgrade\. -. .P There is plenty of room on the registry\. -. -.SH "DESCRIPTION" +.SH DESCRIPTION +.P This removes a package version from the registry, deleting its entry and removing the tarball\. -. .P If no version is specified, or if all versions are removed then the root package entry is removed from the registry entirely\. -. .P Even if a package version is unpublished, that specific name and version combination can never be reused\. In order to publish the package again, a new version number must be used\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.P +The scope is optional and follows the usual rules for npm help 7 \fBnpm\-scope\fR\|\. +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help deprecate -. -.IP "\(bu" 4 +.IP \(bu 2 npm help publish -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 registry -. -.IP "\(bu" 4 +.IP \(bu 2 npm help adduser -. -.IP "\(bu" 4 +.IP \(bu 2 npm help owner -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-update.1 b/deps/npm/man/man1/npm-update.1 index de2201209f8..4edfab32066 100644 --- a/deps/npm/man/man1/npm-update.1 +++ b/deps/npm/man/man1/npm-update.1 @@ -1,45 +1,37 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-UPDATE" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-update\fR \-\- Update a package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-update\fR \- Update a package +.SH SYNOPSIS +.P +.RS 2 +.EX npm update [\-g] [ [ \.\.\.]] -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This command will update all the packages listed to the latest version (specified by the \fBtag\fR config)\. -. .P It will also install missing packages\. -. .P -If the \fB\-g\fR flag is specified, this command will update globally installed packages\. -If no package name is specified, all packages in the specified location (global or local) will be updated\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +If the \fB\-g\fR flag is specified, this command will update globally installed +packages\. +.P +If no package name is specified, all packages in the specified location (global +or local) will be updated\. +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help install -. -.IP "\(bu" 4 +.IP \(bu 2 npm help outdated -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 registry -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 folders -. -.IP "\(bu" 4 +.IP \(bu 2 npm help ls -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-version.1 b/deps/npm/man/man1/npm-version.1 index fc52da6e8f5..5c05aab9bde 100644 --- a/deps/npm/man/man1/npm-version.1 +++ b/deps/npm/man/man1/npm-version.1 @@ -1,75 +1,61 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-VERSION" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-version\fR \-\- Bump a package version -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-version\fR \- Bump a package version +.SH SYNOPSIS +.P +.RS 2 +.EX npm version [ | major | minor | patch | premajor | preminor | prepatch | prerelease] -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Run this in a package directory to bump the version and write the new data back to the package\.json file\. -. .P The \fBnewversion\fR argument should be a valid semver string, \fIor\fR a valid second argument to semver\.inc (one of "patch", "minor", "major", "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\. -. .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 \fBmessage\fR config contains \fB%s\fR then that will be replaced with the +use it as a commit message when creating a version commit\. If the +\fBmessage\fR config contains \fB%s\fR then that will be replaced with the resulting version number\. For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm version patch \-m "Upgrade to %s for reasons" -. -.fi -. -.IP "" 0 -. +.EE +.RE .P If the \fBsign\-git\-tag\fR config is set, then the tag will be signed using the \fB\-s\fR flag to git\. Note that you must have a default GPG key set up in your git config for this to work properly\. For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX $ npm config set sign\-git\-tag true $ npm version patch + You need a passphrase to unlock the secret key for user: "isaacs (http://blog\.izs\.me/) " 2048\-bit RSA key, ID 6C481CF6, created 2010\-08\-31 + Enter passphrase: -. -.fi -. -.IP "" 0 -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.EE +.RE +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help init -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 package\.json -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 semver -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-view.1 b/deps/npm/man/man1/npm-view.1 index 44b42b308d6..af435f023d3 100644 --- a/deps/npm/man/man1/npm-view.1 +++ b/deps/npm/man/man1/npm-view.1 @@ -1,186 +1,136 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-VIEW" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-view\fR \-\- View registry info -. -.SH "SYNOPSIS" -. -.nf -npm view [@] [[\.]\.\.\.] -npm v [@] [[\.]\.\.\.] -. -.fi -. -.SH "DESCRIPTION" +\fBnpm-view\fR \- View registry info +.SH SYNOPSIS +.P +.RS 2 +.EX +npm view [@/][@] [[\.]\.\.\.] +npm v [@/][@] [[\.]\.\.\.] +.EE +.RE +.SH DESCRIPTION +.P This command shows data about a package and prints it to the stream referenced by the \fBoutfd\fR config, which defaults to stdout\. -. .P To show the package registry entry for the \fBconnect\fR package, you can do this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm view connect -. -.fi -. -.IP "" 0 -. +.EE +.RE .P The default version is "latest" if unspecified\. -. .P Field names can be specified after the package descriptor\. For example, to show the dependencies of the \fBronn\fR package at version 0\.3\.5, you could do the following: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm view ronn@0\.3\.5 dependencies -. -.fi -. -.IP "" 0 -. +.EE +.RE .P You can view child field by separating them with a period\. To view the git repository URL for the latest version of npm, you could do this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm view npm repository\.url -. -.fi -. -.IP "" 0 -. +.EE +.RE .P This makes it easy to view information about a dependency with a bit of shell scripting\. For example, to view all the data about the version of opts that ronn depends on, you can do this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm view opts@$(npm view ronn dependencies\.opts) -. -.fi -. -.IP "" 0 -. +.EE +.RE .P For fields that are arrays, requesting a non\-numeric field will return all of the values from the objects in the list\. For example, to get all the contributor names for the "express" project, you can do this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm view express contributors\.email -. -.fi -. -.IP "" 0 -. +.EE +.RE .P You may also use numeric indices in square braces to specifically select an item in an array field\. To just get the email address of the first contributor in the list, you can do this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm view express contributors[0]\.email -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Multiple fields may be specified, and will be printed one after another\. For exampls, to get all the contributor names and email addresses, you can do this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm view express contributors\.name contributors\.email -. -.fi -. -.IP "" 0 -. +.EE +.RE .P "Person" fields are shown as a string if they would be shown as an object\. So, for example, this will show the list of npm contributors in the shortened string format\. (See npm help 5 \fBpackage\.json\fR for more on this\.) -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm view npm contributors -. -.fi -. -.IP "" 0 -. +.EE +.RE .P If a version range is provided, then data will be printed for every matching version of the package\. This will show which version of jsdom was required by each matching version of yui3: -. -.IP "" 4 -. -.nf -npm view yui3@\'>0\.5\.4\' dependencies\.jsdom -. -.fi -. -.IP "" 0 -. -.SH "OUTPUT" +.P +.RS 2 +.EX +npm view yui3@'>0\.5\.4' dependencies\.jsdom +.EE +.RE +.SH OUTPUT +.P If only a single string field for a single version is output, then it will not be colorized or quoted, so as to enable piping the output to another command\. If the field is an object, it will be output as a JavaScript object literal\. -. .P If the \-\-json flag is given, the outputted fields will be JSON\. -. .P If the version range matches multiple versions, than each printed value will be prefixed with the version it applies to\. -. .P If multiple fields are requested, than each of them are prefixed with the field name\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help search -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 registry -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 npm help docs -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm-whoami.1 b/deps/npm/man/man1/npm-whoami.1 index bf43ae7eee4..0d44c8b66ac 100644 --- a/deps/npm/man/man1/npm-whoami.1 +++ b/deps/npm/man/man1/npm-whoami.1 @@ -1,34 +1,26 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-WHOAMI" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-whoami\fR \-\- Display npm username -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-whoami\fR \- Display npm username +.SH SYNOPSIS +.P +.RS 2 +.EX npm whoami -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Print the \fBusername\fR config to standard output\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 npm help adduser -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man1/npm.1 b/deps/npm/man/man1/npm.1 index 5a0f94c740b..a44acfeae07 100644 --- a/deps/npm/man/man1/npm.1 +++ b/deps/npm/man/man1/npm.1 @@ -1,244 +1,212 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm\fR \-\- node package manager -. -.SH "SYNOPSIS" -. -.nf +\fBnpm\fR \- node package manager +.SH SYNOPSIS +.P +.RS 2 +.EX npm [args] -. -.fi -. -.SH "VERSION" -1.4.28 -. -.SH "DESCRIPTION" +.EE +.RE +.SH VERSION +.P +2.0.0 +.SH DESCRIPTION +.P npm is the package manager for the Node JavaScript platform\. It puts modules in place so that node can find them, and manages dependency conflicts intelligently\. -. .P It is extremely configurable to support a wide variety of use cases\. Most commonly, it is used to publish, discover, install, and develop node programs\. -. .P Run \fBnpm help\fR to get a list of available commands\. -. -.SH "INTRODUCTION" +.SH INTRODUCTION +.P You probably got npm because you want to install stuff\. -. .P -Use \fBnpm install blerg\fR to install the latest version of "blerg"\. Check out npm help \fBnpm\-install\fR for more info\. It can do a lot of stuff\. -. +Use \fBnpm install blerg\fR to install the latest version of "blerg"\. Check out +npm help \fBnpm\-install\fR for more info\. It can do a lot of stuff\. +.P +Use the \fBnpm search\fR command to show everything that's available\. +Use \fBnpm ls\fR to show everything you've installed\. +.SH DEPENDENCIES .P -Use the \fBnpm search\fR command to show everything that\'s available\. -Use \fBnpm ls\fR to show everything you\'ve installed\. -. -.SH "DEPENDENCIES" If a package references to another package with a git URL, npm depends on a preinstalled git\. -. .P If one of the packages npm tries to install is a native node module and -requires compiling of C++ Code, npm will use node\-gyp \fIhttps://github\.com/TooTallNate/node\-gyp\fR for that task\. +requires compiling of C++ Code, npm will use +node\-gyp \fIhttps://github\.com/TooTallNate/node\-gyp\fR for that task\. For a Unix system, node\-gyp \fIhttps://github\.com/TooTallNate/node\-gyp\fR needs Python, make and a buildchain like GCC\. On Windows, Python and Microsoft Visual Studio C++ is needed\. Python 3 is not supported by node\-gyp \fIhttps://github\.com/TooTallNate/node\-gyp\fR\|\. -For more information visit the node\-gyp repository \fIhttps://github\.com/TooTallNate/node\-gyp\fR and +For more information visit +the node\-gyp repository \fIhttps://github\.com/TooTallNate/node\-gyp\fR and the node\-gyp Wiki \fIhttps://github\.com/TooTallNate/node\-gyp/wiki\fR\|\. -. -.SH "DIRECTORIES" +.SH DIRECTORIES +.P See npm help 5 \fBnpm\-folders\fR to learn about where npm puts stuff\. -. .P In particular, npm has two modes of operation: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 global mode: -. .br -npm installs packages into the install prefix at \fBprefix/lib/node_modules\fR and bins are installed in \fBprefix/bin\fR\|\. -. -.IP "\(bu" 4 +npm installs packages into the install prefix at +\fBprefix/lib/node_modules\fR and bins are installed in \fBprefix/bin\fR\|\. +.IP \(bu 2 local mode: -. .br npm installs packages into the current project directory, which -defaults to the current working directory\. Packages are installed to \fB\|\./node_modules\fR, and bins are installed to \fB\|\./node_modules/\.bin\fR\|\. -. -.IP "" 0 -. +defaults to the current working directory\. Packages are installed to +\fB\|\./node_modules\fR, and bins are installed to \fB\|\./node_modules/\.bin\fR\|\. + +.RE .P Local mode is the default\. Use \fB\-\-global\fR or \fB\-g\fR on any command to operate in global mode instead\. -. -.SH "DEVELOPER USAGE" -If you\'re using npm to develop and publish your code, check out the +.SH DEVELOPER USAGE +.P +If you're using npm to develop and publish your code, check out the following help topics: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 json: Make a package\.json file\. See npm help 5 \fBpackage\.json\fR\|\. -. -.IP "\(bu" 4 +.IP \(bu 2 link: -For linking your current working code into Node\'s path, so that you -don\'t have to reinstall every time you make a change\. Use \fBnpm link\fR to do this\. -. -.IP "\(bu" 4 +For linking your current working code into Node's path, so that you +don't have to reinstall every time you make a change\. Use +\fBnpm link\fR to do this\. +.IP \(bu 2 install: -It\'s a good idea to install things if you don\'t need the symbolic link\. -Especially, installing other peoples code from the registry is done via \fBnpm install\fR -. -.IP "\(bu" 4 +It's a good idea to install things if you don't need the symbolic link\. +Especially, installing other peoples code from the registry is done via +\fBnpm install\fR +.IP \(bu 2 adduser: Create an account or log in\. Credentials are stored in the user config file\. -. -.IP "\(bu" 4 +.IP \(bu 2 publish: Use the \fBnpm publish\fR command to upload your code to the registry\. -. -.IP "" 0 -. -.SH "CONFIGURATION" + +.RE +.SH CONFIGURATION +.P npm is extremely configurable\. It reads its configuration options from 5 places\. -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 Command line switches: -. .br Set a config with \fB\-\-key val\fR\|\. All keys take a value, even if they -are booleans (the config parser doesn\'t know what the options are at +are booleans (the config parser doesn't know what the options are at the time of parsing\.) If no value is provided, then the option is set to boolean \fBtrue\fR\|\. -. -.IP "\(bu" 4 +.IP \(bu 2 Environment Variables: -. .br -Set any config by prefixing the name in an environment variable with \fBnpm_config_\fR\|\. For example, \fBexport npm_config_key=val\fR\|\. -. -.IP "\(bu" 4 +Set any config by prefixing the name in an environment variable with +\fBnpm_config_\fR\|\. For example, \fBexport npm_config_key=val\fR\|\. +.IP \(bu 2 User Configs: -. .br The file at $HOME/\.npmrc is an ini\-formatted list of configs\. If present, it is parsed\. If the \fBuserconfig\fR option is set in the cli or env, then that will be used instead\. -. -.IP "\(bu" 4 +.IP \(bu 2 Global Configs: -. .br The file found at \.\./etc/npmrc (from the node executable, by default this resolves to /usr/local/etc/npmrc) will be parsed if it is found\. If the \fBglobalconfig\fR option is set in the cli, env, or user config, then that file is parsed instead\. -. -.IP "\(bu" 4 +.IP \(bu 2 Defaults: -. .br -npm\'s default configuration options are defined in +npm's default configuration options are defined in lib/utils/config\-defs\.js\. These must not be changed\. -. -.IP "" 0 -. + +.RE .P See npm help 7 \fBnpm\-config\fR for much much more information\. -. -.SH "CONTRIBUTIONS" +.SH CONTRIBUTIONS +.P Patches welcome! -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 code: Read through npm help 7 \fBnpm\-coding\-style\fR if you plan to submit code\. -You don\'t have to agree with it, but you do have to follow it\. -. -.IP "\(bu" 4 +You don't have to agree with it, but you do have to follow it\. +.IP \(bu 2 docs: If you find an error in the documentation, edit the appropriate markdown -file in the "doc" folder\. (Don\'t worry about generating the man page\.) -. -.IP "" 0 -. +file in the "doc" folder\. (Don't worry about generating the man page\.) + +.RE .P -Contributors are listed in npm\'s \fBpackage\.json\fR file\. You can view them +Contributors are listed in npm's \fBpackage\.json\fR file\. You can view them easily by doing \fBnpm view npm contributors\fR\|\. -. .P -If you would like to contribute, but don\'t know what to work on, check +If you would like to contribute, but don't know what to work on, check the issues list or ask on the mailing list\. -. -.IP "\(bu" 4 -\fIhttp://github\.com/npm/npm/issues\fR -. -.IP "\(bu" 4 -\fInpm\-@googlegroups\.com\fR -. -.IP "" 0 -. -.SH "BUGS" +.RS 0 +.IP \(bu 2 +http://github\.com/npm/npm/issues +.IP \(bu 2 +npm\-@googlegroups\.com + +.RE +.SH BUGS +.P When you find issues, please report them: -. -.IP "\(bu" 4 -web: \fIhttp://github\.com/npm/npm/issues\fR -. -.IP "\(bu" 4 -email: \fInpm\-@googlegroups\.com\fR -. -.IP "" 0 -. -.P -Be sure to include \fIall\fR of the output from the npm command that didn\'t work +.RS 0 +.IP \(bu 2 +web: +http://github\.com/npm/npm/issues +.IP \(bu 2 +email: +npm\-@googlegroups\.com + +.RE +.P +Be sure to include \fIall\fR of the output from the npm command that didn't work as expected\. The \fBnpm\-debug\.log\fR file is also helpful to provide\. -. .P You can also look for isaacs in #node\.js on irc://irc\.freenode\.net\. He will no doubt tell you to put the output in a gist or email\. -. -.SH "AUTHOR" -Isaac Z\. Schlueter \fIhttp://blog\.izs\.me/\fR :: isaacs \fIhttps://github\.com/isaacs/\fR :: @izs \fIhttp://twitter\.com/izs\fR :: \fIi@izs\.me\fR -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH AUTHOR +.P +Isaac Z\. Schlueter \fIhttp://blog\.izs\.me/\fR :: +isaacs \fIhttps://github\.com/isaacs/\fR :: +@izs \fIhttp://twitter\.com/izs\fR :: +i@izs\.me +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help help -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 faq -. -.IP "\(bu" 4 +.IP \(bu 2 README -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 package\.json -. -.IP "\(bu" 4 +.IP \(bu 2 npm help install -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 index -. -.IP "\(bu" 4 +.IP \(bu 2 npm apihelp npm -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man3/npm-bin.3 b/deps/npm/man/man3/npm-bin.3 index 97de75de859..704b17c7614 100644 --- a/deps/npm/man/man3/npm-bin.3 +++ b/deps/npm/man/man3/npm-bin.3 @@ -1,21 +1,17 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-BIN" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-bin\fR \-\- Display npm bin folder -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-bin\fR \- Display npm bin folder +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.bin(args, cb) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Print the folder where npm will install executables\. -. .P This function should not be used programmatically\. Instead, just refer to the \fBnpm\.bin\fR member\. + diff --git a/deps/npm/man/man3/npm-bugs.3 b/deps/npm/man/man3/npm-bugs.3 index bb85060afe1..c0809e65960 100644 --- a/deps/npm/man/man3/npm-bugs.3 +++ b/deps/npm/man/man3/npm-bugs.3 @@ -1,28 +1,23 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-BUGS" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-bugs\fR \-\- Bugs for a package in a web browser maybe -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-bugs\fR \- Bugs for a package in a web browser maybe +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.bugs(package, callback) -. -.fi -. -.SH "DESCRIPTION" -This command tries to guess at the likely location of a package\'s +.EE +.RE +.SH DESCRIPTION +.P +This command tries to guess at the likely location of a package's bug tracker URL, and then tries to open it using the \fB\-\-browser\fR config param\. -. .P Like other commands, the first parameter is an array\. This command only uses the first element, which is expected to be a package name with an optional version number\. -. .P This command will launch a browser, so this command may not be the most friendly for programmatic use\. + diff --git a/deps/npm/man/man3/npm-cache.3 b/deps/npm/man/man3/npm-cache.3 index b3396446ff3..125fcf73960 100644 --- a/deps/npm/man/man3/npm-cache.3 +++ b/deps/npm/man/man3/npm-cache.3 @@ -1,40 +1,34 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-CACHE" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-cache\fR \-\- manage the npm cache programmatically -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-cache\fR \- manage the npm cache programmatically +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.cache([args], callback) + // helpers npm\.commands\.cache\.clean([args], callback) npm\.commands\.cache\.add([args], callback) npm\.commands\.cache\.read(name, version, forceBypass, callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This acts much the same ways as the npm help cache command line functionality\. -. .P The callback is called with the package\.json data of the thing that is eventually added to or read from the cache\. -. .P The top level \fBnpm\.commands\.cache(\.\.\.)\fR functionality is a public interface, and like all commands on the \fBnpm\.commands\fR object, it will match the command line behavior exactly\. -. .P However, the cache folder structure and the cache helper functions are considered \fBinternal\fR API surface, and as such, may change in future releases of npm, potentially without warning or significant version incrementation\. -. .P Use at your own risk\. + diff --git a/deps/npm/man/man3/npm-commands.3 b/deps/npm/man/man3/npm-commands.3 index 003f5e5ab47..396b1c76f55 100644 --- a/deps/npm/man/man3/npm-commands.3 +++ b/deps/npm/man/man3/npm-commands.3 @@ -1,35 +1,28 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-COMMANDS" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-commands\fR \-\- npm commands -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-commands\fR \- npm commands +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands[](args, callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P npm comes with a full set of commands, and each of the commands takes a similar set of arguments\. -. .P In general, all commands on the command object take an \fBarray\fR of positional argument \fBstrings\fR\|\. The last argument to any function is a callback\. Some commands are special and take other optional arguments\. -. .P All commands have their own man page\. See \fBman npm\-\fR for command\-line usage, or \fBman 3 npm\-\fR for programmatic usage\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 7 index -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man3/npm-config.3 b/deps/npm/man/man3/npm-config.3 index 578b939a636..0e8e3641a4d 100644 --- a/deps/npm/man/man3/npm-config.3 +++ b/deps/npm/man/man3/npm-config.3 @@ -1,69 +1,49 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-CONFIG" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-config\fR \-\- Manage the npm configuration files -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-config\fR \- Manage the npm configuration files +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.config(args, callback) var val = npm\.config\.get(key) npm\.config\.set(key, val) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This function acts much the same way as the command\-line version\. The first element in the array tells config what to do\. Possible values are: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 \fBset\fR -. -.IP -Sets a config parameter\. The second element in \fBargs\fR is interpreted as the -key, and the third element is interpreted as the value\. -. -.IP "\(bu" 4 + Sets a config parameter\. The second element in \fBargs\fR is interpreted as the + key, and the third element is interpreted as the value\. +.IP \(bu 2 \fBget\fR -. -.IP -Gets the value of a config parameter\. The second element in \fBargs\fR is the -key to get the value of\. -. -.IP "\(bu" 4 + Gets the value of a config parameter\. The second element in \fBargs\fR is the + key to get the value of\. +.IP \(bu 2 \fBdelete\fR (\fBrm\fR or \fBdel\fR) -. -.IP -Deletes a parameter from the config\. The second element in \fBargs\fR is the -key to delete\. -. -.IP "\(bu" 4 + Deletes a parameter from the config\. The second element in \fBargs\fR is the + key to delete\. +.IP \(bu 2 \fBlist\fR (\fBls\fR) -. -.IP -Show all configs that aren\'t secret\. No parameters necessary\. -. -.IP "\(bu" 4 + Show all configs that aren't secret\. No parameters necessary\. +.IP \(bu 2 \fBedit\fR: -. -.IP -Opens the config file in the default editor\. This command isn\'t very useful -programmatically, but it is made available\. -. -.IP "" 0 -. + Opens the config file in the default editor\. This command isn't very useful + programmatically, but it is made available\. + +.RE .P To programmatically access npm configuration settings, or set them for the duration of a program, use the \fBnpm\.config\.set\fR and \fBnpm\.config\.get\fR functions instead\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm apihelp npm -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man3/npm-deprecate.3 b/deps/npm/man/man3/npm-deprecate.3 index 29e4c345154..ba5ffbdf272 100644 --- a/deps/npm/man/man3/npm-deprecate.3 +++ b/deps/npm/man/man3/npm-deprecate.3 @@ -1,57 +1,43 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-DEPRECATE" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-deprecate\fR \-\- Deprecate a version of a package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-deprecate\fR \- Deprecate a version of a package +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.deprecate(args, callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This command will update the npm registry entry for a package, providing a deprecation warning to all who attempt to install it\. -. .P -The \'args\' parameter must have exactly two elements: -. -.IP "\(bu" 4 +The 'args' parameter must have exactly two elements: +.RS 0 +.IP \(bu 2 \fBpackage[@version]\fR -. -.IP -The \fBversion\fR portion is optional, and may be either a range, or a -specific version, or a tag\. -. -.IP "\(bu" 4 + The \fBversion\fR portion is optional, and may be either a range, or a + specific version, or a tag\. +.IP \(bu 2 \fBmessage\fR -. -.IP -The warning message that will be printed whenever a user attempts to -install the package\. -. -.IP "" 0 -. + The warning message that will be printed whenever a user attempts to + install the package\. + +.RE .P -Note that you must be the package owner to deprecate something\. See the \fBowner\fR and \fBadduser\fR help topics\. -. +Note that you must be the package owner to deprecate something\. See the +\fBowner\fR and \fBadduser\fR help topics\. .P To un\-deprecate a package, specify an empty string (\fB""\fR) for the \fBmessage\fR argument\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm apihelp publish -. -.IP "\(bu" 4 +.IP \(bu 2 npm apihelp unpublish -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 registry -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man3/npm-docs.3 b/deps/npm/man/man3/npm-docs.3 index e3039c2ef5e..6aec6d76ab0 100644 --- a/deps/npm/man/man3/npm-docs.3 +++ b/deps/npm/man/man3/npm-docs.3 @@ -1,28 +1,23 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-DOCS" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-docs\fR \-\- Docs for a package in a web browser maybe -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-docs\fR \- Docs for a package in a web browser maybe +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.docs(package, callback) -. -.fi -. -.SH "DESCRIPTION" -This command tries to guess at the likely location of a package\'s +.EE +.RE +.SH DESCRIPTION +.P +This command tries to guess at the likely location of a package's documentation URL, and then tries to open it using the \fB\-\-browser\fR config param\. -. .P Like other commands, the first parameter is an array\. This command only uses the first element, which is expected to be a package name with an optional version number\. -. .P This command will launch a browser, so this command may not be the most friendly for programmatic use\. + diff --git a/deps/npm/man/man3/npm-edit.3 b/deps/npm/man/man3/npm-edit.3 index bcdabb6f237..0c52d964294 100644 --- a/deps/npm/man/man3/npm-edit.3 +++ b/deps/npm/man/man3/npm-edit.3 @@ -1,35 +1,28 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-EDIT" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-edit\fR \-\- Edit an installed package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-edit\fR \- Edit an installed package +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.edit(package, callback) -. -.fi -. -.SH "DESCRIPTION" -Opens the package folder in the default editor (or whatever you\'ve +.EE +.RE +.SH DESCRIPTION +.P +Opens the package folder in the default editor (or whatever you've configured as the npm \fBeditor\fR config \-\- see \fBnpm help config\fR\|\.) -. .P After it has been edited, the package is rebuilt so as to pick up any changes in compiled packages\. -. .P For instance, you can do \fBnpm install connect\fR to install connect into your package, and then \fBnpm\.commands\.edit(["connect"], callback)\fR to make a few changes to your locally installed copy\. -. .P The first parameter is a string array with a single element, the package to open\. The package can optionally have a version number attached\. -. .P Since this command opens an editor in a new process, be careful about where and how this is used\. + diff --git a/deps/npm/man/man3/npm-explore.3 b/deps/npm/man/man3/npm-explore.3 index 0918dae972c..8b0cb72bf4a 100644 --- a/deps/npm/man/man3/npm-explore.3 +++ b/deps/npm/man/man3/npm-explore.3 @@ -1,28 +1,22 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-EXPLORE" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-explore\fR \-\- Browse an installed package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-explore\fR \- Browse an installed package +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.explore(args, callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Spawn a subshell in the directory of the installed package specified\. -. .P If a command is specified, then it is run in the subshell, which then immediately terminates\. -. .P Note that the package is \fInot\fR automatically rebuilt afterwards, so be sure to use \fBnpm rebuild \fR if you make any changes\. -. .P -The first element in the \'args\' parameter must be a package name\. After that is the optional command, which can be any number of strings\. All of the strings will be combined into one, space\-delimited command\. +The first element in the 'args' parameter must be a package name\. After that is the optional command, which can be any number of strings\. All of the strings will be combined into one, space\-delimited command\. + diff --git a/deps/npm/man/man3/npm-help-search.3 b/deps/npm/man/man3/npm-help-search.3 index 2c39f5c7b42..8b92f90b5ec 100644 --- a/deps/npm/man/man3/npm-help-search.3 +++ b/deps/npm/man/man3/npm-help-search.3 @@ -1,51 +1,41 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-HELP\-SEARCH" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-help-search\fR \-\- Search the help pages -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-help-search\fR \- Search the help pages +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.helpSearch(args, [silent,] callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This command is rarely useful, but it exists in the rare case that it is\. -. .P This command takes an array of search terms and returns the help pages that match in order of best match\. -. .P If there is only one match, then npm displays that help section\. If there are multiple results, the results are printed to the screen formatted and the array of results is returned\. Each result is an object with these properties: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 hits: A map of args to number of hits on that arg\. For example, {"npm": 3} -. -.IP "\(bu" 4 +.IP \(bu 2 found: Total number of unique args that matched\. -. -.IP "\(bu" 4 +.IP \(bu 2 totalHits: Total number of hits\. -. -.IP "\(bu" 4 +.IP \(bu 2 lines: An array of all matching lines (and some adjacent lines)\. -. -.IP "\(bu" 4 +.IP \(bu 2 file: Name of the file that matched -. -.IP "" 0 -. + +.RE .P The silent parameter is not neccessary not used, but it may in the future\. + diff --git a/deps/npm/man/man3/npm-init.3 b/deps/npm/man/man3/npm-init.3 index d4eba220526..87059d957b9 100644 --- a/deps/npm/man/man3/npm-init.3 +++ b/deps/npm/man/man3/npm-init.3 @@ -1,39 +1,32 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. -.TH "INIT" "3" "September 2014" "" "" -. +.TH "NPM" "" "September 2014" "" "" .SH "NAME" -\fBinit\fR \-\- Interactively create a package\.json file -. -.SH "SYNOPSIS" -. -.nf +\fBnpm\fR +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.init(args, callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This will ask you a bunch of questions, and then write a package\.json for you\. -. .P It attempts to make reasonable guesses about what you want things to be set to, -and then writes a package\.json file with the options you\'ve selected\. -. +and then writes a package\.json file with the options you've selected\. .P -If you already have a package\.json file, it\'ll read that first, and default to +If you already have a package\.json file, it'll read that first, and default to the options in there\. -. .P It is strictly additive, so it does not delete options from your package\.json without a really good reason to do so\. -. .P -Since this function expects to be run on the command\-line, it doesn\'t work very +Since this function expects to be run on the command\-line, it doesn't work very well as a programmatically\. The best option is to roll your own, and since JavaScript makes it stupid simple to output formatted JSON, that is the -preferred method\. If you\'re sure you want to handle command\-line prompting, +preferred method\. If you're sure you want to handle command\-line prompting, then go ahead and use this programmatically\. -. -.SH "SEE ALSO" +.SH SEE ALSO +.P npm help 5 package\.json + diff --git a/deps/npm/man/man3/npm-install.3 b/deps/npm/man/man3/npm-install.3 index 4b09fbe80fe..3202bdffe76 100644 --- a/deps/npm/man/man3/npm-install.3 +++ b/deps/npm/man/man3/npm-install.3 @@ -1,29 +1,23 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-INSTALL" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-install\fR \-\- install a package programmatically -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-install\fR \- install a package programmatically +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.install([where,] packages, callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This acts much the same ways as installing on the command\-line\. -. .P -The \'where\' parameter is optional and only used internally, and it specifies +The 'where' parameter is optional and only used internally, and it specifies where the packages should be installed to\. -. .P -The \'packages\' parameter is an array of strings\. Each element in the array is +The 'packages' parameter is an array of strings\. Each element in the array is the name of a package to be installed\. -. .P -Finally, \'callback\' is a function that will be called when all packages have been +Finally, 'callback' is a function that will be called when all packages have been installed or when an error has been encountered\. + diff --git a/deps/npm/man/man3/npm-link.3 b/deps/npm/man/man3/npm-link.3 index dbecc0edb7d..ff5ea0f7999 100644 --- a/deps/npm/man/man3/npm-link.3 +++ b/deps/npm/man/man3/npm-link.3 @@ -1,53 +1,41 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-LINK" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-link\fR \-\- Symlink a package folder -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-link\fR \- Symlink a package folder +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.link(callback) npm\.commands\.link(packages, callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Package linking is a two\-step process\. -. .P Without parameters, link will create a globally\-installed symbolic link from \fBprefix/package\-name\fR to the current folder\. -. .P With a parameters, link will create a symlink from the local \fBnode_modules\fR folder to the global symlink\. -. .P When creating tarballs for \fBnpm publish\fR, the linked packages are "snapshotted" to their current state by resolving the symbolic links\. -. .P This is handy for installing your own stuff, so that you can work on it and test it iteratively without having to continually rebuild\. -. .P For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm\.commands\.link(cb) # creates global link from the cwd # (say redis package) -npm\.commands\.link(\'redis\', cb) # link\-install the package -. -.fi -. -.IP "" 0 -. +npm\.commands\.link('redis', cb) # link\-install the package +.EE +.RE .P Now, any changes to the redis package will be reflected in the package in the current working directory + diff --git a/deps/npm/man/man3/npm-load.3 b/deps/npm/man/man3/npm-load.3 index 4180127d7e1..8189b5abcfe 100644 --- a/deps/npm/man/man3/npm-load.3 +++ b/deps/npm/man/man3/npm-load.3 @@ -1,44 +1,34 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-LOAD" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-load\fR \-\- Load config settings -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-load\fR \- Load config settings +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.load(conf, cb) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P npm\.load() must be called before any other function call\. Both parameters are optional, but the second is recommended\. -. .P The first parameter is an object hash of command\-line config params, and the second parameter is a callback that will be called when npm is loaded and ready to serve\. -. .P The first parameter should follow a similar structure as the package\.json config object\. -. .P For example, to emulate the \-\-dev flag, pass an object that looks like this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "dev": true } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P For a list of all the available command\-line configs, see \fBnpm help config\fR + diff --git a/deps/npm/man/man3/npm-ls.3 b/deps/npm/man/man3/npm-ls.3 index 723e2bc45b0..a8ce7f71175 100644 --- a/deps/npm/man/man3/npm-ls.3 +++ b/deps/npm/man/man3/npm-ls.3 @@ -1,86 +1,68 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-LS" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-ls\fR \-\- List installed packages -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-ls\fR \- List installed packages +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.ls(args, [silent,] callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This command will print to stdout all the versions of packages that are installed, as well as their dependencies, in a tree\-structure\. It will also return that data using the callback\. -. .P This command does not take any arguments, but args must be defined\. Beyond that, if any arguments are passed in, npm will politely warn that it does not take positional arguments, though you may set config flags like with any other command, such as \fBglobal\fR to list global packages\. -. .P It will print out extraneous, missing, and invalid packages\. -. .P If the silent parameter is set to true, nothing will be output to the screen, but the data will still be returned\. -. .P Callback is provided an error if one occurred, the full data about which packages are installed and which dependencies they will receive, and a "lite" data object which just shows which versions are installed where\. Note that the full data object is a circular structure, so care must be taken if it is serialized to JSON\. -. -.SH "CONFIGURATION" -. -.SS "long" -. -.IP "\(bu" 4 +.SH CONFIGURATION +.SS long +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Show extended information\. -. -.SS "parseable" -. -.IP "\(bu" 4 +.SS parseable +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Show parseable output instead of tree view\. -. -.SS "global" -. -.IP "\(bu" 4 +.SS global +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P List packages in the global install prefix instead of in the current project\. -. .P -Note, if parseable is set or long isn\'t set, then duplicates will be trimmed\. +Note, if parseable is set or long isn't set, then duplicates will be trimmed\. This means that if a submodule a same dependency as a parent module, then the dependency will only be output once\. + diff --git a/deps/npm/man/man3/npm-outdated.3 b/deps/npm/man/man3/npm-outdated.3 index 3da841dc3dd..ac653f9259f 100644 --- a/deps/npm/man/man3/npm-outdated.3 +++ b/deps/npm/man/man3/npm-outdated.3 @@ -1,21 +1,17 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-OUTDATED" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-outdated\fR \-\- Check for outdated packages -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-outdated\fR \- Check for outdated packages +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.outdated([packages,] callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This command will check the registry to see if the specified packages are currently outdated\. -. .P -If the \'packages\' parameter is left out, npm will check all packages\. +If the 'packages' parameter is left out, npm will check all packages\. + diff --git a/deps/npm/man/man3/npm-owner.3 b/deps/npm/man/man3/npm-owner.3 index 38cc42d6992..ac4ad142591 100644 --- a/deps/npm/man/man3/npm-owner.3 +++ b/deps/npm/man/man3/npm-owner.3 @@ -1,52 +1,43 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-OWNER" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-owner\fR \-\- Manage package owners -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-owner\fR \- Manage package owners +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.owner(args, callback) -. -.fi -. -.SH "DESCRIPTION" -The first element of the \'args\' parameter defines what to do, and the subsequent +.EE +.RE +.SH DESCRIPTION +.P +The first element of the 'args' parameter defines what to do, and the subsequent elements depend on the action\. Possible values for the action are (order of parameters are given in parenthesis): -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 ls (package): List all the users who have access to modify a package and push new versions\. Handy when you need to know who to bug for help\. -. -.IP "\(bu" 4 +.IP \(bu 2 add (user, package): Add a new user as a maintainer of a package\. This user is enabled to modify metadata, publish new versions, and add other owners\. -. -.IP "\(bu" 4 +.IP \(bu 2 rm (user, package): Remove a user from the package owner list\. This immediately revokes their privileges\. -. -.IP "" 0 -. + +.RE .P Note that there is only one level of access\. Either you can modify a package, -or you can\'t\. Future versions may contain more fine\-grained access levels, but +or you can't\. Future versions may contain more fine\-grained access levels, but that is not implemented at this time\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm apihelp publish -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 registry -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man3/npm-pack.3 b/deps/npm/man/man3/npm-pack.3 index a7ccab0a732..07b6399482d 100644 --- a/deps/npm/man/man3/npm-pack.3 +++ b/deps/npm/man/man3/npm-pack.3 @@ -1,28 +1,23 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-PACK" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-pack\fR \-\- Create a tarball from a package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-pack\fR \- Create a tarball from a package +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.pack([packages,] callback) -. -.fi -. -.SH "DESCRIPTION" -For anything that\'s installable (that is, a package folder, tarball, +.EE +.RE +.SH DESCRIPTION +.P +For anything that's installable (that is, a package folder, tarball, tarball url, name@tag, name@version, or name), this command will fetch it to the cache, and then copy the tarball to the current working directory as \fB\-\.tgz\fR, and then write the filenames out to stdout\. -. .P If the same package is specified multiple times, then the file will be overwritten the second time\. -. .P If no arguments are supplied, then npm packs the current package folder\. + diff --git a/deps/npm/man/man3/npm-prefix.3 b/deps/npm/man/man3/npm-prefix.3 index 3e800556574..d83aea1ef22 100644 --- a/deps/npm/man/man3/npm-prefix.3 +++ b/deps/npm/man/man3/npm-prefix.3 @@ -1,24 +1,19 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-PREFIX" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-prefix\fR \-\- Display prefix -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-prefix\fR \- Display prefix +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.prefix(args, callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Print the prefix to standard out\. -. .P -\'args\' is never used and callback is never called with data\. -\'args\' must be present or things will break\. -. +\|'args' is never used and callback is never called with data\. +\|'args' must be present or things will break\. .P This function is not useful programmatically + diff --git a/deps/npm/man/man3/npm-prune.3 b/deps/npm/man/man3/npm-prune.3 index f9aff4ad322..7ad7ebc053f 100644 --- a/deps/npm/man/man3/npm-prune.3 +++ b/deps/npm/man/man3/npm-prune.3 @@ -1,27 +1,21 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-PRUNE" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-prune\fR \-\- Remove extraneous packages -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-prune\fR \- Remove extraneous packages +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.prune([packages,] callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This command removes "extraneous" packages\. -. .P The first parameter is optional, and it specifies packages to be removed\. -. .P No packages are specified, then all packages will be checked\. -. .P Extraneous packages are packages that are not listed on the parent -package\'s dependencies list\. +package's dependencies list\. + diff --git a/deps/npm/man/man3/npm-publish.3 b/deps/npm/man/man3/npm-publish.3 index 842da1bb808..877ab41d2fc 100644 --- a/deps/npm/man/man3/npm-publish.3 +++ b/deps/npm/man/man3/npm-publish.3 @@ -1,51 +1,41 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-PUBLISH" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-publish\fR \-\- Publish a package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-publish\fR \- Publish a package +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.publish([packages,] callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Publishes a package to the registry so that it can be installed by name\. -Possible values in the \'packages\' array are: -. -.IP "\(bu" 4 +Possible values in the 'packages' array are: +.RS 0 +.IP \(bu 2 \fB\fR: A folder containing a package\.json file -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\fR: A url or file path to a gzipped tar archive containing a single folder with a package\.json file inside\. -. -.IP "" 0 -. + +.RE .P If the package array is empty, npm will try to publish something in the current working directory\. -. .P This command could fails if one of the packages specified already exists in the registry\. Overwrites when the "force" environment variable is set\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 7 registry -. -.IP "\(bu" 4 +.IP \(bu 2 npm help adduser -. -.IP "\(bu" 4 +.IP \(bu 2 npm apihelp owner -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man3/npm-rebuild.3 b/deps/npm/man/man3/npm-rebuild.3 index f6233c2f290..1a0387f6e2e 100644 --- a/deps/npm/man/man3/npm-rebuild.3 +++ b/deps/npm/man/man3/npm-rebuild.3 @@ -1,22 +1,19 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-REBUILD" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-rebuild\fR \-\- Rebuild a package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-rebuild\fR \- Rebuild a package +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.rebuild([packages,] callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This command runs the \fBnpm build\fR command on each of the matched packages\. This is useful when you install a new version of node, and must recompile all your C++ addons with -the new binary\. If no \'packages\' parameter is specify, every package will be rebuilt\. -. -.SH "CONFIGURATION" +the new binary\. If no 'packages' parameter is specify, every package will be rebuilt\. +.SH CONFIGURATION +.P See \fBnpm help build\fR + diff --git a/deps/npm/man/man3/npm-repo.3 b/deps/npm/man/man3/npm-repo.3 index 06db0d50a25..e88952853a0 100644 --- a/deps/npm/man/man3/npm-repo.3 +++ b/deps/npm/man/man3/npm-repo.3 @@ -1,28 +1,23 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-REPO" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-repo\fR \-\- Open package repository page in the browser -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-repo\fR \- Open package repository page in the browser +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.repo(package, callback) -. -.fi -. -.SH "DESCRIPTION" -This command tries to guess at the likely location of a package\'s +.EE +.RE +.SH DESCRIPTION +.P +This command tries to guess at the likely location of a package's repository URL, and then tries to open it using the \fB\-\-browser\fR config param\. -. .P Like other commands, the first parameter is an array\. This command only uses the first element, which is expected to be a package name with an optional version number\. -. .P This command will launch a browser, so this command may not be the most friendly for programmatic use\. + diff --git a/deps/npm/man/man3/npm-restart.3 b/deps/npm/man/man3/npm-restart.3 index 5c0ed9ca0e8..90854364d75 100644 --- a/deps/npm/man/man3/npm-restart.3 +++ b/deps/npm/man/man3/npm-restart.3 @@ -1,37 +1,29 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-RESTART" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-restart\fR \-\- Start a package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-restart\fR \- Start a package +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.restart(packages, callback) -. -.fi -. -.SH "DESCRIPTION" -This runs a package\'s "restart" script, if one was provided\. -Otherwise it runs package\'s "stop" script, if one was provided, and then +.EE +.RE +.SH DESCRIPTION +.P +This runs a package's "restart" script, if one was provided\. +Otherwise it runs package's "stop" script, if one was provided, and then the "start" script\. -. .P If no version is specified, then it restarts the "active" version\. -. .P npm can run tests on multiple packages\. Just specify multiple packages in the \fBpackages\fR parameter\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm apihelp start -. -.IP "\(bu" 4 +.IP \(bu 2 npm apihelp stop -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man3/npm-root.3 b/deps/npm/man/man3/npm-root.3 index 5772cb40d33..36ce0019d9b 100644 --- a/deps/npm/man/man3/npm-root.3 +++ b/deps/npm/man/man3/npm-root.3 @@ -1,24 +1,19 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-ROOT" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-root\fR \-\- Display npm root -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-root\fR \- Display npm root +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.root(args, callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Print the effective \fBnode_modules\fR folder to standard out\. -. .P -\'args\' is never used and callback is never called with data\. -\'args\' must be present or things will break\. -. +\|'args' is never used and callback is never called with data\. +\|'args' must be present or things will break\. .P This function is not useful programmatically\. + diff --git a/deps/npm/man/man3/npm-run-script.3 b/deps/npm/man/man3/npm-run-script.3 index 5c5d435a309..2ec3a679a36 100644 --- a/deps/npm/man/man3/npm-run-script.3 +++ b/deps/npm/man/man3/npm-run-script.3 @@ -1,48 +1,37 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-RUN\-SCRIPT" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-run-script\fR \-\- Run arbitrary package scripts -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-run-script\fR \- Run arbitrary package scripts +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.run\-script(args, callback) -. -.fi -. -.SH "DESCRIPTION" -This runs an arbitrary command from a package\'s "scripts" object\. -. +.EE +.RE +.SH DESCRIPTION +.P +This runs an arbitrary command from a package's "scripts" object\. .P It is used by the test, start, restart, and stop commands, but can be called directly, as well\. -. .P -The \'args\' parameter is an array of strings\. Behavior depends on the number +The 'args' parameter is an array of strings\. Behavior depends on the number of elements\. If there is only one element, npm assumes that the element represents a command to be run on the local repository\. If there is more than one element, then the first is assumed to be the package and the second is assumed to be the command to run\. All other elements are ignored\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 7 scripts -. -.IP "\(bu" 4 +.IP \(bu 2 npm apihelp test -. -.IP "\(bu" 4 +.IP \(bu 2 npm apihelp start -. -.IP "\(bu" 4 +.IP \(bu 2 npm apihelp restart -. -.IP "\(bu" 4 +.IP \(bu 2 npm apihelp stop -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man3/npm-search.3 b/deps/npm/man/man3/npm-search.3 index f7692a637c6..e508a016306 100644 --- a/deps/npm/man/man3/npm-search.3 +++ b/deps/npm/man/man3/npm-search.3 @@ -1,64 +1,52 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-SEARCH" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-search\fR \-\- Search for packages -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-search\fR \- Search for packages +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.search(searchTerms, [silent,] [staleness,] callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Search the registry for packages matching the search terms\. The available parameters are: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 searchTerms: Array of search terms\. These terms are case\-insensitive\. -. -.IP "\(bu" 4 +.IP \(bu 2 silent: If true, npm will not log anything to the console\. -. -.IP "\(bu" 4 +.IP \(bu 2 staleness: This is the threshold for stale packages\. "Fresh" packages are not refreshed from the registry\. This value is measured in seconds\. -. -.IP "\(bu" 4 +.IP \(bu 2 callback: Returns an object where each key is the name of a package, and the value -is information about that package along with a \'words\' property, which is +is information about that package along with a 'words' property, which is a space\-delimited string of all of the interesting words in that package\. The only properties included are those that are searched, which generally include: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 name -. -.IP "\(bu" 4 +.IP \(bu 2 description -. -.IP "\(bu" 4 +.IP \(bu 2 maintainers -. -.IP "\(bu" 4 +.IP \(bu 2 url -. -.IP "\(bu" 4 +.IP \(bu 2 keywords -. -.IP "" 0 -. -.IP "" 0 -. +.RE + +.RE .P A search on the registry excludes any result that does not match all of the search terms\. It also removes any items from the results that contain an excluded term (the "searchexclude" config)\. The search is case insensitive -and doesn\'t try to read your mind (it doesn\'t do any verb tense matching or the +and doesn't try to read your mind (it doesn't do any verb tense matching or the like)\. + diff --git a/deps/npm/man/man3/npm-shrinkwrap.3 b/deps/npm/man/man3/npm-shrinkwrap.3 index e5cdb59d9c3..d7e4ba84f7d 100644 --- a/deps/npm/man/man3/npm-shrinkwrap.3 +++ b/deps/npm/man/man3/npm-shrinkwrap.3 @@ -1,30 +1,24 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-SHRINKWRAP" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-shrinkwrap\fR \-\- programmatically generate package shrinkwrap file -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-shrinkwrap\fR \- programmatically generate package shrinkwrap file +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.shrinkwrap(args, [silent,] callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This acts much the same ways as shrinkwrapping on the command\-line\. -. .P -This command does not take any arguments, but \'args\' must be defined\. +This command does not take any arguments, but 'args' must be defined\. Beyond that, if any arguments are passed in, npm will politely warn that it does not take positional arguments\. -. .P -If the \'silent\' parameter is set to true, nothing will be output to the screen, +If the 'silent' parameter is set to true, nothing will be output to the screen, but the shrinkwrap file will still be written\. -. .P -Finally, \'callback\' is a function that will be called when the shrinkwrap has +Finally, 'callback' is a function that will be called when the shrinkwrap has been saved\. + diff --git a/deps/npm/man/man3/npm-start.3 b/deps/npm/man/man3/npm-start.3 index 6e2cb647713..7942fbd3e98 100644 --- a/deps/npm/man/man3/npm-start.3 +++ b/deps/npm/man/man3/npm-start.3 @@ -1,21 +1,17 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-START" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-start\fR \-\- Start a package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-start\fR \- Start a package +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.start(packages, callback) -. -.fi -. -.SH "DESCRIPTION" -This runs a package\'s "start" script, if one was provided\. -. +.EE +.RE +.SH DESCRIPTION +.P +This runs a package's "start" script, if one was provided\. .P npm can run tests on multiple packages\. Just specify multiple packages in the \fBpackages\fR parameter\. + diff --git a/deps/npm/man/man3/npm-stop.3 b/deps/npm/man/man3/npm-stop.3 index b1f4ee75030..b7d2d6d7964 100644 --- a/deps/npm/man/man3/npm-stop.3 +++ b/deps/npm/man/man3/npm-stop.3 @@ -1,21 +1,17 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-STOP" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-stop\fR \-\- Stop a package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-stop\fR \- Stop a package +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.stop(packages, callback) -. -.fi -. -.SH "DESCRIPTION" -This runs a package\'s "stop" script, if one was provided\. -. +.EE +.RE +.SH DESCRIPTION +.P +This runs a package's "stop" script, if one was provided\. .P npm can run stop on multiple packages\. Just specify multiple packages in the \fBpackages\fR parameter\. + diff --git a/deps/npm/man/man3/npm-submodule.3 b/deps/npm/man/man3/npm-submodule.3 index 95739ce3b08..7ade6d2ab86 100644 --- a/deps/npm/man/man3/npm-submodule.3 +++ b/deps/npm/man/man3/npm-submodule.3 @@ -1,42 +1,35 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-SUBMODULE" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-submodule\fR \-\- Add a package as a git submodule -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-submodule\fR \- Add a package as a git submodule +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.submodule(packages, callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P For each package specified, npm will check if it has a git repository url -in its package\.json description then add it as a git submodule at \fBnode_modules/\fR\|\. -. +in its package\.json description then add it as a git submodule at +\fBnode_modules/\fR\|\. .P -This is a convenience only\. From then on, it\'s up to you to manage +This is a convenience only\. From then on, it's up to you to manage updates by using the appropriate git commands\. npm will stubbornly refuse to update, modify, or remove anything with a \fB\|\.git\fR subfolder in it\. -. .P This command also does not install missing dependencies, if the package does not include them in its git repository\. If \fBnpm ls\fR reports that things are missing, you can either install, link, or submodule them yourself, or you can do \fBnpm explore \-\- npm install\fR to install the dependencies into the submodule folder\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help json -. -.IP "\(bu" 4 +.IP \(bu 2 git help submodule -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man3/npm-tag.3 b/deps/npm/man/man3/npm-tag.3 index fe00dbcc2e4..a6d34762fbc 100644 --- a/deps/npm/man/man3/npm-tag.3 +++ b/deps/npm/man/man3/npm-tag.3 @@ -1,31 +1,27 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-TAG" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-tag\fR \-\- Tag a published version -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-tag\fR \- Tag a published version +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.tag(package@version, tag, callback) -. -.fi -. -.SH "DESCRIPTION" -Tags the specified version of the package with the specified tag, or the \fB\-\-tag\fR config if not specified\. -. +.EE +.RE +.SH DESCRIPTION +.P +Tags the specified version of the package with the specified tag, or the +\fB\-\-tag\fR config if not specified\. .P -The \'package@version\' is an array of strings, but only the first two elements are +The 'package@version' is an array of strings, but only the first two elements are currently used\. -. .P The first element must be in the form package@version, where package is the package name and version is the version number (much like installing a specific version)\. -. .P The second element is the name of the tag to tag this version with\. If this parameter is missing or falsey (empty), the default froom the config will be -used\. For more information about how to set this config, check \fBman 3 npm\-config\fR for programmatic usage or \fBman npm\-config\fR for cli usage\. +used\. For more information about how to set this config, check +\fBman 3 npm\-config\fR for programmatic usage or \fBman npm\-config\fR for cli usage\. + diff --git a/deps/npm/man/man3/npm-test.3 b/deps/npm/man/man3/npm-test.3 index 86aa780ac1c..02f4de01ff5 100644 --- a/deps/npm/man/man3/npm-test.3 +++ b/deps/npm/man/man3/npm-test.3 @@ -1,25 +1,20 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-TEST" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-test\fR \-\- Test a package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-test\fR \- Test a package +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.test(packages, callback) -. -.fi -. -.SH "DESCRIPTION" -This runs a package\'s "test" script, if one was provided\. -. +.EE +.RE +.SH DESCRIPTION +.P +This runs a package's "test" script, if one was provided\. .P To run tests as a condition of installation, set the \fBnpat\fR config to true\. -. .P npm can run tests on multiple packages\. Just specify multiple packages in the \fBpackages\fR parameter\. + diff --git a/deps/npm/man/man3/npm-uninstall.3 b/deps/npm/man/man3/npm-uninstall.3 index 7ae13684231..883deaf4ac6 100644 --- a/deps/npm/man/man3/npm-uninstall.3 +++ b/deps/npm/man/man3/npm-uninstall.3 @@ -1,25 +1,20 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-UNINSTALL" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-uninstall\fR \-\- uninstall a package programmatically -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-uninstall\fR \- uninstall a package programmatically +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.uninstall(packages, callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This acts much the same ways as uninstalling on the command\-line\. -. .P -The \'packages\' parameter is an array of strings\. Each element in the array is +The 'packages' parameter is an array of strings\. Each element in the array is the name of a package to be uninstalled\. -. .P -Finally, \'callback\' is a function that will be called when all packages have been +Finally, 'callback' is a function that will be called when all packages have been uninstalled or when an error has been encountered\. + diff --git a/deps/npm/man/man3/npm-unpublish.3 b/deps/npm/man/man3/npm-unpublish.3 index 63be8506ee7..8420247493c 100644 --- a/deps/npm/man/man3/npm-unpublish.3 +++ b/deps/npm/man/man3/npm-unpublish.3 @@ -1,30 +1,24 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-UNPUBLISH" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-unpublish\fR \-\- Remove a package from the registry -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-unpublish\fR \- Remove a package from the registry +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.unpublish(package, callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This removes a package version from the registry, deleting its entry and removing the tarball\. -. .P The package parameter must be defined\. -. .P Only the first element in the package parameter is used\. If there is no first element, then npm assumes that the package at the current working directory is what is meant\. -. .P If no version is specified, or if all versions are removed then the root package entry is removed from the registry entirely\. + diff --git a/deps/npm/man/man3/npm-update.3 b/deps/npm/man/man3/npm-update.3 index 740038b419b..55fb3d1a37e 100644 --- a/deps/npm/man/man3/npm-update.3 +++ b/deps/npm/man/man3/npm-update.3 @@ -1,18 +1,18 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-UPDATE" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-update\fR \-\- Update a package -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-update\fR \- Update a package +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.update(packages, callback) -. -.fi +.EE +.RE +.TH "DESCRIPTION" "" "September 2014" "" "" +.SH "NAME" +\fBDESCRIPTION\fR +.P 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 'packages' argument is an array of packages to update\. The 'callback' parameter will be called when done or when an error occurs\. + diff --git a/deps/npm/man/man3/npm-version.3 b/deps/npm/man/man3/npm-version.3 index 2c79f3782f6..0cbf79c9094 100644 --- a/deps/npm/man/man3/npm-version.3 +++ b/deps/npm/man/man3/npm-version.3 @@ -1,27 +1,22 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-VERSION" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-version\fR \-\- Bump a package version -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-version\fR \- Bump a package version +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.version(newversion, callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Run this in a package directory to bump the version and write the new data back to the package\.json file\. -. .P If run in a git repo, it will also create a version commit and tag, and fail if the repo is not clean\. -. .P Like all other commands, this function takes a string array as its first parameter\. The difference, however, is this function will fail if it does not have exactly one element\. The only element should be a version number\. + diff --git a/deps/npm/man/man3/npm-view.3 b/deps/npm/man/man3/npm-view.3 index 3e91ce67168..2201f545446 100644 --- a/deps/npm/man/man3/npm-view.3 +++ b/deps/npm/man/man3/npm-view.3 @@ -1,176 +1,131 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-VIEW" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-view\fR \-\- View registry info -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-view\fR \- View registry info +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.view(args, [silent,] callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P This command shows data about a package and prints it to the stream referenced by the \fBoutfd\fR config, which defaults to stdout\. -. .P The "args" parameter is an ordered list that closely resembles the command\-line usage\. The elements should be ordered such that the first element is the package and version (package@version)\. The version is optional\. After that, the rest of the parameters are fields with optional subfields ("field\.subfield") which can be used to get only the information desired from the registry\. -. .P The callback will be passed all of the data returned by the query\. -. .P For example, to get the package registry entry for the \fBconnect\fR package, you can do this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm\.commands\.view(["connect"], callback) -. -.fi -. -.IP "" 0 -. +.EE +.RE .P If no version is specified, "latest" is assumed\. -. .P Field names can be specified after the package descriptor\. For example, to show the dependencies of the \fBronn\fR package at version 0\.3\.5, you could do the following: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm\.commands\.view(["ronn@0\.3\.5", "dependencies"], callback) -. -.fi -. -.IP "" 0 -. +.EE +.RE .P You can view child field by separating them with a period\. To view the git repository URL for the latest version of npm, you could do this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm\.commands\.view(["npm", "repository\.url"], callback) -. -.fi -. -.IP "" 0 -. +.EE +.RE .P For fields that are arrays, requesting a non\-numeric field will return all of the values from the objects in the list\. For example, to get all the contributor names for the "express" project, you can do this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm\.commands\.view(["express", "contributors\.email"], callback) -. -.fi -. -.IP "" 0 -. +.EE +.RE .P You may also use numeric indices in square braces to specifically select an item in an array field\. To just get the email address of the first contributor in the list, you can do this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm\.commands\.view(["express", "contributors[0]\.email"], callback) -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Multiple fields may be specified, and will be printed one after another\. For exampls, to get all the contributor names and email addresses, you can do this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm\.commands\.view(["express", "contributors\.name", "contributors\.email"], callback) -. -.fi -. -.IP "" 0 -. +.EE +.RE .P "Person" fields are shown as a string if they would be shown as an object\. So, for example, this will show the list of npm contributors in the shortened string format\. (See \fBnpm help json\fR for more on this\.) -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm\.commands\.view(["npm", "contributors"], callback) -. -.fi -. -.IP "" 0 -. +.EE +.RE .P If a version range is provided, then data will be printed for every matching version of the package\. This will show which version of jsdom was required by each matching version of yui3: -. -.IP "" 4 -. -.nf -npm\.commands\.view(["yui3@\'>0\.5\.4\'", "dependencies\.jsdom"], callback) -. -.fi -. -.IP "" 0 -. -.SH "OUTPUT" +.P +.RS 2 +.EX +npm\.commands\.view(["yui3@'>0\.5\.4'", "dependencies\.jsdom"], callback) +.EE +.RE +.SH OUTPUT +.P If only a single string field for a single version is output, then it will not be colorized or quoted, so as to enable piping the output to another command\. -. .P If the version range matches multiple versions, than each printed value will be prefixed with the version it applies to\. -. .P If multiple fields are requested, than each of them are prefixed with the field name\. -. .P -Console output can be disabled by setting the \'silent\' parameter to true\. -. -.SH "RETURN VALUE" +Console output can be disabled by setting the 'silent' parameter to true\. +.SH RETURN VALUE +.P The data returned will be an object in this formation: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { : { : , \.\.\. } , \.\.\. } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P corresponding to the list of fields selected\. + diff --git a/deps/npm/man/man3/npm-whoami.3 b/deps/npm/man/man3/npm-whoami.3 index 1a0a43cf51b..272d6b16bfe 100644 --- a/deps/npm/man/man3/npm-whoami.3 +++ b/deps/npm/man/man3/npm-whoami.3 @@ -1,24 +1,19 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-WHOAMI" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm-whoami\fR \-\- Display npm username -. -.SH "SYNOPSIS" -. -.nf +\fBnpm-whoami\fR \- Display npm username +.SH SYNOPSIS +.P +.RS 2 +.EX npm\.commands\.whoami(args, callback) -. -.fi -. -.SH "DESCRIPTION" +.EE +.RE +.SH DESCRIPTION +.P Print the \fBusername\fR config to standard output\. -. .P -\'args\' is never used and callback is never called with data\. -\'args\' must be present or things will break\. -. +\|'args' is never used and callback is never called with data\. +\|'args' must be present or things will break\. .P This function is not useful programmatically + diff --git a/deps/npm/man/man3/npm.3 b/deps/npm/man/man3/npm.3 index e762dc4851f..41103a0c52d 100644 --- a/deps/npm/man/man3/npm.3 +++ b/deps/npm/man/man3/npm.3 @@ -1,162 +1,125 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM" "3" "September 2014" "" "" -. .SH "NAME" -\fBnpm\fR \-\- node package manager -. -.SH "SYNOPSIS" -. -.nf +\fBnpm\fR \- node package manager +.SH SYNOPSIS +.P +.RS 2 +.EX var npm = require("npm") npm\.load([configObject, ]function (er, npm) { - // use the npm object, now that it\'s loaded\. + // use the npm object, now that it's loaded\. + npm\.config\.set(key, val) val = npm\.config\.get(key) + console\.log("prefix = %s", npm\.prefix) + npm\.commands\.install(["package"], cb) }) -. -.fi -. -.SH "VERSION" -1.4.28 -. -.SH "DESCRIPTION" +.EE +.RE +.SH VERSION +.P +2.0.0 +.SH DESCRIPTION +.P This is the API documentation for npm\. To find documentation of the command line client, see npm help \fBnpm\fR\|\. -. .P -Prior to using npm\'s commands, \fBnpm\.load()\fR must be called\. +Prior to using npm's commands, \fBnpm\.load()\fR must be called\. If you provide \fBconfigObject\fR as an object hash of top\-level configs, they override the values stored in the various config locations\. In the npm command line client, this set of configs is parsed from the command line options\. Additional configuration -params are loaded from two configuration files\. See npm help \fBnpm\-config\fR, npm help 7 \fBnpm\-config\fR, and npm help 5 \fBnpmrc\fR for more information\. -. +params are loaded from two configuration files\. See npm help \fBnpm\-config\fR, +npm help 7 \fBnpm\-config\fR, and npm help 5 \fBnpmrc\fR for more information\. .P After that, each of the functions are accessible in the commands object: \fBnpm\.commands\.\fR\|\. See npm help 7 \fBnpm\-index\fR for a list of all possible commands\. -. .P -All commands on the command object take an \fBarray\fR of positional argument \fBstrings\fR\|\. The last argument to any function is a callback\. Some +All commands on the command object take an \fBarray\fR of positional argument +\fBstrings\fR\|\. The last argument to any function is a callback\. Some commands take other optional arguments\. -. .P Configs cannot currently be set on a per function basis, as each call to npm\.config\.set will change the value for \fIall\fR npm commands in that process\. -. .P To find API documentation for a specific command, run the \fBnpm apihelp\fR command\. -. -.SH "METHODS AND PROPERTIES" -. -.IP "\(bu" 4 +.SH METHODS AND PROPERTIES +.RS 0 +.IP \(bu 2 \fBnpm\.load(configs, cb)\fR -. -.IP -Load the configuration params, and call the \fBcb\fR function once the -globalconfig and userconfig files have been loaded as well, or on -nextTick if they\'ve already been loaded\. -. -.IP "\(bu" 4 + Load the configuration params, and call the \fBcb\fR function once the + globalconfig and userconfig files have been loaded as well, or on + nextTick if they've already been loaded\. +.IP \(bu 2 \fBnpm\.config\fR -. -.IP -An object for accessing npm configuration parameters\. -. -.IP "\(bu" 4 + An object for accessing npm configuration parameters\. +.RS 0 +.IP \(bu 2 \fBnpm\.config\.get(key)\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fBnpm\.config\.set(key, val)\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fBnpm\.config\.del(key)\fR -. -.IP "" 0 -. -.IP "\(bu" 4 +.RE +.IP \(bu 2 \fBnpm\.dir\fR or \fBnpm\.root\fR -. -.IP -The \fBnode_modules\fR directory where npm will operate\. -. -.IP "\(bu" 4 + The \fBnode_modules\fR directory where npm will operate\. +.IP \(bu 2 \fBnpm\.prefix\fR -. -.IP -The prefix where npm is operating\. (Most often the current working -directory\.) -. -.IP "\(bu" 4 + The prefix where npm is operating\. (Most often the current working + directory\.) +.IP \(bu 2 \fBnpm\.cache\fR -. -.IP -The place where npm keeps JSON and tarballs it fetches from the -registry (or uploads to the registry)\. -. -.IP "\(bu" 4 + The place where npm keeps JSON and tarballs it fetches from the + registry (or uploads to the registry)\. +.IP \(bu 2 \fBnpm\.tmp\fR -. -.IP -npm\'s temporary working directory\. -. -.IP "\(bu" 4 + npm's temporary working directory\. +.IP \(bu 2 \fBnpm\.deref\fR -. -.IP -Get the "real" name for a command that has either an alias or -abbreviation\. -. -.IP "" 0 -. -.SH "MAGIC" + Get the "real" name for a command that has either an alias or + abbreviation\. + +.RE +.SH MAGIC +.P For each of the methods in the \fBnpm\.commands\fR hash, a method is added to the npm object, which takes a set of positional string arguments rather than an array and a callback\. -. .P If the last argument is a callback, then it will use the supplied callback\. However, if no callback is provided, then it will print out the error or results\. -. .P For example, this would work in a node repl: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX > npm = require("npm") > npm\.load() // wait a sec\.\.\. > npm\.install("dnode", "express") -. -.fi -. -.IP "" 0 -. +.EE +.RE .P -Note that that \fIwon\'t\fR work in a node program, since the \fBinstall\fR +Note that that \fIwon't\fR work in a node program, since the \fBinstall\fR method will get called before the configuration load is completed\. -. -.SH "ABBREVS" -In order to support \fBnpm ins foo\fR instead of \fBnpm install foo\fR, the \fBnpm\.commands\fR object has a set of abbreviations as well as the full +.SH ABBREVS +.P +In order to support \fBnpm ins foo\fR instead of \fBnpm install foo\fR, the +\fBnpm\.commands\fR object has a set of abbreviations as well as the full method names\. Use the \fBnpm\.deref\fR method to find the real name\. -. .P For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX var cmd = npm\.deref("unp") // cmd === "unpublish" -. -.fi -. -.IP "" 0 +.EE +.RE diff --git a/deps/npm/man/man5/npm-folders.5 b/deps/npm/man/man5/npm-folders.5 index d349c1f43a5..4f4d2cc3254 100644 --- a/deps/npm/man/man5/npm-folders.5 +++ b/deps/npm/man/man5/npm-folders.5 @@ -1,141 +1,132 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-FOLDERS" "5" "September 2014" "" "" -. .SH "NAME" -\fBnpm-folders\fR \-\- Folder Structures Used by npm -. -.SH "DESCRIPTION" -npm puts various things on your computer\. That\'s its job\. -. +\fBnpm-folders\fR \- Folder Structures Used by npm +.SH DESCRIPTION +.P +npm puts various things on your computer\. That's its job\. .P This document will tell you what it puts where\. -. -.SS "tl;dr" -. -.IP "\(bu" 4 +.SS tl;dr +.RS 0 +.IP \(bu 2 Local install (default): puts stuff in \fB\|\./node_modules\fR of the current package root\. -. -.IP "\(bu" 4 +.IP \(bu 2 Global install (with \fB\-g\fR): puts stuff in /usr/local or wherever node is installed\. -. -.IP "\(bu" 4 -Install it \fBlocally\fR if you\'re going to \fBrequire()\fR it\. -. -.IP "\(bu" 4 -Install it \fBglobally\fR if you\'re going to run it on the command line\. -. -.IP "\(bu" 4 +.IP \(bu 2 +Install it \fBlocally\fR if you're going to \fBrequire()\fR it\. +.IP \(bu 2 +Install it \fBglobally\fR if you're going to run it on the command line\. +.IP \(bu 2 If you need both, then install it in both places, or use \fBnpm link\fR\|\. -. -.IP "" 0 -. -.SS "prefix Configuration" + +.RE +.SS prefix Configuration +.P The \fBprefix\fR config defaults to the location where node is installed\. On most systems, this is \fB/usr/local\fR, and most of the time is the same -as node\'s \fBprocess\.installPrefix\fR\|\. -. +as node's \fBprocess\.installPrefix\fR\|\. .P On windows, this is the exact location of the node\.exe binary\. On Unix -systems, it\'s one level up, since node is typically installed at \fB{prefix}/bin/node\fR rather than \fB{prefix}/node\.exe\fR\|\. -. +systems, it's one level up, since node is typically installed at +\fB{prefix}/bin/node\fR rather than \fB{prefix}/node\.exe\fR\|\. .P When the \fBglobal\fR flag is set, npm installs things into this prefix\. When it is not set, it uses the root of the current package, or the current working directory if not in a package already\. -. -.SS "Node Modules" +.SS Node Modules +.P Packages are dropped into the \fBnode_modules\fR folder under the \fBprefix\fR\|\. -When installing locally, this means that you can \fBrequire("packagename")\fR to load its main module, or \fBrequire("packagename/lib/path/to/sub/module")\fR to load other modules\. -. +When installing locally, this means that you can +\fBrequire("packagename")\fR to load its main module, or +\fBrequire("packagename/lib/path/to/sub/module")\fR to load other modules\. .P Global installs on Unix systems go to \fB{prefix}/lib/node_modules\fR\|\. -Global installs on Windows go to \fB{prefix}/node_modules\fR (that is, no \fBlib\fR folder\.) -. +Global installs on Windows go to \fB{prefix}/node_modules\fR (that is, no +\fBlib\fR folder\.) +.P +Scoped packages are installed the same way, except they are grouped together +in a sub\-folder of the relevant \fBnode_modules\fR folder with the name of that +scope prefix by the @ symbol, e\.g\. \fBnpm install @myorg/package\fR would place +the package in \fB{prefix}/node_modules/@myorg/package\fR\|\. See npm help 7 \fBscopes\fR for +more details\. .P If you wish to \fBrequire()\fR a package, then install it locally\. -. -.SS "Executables" +.SS Executables +.P When in global mode, executables are linked into \fB{prefix}/bin\fR on Unix, or directly into \fB{prefix}\fR on Windows\. -. .P -When in local mode, executables are linked into \fB\|\./node_modules/\.bin\fR so that they can be made available to scripts run +When in local mode, executables are linked into +\fB\|\./node_modules/\.bin\fR so that they can be made available to scripts run through npm\. (For example, so that a test runner will be in the path when you run \fBnpm test\fR\|\.) -. -.SS "Man Pages" +.SS Man Pages +.P When in global mode, man pages are linked into \fB{prefix}/share/man\fR\|\. -. .P When in local mode, man pages are not installed\. -. .P Man pages are not installed on Windows systems\. -. -.SS "Cache" -See npm help \fBnpm\-cache\fR\|\. Cache files are stored in \fB~/\.npm\fR on Posix, or \fB~/npm\-cache\fR on Windows\. -. +.SS Cache +.P +See npm help \fBnpm\-cache\fR\|\. Cache files are stored in \fB~/\.npm\fR on Posix, or +\fB~/npm\-cache\fR on Windows\. .P This is controlled by the \fBcache\fR configuration param\. -. -.SS "Temp Files" -Temporary files are stored by default in the folder specified by the \fBtmp\fR config, which defaults to the TMPDIR, TMP, or TEMP environment +.SS Temp Files +.P +Temporary files are stored by default in the folder specified by the +\fBtmp\fR config, which defaults to the TMPDIR, TMP, or TEMP environment variables, or \fB/tmp\fR on Unix and \fBc:\\windows\\temp\fR on Windows\. -. .P Temp files are given a unique folder under this root for each run of the program, and are deleted upon successful exit\. -. -.SH "More Information" -When installing locally, npm first tries to find an appropriate \fBprefix\fR folder\. This is so that \fBnpm install foo@1\.2\.3\fR will install +.SH More Information +.P +When installing locally, npm first tries to find an appropriate +\fBprefix\fR folder\. This is so that \fBnpm install foo@1\.2\.3\fR will install to the sensible root of your package, even if you happen to have \fBcd\fRed into some other folder\. -. .P Starting at the $PWD, npm will walk up the folder tree checking for a folder that contains either a \fBpackage\.json\fR file, or a \fBnode_modules\fR folder\. If such a thing is found, then that is treated as the effective "current directory" for the purpose of running npm commands\. (This -behavior is inspired by and similar to git\'s \.git\-folder seeking +behavior is inspired by and similar to git's \.git\-folder seeking logic when running git commands in a working dir\.) -. .P If no package root is found, then the current folder is used\. -. .P When you run \fBnpm install foo@1\.2\.3\fR, then the package is loaded into the cache, and then unpacked into \fB\|\./node_modules/foo\fR\|\. Then, any of -foo\'s dependencies are similarly unpacked into \fB\|\./node_modules/foo/node_modules/\.\.\.\fR\|\. -. +foo's dependencies are similarly unpacked into +\fB\|\./node_modules/foo/node_modules/\.\.\.\fR\|\. .P Any bin files are symlinked to \fB\|\./node_modules/\.bin/\fR, so that they may be found by npm scripts when necessary\. -. -.SS "Global Installation" +.SS Global Installation +.P If the \fBglobal\fR configuration is set to true, then npm will install packages "globally"\. -. .P For global installation, packages are installed roughly the same way, but using the folders described above\. -. -.SS "Cycles, Conflicts, and Folder Parsimony" -Cycles are handled using the property of node\'s module system that it +.SS Cycles, Conflicts, and Folder Parsimony +.P +Cycles are handled using the property of node's module system that it walks up the directories looking for \fBnode_modules\fR folders\. So, at every stage, if a package is already installed in an ancestor \fBnode_modules\fR folder, then it is not installed at the current location\. -. .P Consider the case above, where \fBfoo \-> bar \-> baz\fR\|\. Imagine if, in -addition to that, baz depended on bar, so you\'d have: \fBfoo \-> bar \-> baz \-> bar \-> baz \.\.\.\fR\|\. However, since the folder -structure is: \fBfoo/node_modules/bar/node_modules/baz\fR, there\'s no need to +addition to that, baz depended on bar, so you'd have: +\fBfoo \-> bar \-> baz \-> bar \-> baz \.\.\.\fR\|\. However, since the folder +structure is: \fBfoo/node_modules/bar/node_modules/baz\fR, there's no need to put another copy of bar into \fB\|\.\.\./baz/node_modules\fR, since when it calls -require("bar"), it will get the copy that is installed in \fBfoo/node_modules/bar\fR\|\. -. +require("bar"), it will get the copy that is installed in +\fBfoo/node_modules/bar\fR\|\. .P This shortcut is only used if the exact same version would be installed in multiple nested \fBnode_modules\fR folders\. It @@ -143,17 +134,15 @@ is still possible to have \fBa/node_modules/b/node_modules/a\fR if the two "a" packages are different versions\. However, without repeating the exact same package multiple times, an infinite regress will always be prevented\. -. .P Another optimization can be made by installing dependencies at the highest level possible, below the localized "target" folder\. -. -.SS "\fIExample\fR" +.SS Example +.P Consider this dependency graph: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX foo +\-\- blerg@1\.2\.5 +\-\- bar@1\.2\.3 @@ -165,17 +154,13 @@ foo `\-\- baz@1\.2\.3 `\-\- quux@3\.x `\-\- bar -. -.fi -. -.IP "" 0 -. +.EE +.RE .P In this case, we might expect a folder structure like this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX foo +\-\- node_modules +\-\- blerg (1\.2\.5) <\-\-\-[A] @@ -188,77 +173,59 @@ foo `\-\- baz (1\.2\.3) <\-\-\-[D] `\-\- node_modules `\-\- quux (3\.2\.0) <\-\-\-[E] -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Since foo depends directly on \fBbar@1\.2\.3\fR and \fBbaz@1\.2\.3\fR, those are -installed in foo\'s \fBnode_modules\fR folder\. -. +installed in foo's \fBnode_modules\fR folder\. .P Even though the latest copy of blerg is 1\.3\.7, foo has a specific dependency on version 1\.2\.5\. So, that gets installed at [A]\. Since the -parent installation of blerg satisfies bar\'s dependency on \fBblerg@1\.x\fR, +parent installation of blerg satisfies bar's dependency on \fBblerg@1\.x\fR, it does not install another copy under [B]\. -. .P Bar [B] also has dependencies on baz and asdf, so those are installed in -bar\'s \fBnode_modules\fR folder\. Because it depends on \fBbaz@2\.x\fR, it cannot +bar's \fBnode_modules\fR folder\. Because it depends on \fBbaz@2\.x\fR, it cannot re\-use the \fBbaz@1\.2\.3\fR installed in the parent \fBnode_modules\fR folder [D], and must install its own copy [C]\. -. .P Underneath bar, the \fBbaz \-> quux \-> bar\fR dependency creates a cycle\. -However, because bar is already in quux\'s ancestry [B], it does not +However, because bar is already in quux's ancestry [B], it does not unpack another copy of bar into that folder\. -. .P -Underneath \fBfoo \-> baz\fR [D], quux\'s [E] folder tree is empty, because its +Underneath \fBfoo \-> baz\fR [D], quux's [E] folder tree is empty, because its dependency on bar is satisfied by the parent folder copy installed at [B]\. -. .P For a graphical breakdown of what is installed where, use \fBnpm ls\fR\|\. -. -.SS "Publishing" +.SS Publishing +.P Upon publishing, npm will look in the \fBnode_modules\fR folder\. If any of the items there are not in the \fBbundledDependencies\fR array, then they will not be included in the package tarball\. -. .P This allows a package maintainer to install all of their dependencies (and dev dependencies) locally, but only re\-publish those items that cannot be found elsewhere\. See npm help 5 \fBpackage\.json\fR for more information\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 7 faq -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 package\.json -. -.IP "\(bu" 4 +.IP \(bu 2 npm help install -. -.IP "\(bu" 4 +.IP \(bu 2 npm help pack -. -.IP "\(bu" 4 +.IP \(bu 2 npm help cache -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help publish -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man5/npm-global.5 b/deps/npm/man/man5/npm-global.5 index d349c1f43a5..4f4d2cc3254 100644 --- a/deps/npm/man/man5/npm-global.5 +++ b/deps/npm/man/man5/npm-global.5 @@ -1,141 +1,132 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-FOLDERS" "5" "September 2014" "" "" -. .SH "NAME" -\fBnpm-folders\fR \-\- Folder Structures Used by npm -. -.SH "DESCRIPTION" -npm puts various things on your computer\. That\'s its job\. -. +\fBnpm-folders\fR \- Folder Structures Used by npm +.SH DESCRIPTION +.P +npm puts various things on your computer\. That's its job\. .P This document will tell you what it puts where\. -. -.SS "tl;dr" -. -.IP "\(bu" 4 +.SS tl;dr +.RS 0 +.IP \(bu 2 Local install (default): puts stuff in \fB\|\./node_modules\fR of the current package root\. -. -.IP "\(bu" 4 +.IP \(bu 2 Global install (with \fB\-g\fR): puts stuff in /usr/local or wherever node is installed\. -. -.IP "\(bu" 4 -Install it \fBlocally\fR if you\'re going to \fBrequire()\fR it\. -. -.IP "\(bu" 4 -Install it \fBglobally\fR if you\'re going to run it on the command line\. -. -.IP "\(bu" 4 +.IP \(bu 2 +Install it \fBlocally\fR if you're going to \fBrequire()\fR it\. +.IP \(bu 2 +Install it \fBglobally\fR if you're going to run it on the command line\. +.IP \(bu 2 If you need both, then install it in both places, or use \fBnpm link\fR\|\. -. -.IP "" 0 -. -.SS "prefix Configuration" + +.RE +.SS prefix Configuration +.P The \fBprefix\fR config defaults to the location where node is installed\. On most systems, this is \fB/usr/local\fR, and most of the time is the same -as node\'s \fBprocess\.installPrefix\fR\|\. -. +as node's \fBprocess\.installPrefix\fR\|\. .P On windows, this is the exact location of the node\.exe binary\. On Unix -systems, it\'s one level up, since node is typically installed at \fB{prefix}/bin/node\fR rather than \fB{prefix}/node\.exe\fR\|\. -. +systems, it's one level up, since node is typically installed at +\fB{prefix}/bin/node\fR rather than \fB{prefix}/node\.exe\fR\|\. .P When the \fBglobal\fR flag is set, npm installs things into this prefix\. When it is not set, it uses the root of the current package, or the current working directory if not in a package already\. -. -.SS "Node Modules" +.SS Node Modules +.P Packages are dropped into the \fBnode_modules\fR folder under the \fBprefix\fR\|\. -When installing locally, this means that you can \fBrequire("packagename")\fR to load its main module, or \fBrequire("packagename/lib/path/to/sub/module")\fR to load other modules\. -. +When installing locally, this means that you can +\fBrequire("packagename")\fR to load its main module, or +\fBrequire("packagename/lib/path/to/sub/module")\fR to load other modules\. .P Global installs on Unix systems go to \fB{prefix}/lib/node_modules\fR\|\. -Global installs on Windows go to \fB{prefix}/node_modules\fR (that is, no \fBlib\fR folder\.) -. +Global installs on Windows go to \fB{prefix}/node_modules\fR (that is, no +\fBlib\fR folder\.) +.P +Scoped packages are installed the same way, except they are grouped together +in a sub\-folder of the relevant \fBnode_modules\fR folder with the name of that +scope prefix by the @ symbol, e\.g\. \fBnpm install @myorg/package\fR would place +the package in \fB{prefix}/node_modules/@myorg/package\fR\|\. See npm help 7 \fBscopes\fR for +more details\. .P If you wish to \fBrequire()\fR a package, then install it locally\. -. -.SS "Executables" +.SS Executables +.P When in global mode, executables are linked into \fB{prefix}/bin\fR on Unix, or directly into \fB{prefix}\fR on Windows\. -. .P -When in local mode, executables are linked into \fB\|\./node_modules/\.bin\fR so that they can be made available to scripts run +When in local mode, executables are linked into +\fB\|\./node_modules/\.bin\fR so that they can be made available to scripts run through npm\. (For example, so that a test runner will be in the path when you run \fBnpm test\fR\|\.) -. -.SS "Man Pages" +.SS Man Pages +.P When in global mode, man pages are linked into \fB{prefix}/share/man\fR\|\. -. .P When in local mode, man pages are not installed\. -. .P Man pages are not installed on Windows systems\. -. -.SS "Cache" -See npm help \fBnpm\-cache\fR\|\. Cache files are stored in \fB~/\.npm\fR on Posix, or \fB~/npm\-cache\fR on Windows\. -. +.SS Cache +.P +See npm help \fBnpm\-cache\fR\|\. Cache files are stored in \fB~/\.npm\fR on Posix, or +\fB~/npm\-cache\fR on Windows\. .P This is controlled by the \fBcache\fR configuration param\. -. -.SS "Temp Files" -Temporary files are stored by default in the folder specified by the \fBtmp\fR config, which defaults to the TMPDIR, TMP, or TEMP environment +.SS Temp Files +.P +Temporary files are stored by default in the folder specified by the +\fBtmp\fR config, which defaults to the TMPDIR, TMP, or TEMP environment variables, or \fB/tmp\fR on Unix and \fBc:\\windows\\temp\fR on Windows\. -. .P Temp files are given a unique folder under this root for each run of the program, and are deleted upon successful exit\. -. -.SH "More Information" -When installing locally, npm first tries to find an appropriate \fBprefix\fR folder\. This is so that \fBnpm install foo@1\.2\.3\fR will install +.SH More Information +.P +When installing locally, npm first tries to find an appropriate +\fBprefix\fR folder\. This is so that \fBnpm install foo@1\.2\.3\fR will install to the sensible root of your package, even if you happen to have \fBcd\fRed into some other folder\. -. .P Starting at the $PWD, npm will walk up the folder tree checking for a folder that contains either a \fBpackage\.json\fR file, or a \fBnode_modules\fR folder\. If such a thing is found, then that is treated as the effective "current directory" for the purpose of running npm commands\. (This -behavior is inspired by and similar to git\'s \.git\-folder seeking +behavior is inspired by and similar to git's \.git\-folder seeking logic when running git commands in a working dir\.) -. .P If no package root is found, then the current folder is used\. -. .P When you run \fBnpm install foo@1\.2\.3\fR, then the package is loaded into the cache, and then unpacked into \fB\|\./node_modules/foo\fR\|\. Then, any of -foo\'s dependencies are similarly unpacked into \fB\|\./node_modules/foo/node_modules/\.\.\.\fR\|\. -. +foo's dependencies are similarly unpacked into +\fB\|\./node_modules/foo/node_modules/\.\.\.\fR\|\. .P Any bin files are symlinked to \fB\|\./node_modules/\.bin/\fR, so that they may be found by npm scripts when necessary\. -. -.SS "Global Installation" +.SS Global Installation +.P If the \fBglobal\fR configuration is set to true, then npm will install packages "globally"\. -. .P For global installation, packages are installed roughly the same way, but using the folders described above\. -. -.SS "Cycles, Conflicts, and Folder Parsimony" -Cycles are handled using the property of node\'s module system that it +.SS Cycles, Conflicts, and Folder Parsimony +.P +Cycles are handled using the property of node's module system that it walks up the directories looking for \fBnode_modules\fR folders\. So, at every stage, if a package is already installed in an ancestor \fBnode_modules\fR folder, then it is not installed at the current location\. -. .P Consider the case above, where \fBfoo \-> bar \-> baz\fR\|\. Imagine if, in -addition to that, baz depended on bar, so you\'d have: \fBfoo \-> bar \-> baz \-> bar \-> baz \.\.\.\fR\|\. However, since the folder -structure is: \fBfoo/node_modules/bar/node_modules/baz\fR, there\'s no need to +addition to that, baz depended on bar, so you'd have: +\fBfoo \-> bar \-> baz \-> bar \-> baz \.\.\.\fR\|\. However, since the folder +structure is: \fBfoo/node_modules/bar/node_modules/baz\fR, there's no need to put another copy of bar into \fB\|\.\.\./baz/node_modules\fR, since when it calls -require("bar"), it will get the copy that is installed in \fBfoo/node_modules/bar\fR\|\. -. +require("bar"), it will get the copy that is installed in +\fBfoo/node_modules/bar\fR\|\. .P This shortcut is only used if the exact same version would be installed in multiple nested \fBnode_modules\fR folders\. It @@ -143,17 +134,15 @@ is still possible to have \fBa/node_modules/b/node_modules/a\fR if the two "a" packages are different versions\. However, without repeating the exact same package multiple times, an infinite regress will always be prevented\. -. .P Another optimization can be made by installing dependencies at the highest level possible, below the localized "target" folder\. -. -.SS "\fIExample\fR" +.SS Example +.P Consider this dependency graph: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX foo +\-\- blerg@1\.2\.5 +\-\- bar@1\.2\.3 @@ -165,17 +154,13 @@ foo `\-\- baz@1\.2\.3 `\-\- quux@3\.x `\-\- bar -. -.fi -. -.IP "" 0 -. +.EE +.RE .P In this case, we might expect a folder structure like this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX foo +\-\- node_modules +\-\- blerg (1\.2\.5) <\-\-\-[A] @@ -188,77 +173,59 @@ foo `\-\- baz (1\.2\.3) <\-\-\-[D] `\-\- node_modules `\-\- quux (3\.2\.0) <\-\-\-[E] -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Since foo depends directly on \fBbar@1\.2\.3\fR and \fBbaz@1\.2\.3\fR, those are -installed in foo\'s \fBnode_modules\fR folder\. -. +installed in foo's \fBnode_modules\fR folder\. .P Even though the latest copy of blerg is 1\.3\.7, foo has a specific dependency on version 1\.2\.5\. So, that gets installed at [A]\. Since the -parent installation of blerg satisfies bar\'s dependency on \fBblerg@1\.x\fR, +parent installation of blerg satisfies bar's dependency on \fBblerg@1\.x\fR, it does not install another copy under [B]\. -. .P Bar [B] also has dependencies on baz and asdf, so those are installed in -bar\'s \fBnode_modules\fR folder\. Because it depends on \fBbaz@2\.x\fR, it cannot +bar's \fBnode_modules\fR folder\. Because it depends on \fBbaz@2\.x\fR, it cannot re\-use the \fBbaz@1\.2\.3\fR installed in the parent \fBnode_modules\fR folder [D], and must install its own copy [C]\. -. .P Underneath bar, the \fBbaz \-> quux \-> bar\fR dependency creates a cycle\. -However, because bar is already in quux\'s ancestry [B], it does not +However, because bar is already in quux's ancestry [B], it does not unpack another copy of bar into that folder\. -. .P -Underneath \fBfoo \-> baz\fR [D], quux\'s [E] folder tree is empty, because its +Underneath \fBfoo \-> baz\fR [D], quux's [E] folder tree is empty, because its dependency on bar is satisfied by the parent folder copy installed at [B]\. -. .P For a graphical breakdown of what is installed where, use \fBnpm ls\fR\|\. -. -.SS "Publishing" +.SS Publishing +.P Upon publishing, npm will look in the \fBnode_modules\fR folder\. If any of the items there are not in the \fBbundledDependencies\fR array, then they will not be included in the package tarball\. -. .P This allows a package maintainer to install all of their dependencies (and dev dependencies) locally, but only re\-publish those items that cannot be found elsewhere\. See npm help 5 \fBpackage\.json\fR for more information\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 7 faq -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 package\.json -. -.IP "\(bu" 4 +.IP \(bu 2 npm help install -. -.IP "\(bu" 4 +.IP \(bu 2 npm help pack -. -.IP "\(bu" 4 +.IP \(bu 2 npm help cache -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help publish -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man5/npm-json.5 b/deps/npm/man/man5/npm-json.5 index 8233dc17315..8ab713ccc0c 100644 --- a/deps/npm/man/man5/npm-json.5 +++ b/deps/npm/man/man5/npm-json.5 @@ -1,466 +1,385 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "PACKAGE\.JSON" "5" "September 2014" "" "" -. .SH "NAME" -\fBpackage.json\fR \-\- Specifics of npm\'s package\.json handling -. -.SH "DESCRIPTION" -This document is all you need to know about what\'s required in your package\.json +\fBpackage.json\fR \- Specifics of npm's package\.json handling +.SH DESCRIPTION +.P +This document is all you need to know about what's required in your package\.json file\. It must be actual JSON, not just a JavaScript object literal\. -. .P A lot of the behavior described in this document is affected by the config settings described in npm help 7 \fBnpm\-config\fR\|\. -. -.SH "name" +.SH name +.P The \fImost\fR important things in your package\.json are the name and version fields\. -Those are actually required, and your package won\'t install without +Those are actually required, and your package won't install without them\. The name and version together form an identifier that is assumed to be completely unique\. Changes to the package should come along with changes to the version\. -. .P The name is what your thing is called\. Some tips: -. -.IP "\(bu" 4 -Don\'t put "js" or "node" in the name\. It\'s assumed that it\'s js, since you\'re +.RS 0 +.IP \(bu 2 +Don't put "js" or "node" in the name\. It's assumed that it's js, since you're writing a package\.json file, and you can specify the engine using the "engines" field\. (See below\.) -. -.IP "\(bu" 4 +.IP \(bu 2 The name ends up being part of a URL, an argument on the command line, and a folder name\. Any name with non\-url\-safe characters will be rejected\. -Also, it can\'t start with a dot or an underscore\. -. -.IP "\(bu" 4 +Also, it can't start with a dot or an underscore\. +.IP \(bu 2 The name will probably be passed as an argument to require(), so it should be something short, but also reasonably descriptive\. -. -.IP "\(bu" 4 -You may want to check the npm registry to see if there\'s something by that name +.IP \(bu 2 +You may want to check the npm registry to see if there's something by that name already, before you get too attached to it\. http://registry\.npmjs\.org/ -. -.IP "" 0 -. -.SH "version" + +.RE +.P +A name can be optionally prefixed by a scope, e\.g\. \fB@myorg/mypackage\fR\|\. See +npm help 7 \fBnpm\-scope\fR for more detail\. +.SH version +.P The \fImost\fR important things in your package\.json are the name and version fields\. -Those are actually required, and your package won\'t install without +Those are actually required, and your package won't install without them\. The name and version together form an identifier that is assumed to be completely unique\. Changes to the package should come along with changes to the version\. -. .P -Version must be parseable by node\-semver \fIhttps://github\.com/isaacs/node\-semver\fR, which is bundled +Version must be parseable by +node\-semver \fIhttps://github\.com/isaacs/node\-semver\fR, which is bundled with npm as a dependency\. (\fBnpm install semver\fR to use it yourself\.) -. .P More on version numbers and ranges at npm help 7 semver\. -. -.SH "description" -Put a description in it\. It\'s a string\. This helps people discover your -package, as it\'s listed in \fBnpm search\fR\|\. -. -.SH "keywords" -Put keywords in it\. It\'s an array of strings\. This helps people -discover your package as it\'s listed in \fBnpm search\fR\|\. -. -.SH "homepage" +.SH description +.P +Put a description in it\. It's a string\. This helps people discover your +package, as it's listed in \fBnpm search\fR\|\. +.SH keywords +.P +Put keywords in it\. It's an array of strings\. This helps people +discover your package as it's listed in \fBnpm search\fR\|\. +.SH homepage +.P The url to the project homepage\. -. .P \fBNOTE\fR: This is \fInot\fR the same as "url"\. If you put a "url" field, -then the registry will think it\'s a redirection to your package that has +then the registry will think it's a redirection to your package that has been published somewhere else, and spit at you\. -. .P -Literally\. Spit\. I\'m so not kidding\. -. -.SH "bugs" -The url to your project\'s issue tracker and / or the email address to which +Literally\. Spit\. I'm so not kidding\. +.SH bugs +.P +The url to your project's issue tracker and / or the email address to which issues should be reported\. These are helpful for people who encounter issues with your package\. -. .P It should look like this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "url" : "http://github\.com/owner/project/issues" , "email" : "project@hostname\.com" } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P You can specify either one or both values\. If you want to provide only a url, you can specify the value for "bugs" as a simple string instead of an object\. -. .P If a url is provided, it will be used by the \fBnpm bugs\fR command\. -. -.SH "license" +.SH license +.P You should specify a license for your package so that people know how they are -permitted to use it, and any restrictions you\'re placing on it\. -. +permitted to use it, and any restrictions you're placing on it\. .P -The simplest way, assuming you\'re using a common license such as BSD\-3\-Clause -or MIT, is to just specify the standard SPDX ID of the license you\'re using, +The simplest way, assuming you're using a common license such as BSD\-3\-Clause +or MIT, is to just specify the standard SPDX ID of the license you're using, like this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "license" : "BSD\-3\-Clause" } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P You can check the full list of SPDX license IDs \fIhttps://spdx\.org/licenses/\fR\|\. -Ideally you should pick one that is OSI \fIhttp://opensource\.org/licenses/alphabetical\fR approved\. -. +Ideally you should pick one that is +OSI \fIhttp://opensource\.org/licenses/alphabetical\fR approved\. .P -It\'s also a good idea to include a LICENSE file at the top level in +It's also a good idea to include a LICENSE file at the top level in your package\. -. -.SH "people fields: author, contributors" +.SH people fields: author, contributors +.P The "author" is one person\. "contributors" is an array of people\. A "person" is an object with a "name" field and optionally "url" and "email", like this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name" : "Barney Rubble" , "email" : "b@rubble\.com" , "url" : "http://barnyrubble\.tumblr\.com/" } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Or you can shorten that all into a single string, and npm will parse it for you: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX "Barney Rubble (http://barnyrubble\.tumblr\.com/) -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Both email and url are optional either way\. -. .P npm also sets a top\-level "maintainers" field with your npm user info\. -. -.SH "files" +.SH files +.P The "files" field is an array of files to include in your project\. If you name a folder in the array, then it will also include the files inside that folder\. (Unless they would be ignored by another rule\.) -. .P You can also provide a "\.npmignore" file in the root of your package, which will keep files from being included, even if they would be picked up by the files array\. The "\.npmignore" file works just like a "\.gitignore"\. -. -.SH "main" +.SH main +.P The main field is a module ID that is the primary entry point to your program\. -That is, if your package is named \fBfoo\fR, and a user installs it, and then does \fBrequire("foo")\fR, then your main module\'s exports object will be returned\. -. +That is, if your package is named \fBfoo\fR, and a user installs it, and then does +\fBrequire("foo")\fR, then your main module's exports object will be returned\. .P This should be a module ID relative to the root of your package folder\. -. .P For most modules, it makes the most sense to have a main script and often not much else\. -. -.SH "bin" -A lot of packages have one or more executable files that they\'d like to +.SH bin +.P +A lot of packages have one or more executable files that they'd like to install into the PATH\. npm makes this pretty easy (in fact, it uses this feature to install the "npm" executable\.) -. .P To use this, supply a \fBbin\fR field in your package\.json which is a map of -command name to local file name\. On install, npm will symlink that file into \fBprefix/bin\fR for global installs, or \fB\|\./node_modules/\.bin/\fR for local +command name to local file name\. On install, npm will symlink that file into +\fBprefix/bin\fR for global installs, or \fB\|\./node_modules/\.bin/\fR for local installs\. -. .P For example, npm has this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "bin" : { "npm" : "\./cli\.js" } } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P -So, when you install npm, it\'ll create a symlink from the \fBcli\.js\fR script to \fB/usr/local/bin/npm\fR\|\. -. +So, when you install npm, it'll create a symlink from the \fBcli\.js\fR script to +\fB/usr/local/bin/npm\fR\|\. .P If you have a single executable, and its name should be the name of the package, then you can just supply it as a string\. For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name": "my\-program" , "version": "1\.2\.5" , "bin": "\./path/to/program" } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P would be the same as this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name": "my\-program" , "version": "1\.2\.5" , "bin" : { "my\-program" : "\./path/to/program" } } -. -.fi -. -.IP "" 0 -. -.SH "man" -Specify either a single file or an array of filenames to put in place for the \fBman\fR program to find\. -. -.P -If only a single file is provided, then it\'s installed such that it is the +.EE +.RE +.SH man +.P +Specify either a single file or an array of filenames to put in place for the +\fBman\fR program to find\. +.P +If only a single file is provided, then it's installed such that it is the result from \fBman \fR, regardless of its actual filename\. For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name" : "foo" , "version" : "1\.2\.3" , "description" : "A packaged foo fooer for fooing foos" , "main" : "foo\.js" , "man" : "\./man/doc\.1" } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P would link the \fB\|\./man/doc\.1\fR file in such that it is the target for \fBman foo\fR -. .P -If the filename doesn\'t start with the package name, then it\'s prefixed\. +If the filename doesn't start with the package name, then it's prefixed\. So, this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name" : "foo" , "version" : "1\.2\.3" , "description" : "A packaged foo fooer for fooing foos" , "main" : "foo\.js" , "man" : [ "\./man/foo\.1", "\./man/bar\.1" ] } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P will create files to do \fBman foo\fR and \fBman foo\-bar\fR\|\. -. .P Man files must end with a number, and optionally a \fB\|\.gz\fR suffix if they are compressed\. The number dictates which man section the file is installed into\. -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name" : "foo" , "version" : "1\.2\.3" , "description" : "A packaged foo fooer for fooing foos" , "main" : "foo\.js" , "man" : [ "\./man/foo\.1", "\./man/foo\.2" ] } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P will create entries for \fBman foo\fR and \fBman 2 foo\fR -. -.SH "directories" +.SH directories +.P The CommonJS Packages \fIhttp://wiki\.commonjs\.org/wiki/Packages/1\.0\fR spec details a few ways that you can indicate the structure of your package using a \fBdirectories\fR -hash\. If you look at npm\'s package\.json \fIhttp://registry\.npmjs\.org/npm/latest\fR, -you\'ll see that it has directories for doc, lib, and man\. -. +hash\. If you look at npm's package\.json \fIhttp://registry\.npmjs\.org/npm/latest\fR, +you'll see that it has directories for doc, lib, and man\. .P In the future, this information may be used in other creative ways\. -. -.SS "directories\.lib" +.SS directories\.lib +.P Tell people where the bulk of your library is\. Nothing special is done -with the lib folder in any way, but it\'s useful meta info\. -. -.SS "directories\.bin" +with the lib folder in any way, but it's useful meta info\. +.SS directories\.bin +.P If you specify a "bin" directory, then all the files in that folder will be used as the "bin" hash\. -. .P If you have a "bin" hash already, then this has no effect\. -. -.SS "directories\.man" +.SS directories\.man +.P A folder that is full of man pages\. Sugar to generate a "man" array by walking the folder\. -. -.SS "directories\.doc" +.SS directories\.doc +.P Put markdown files in here\. Eventually, these will be displayed nicely, maybe, someday\. -. -.SS "directories\.example" +.SS directories\.example +.P Put example scripts in here\. Someday, it might be exposed in some clever way\. -. -.SH "repository" +.SH repository +.P Specify the place where your code lives\. This is helpful for people who want to contribute\. If the git repo is on github, then the \fBnpm docs\fR command will be able to find you\. -. .P Do it like this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX "repository" : { "type" : "git" , "url" : "http://github\.com/npm/npm\.git" } + "repository" : { "type" : "svn" , "url" : "http://v8\.googlecode\.com/svn/trunk/" } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P The URL should be a publicly available (perhaps read\-only) url that can be handed directly to a VCS program without any modification\. It should not be a url to an -html project page that you put in your browser\. It\'s for computers\. -. -.SH "scripts" +html project page that you put in your browser\. It's for computers\. +.SH scripts +.P The "scripts" member is an object hash of script commands that are run at various times in the lifecycle of your package\. The key is the lifecycle event, and the value is the command to run at that point\. -. .P See npm help 7 \fBnpm\-scripts\fR to find out more about writing package scripts\. -. -.SH "config" +.SH config +.P A "config" hash can be used to set configuration parameters used in package scripts that persist across upgrades\. For instance, if a package had the following: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name" : "foo" , "config" : { "port" : "8080" } } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P -and then had a "start" command that then referenced the \fBnpm_package_config_port\fR environment variable, then the user could +and then had a "start" command that then referenced the +\fBnpm_package_config_port\fR environment variable, then the user could override that by doing \fBnpm config set foo:port 8001\fR\|\. -. .P See npm help 7 \fBnpm\-config\fR and npm help 7 \fBnpm\-scripts\fR for more on package configs\. -. -.SH "dependencies" +.SH dependencies +.P Dependencies are specified with a simple hash of package name to version range\. The version range is a string which has one or more space\-separated descriptors\. Dependencies can also be identified with a tarball or git URL\. -. .P -\fBPlease do not put test harnesses or transpilers in your \fBdependencies\fR hash\.\fR See \fBdevDependencies\fR, below\. -. +\fBPlease do not put test harnesses or transpilers in your +\fBdependencies\fR hash\.\fR See \fBdevDependencies\fR, below\. .P See npm help 7 semver for more details about specifying version ranges\. -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 \fBversion\fR Must match \fBversion\fR exactly -. -.IP "\(bu" 4 +.IP \(bu 2 \fB>version\fR Must be greater than \fBversion\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB>=version\fR etc -. -.IP "\(bu" 4 +.IP \(bu 2 \fB=version1 <=version2\fR\|\. -. -.IP "\(bu" 4 +.IP \(bu 2 \fBrange1 || range2\fR Passes if either range1 or range2 are satisfied\. -. -.IP "\(bu" 4 -\fBgit\.\.\.\fR See \'Git URLs as Dependencies\' below -. -.IP "\(bu" 4 -\fBuser/repo\fR See \'GitHub URLs\' below -. -.IP "" 0 -. +.IP \(bu 2 +\fBgit\.\.\.\fR See 'Git URLs as Dependencies' below +.IP \(bu 2 +\fBuser/repo\fR See 'GitHub URLs' below +.IP \(bu 2 +\fBtag\fR A specific version tagged and published as \fBtag\fR See npm help \fBnpm\-tag\fR +.IP \(bu 2 +\fBpath/path/path\fR See Local Paths below + +.RE .P For example, these are all valid: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "dependencies" : { "foo" : "1\.0\.0 \- 2\.9999\.9999" , "bar" : ">=1\.0\.2 <2\.1\.2" @@ -472,46 +391,40 @@ For example, these are all valid: , "elf" : "~1\.2\.3" , "two" : "2\.x" , "thr" : "3\.3\.x" + , "lat" : "latest" + , "dyl" : "~/projects/dyl" } } -. -.fi -. -.IP "" 0 -. -.SS "URLs as Dependencies" +.EE +.RE +.SS URLs as Dependencies +.P You may specify a tarball URL in place of a version range\. -. .P This tarball will be downloaded and installed locally to your package at install time\. -. -.SS "Git URLs as Dependencies" +.SS Git URLs as Dependencies +.P Git urls can be of the form: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX git://github\.com/user/project\.git#commit\-ish git+ssh://user@hostname:project\.git#commit\-ish git+ssh://user@hostname/project\.git#commit\-ish git+http://user@hostname/project/blah\.git#commit\-ish git+https://user@hostname/project/blah\.git#commit\-ish -. -.fi -. -.IP "" 0 -. +.EE +.RE .P The \fBcommit\-ish\fR can be any tag, sha, or branch which can be supplied as an argument to \fBgit checkout\fR\|\. The default is \fBmaster\fR\|\. -. -.SH "GitHub URLs" +.SH GitHub URLs +.P As of version 1\.1\.65, you can refer to GitHub urls as just "foo": "user/foo\-project"\. For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name": "foo", "version": "0\.0\.0", @@ -519,35 +432,47 @@ As of version 1\.1\.65, you can refer to GitHub urls as just "foo": "user/foo\-p "express": "visionmedia/express" } } -. -.fi -. -.IP "" 0 -. -.SH "devDependencies" +.EE +.RE +.SH Local Paths +.P +As of version 2\.0\.0 you can provide a path to a local directory that +contains a package\. Local paths can be in the form: +.P +.RS 2 +.EX +\|\.\./foo/bar +~/foo/bar +\|\./foo/bar +/foo/bar +.EE +.RE +.P +This feature is helpful for local offline development and creating +tests that require npm installing where you don't want to hit an +external server, but should not be used when publishing packages +to the public registry\. +.SH devDependencies +.P If someone is planning on downloading and using your module in their -program, then they probably don\'t want or need to download and build +program, then they probably don't want or need to download and build the external test or documentation framework that you use\. -. .P -In this case, it\'s best to list these additional items in a \fBdevDependencies\fR hash\. -. +In this case, it's best to list these additional items in a +\fBdevDependencies\fR hash\. .P These things will be installed when doing \fBnpm link\fR or \fBnpm install\fR from the root of a package, and can be managed like any other npm configuration param\. See npm help 7 \fBnpm\-config\fR for more on the topic\. -. .P For build steps that are not platform\-specific, such as compiling CoffeeScript or other languages to JavaScript, use the \fBprepublish\fR script to do this, and make the required package a devDependency\. -. .P For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name": "ethopia\-waza", "description": "a delightfully fruity coffee varietal", "version": "1\.2\.3", @@ -559,29 +484,24 @@ For example: }, "main": "lib/waza\.js" } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P The \fBprepublish\fR script will be run before publishing, so that users can consume the functionality without requiring them to compile it -themselves\. In dev mode (ie, locally running \fBnpm install\fR), it\'ll +themselves\. In dev mode (ie, locally running \fBnpm install\fR), it'll run this script as well, so that you can test it easily\. -. -.SH "peerDependencies" +.SH peerDependencies +.P In some cases, you want to express the compatibility of your package with an host tool or library, while not necessarily doing a \fBrequire\fR of this host\. This is usually refered to as a \fIplugin\fR\|\. Notably, your module may be exposing a specific interface, expected and specified by the host documentation\. -. .P For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name": "tea\-latte", "version": "1\.3\.5" @@ -589,283 +509,223 @@ For example: "tea": "2\.x" } } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P This ensures your package \fBtea\-latte\fR can be installed \fIalong\fR with the second major version of the host package \fBtea\fR only\. The host package is automatically installed if needed\. \fBnpm install tea\-latte\fR could possibly yield the following dependency graph: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX ├── tea\-latte@1\.3\.5 └── tea@2\.2\.0 -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Trying to install another plugin with a conflicting requirement will cause an error\. For this reason, make sure your plugin requirement is as broad as possible, and not to lock it down to specific patch versions\. -. .P Assuming the host complies with semver \fIhttp://semver\.org/\fR, only changes in -the host package\'s major version will break your plugin\. Thus, if you\'ve worked +the host package's major version will break your plugin\. Thus, if you've worked with every 1\.x version of the host package, use \fB"^1\.0"\fR or \fB"1\.x"\fR to express this\. If you depend on features introduced in 1\.5\.2, use \fB">= 1\.5\.2 < 2"\fR\|\. -. -.SH "bundledDependencies" +.SH bundledDependencies +.P Array of package names that will be bundled when publishing the package\. -. .P If this is spelled \fB"bundleDependencies"\fR, then that is also honorable\. -. -.SH "optionalDependencies" +.SH optionalDependencies +.P If a dependency can be used, but you would like npm to proceed if it -cannot be found or fails to install, then you may put it in the \fBoptionalDependencies\fR hash\. This is a map of package name to version +cannot be found or fails to install, then you may put it in the +\fBoptionalDependencies\fR hash\. This is a map of package name to version or url, just like the \fBdependencies\fR hash\. The difference is that failure is tolerated\. -. .P -It is still your program\'s responsibility to handle the lack of the +It is still your program's responsibility to handle the lack of the dependency\. For example, something like this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX try { - var foo = require(\'foo\') - var fooVersion = require(\'foo/package\.json\')\.version + var foo = require('foo') + var fooVersion = require('foo/package\.json')\.version } catch (er) { foo = null } if ( notGoodFooVersion(fooVersion) ) { foo = null } + // \.\. then later in your program \.\. + if (foo) { foo\.doFooThings() } -. -.fi -. -.IP "" 0 -. -.P -Entries in \fBoptionalDependencies\fR will override entries of the same name in \fBdependencies\fR, so it\'s usually best to only put in one place\. -. -.SH "engines" +.EE +.RE +.P +Entries in \fBoptionalDependencies\fR will override entries of the same name in +\fBdependencies\fR, so it's usually best to only put in one place\. +.SH engines +.P You can specify the version of node that your stuff works on: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "engines" : { "node" : ">=0\.10\.3 <0\.12" } } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P -And, like with dependencies, if you don\'t specify the version (or if you +And, like with dependencies, if you don't specify the version (or if you specify "*" as the version), then any version of node will do\. -. .P If you specify an "engines" field, then npm will require that "node" be somewhere on that list\. If "engines" is omitted, then npm will just assume that it works on node\. -. .P You can also use the "engines" field to specify which versions of npm are capable of properly installing your program\. For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "engines" : { "npm" : "~1\.0\.20" } } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Note that, unless the user has set the \fBengine\-strict\fR config flag, this field is advisory only\. -. -.SH "engineStrict" +.SH engineStrict +.P If you are sure that your module will \fIdefinitely not\fR run properly on versions of Node/npm other than those specified in the \fBengines\fR hash, then you can set \fB"engineStrict": true\fR in your package\.json file\. -This will override the user\'s \fBengine\-strict\fR config setting\. -. +This will override the user's \fBengine\-strict\fR config setting\. .P Please do not do this unless you are really very very sure\. If your engines hash is something overly restrictive, you can quite easily and inadvertently lock yourself into obscurity and prevent your users from updating to new versions of Node\. Consider this choice carefully\. If people abuse it, it will be removed in a future version of npm\. -. -.SH "os" +.SH os +.P You can specify which operating systems your module will run on: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX "os" : [ "darwin", "linux" ] -. -.fi -. -.IP "" 0 -. +.EE +.RE .P You can also blacklist instead of whitelist operating systems, -just prepend the blacklisted os with a \'!\': -. -.IP "" 4 -. -.nf +just prepend the blacklisted os with a '!': +.P +.RS 2 +.EX "os" : [ "!win32" ] -. -.fi -. -.IP "" 0 -. +.EE +.RE .P The host operating system is determined by \fBprocess\.platform\fR -. .P -It is allowed to both blacklist, and whitelist, although there isn\'t any +It is allowed to both blacklist, and whitelist, although there isn't any good reason to do this\. -. -.SH "cpu" +.SH cpu +.P If your code only runs on certain cpu architectures, you can specify which ones\. -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX "cpu" : [ "x64", "ia32" ] -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Like the \fBos\fR option, you can also blacklist architectures: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX "cpu" : [ "!arm", "!mips" ] -. -.fi -. -.IP "" 0 -. +.EE +.RE .P The host architecture is determined by \fBprocess\.arch\fR -. -.SH "preferGlobal" +.SH preferGlobal +.P If your package is primarily a command\-line application that should be installed globally, then set this value to \fBtrue\fR to provide a warning if it is installed locally\. -. .P -It doesn\'t actually prevent users from installing it locally, but it -does help prevent some confusion if it doesn\'t work as expected\. -. -.SH "private" +It doesn't actually prevent users from installing it locally, but it +does help prevent some confusion if it doesn't work as expected\. +.SH private +.P If you set \fB"private": true\fR in your package\.json, then npm will refuse to publish it\. -. .P This is a way to prevent accidental publication of private repositories\. If you would like to ensure that a given package is only ever published to a specific registry (for example, an internal registry), then use the \fBpublishConfig\fR hash described below to override the \fBregistry\fR config param at publish\-time\. -. -.SH "publishConfig" -This is a set of config values that will be used at publish\-time\. It\'s +.SH publishConfig +.P +This is a set of config values that will be used at publish\-time\. It's especially handy if you want to set the tag or registry, so that you can ensure that a given package is not tagged with "latest" or published to the global public registry by default\. -. .P Any config values can be overridden, but of course only "tag" and "registry" probably matter for the purposes of publishing\. -. .P See npm help 7 \fBnpm\-config\fR to see the list of config options that can be overridden\. -. -.SH "DEFAULT VALUES" +.SH DEFAULT VALUES +.P npm will default some values based on package contents\. -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 \fB"scripts": {"start": "node server\.js"}\fR -. -.IP If there is a \fBserver\.js\fR file in the root of your package, then npm will default the \fBstart\fR command to \fBnode server\.js\fR\|\. -. -.IP "\(bu" 4 +.IP \(bu 2 \fB"scripts":{"preinstall": "node\-gyp rebuild"}\fR -. -.IP If there is a \fBbinding\.gyp\fR file in the root of your package, npm will default the \fBpreinstall\fR command to compile using node\-gyp\. -. -.IP "\(bu" 4 +.IP \(bu 2 \fB"contributors": [\.\.\.]\fR -. -.IP If there is an \fBAUTHORS\fR file in the root of your package, npm will treat each line as a \fBName (url)\fR format, where email and url are optional\. Lines which start with a \fB#\fR or are blank, will be ignored\. -. -.IP "" 0 -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 + +.RE +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 7 semver -. -.IP "\(bu" 4 +.IP \(bu 2 npm help init -. -.IP "\(bu" 4 +.IP \(bu 2 npm help version -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help help -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 faq -. -.IP "\(bu" 4 +.IP \(bu 2 npm help install -. -.IP "\(bu" 4 +.IP \(bu 2 npm help publish -. -.IP "\(bu" 4 +.IP \(bu 2 npm help rm -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man5/npmrc.5 b/deps/npm/man/man5/npmrc.5 index d0b63236574..569b7c5c6b5 100644 --- a/deps/npm/man/man5/npmrc.5 +++ b/deps/npm/man/man5/npmrc.5 @@ -1,103 +1,83 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPMRC" "5" "September 2014" "" "" -. .SH "NAME" -\fBnpmrc\fR \-\- The npm config files -. -.SH "DESCRIPTION" +\fBnpmrc\fR \- The npm config files +.SH DESCRIPTION +.P npm gets its config settings from the command line, environment variables, and \fBnpmrc\fR files\. -. .P The \fBnpm config\fR command can be used to update and edit the contents of the user and global npmrc files\. -. .P For a list of available configuration options, see npm help 7 config\. -. -.SH "FILES" +.SH FILES +.P The four relevant files are: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 per\-project config file (/path/to/my/project/\.npmrc) -. -.IP "\(bu" 4 +.IP \(bu 2 per\-user config file (~/\.npmrc) -. -.IP "\(bu" 4 +.IP \(bu 2 global config file ($PREFIX/npmrc) -. -.IP "\(bu" 4 +.IP \(bu 2 npm builtin config file (/path/to/npm/npmrc) -. -.IP "" 0 -. + +.RE .P All npm config files are an ini\-formatted list of \fBkey = value\fR -parameters\. Environment variables can be replaced using \fB${VARIABLE_NAME}\fR\|\. For example: -. -.IP "" 4 -. -.nf +parameters\. Environment variables can be replaced using +\fB${VARIABLE_NAME}\fR\|\. For example: +.P +.RS 2 +.EX prefix = ${HOME}/\.npm\-packages -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Each of these files is loaded, and config options are resolved in priority order\. For example, a setting in the userconfig file would override the setting in the globalconfig file\. -. -.SS "Per\-project config file" +.SS Per\-project config file +.P When working locally in a project, a \fB\|\.npmrc\fR file in the root of the project (ie, a sibling of \fBnode_modules\fR and \fBpackage\.json\fR) will set config values specific to this project\. -. .P -Note that this only applies to the root of the project that you\'re +Note that this only applies to the root of the project that you're running npm in\. It has no effect when your module is published\. For -example, you can\'t publish a module that forces itself to install +example, you can't publish a module that forces itself to install globally, or in a different location\. -. -.SS "Per\-user config file" +.SS Per\-user config file +.P \fB$HOME/\.npmrc\fR (or the \fBuserconfig\fR param, if set in the environment or on the command line) -. -.SS "Global config file" +.SS Global config file +.P \fB$PREFIX/etc/npmrc\fR (or the \fBglobalconfig\fR param, if set above): This file is an ini\-file formatted list of \fBkey = value\fR parameters\. Environment variables can be replaced as above\. -. -.SS "Built\-in config file" +.SS Built\-in config file +.P \fBpath/to/npm/itself/npmrc\fR -. .P This is an unchangeable "builtin" configuration file that npm keeps consistent across updates\. Set fields in here using the \fB\|\./configure\fR script that comes with npm\. This is primarily for distribution maintainers to override default configs in a standard and consistent manner\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 5 folders -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 package\.json -. -.IP "\(bu" 4 +.IP \(bu 2 npm help npm -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man5/package.json.5 b/deps/npm/man/man5/package.json.5 index 8233dc17315..8ab713ccc0c 100644 --- a/deps/npm/man/man5/package.json.5 +++ b/deps/npm/man/man5/package.json.5 @@ -1,466 +1,385 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "PACKAGE\.JSON" "5" "September 2014" "" "" -. .SH "NAME" -\fBpackage.json\fR \-\- Specifics of npm\'s package\.json handling -. -.SH "DESCRIPTION" -This document is all you need to know about what\'s required in your package\.json +\fBpackage.json\fR \- Specifics of npm's package\.json handling +.SH DESCRIPTION +.P +This document is all you need to know about what's required in your package\.json file\. It must be actual JSON, not just a JavaScript object literal\. -. .P A lot of the behavior described in this document is affected by the config settings described in npm help 7 \fBnpm\-config\fR\|\. -. -.SH "name" +.SH name +.P The \fImost\fR important things in your package\.json are the name and version fields\. -Those are actually required, and your package won\'t install without +Those are actually required, and your package won't install without them\. The name and version together form an identifier that is assumed to be completely unique\. Changes to the package should come along with changes to the version\. -. .P The name is what your thing is called\. Some tips: -. -.IP "\(bu" 4 -Don\'t put "js" or "node" in the name\. It\'s assumed that it\'s js, since you\'re +.RS 0 +.IP \(bu 2 +Don't put "js" or "node" in the name\. It's assumed that it's js, since you're writing a package\.json file, and you can specify the engine using the "engines" field\. (See below\.) -. -.IP "\(bu" 4 +.IP \(bu 2 The name ends up being part of a URL, an argument on the command line, and a folder name\. Any name with non\-url\-safe characters will be rejected\. -Also, it can\'t start with a dot or an underscore\. -. -.IP "\(bu" 4 +Also, it can't start with a dot or an underscore\. +.IP \(bu 2 The name will probably be passed as an argument to require(), so it should be something short, but also reasonably descriptive\. -. -.IP "\(bu" 4 -You may want to check the npm registry to see if there\'s something by that name +.IP \(bu 2 +You may want to check the npm registry to see if there's something by that name already, before you get too attached to it\. http://registry\.npmjs\.org/ -. -.IP "" 0 -. -.SH "version" + +.RE +.P +A name can be optionally prefixed by a scope, e\.g\. \fB@myorg/mypackage\fR\|\. See +npm help 7 \fBnpm\-scope\fR for more detail\. +.SH version +.P The \fImost\fR important things in your package\.json are the name and version fields\. -Those are actually required, and your package won\'t install without +Those are actually required, and your package won't install without them\. The name and version together form an identifier that is assumed to be completely unique\. Changes to the package should come along with changes to the version\. -. .P -Version must be parseable by node\-semver \fIhttps://github\.com/isaacs/node\-semver\fR, which is bundled +Version must be parseable by +node\-semver \fIhttps://github\.com/isaacs/node\-semver\fR, which is bundled with npm as a dependency\. (\fBnpm install semver\fR to use it yourself\.) -. .P More on version numbers and ranges at npm help 7 semver\. -. -.SH "description" -Put a description in it\. It\'s a string\. This helps people discover your -package, as it\'s listed in \fBnpm search\fR\|\. -. -.SH "keywords" -Put keywords in it\. It\'s an array of strings\. This helps people -discover your package as it\'s listed in \fBnpm search\fR\|\. -. -.SH "homepage" +.SH description +.P +Put a description in it\. It's a string\. This helps people discover your +package, as it's listed in \fBnpm search\fR\|\. +.SH keywords +.P +Put keywords in it\. It's an array of strings\. This helps people +discover your package as it's listed in \fBnpm search\fR\|\. +.SH homepage +.P The url to the project homepage\. -. .P \fBNOTE\fR: This is \fInot\fR the same as "url"\. If you put a "url" field, -then the registry will think it\'s a redirection to your package that has +then the registry will think it's a redirection to your package that has been published somewhere else, and spit at you\. -. .P -Literally\. Spit\. I\'m so not kidding\. -. -.SH "bugs" -The url to your project\'s issue tracker and / or the email address to which +Literally\. Spit\. I'm so not kidding\. +.SH bugs +.P +The url to your project's issue tracker and / or the email address to which issues should be reported\. These are helpful for people who encounter issues with your package\. -. .P It should look like this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "url" : "http://github\.com/owner/project/issues" , "email" : "project@hostname\.com" } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P You can specify either one or both values\. If you want to provide only a url, you can specify the value for "bugs" as a simple string instead of an object\. -. .P If a url is provided, it will be used by the \fBnpm bugs\fR command\. -. -.SH "license" +.SH license +.P You should specify a license for your package so that people know how they are -permitted to use it, and any restrictions you\'re placing on it\. -. +permitted to use it, and any restrictions you're placing on it\. .P -The simplest way, assuming you\'re using a common license such as BSD\-3\-Clause -or MIT, is to just specify the standard SPDX ID of the license you\'re using, +The simplest way, assuming you're using a common license such as BSD\-3\-Clause +or MIT, is to just specify the standard SPDX ID of the license you're using, like this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "license" : "BSD\-3\-Clause" } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P You can check the full list of SPDX license IDs \fIhttps://spdx\.org/licenses/\fR\|\. -Ideally you should pick one that is OSI \fIhttp://opensource\.org/licenses/alphabetical\fR approved\. -. +Ideally you should pick one that is +OSI \fIhttp://opensource\.org/licenses/alphabetical\fR approved\. .P -It\'s also a good idea to include a LICENSE file at the top level in +It's also a good idea to include a LICENSE file at the top level in your package\. -. -.SH "people fields: author, contributors" +.SH people fields: author, contributors +.P The "author" is one person\. "contributors" is an array of people\. A "person" is an object with a "name" field and optionally "url" and "email", like this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name" : "Barney Rubble" , "email" : "b@rubble\.com" , "url" : "http://barnyrubble\.tumblr\.com/" } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Or you can shorten that all into a single string, and npm will parse it for you: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX "Barney Rubble (http://barnyrubble\.tumblr\.com/) -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Both email and url are optional either way\. -. .P npm also sets a top\-level "maintainers" field with your npm user info\. -. -.SH "files" +.SH files +.P The "files" field is an array of files to include in your project\. If you name a folder in the array, then it will also include the files inside that folder\. (Unless they would be ignored by another rule\.) -. .P You can also provide a "\.npmignore" file in the root of your package, which will keep files from being included, even if they would be picked up by the files array\. The "\.npmignore" file works just like a "\.gitignore"\. -. -.SH "main" +.SH main +.P The main field is a module ID that is the primary entry point to your program\. -That is, if your package is named \fBfoo\fR, and a user installs it, and then does \fBrequire("foo")\fR, then your main module\'s exports object will be returned\. -. +That is, if your package is named \fBfoo\fR, and a user installs it, and then does +\fBrequire("foo")\fR, then your main module's exports object will be returned\. .P This should be a module ID relative to the root of your package folder\. -. .P For most modules, it makes the most sense to have a main script and often not much else\. -. -.SH "bin" -A lot of packages have one or more executable files that they\'d like to +.SH bin +.P +A lot of packages have one or more executable files that they'd like to install into the PATH\. npm makes this pretty easy (in fact, it uses this feature to install the "npm" executable\.) -. .P To use this, supply a \fBbin\fR field in your package\.json which is a map of -command name to local file name\. On install, npm will symlink that file into \fBprefix/bin\fR for global installs, or \fB\|\./node_modules/\.bin/\fR for local +command name to local file name\. On install, npm will symlink that file into +\fBprefix/bin\fR for global installs, or \fB\|\./node_modules/\.bin/\fR for local installs\. -. .P For example, npm has this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "bin" : { "npm" : "\./cli\.js" } } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P -So, when you install npm, it\'ll create a symlink from the \fBcli\.js\fR script to \fB/usr/local/bin/npm\fR\|\. -. +So, when you install npm, it'll create a symlink from the \fBcli\.js\fR script to +\fB/usr/local/bin/npm\fR\|\. .P If you have a single executable, and its name should be the name of the package, then you can just supply it as a string\. For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name": "my\-program" , "version": "1\.2\.5" , "bin": "\./path/to/program" } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P would be the same as this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name": "my\-program" , "version": "1\.2\.5" , "bin" : { "my\-program" : "\./path/to/program" } } -. -.fi -. -.IP "" 0 -. -.SH "man" -Specify either a single file or an array of filenames to put in place for the \fBman\fR program to find\. -. -.P -If only a single file is provided, then it\'s installed such that it is the +.EE +.RE +.SH man +.P +Specify either a single file or an array of filenames to put in place for the +\fBman\fR program to find\. +.P +If only a single file is provided, then it's installed such that it is the result from \fBman \fR, regardless of its actual filename\. For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name" : "foo" , "version" : "1\.2\.3" , "description" : "A packaged foo fooer for fooing foos" , "main" : "foo\.js" , "man" : "\./man/doc\.1" } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P would link the \fB\|\./man/doc\.1\fR file in such that it is the target for \fBman foo\fR -. .P -If the filename doesn\'t start with the package name, then it\'s prefixed\. +If the filename doesn't start with the package name, then it's prefixed\. So, this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name" : "foo" , "version" : "1\.2\.3" , "description" : "A packaged foo fooer for fooing foos" , "main" : "foo\.js" , "man" : [ "\./man/foo\.1", "\./man/bar\.1" ] } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P will create files to do \fBman foo\fR and \fBman foo\-bar\fR\|\. -. .P Man files must end with a number, and optionally a \fB\|\.gz\fR suffix if they are compressed\. The number dictates which man section the file is installed into\. -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name" : "foo" , "version" : "1\.2\.3" , "description" : "A packaged foo fooer for fooing foos" , "main" : "foo\.js" , "man" : [ "\./man/foo\.1", "\./man/foo\.2" ] } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P will create entries for \fBman foo\fR and \fBman 2 foo\fR -. -.SH "directories" +.SH directories +.P The CommonJS Packages \fIhttp://wiki\.commonjs\.org/wiki/Packages/1\.0\fR spec details a few ways that you can indicate the structure of your package using a \fBdirectories\fR -hash\. If you look at npm\'s package\.json \fIhttp://registry\.npmjs\.org/npm/latest\fR, -you\'ll see that it has directories for doc, lib, and man\. -. +hash\. If you look at npm's package\.json \fIhttp://registry\.npmjs\.org/npm/latest\fR, +you'll see that it has directories for doc, lib, and man\. .P In the future, this information may be used in other creative ways\. -. -.SS "directories\.lib" +.SS directories\.lib +.P Tell people where the bulk of your library is\. Nothing special is done -with the lib folder in any way, but it\'s useful meta info\. -. -.SS "directories\.bin" +with the lib folder in any way, but it's useful meta info\. +.SS directories\.bin +.P If you specify a "bin" directory, then all the files in that folder will be used as the "bin" hash\. -. .P If you have a "bin" hash already, then this has no effect\. -. -.SS "directories\.man" +.SS directories\.man +.P A folder that is full of man pages\. Sugar to generate a "man" array by walking the folder\. -. -.SS "directories\.doc" +.SS directories\.doc +.P Put markdown files in here\. Eventually, these will be displayed nicely, maybe, someday\. -. -.SS "directories\.example" +.SS directories\.example +.P Put example scripts in here\. Someday, it might be exposed in some clever way\. -. -.SH "repository" +.SH repository +.P Specify the place where your code lives\. This is helpful for people who want to contribute\. If the git repo is on github, then the \fBnpm docs\fR command will be able to find you\. -. .P Do it like this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX "repository" : { "type" : "git" , "url" : "http://github\.com/npm/npm\.git" } + "repository" : { "type" : "svn" , "url" : "http://v8\.googlecode\.com/svn/trunk/" } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P The URL should be a publicly available (perhaps read\-only) url that can be handed directly to a VCS program without any modification\. It should not be a url to an -html project page that you put in your browser\. It\'s for computers\. -. -.SH "scripts" +html project page that you put in your browser\. It's for computers\. +.SH scripts +.P The "scripts" member is an object hash of script commands that are run at various times in the lifecycle of your package\. The key is the lifecycle event, and the value is the command to run at that point\. -. .P See npm help 7 \fBnpm\-scripts\fR to find out more about writing package scripts\. -. -.SH "config" +.SH config +.P A "config" hash can be used to set configuration parameters used in package scripts that persist across upgrades\. For instance, if a package had the following: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name" : "foo" , "config" : { "port" : "8080" } } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P -and then had a "start" command that then referenced the \fBnpm_package_config_port\fR environment variable, then the user could +and then had a "start" command that then referenced the +\fBnpm_package_config_port\fR environment variable, then the user could override that by doing \fBnpm config set foo:port 8001\fR\|\. -. .P See npm help 7 \fBnpm\-config\fR and npm help 7 \fBnpm\-scripts\fR for more on package configs\. -. -.SH "dependencies" +.SH dependencies +.P Dependencies are specified with a simple hash of package name to version range\. The version range is a string which has one or more space\-separated descriptors\. Dependencies can also be identified with a tarball or git URL\. -. .P -\fBPlease do not put test harnesses or transpilers in your \fBdependencies\fR hash\.\fR See \fBdevDependencies\fR, below\. -. +\fBPlease do not put test harnesses or transpilers in your +\fBdependencies\fR hash\.\fR See \fBdevDependencies\fR, below\. .P See npm help 7 semver for more details about specifying version ranges\. -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 \fBversion\fR Must match \fBversion\fR exactly -. -.IP "\(bu" 4 +.IP \(bu 2 \fB>version\fR Must be greater than \fBversion\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB>=version\fR etc -. -.IP "\(bu" 4 +.IP \(bu 2 \fB=version1 <=version2\fR\|\. -. -.IP "\(bu" 4 +.IP \(bu 2 \fBrange1 || range2\fR Passes if either range1 or range2 are satisfied\. -. -.IP "\(bu" 4 -\fBgit\.\.\.\fR See \'Git URLs as Dependencies\' below -. -.IP "\(bu" 4 -\fBuser/repo\fR See \'GitHub URLs\' below -. -.IP "" 0 -. +.IP \(bu 2 +\fBgit\.\.\.\fR See 'Git URLs as Dependencies' below +.IP \(bu 2 +\fBuser/repo\fR See 'GitHub URLs' below +.IP \(bu 2 +\fBtag\fR A specific version tagged and published as \fBtag\fR See npm help \fBnpm\-tag\fR +.IP \(bu 2 +\fBpath/path/path\fR See Local Paths below + +.RE .P For example, these are all valid: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "dependencies" : { "foo" : "1\.0\.0 \- 2\.9999\.9999" , "bar" : ">=1\.0\.2 <2\.1\.2" @@ -472,46 +391,40 @@ For example, these are all valid: , "elf" : "~1\.2\.3" , "two" : "2\.x" , "thr" : "3\.3\.x" + , "lat" : "latest" + , "dyl" : "~/projects/dyl" } } -. -.fi -. -.IP "" 0 -. -.SS "URLs as Dependencies" +.EE +.RE +.SS URLs as Dependencies +.P You may specify a tarball URL in place of a version range\. -. .P This tarball will be downloaded and installed locally to your package at install time\. -. -.SS "Git URLs as Dependencies" +.SS Git URLs as Dependencies +.P Git urls can be of the form: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX git://github\.com/user/project\.git#commit\-ish git+ssh://user@hostname:project\.git#commit\-ish git+ssh://user@hostname/project\.git#commit\-ish git+http://user@hostname/project/blah\.git#commit\-ish git+https://user@hostname/project/blah\.git#commit\-ish -. -.fi -. -.IP "" 0 -. +.EE +.RE .P The \fBcommit\-ish\fR can be any tag, sha, or branch which can be supplied as an argument to \fBgit checkout\fR\|\. The default is \fBmaster\fR\|\. -. -.SH "GitHub URLs" +.SH GitHub URLs +.P As of version 1\.1\.65, you can refer to GitHub urls as just "foo": "user/foo\-project"\. For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name": "foo", "version": "0\.0\.0", @@ -519,35 +432,47 @@ As of version 1\.1\.65, you can refer to GitHub urls as just "foo": "user/foo\-p "express": "visionmedia/express" } } -. -.fi -. -.IP "" 0 -. -.SH "devDependencies" +.EE +.RE +.SH Local Paths +.P +As of version 2\.0\.0 you can provide a path to a local directory that +contains a package\. Local paths can be in the form: +.P +.RS 2 +.EX +\|\.\./foo/bar +~/foo/bar +\|\./foo/bar +/foo/bar +.EE +.RE +.P +This feature is helpful for local offline development and creating +tests that require npm installing where you don't want to hit an +external server, but should not be used when publishing packages +to the public registry\. +.SH devDependencies +.P If someone is planning on downloading and using your module in their -program, then they probably don\'t want or need to download and build +program, then they probably don't want or need to download and build the external test or documentation framework that you use\. -. .P -In this case, it\'s best to list these additional items in a \fBdevDependencies\fR hash\. -. +In this case, it's best to list these additional items in a +\fBdevDependencies\fR hash\. .P These things will be installed when doing \fBnpm link\fR or \fBnpm install\fR from the root of a package, and can be managed like any other npm configuration param\. See npm help 7 \fBnpm\-config\fR for more on the topic\. -. .P For build steps that are not platform\-specific, such as compiling CoffeeScript or other languages to JavaScript, use the \fBprepublish\fR script to do this, and make the required package a devDependency\. -. .P For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name": "ethopia\-waza", "description": "a delightfully fruity coffee varietal", "version": "1\.2\.3", @@ -559,29 +484,24 @@ For example: }, "main": "lib/waza\.js" } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P The \fBprepublish\fR script will be run before publishing, so that users can consume the functionality without requiring them to compile it -themselves\. In dev mode (ie, locally running \fBnpm install\fR), it\'ll +themselves\. In dev mode (ie, locally running \fBnpm install\fR), it'll run this script as well, so that you can test it easily\. -. -.SH "peerDependencies" +.SH peerDependencies +.P In some cases, you want to express the compatibility of your package with an host tool or library, while not necessarily doing a \fBrequire\fR of this host\. This is usually refered to as a \fIplugin\fR\|\. Notably, your module may be exposing a specific interface, expected and specified by the host documentation\. -. .P For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name": "tea\-latte", "version": "1\.3\.5" @@ -589,283 +509,223 @@ For example: "tea": "2\.x" } } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P This ensures your package \fBtea\-latte\fR can be installed \fIalong\fR with the second major version of the host package \fBtea\fR only\. The host package is automatically installed if needed\. \fBnpm install tea\-latte\fR could possibly yield the following dependency graph: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX ├── tea\-latte@1\.3\.5 └── tea@2\.2\.0 -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Trying to install another plugin with a conflicting requirement will cause an error\. For this reason, make sure your plugin requirement is as broad as possible, and not to lock it down to specific patch versions\. -. .P Assuming the host complies with semver \fIhttp://semver\.org/\fR, only changes in -the host package\'s major version will break your plugin\. Thus, if you\'ve worked +the host package's major version will break your plugin\. Thus, if you've worked with every 1\.x version of the host package, use \fB"^1\.0"\fR or \fB"1\.x"\fR to express this\. If you depend on features introduced in 1\.5\.2, use \fB">= 1\.5\.2 < 2"\fR\|\. -. -.SH "bundledDependencies" +.SH bundledDependencies +.P Array of package names that will be bundled when publishing the package\. -. .P If this is spelled \fB"bundleDependencies"\fR, then that is also honorable\. -. -.SH "optionalDependencies" +.SH optionalDependencies +.P If a dependency can be used, but you would like npm to proceed if it -cannot be found or fails to install, then you may put it in the \fBoptionalDependencies\fR hash\. This is a map of package name to version +cannot be found or fails to install, then you may put it in the +\fBoptionalDependencies\fR hash\. This is a map of package name to version or url, just like the \fBdependencies\fR hash\. The difference is that failure is tolerated\. -. .P -It is still your program\'s responsibility to handle the lack of the +It is still your program's responsibility to handle the lack of the dependency\. For example, something like this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX try { - var foo = require(\'foo\') - var fooVersion = require(\'foo/package\.json\')\.version + var foo = require('foo') + var fooVersion = require('foo/package\.json')\.version } catch (er) { foo = null } if ( notGoodFooVersion(fooVersion) ) { foo = null } + // \.\. then later in your program \.\. + if (foo) { foo\.doFooThings() } -. -.fi -. -.IP "" 0 -. -.P -Entries in \fBoptionalDependencies\fR will override entries of the same name in \fBdependencies\fR, so it\'s usually best to only put in one place\. -. -.SH "engines" +.EE +.RE +.P +Entries in \fBoptionalDependencies\fR will override entries of the same name in +\fBdependencies\fR, so it's usually best to only put in one place\. +.SH engines +.P You can specify the version of node that your stuff works on: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "engines" : { "node" : ">=0\.10\.3 <0\.12" } } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P -And, like with dependencies, if you don\'t specify the version (or if you +And, like with dependencies, if you don't specify the version (or if you specify "*" as the version), then any version of node will do\. -. .P If you specify an "engines" field, then npm will require that "node" be somewhere on that list\. If "engines" is omitted, then npm will just assume that it works on node\. -. .P You can also use the "engines" field to specify which versions of npm are capable of properly installing your program\. For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "engines" : { "npm" : "~1\.0\.20" } } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Note that, unless the user has set the \fBengine\-strict\fR config flag, this field is advisory only\. -. -.SH "engineStrict" +.SH engineStrict +.P If you are sure that your module will \fIdefinitely not\fR run properly on versions of Node/npm other than those specified in the \fBengines\fR hash, then you can set \fB"engineStrict": true\fR in your package\.json file\. -This will override the user\'s \fBengine\-strict\fR config setting\. -. +This will override the user's \fBengine\-strict\fR config setting\. .P Please do not do this unless you are really very very sure\. If your engines hash is something overly restrictive, you can quite easily and inadvertently lock yourself into obscurity and prevent your users from updating to new versions of Node\. Consider this choice carefully\. If people abuse it, it will be removed in a future version of npm\. -. -.SH "os" +.SH os +.P You can specify which operating systems your module will run on: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX "os" : [ "darwin", "linux" ] -. -.fi -. -.IP "" 0 -. +.EE +.RE .P You can also blacklist instead of whitelist operating systems, -just prepend the blacklisted os with a \'!\': -. -.IP "" 4 -. -.nf +just prepend the blacklisted os with a '!': +.P +.RS 2 +.EX "os" : [ "!win32" ] -. -.fi -. -.IP "" 0 -. +.EE +.RE .P The host operating system is determined by \fBprocess\.platform\fR -. .P -It is allowed to both blacklist, and whitelist, although there isn\'t any +It is allowed to both blacklist, and whitelist, although there isn't any good reason to do this\. -. -.SH "cpu" +.SH cpu +.P If your code only runs on certain cpu architectures, you can specify which ones\. -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX "cpu" : [ "x64", "ia32" ] -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Like the \fBos\fR option, you can also blacklist architectures: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX "cpu" : [ "!arm", "!mips" ] -. -.fi -. -.IP "" 0 -. +.EE +.RE .P The host architecture is determined by \fBprocess\.arch\fR -. -.SH "preferGlobal" +.SH preferGlobal +.P If your package is primarily a command\-line application that should be installed globally, then set this value to \fBtrue\fR to provide a warning if it is installed locally\. -. .P -It doesn\'t actually prevent users from installing it locally, but it -does help prevent some confusion if it doesn\'t work as expected\. -. -.SH "private" +It doesn't actually prevent users from installing it locally, but it +does help prevent some confusion if it doesn't work as expected\. +.SH private +.P If you set \fB"private": true\fR in your package\.json, then npm will refuse to publish it\. -. .P This is a way to prevent accidental publication of private repositories\. If you would like to ensure that a given package is only ever published to a specific registry (for example, an internal registry), then use the \fBpublishConfig\fR hash described below to override the \fBregistry\fR config param at publish\-time\. -. -.SH "publishConfig" -This is a set of config values that will be used at publish\-time\. It\'s +.SH publishConfig +.P +This is a set of config values that will be used at publish\-time\. It's especially handy if you want to set the tag or registry, so that you can ensure that a given package is not tagged with "latest" or published to the global public registry by default\. -. .P Any config values can be overridden, but of course only "tag" and "registry" probably matter for the purposes of publishing\. -. .P See npm help 7 \fBnpm\-config\fR to see the list of config options that can be overridden\. -. -.SH "DEFAULT VALUES" +.SH DEFAULT VALUES +.P npm will default some values based on package contents\. -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 \fB"scripts": {"start": "node server\.js"}\fR -. -.IP If there is a \fBserver\.js\fR file in the root of your package, then npm will default the \fBstart\fR command to \fBnode server\.js\fR\|\. -. -.IP "\(bu" 4 +.IP \(bu 2 \fB"scripts":{"preinstall": "node\-gyp rebuild"}\fR -. -.IP If there is a \fBbinding\.gyp\fR file in the root of your package, npm will default the \fBpreinstall\fR command to compile using node\-gyp\. -. -.IP "\(bu" 4 +.IP \(bu 2 \fB"contributors": [\.\.\.]\fR -. -.IP If there is an \fBAUTHORS\fR file in the root of your package, npm will treat each line as a \fBName (url)\fR format, where email and url are optional\. Lines which start with a \fB#\fR or are blank, will be ignored\. -. -.IP "" 0 -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 + +.RE +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 7 semver -. -.IP "\(bu" 4 +.IP \(bu 2 npm help init -. -.IP "\(bu" 4 +.IP \(bu 2 npm help version -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help help -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 faq -. -.IP "\(bu" 4 +.IP \(bu 2 npm help install -. -.IP "\(bu" 4 +.IP \(bu 2 npm help publish -. -.IP "\(bu" 4 +.IP \(bu 2 npm help rm -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man7/index.7 b/deps/npm/man/man7/index.7 deleted file mode 100644 index 911d8efab01..00000000000 --- a/deps/npm/man/man7/index.7 +++ /dev/null @@ -1,298 +0,0 @@ -.\" Generated with Ronnjs 0.4.0 -.\" http://github.com/kapouer/ronnjs -. -.TH "NPM\-INDEX" "7" "July 2013" "" "" -. -.SH "NAME" -\fBnpm-index\fR \-\- Index of all npm documentation -. -npm help .SH "README" -node package manager -. -npm help .SH "npm" -node package manager -. -npm help .SH "npm\-adduser" -Add a registry user account -. -npm help .SH "npm\-bin" -Display npm bin folder -. -npm help .SH "npm\-bugs" -Bugs for a package in a web browser maybe -. -npm help .SH "npm\-build" -Build a package -. -npm help .SH "npm\-bundle" -REMOVED -. -npm help .SH "npm\-cache" -Manipulates packages cache -. -npm help .SH "npm\-completion" -Tab Completion for npm -. -npm help .SH "npm\-config" -Manage the npm configuration files -. -npm help .SH "npm\-dedupe" -Reduce duplication -. -npm help .SH "npm\-deprecate" -Deprecate a version of a package -. -npm help .SH "npm\-docs" -Docs for a package in a web browser maybe -. -npm help .SH "npm\-edit" -Edit an installed package -. -npm help .SH "npm\-explore" -Browse an installed package -. -npm help .SH "npm\-help\-search" -Search npm help documentation -. -npm help .SH "npm\-help" -Get help on npm -. -npm help .SH "npm\-init" -Interactively create a package\.json file -. -npm help .SH "npm\-install" -Install a package -. -npm help .SH "npm\-link" -Symlink a package folder -. -npm help .SH "npm\-ls" -List installed packages -. -npm help .SH "npm\-outdated" -Check for outdated packages -. -npm help .SH "npm\-owner" -Manage package owners -. -npm help .SH "npm\-pack" -Create a tarball from a package -. -npm help .SH "npm\-prefix" -Display prefix -. -npm help .SH "npm\-prune" -Remove extraneous packages -. -npm help .SH "npm\-publish" -Publish a package -. -npm help .SH "npm\-rebuild" -Rebuild a package -. -npm help .SH "npm\-restart" -Start a package -. -npm help .SH "npm\-rm" -Remove a package -. -npm help .SH "npm\-root" -Display npm root -. -npm help .SH "npm\-run\-script" -Run arbitrary package scripts -. -npm help .SH "npm\-search" -Search for packages -. -npm help .SH "npm\-shrinkwrap" -Lock down dependency versions -. -npm help .SH "npm\-star" -Mark your favorite packages -. -npm help .SH "npm\-stars" -View packages marked as favorites -. -npm help .SH "npm\-start" -Start a package -. -npm help .SH "npm\-stop" -Stop a package -. -npm help .SH "npm\-submodule" -Add a package as a git submodule -. -npm help .SH "npm\-tag" -Tag a published version -. -npm help .SH "npm\-test" -Test a package -. -npm help .SH "npm\-uninstall" -Remove a package -. -npm help .SH "npm\-unpublish" -Remove a package from the registry -. -npm help .SH "npm\-update" -Update a package -. -npm help .SH "npm\-version" -Bump a package version -. -npm help .SH "npm\-view" -View registry info -. -npm help .SH "npm\-whoami" -Display npm username -. -npm apihelp .SH "npm" -node package manager -. -npm apihelp .SH "npm\-bin" -Display npm bin folder -. -npm apihelp .SH "npm\-bugs" -Bugs for a package in a web browser maybe -. -npm apihelp .SH "npm\-commands" -npm commands -. -npm apihelp .SH "npm\-config" -Manage the npm configuration files -. -npm apihelp .SH "npm\-deprecate" -Deprecate a version of a package -. -npm apihelp .SH "npm\-docs" -Docs for a package in a web browser maybe -. -npm apihelp .SH "npm\-edit" -Edit an installed package -. -npm apihelp .SH "npm\-explore" -Browse an installed package -. -npm apihelp .SH "npm\-help\-search" -Search the help pages -. -npm apihelp .SH "npm\-init" -Interactively create a package\.json file -. -npm apihelp .SH "npm\-install" -install a package programmatically -. -npm apihelp .SH "npm\-link" -Symlink a package folder -. -npm apihelp .SH "npm\-load" -Load config settings -. -npm apihelp .SH "npm\-ls" -List installed packages -. -npm apihelp .SH "npm\-outdated" -Check for outdated packages -. -npm apihelp .SH "npm\-owner" -Manage package owners -. -npm apihelp .SH "npm\-pack" -Create a tarball from a package -. -npm apihelp .SH "npm\-prefix" -Display prefix -. -npm apihelp .SH "npm\-prune" -Remove extraneous packages -. -npm apihelp .SH "npm\-publish" -Publish a package -. -npm apihelp .SH "npm\-rebuild" -Rebuild a package -. -npm apihelp .SH "npm\-restart" -Start a package -. -npm apihelp .SH "npm\-root" -Display npm root -. -npm apihelp .SH "npm\-run\-script" -Run arbitrary package scripts -. -npm apihelp .SH "npm\-search" -Search for packages -. -npm apihelp .SH "npm\-shrinkwrap" -programmatically generate package shrinkwrap file -. -npm apihelp .SH "npm\-start" -Start a package -. -npm apihelp .SH "npm\-stop" -Stop a package -. -npm apihelp .SH "npm\-submodule" -Add a package as a git submodule -. -npm apihelp .SH "npm\-tag" -Tag a published version -. -npm apihelp .SH "npm\-test" -Test a package -. -npm apihelp .SH "npm\-uninstall" -uninstall a package programmatically -. -npm apihelp .SH "npm\-unpublish" -Remove a package from the registry -. -npm apihelp .SH "npm\-update" -Update a package -. -npm apihelp .SH "npm\-version" -Bump a package version -. -npm apihelp .SH "npm\-view" -View registry info -. -npm apihelp .SH "npm\-whoami" -Display npm username -. -npm help .SH "npm\-folders" -Folder Structures Used by npm -. -npm help .SH "npmrc" -The npm config files -. -npm help .SH "package\.json" -Specifics of npm\'s package\.json handling -. -npm help .SH "npm\-coding\-style" -npm\'s "funny" coding style -. -npm help .SH "npm\-config" -More than you probably want to know about npm configuration -. -npm help .SH "npm\-developers" -Developer Guide -. -npm help .SH "npm\-disputes" -Handling Module Name Disputes -. -npm help .SH "npm\-faq" -Frequently Asked Questions -. -npm help .SH "npm\-registry" -The JavaScript Package Registry -. -npm help .SH "npm\-scripts" -How npm handles the "scripts" field -. -npm help .SH "removing\-npm" -Cleaning the Slate -. -npm help .SH "semver" -The semantic versioner for npm diff --git a/deps/npm/man/man7/npm-coding-style.7 b/deps/npm/man/man7/npm-coding-style.7 index 385a3908728..304dd4954ec 100644 --- a/deps/npm/man/man7/npm-coding-style.7 +++ b/deps/npm/man/man7/npm-coding-style.7 @@ -1,122 +1,93 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-CODING\-STYLE" "7" "September 2014" "" "" -. .SH "NAME" -\fBnpm-coding-style\fR \-\- npm\'s "funny" coding style -. -.SH "DESCRIPTION" -npm\'s coding style is a bit unconventional\. It is not different for -difference\'s sake, but rather a carefully crafted style that is +\fBnpm-coding-style\fR \- npm's "funny" coding style +.SH DESCRIPTION +.P +npm's coding style is a bit unconventional\. It is not different for +difference's sake, but rather a carefully crafted style that is designed to reduce visual clutter and make bugs more apparent\. -. .P If you want to contribute to npm (which is very encouraged), you should -make your code conform to npm\'s style\. -. +make your code conform to npm's style\. +.P +Note: this concerns npm's code not the specific packages at npmjs\.org +.SH Line Length .P -Note: this concerns npm\'s code not the specific packages at npmjs\.org -. -.SH "Line Length" -Keep lines shorter than 80 characters\. It\'s better for lines to be +Keep lines shorter than 80 characters\. It's better for lines to be too short than to be too long\. Break up long lists, objects, and other statements onto multiple lines\. -. -.SH "Indentation" +.SH Indentation +.P Two\-spaces\. Tabs are better, but they look like hell in web browsers -(and on github), and node uses 2 spaces, so that\'s that\. -. +(and on github), and node uses 2 spaces, so that's that\. .P Configure your editor appropriately\. -. -.SH "Curly braces" +.SH Curly braces +.P Curly braces belong on the same line as the thing that necessitates them\. -. .P Bad: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX function () { -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Good: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX function () { -. -.fi -. -.IP "" 0 -. +.EE +.RE .P -If a block needs to wrap to the next line, use a curly brace\. Don\'t -use it if it doesn\'t\. -. +If a block needs to wrap to the next line, use a curly brace\. Don't +use it if it doesn't\. .P Bad: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX if (foo) { bar() } while (foo) bar() -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Good: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX if (foo) bar() while (foo) { bar() } -. -.fi -. -.IP "" 0 -. -.SH "Semicolons" -Don\'t use them except in four situations: -. -.IP "\(bu" 4 -\fBfor (;;)\fR loops\. They\'re actually required\. -. -.IP "\(bu" 4 -null loops like: \fBwhile (something) ;\fR (But you\'d better have a good +.EE +.RE +.SH Semicolons +.P +Don't use them except in four situations: +.RS 0 +.IP \(bu 2 +\fBfor (;;)\fR loops\. They're actually required\. +.IP \(bu 2 +null loops like: \fBwhile (something) ;\fR (But you'd better have a good reason for doing that\.) -. -.IP "\(bu" 4 +.IP \(bu 2 \fBcase "foo": doSomething(); break\fR -. -.IP "\(bu" 4 +.IP \(bu 2 In front of a leading \fB(\fR or \fB[\fR at the start of the line\. This prevents the expression from being interpreted as a function call or property access, respectively\. -. -.IP "" 0 -. + +.RE .P Some examples of good semicolon usage: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX ;(x || y)\.doSomething() ;[a, b, c]\.forEach(doSomething) for (var i = 0; i < 10; i ++) { @@ -127,24 +98,20 @@ for (var i = 0; i < 10; i ++) { } end() } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Note that starting lines with \fB\-\fR and \fB+\fR also should be prefixed with a semicolon, but this is much less common\. -. -.SH "Comma First" +.SH Comma First +.P If there is a list of things separated by commas, and it wraps across multiple lines, put the comma at the start of the next line, directly below the token that starts the list\. Put the final token in the list on a line by itself\. For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX var magicWords = [ "abracadabra" , "gesundheit" , "ventrilo" @@ -156,99 +123,82 @@ var magicWords = [ "abracadabra" , b = "abc" , etc , somethingElse -. -.fi -. -.IP "" 0 -. -.SH "Whitespace" +.EE +.RE +.SH Whitespace +.P Put a single space in front of ( for anything other than a function call\. Also use a single space wherever it makes things more readable\. -. .P -Don\'t leave trailing whitespace at the end of lines\. Don\'t indent empty -lines\. Don\'t use more spaces than are helpful\. -. -.SH "Functions" +Don't leave trailing whitespace at the end of lines\. Don't indent empty +lines\. Don't use more spaces than are helpful\. +.SH Functions +.P Use named functions\. They make stack traces a lot easier to read\. -. -.SH "Callbacks, Sync/async Style" +.SH Callbacks, Sync/async Style +.P Use the asynchronous/non\-blocking versions of things as much as possible\. It might make more sense for npm to use the synchronous fs APIs, but this way, the fs and http and child process stuff all uses the same callback\-passing methodology\. -. .P The callback should always be the last argument in the list\. Its first argument is the Error or null\. -. .P -Be very careful never to ever ever throw anything\. It\'s worse than useless\. +Be very careful never to ever ever throw anything\. It's worse than useless\. Just send the error message back as the first argument to the callback\. -. -.SH "Errors" -Always create a new Error object with your message\. Don\'t just return a +.SH Errors +.P +Always create a new Error object with your message\. Don't just return a string message to the callback\. Stack traces are handy\. -. -.SH "Logging" +.SH Logging +.P Logging is done using the npmlog \fIhttps://github\.com/npm/npmlog\fR utility\. -. .P Please clean up logs when they are no longer helpful\. In particular, logging the same object over and over again is not helpful\. Logs should -report what\'s happening so that it\'s easier to track down where a fault +report what's happening so that it's easier to track down where a fault occurs\. -. .P Use appropriate log levels\. See npm help 7 \fBnpm\-config\fR and search for "loglevel"\. -. -.SH "Case, naming, etc\." +.SH Case, naming, etc\. +.P Use \fBlowerCamelCase\fR for multiword identifiers when they refer to objects, functions, methods, members, or anything not specified in this section\. -. .P -Use \fBUpperCamelCase\fR for class names (things that you\'d pass to "new")\. -. +Use \fBUpperCamelCase\fR for class names (things that you'd pass to "new")\. .P Use \fBall\-lower\-hyphen\-css\-case\fR for multiword filenames and config keys\. -. .P Use named functions\. They make stack traces easier to follow\. -. .P Use \fBCAPS_SNAKE_CASE\fR for constants, things that should never change and are rarely used\. -. .P Use a single uppercase letter for function names where the function would normally be anonymous, but needs to call itself recursively\. It -makes it clear that it\'s a "throwaway" function\. -. -.SH "null, undefined, false, 0" -Boolean variables and functions should always be either \fBtrue\fR or \fBfalse\fR\|\. Don\'t set it to 0 unless it\'s supposed to be a number\. -. +makes it clear that it's a "throwaway" function\. +.SH null, undefined, false, 0 +.P +Boolean variables and functions should always be either \fBtrue\fR or +\fBfalse\fR\|\. Don't set it to 0 unless it's supposed to be a number\. .P When something is intentionally missing or removed, set it to \fBnull\fR\|\. -. .P -Don\'t set things to \fBundefined\fR\|\. Reserve that value to mean "not yet +Don't set things to \fBundefined\fR\|\. Reserve that value to mean "not yet set to anything\." -. .P Boolean objects are verboten\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 7 developers -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 faq -. -.IP "\(bu" 4 +.IP \(bu 2 npm help npm -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man7/npm-config.7 b/deps/npm/man/man7/npm-config.7 index 7bdf1c00598..f759d94bfd6 100644 --- a/deps/npm/man/man7/npm-config.7 +++ b/deps/npm/man/man7/npm-config.7 @@ -1,1520 +1,1198 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-CONFIG" "7" "September 2014" "" "" -. .SH "NAME" -\fBnpm-config\fR \-\- More than you probably want to know about npm configuration -. -.SH "DESCRIPTION" +\fBnpm-config\fR \- More than you probably want to know about npm configuration +.SH DESCRIPTION +.P npm gets its configuration values from 6 sources, in this priority: -. -.SS "Command Line Flags" +.SS Command Line Flags +.P Putting \fB\-\-foo bar\fR on the command line sets the \fBfoo\fR configuration parameter to \fB"bar"\fR\|\. A \fB\-\-\fR argument tells the cli parser to stop reading flags\. A \fB\-\-flag\fR parameter that is at the \fIend\fR of the command will be given the value of \fBtrue\fR\|\. -. -.SS "Environment Variables" +.SS Environment Variables +.P Any environment variables that start with \fBnpm_config_\fR will be -interpreted as a configuration parameter\. For example, putting \fBnpm_config_foo=bar\fR in your environment will set the \fBfoo\fR +interpreted as a configuration parameter\. For example, putting +\fBnpm_config_foo=bar\fR in your environment will set the \fBfoo\fR configuration parameter to \fBbar\fR\|\. Any environment configurations that are not given a value will be given the value of \fBtrue\fR\|\. Config values are case\-insensitive, so \fBNPM_CONFIG_FOO=bar\fR will work the same\. -. -.SS "npmrc Files" +.SS npmrc Files +.P The four relevant files are: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 per\-project config file (/path/to/my/project/\.npmrc) -. -.IP "\(bu" 4 +.IP \(bu 2 per\-user config file (~/\.npmrc) -. -.IP "\(bu" 4 +.IP \(bu 2 global config file ($PREFIX/npmrc) -. -.IP "\(bu" 4 +.IP \(bu 2 npm builtin config file (/path/to/npm/npmrc) -. -.IP "" 0 -. + +.RE .P See npm help 5 npmrc for more details\. -. -.SS "Default Configs" +.SS Default Configs +.P A set of configuration parameters that are internal to npm, and are defaults if nothing else is specified\. -. -.SH "Shorthands and Other CLI Niceties" +.SH Shorthands and Other CLI Niceties +.P The following shorthands are parsed on the command\-line: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 \fB\-v\fR: \fB\-\-version\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-h\fR, \fB\-?\fR, \fB\-\-help\fR, \fB\-H\fR: \fB\-\-usage\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-s\fR, \fB\-\-silent\fR: \fB\-\-loglevel silent\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-q\fR, \fB\-\-quiet\fR: \fB\-\-loglevel warn\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-d\fR: \fB\-\-loglevel info\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-dd\fR, \fB\-\-verbose\fR: \fB\-\-loglevel verbose\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-ddd\fR: \fB\-\-loglevel silly\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-g\fR: \fB\-\-global\fR -. -.IP "\(bu" 4 +.IP \(bu 2 +\fB\-C\fR: \fB\-\-prefix\fR +.IP \(bu 2 \fB\-l\fR: \fB\-\-long\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-m\fR: \fB\-\-message\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-p\fR, \fB\-\-porcelain\fR: \fB\-\-parseable\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-reg\fR: \fB\-\-registry\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-v\fR: \fB\-\-version\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-f\fR: \fB\-\-force\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-desc\fR: \fB\-\-description\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-S\fR: \fB\-\-save\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-D\fR: \fB\-\-save\-dev\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-O\fR: \fB\-\-save\-optional\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-B\fR: \fB\-\-save\-bundle\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-E\fR: \fB\-\-save\-exact\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-y\fR: \fB\-\-yes\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\-n\fR: \fB\-\-yes false\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fBll\fR and \fBla\fR commands: \fBls \-\-long\fR -. -.IP "" 0 -. + +.RE .P If the specified configuration param resolves unambiguously to a known configuration parameter, then it is expanded to that configuration parameter\. For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm ls \-\-par # same as: npm ls \-\-parseable -. -.fi -. -.IP "" 0 -. +.EE +.RE .P If multiple single\-character shorthands are strung together, and the resulting combination is unambiguously not some other configuration param, then it is expanded to its various component pieces\. For example: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm ls \-gpld # same as: npm ls \-\-global \-\-parseable \-\-long \-\-loglevel info -. -.fi -. -.IP "" 0 -. -.SH "Per\-Package Config Settings" +.EE +.RE +.SH Per\-Package Config Settings +.P When running scripts (see npm help 7 \fBnpm\-scripts\fR) the package\.json "config" -keys are overwritten in the environment if there is a config param of \fB[@]:\fR\|\. For example, if the package\.json has +keys are overwritten in the environment if there is a config param of +\fB[@]:\fR\|\. For example, if the package\.json has this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name" : "foo" , "config" : { "port" : "8080" } , "scripts" : { "start" : "node server\.js" } } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P and the server\.js is this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX http\.createServer(\.\.\.)\.listen(process\.env\.npm_package_config_port) -. -.fi -. -.IP "" 0 -. +.EE +.RE .P then the user could change the behavior by doing: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm config set foo:port 80 -. -.fi -. -.IP "" 0 -. +.EE +.RE .P See npm help 5 package\.json for more information\. -. -.SH "Config Settings" -. -.SS "always\-auth" -. -.IP "\(bu" 4 +.SH Config Settings +.SS always\-auth +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Force npm to always require authentication when accessing the registry, even for \fBGET\fR requests\. -. -.SS "bin\-links" -. -.IP "\(bu" 4 +.SS bin\-links +.RS 0 +.IP \(bu 2 Default: \fBtrue\fR -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Tells npm to create symlinks (or \fB\|\.cmd\fR shims on Windows) for package executables\. -. .P Set to false to have it not do this\. This can be used to work around -the fact that some file systems don\'t support symlinks, even on +the fact that some file systems don't support symlinks, even on ostensibly Unix systems\. -. -.SS "browser" -. -.IP "\(bu" 4 +.SS browser +.RS 0 +.IP \(bu 2 Default: OS X: \fB"open"\fR, Windows: \fB"start"\fR, Others: \fB"xdg\-open"\fR -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "" 0 -. + +.RE .P The browser that is called by the \fBnpm docs\fR command to open websites\. -. -.SS "ca" -. -.IP "\(bu" 4 +.SS ca +.RS 0 +.IP \(bu 2 Default: The npm CA certificate -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String or null -. -.IP "" 0 -. + +.RE .P The Certificate Authority signing certificate that is trusted for SSL connections to the registry\. -. .P Set to \fBnull\fR to only allow "known" registrars, or to a specific CA cert to trust only that specific signing authority\. -. .P See also the \fBstrict\-ssl\fR config\. -. -.SS "cafile" -. -.IP "\(bu" 4 +.SS cafile +.RS 0 +.IP \(bu 2 Default: \fBnull\fR -. -.IP "\(bu" 4 +.IP \(bu 2 Type: path -. -.IP "" 0 -. + +.RE .P A path to a file containing one or multiple Certificate Authority signing -certificates\. Similar to the \fBca\fR setting, but allows for multiple CA\'s, as +certificates\. Similar to the \fBca\fR setting, but allows for multiple CA's, as well as for the CA information to be stored in a file on disk\. -. -.SS "cache" -. -.IP "\(bu" 4 +.SS cache +.RS 0 +.IP \(bu 2 Default: Windows: \fB%AppData%\\npm\-cache\fR, Posix: \fB~/\.npm\fR -. -.IP "\(bu" 4 +.IP \(bu 2 Type: path -. -.IP "" 0 -. -.P -The location of npm\'s cache directory\. See npm help \fBnpm\-cache\fR -. -.SS "cache\-lock\-stale" -. -.IP "\(bu" 4 + +.RE +.P +The location of npm's cache directory\. See npm help \fBnpm\-cache\fR +.SS cache\-lock\-stale +.RS 0 +.IP \(bu 2 Default: 60000 (1 minute) -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Number -. -.IP "" 0 -. + +.RE .P The number of ms before cache folder lockfiles are considered stale\. -. -.SS "cache\-lock\-retries" -. -.IP "\(bu" 4 +.SS cache\-lock\-retries +.RS 0 +.IP \(bu 2 Default: 10 -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Number -. -.IP "" 0 -. + +.RE .P Number of times to retry to acquire a lock on cache folder lockfiles\. -. -.SS "cache\-lock\-wait" -. -.IP "\(bu" 4 +.SS cache\-lock\-wait +.RS 0 +.IP \(bu 2 Default: 10000 (10 seconds) -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Number -. -.IP "" 0 -. + +.RE .P Number of ms to wait for cache lock files to expire\. -. -.SS "cache\-max" -. -.IP "\(bu" 4 +.SS cache\-max +.RS 0 +.IP \(bu 2 Default: Infinity -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Number -. -.IP "" 0 -. + +.RE .P The maximum time (in seconds) to keep items in the registry cache before re\-checking against the registry\. -. .P Note that no purging is done unless the \fBnpm cache clean\fR command is explicitly used, and that only GET requests use the cache\. -. -.SS "cache\-min" -. -.IP "\(bu" 4 +.SS cache\-min +.RS 0 +.IP \(bu 2 Default: 10 -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Number -. -.IP "" 0 -. + +.RE .P The minimum time (in seconds) to keep items in the registry cache before re\-checking against the registry\. -. .P Note that no purging is done unless the \fBnpm cache clean\fR command is explicitly used, and that only GET requests use the cache\. -. -.SS "cert" -. -.IP "\(bu" 4 +.SS cert +.RS 0 +.IP \(bu 2 Default: \fBnull\fR -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "" 0 -. + +.RE .P A client certificate to pass when accessing the registry\. -. -.SS "color" -. -.IP "\(bu" 4 +.SS color +.RS 0 +.IP \(bu 2 Default: true on Posix, false on Windows -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean or \fB"always"\fR -. -.IP "" 0 -. + +.RE .P If false, never shows colors\. If \fB"always"\fR then always shows colors\. If true, then only prints color codes for tty file descriptors\. -. -.SS "depth" -. -.IP "\(bu" 4 +.SS depth +.RS 0 +.IP \(bu 2 Default: Infinity -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Number -. -.IP "" 0 -. -.P -The depth to go when recursing directories for \fBnpm ls\fR and \fBnpm cache ls\fR\|\. -. -.SS "description" -. -.IP "\(bu" 4 + +.RE +.P +The depth to go when recursing directories for \fBnpm ls\fR and +\fBnpm cache ls\fR\|\. +.SS description +.RS 0 +.IP \(bu 2 Default: true -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Show the description in \fBnpm search\fR -. -.SS "dev" -. -.IP "\(bu" 4 +.SS dev +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Install \fBdev\-dependencies\fR along with packages\. -. .P Note that \fBdev\-dependencies\fR are also installed if the \fBnpat\fR flag is set\. -. -.SS "editor" -. -.IP "\(bu" 4 +.SS editor +.RS 0 +.IP \(bu 2 Default: \fBEDITOR\fR environment variable if set, or \fB"vi"\fR on Posix, or \fB"notepad"\fR on Windows\. -. -.IP "\(bu" 4 +.IP \(bu 2 Type: path -. -.IP "" 0 -. + +.RE .P The command to run for \fBnpm edit\fR or \fBnpm config edit\fR\|\. -. -.SS "email" -The email of the logged\-in user\. -. -.P -Set by the \fBnpm adduser\fR command\. Should not be set explicitly\. -. -.SS "engine\-strict" -. -.IP "\(bu" 4 +.SS engine\-strict +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P If set to true, then npm will stubbornly refuse to install (or even consider installing) any package that claims to not be compatible with the current Node\.js version\. -. -.SS "force" -. -.IP "\(bu" 4 +.SS force +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Makes various commands more forceful\. -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 lifecycle script failure does not block progress\. -. -.IP "\(bu" 4 +.IP \(bu 2 publishing clobbers previously published versions\. -. -.IP "\(bu" 4 +.IP \(bu 2 skips cache when requesting from the registry\. -. -.IP "\(bu" 4 +.IP \(bu 2 prevents checks against clobbering non\-npm files\. -. -.IP "" 0 -. -.SS "fetch\-retries" -. -.IP "\(bu" 4 + +.RE +.SS fetch\-retries +.RS 0 +.IP \(bu 2 Default: 2 -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Number -. -.IP "" 0 -. + +.RE .P The "retries" config for the \fBretry\fR module to use when fetching packages from the registry\. -. -.SS "fetch\-retry\-factor" -. -.IP "\(bu" 4 +.SS fetch\-retry\-factor +.RS 0 +.IP \(bu 2 Default: 10 -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Number -. -.IP "" 0 -. + +.RE .P The "factor" config for the \fBretry\fR module to use when fetching packages\. -. -.SS "fetch\-retry\-mintimeout" -. -.IP "\(bu" 4 +.SS fetch\-retry\-mintimeout +.RS 0 +.IP \(bu 2 Default: 10000 (10 seconds) -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Number -. -.IP "" 0 -. + +.RE .P The "minTimeout" config for the \fBretry\fR module to use when fetching packages\. -. -.SS "fetch\-retry\-maxtimeout" -. -.IP "\(bu" 4 +.SS fetch\-retry\-maxtimeout +.RS 0 +.IP \(bu 2 Default: 60000 (1 minute) -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Number -. -.IP "" 0 -. + +.RE .P The "maxTimeout" config for the \fBretry\fR module to use when fetching packages\. -. -.SS "git" -. -.IP "\(bu" 4 +.SS git +.RS 0 +.IP \(bu 2 Default: \fB"git"\fR -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "" 0 -. + +.RE .P The command to use for git commands\. If git is installed on the computer, but is not in the \fBPATH\fR, then set this to the full path to the git binary\. -. -.SS "git\-tag\-version" -. -.IP "\(bu" 4 +.SS git\-tag\-version +.RS 0 +.IP \(bu 2 Default: \fBtrue\fR -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Tag the commit when using the \fBnpm version\fR command\. -. -.SS "global" -. -.IP "\(bu" 4 +.SS global +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P -Operates in "global" mode, so that packages are installed into the \fBprefix\fR folder instead of the current working directory\. See npm help 5 \fBnpm\-folders\fR for more on the differences in behavior\. -. -.IP "\(bu" 4 +Operates in "global" mode, so that packages are installed into the +\fBprefix\fR folder instead of the current working directory\. See +npm help 5 \fBnpm\-folders\fR for more on the differences in behavior\. +.RS 0 +.IP \(bu 2 packages are installed into the \fB{prefix}/lib/node_modules\fR folder, instead of the current working directory\. -. -.IP "\(bu" 4 +.IP \(bu 2 bin files are linked to \fB{prefix}/bin\fR -. -.IP "\(bu" 4 +.IP \(bu 2 man pages are linked to \fB{prefix}/share/man\fR -. -.IP "" 0 -. -.SS "globalconfig" -. -.IP "\(bu" 4 + +.RE +.SS globalconfig +.RS 0 +.IP \(bu 2 Default: {prefix}/etc/npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 Type: path -. -.IP "" 0 -. + +.RE .P The config file to read for global config options\. -. -.SS "group" -. -.IP "\(bu" 4 +.SS group +.RS 0 +.IP \(bu 2 Default: GID of the current process -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String or Number -. -.IP "" 0 -. + +.RE .P The group to use when running package scripts in global mode as the root user\. -. -.SS "heading" -. -.IP "\(bu" 4 +.SS heading +.RS 0 +.IP \(bu 2 Default: \fB"npm"\fR -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "" 0 -. + +.RE .P The string that starts all the debugging log output\. -. -.SS "https\-proxy" -. -.IP "\(bu" 4 -Default: the \fBHTTPS_PROXY\fR or \fBhttps_proxy\fR or \fBHTTP_PROXY\fR or \fBhttp_proxy\fR environment variables\. -. -.IP "\(bu" 4 +.SS https\-proxy +.RS 0 +.IP \(bu 2 +Default: the \fBHTTPS_PROXY\fR or \fBhttps_proxy\fR or \fBHTTP_PROXY\fR or +\fBhttp_proxy\fR environment variables\. +.IP \(bu 2 Type: url -. -.IP "" 0 -. + +.RE .P A proxy to use for outgoing https requests\. -. -.SS "ignore\-scripts" -. -.IP "\(bu" 4 +.SS ignore\-scripts +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P If true, npm does not run scripts specified in package\.json files\. -. -.SS "init\-module" -. -.IP "\(bu" 4 +.SS init\-module +.RS 0 +.IP \(bu 2 Default: ~/\.npm\-init\.js -. -.IP "\(bu" 4 +.IP \(bu 2 Type: path -. -.IP "" 0 -. + +.RE .P A module that will be loaded by the \fBnpm init\fR command\. See the -documentation for the init\-package\-json \fIhttps://github\.com/isaacs/init\-package\-json\fR module +documentation for the +init\-package\-json \fIhttps://github\.com/isaacs/init\-package\-json\fR module for more information, or npm help init\. -. -.SS "init\.author\.name" -. -.IP "\(bu" 4 +.SS init\.author\.name +.RS 0 +.IP \(bu 2 Default: "" -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "" 0 -. -.P -The value \fBnpm init\fR should use by default for the package author\'s name\. -. -.SS "init\.author\.email" -. -.IP "\(bu" 4 + +.RE +.P +The value \fBnpm init\fR should use by default for the package author's name\. +.SS init\.author\.email +.RS 0 +.IP \(bu 2 Default: "" -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "" 0 -. -.P -The value \fBnpm init\fR should use by default for the package author\'s email\. -. -.SS "init\.author\.url" -. -.IP "\(bu" 4 + +.RE +.P +The value \fBnpm init\fR should use by default for the package author's email\. +.SS init\.author\.url +.RS 0 +.IP \(bu 2 Default: "" -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "" 0 -. -.P -The value \fBnpm init\fR should use by default for the package author\'s homepage\. -. -.SS "init\.license" -. -.IP "\(bu" 4 + +.RE +.P +The value \fBnpm init\fR should use by default for the package author's homepage\. +.SS init\.license +.RS 0 +.IP \(bu 2 Default: "ISC" -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "" 0 -. + +.RE .P The value \fBnpm init\fR should use by default for the package license\. -. -.SS "json" -. -.IP "\(bu" 4 +.SS init\.version +.RS 0 +.IP \(bu 2 +Default: "0\.0\.0" +.IP \(bu 2 +Type: semver + +.RE +.P +The value that \fBnpm init\fR should use by default for the package +version number, if not already set in package\.json\. +.SS json +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Whether or not to output JSON data, rather than the normal output\. -. .P This feature is currently experimental, and the output data structures for many commands is either not implemented in JSON yet, or subject to change\. Only the output from \fBnpm ls \-\-json\fR is currently valid\. -. -.SS "key" -. -.IP "\(bu" 4 +.SS key +.RS 0 +.IP \(bu 2 Default: \fBnull\fR -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "" 0 -. + +.RE .P A client key to pass when accessing the registry\. -. -.SS "link" -. -.IP "\(bu" 4 +.SS link +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P If true, then local installs will link if there is a suitable globally installed package\. -. .P Note that this means that local installs can cause things to be installed into the global space at the same time\. The link is only done if one of the two conditions are met: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 The package is not already installed globally, or -. -.IP "\(bu" 4 +.IP \(bu 2 the globally installed version is identical to the version that is being installed locally\. -. -.IP "" 0 -. -.SS "local\-address" -. -.IP "\(bu" 4 + +.RE +.SS local\-address +.RS 0 +.IP \(bu 2 Default: undefined -. -.IP "\(bu" 4 +.IP \(bu 2 Type: IP Address -. -.IP "" 0 -. + +.RE .P The IP address of the local interface to use when making connections to the npm registry\. Must be IPv4 in versions of Node prior to 0\.12\. -. -.SS "loglevel" -. -.IP "\(bu" 4 +.SS loglevel +.RS 0 +.IP \(bu 2 Default: "http" -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "\(bu" 4 -Values: "silent", "win", "error", "warn", "http", "info", "verbose", "silly" -. -.IP "" 0 -. +.IP \(bu 2 +Values: "silent", "error", "warn", "http", "info", "verbose", "silly" + +.RE .P -What level of logs to report\. On failure, \fIall\fR logs are written to \fBnpm\-debug\.log\fR in the current working directory\. -. +What level of logs to report\. On failure, \fIall\fR logs are written to +\fBnpm\-debug\.log\fR in the current working directory\. .P Any logs of a higher level than the setting are shown\. The default is "http", which shows http, warn, and error output\. -. -.SS "logstream" -. -.IP "\(bu" 4 +.SS logstream +.RS 0 +.IP \(bu 2 Default: process\.stderr -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Stream -. -.IP "" 0 -. + +.RE .P -This is the stream that is passed to the npmlog \fIhttps://github\.com/npm/npmlog\fR module at run time\. -. +This is the stream that is passed to the +npmlog \fIhttps://github\.com/npm/npmlog\fR module at run time\. .P It cannot be set from the command line, but if you are using npm programmatically, you may wish to send logs to somewhere other than stderr\. -. .P If the \fBcolor\fR config is set to true, then this stream will receive colored output if it is a TTY\. -. -.SS "long" -. -.IP "\(bu" 4 +.SS long +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Show extended information in \fBnpm ls\fR and \fBnpm search\fR\|\. -. -.SS "message" -. -.IP "\(bu" 4 +.SS message +.RS 0 +.IP \(bu 2 Default: "%s" -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "" 0 -. + +.RE .P Commit message which is used by \fBnpm version\fR when creating version commit\. -. .P Any "%s" in the message will be replaced with the version number\. -. -.SS "node\-version" -. -.IP "\(bu" 4 +.SS node\-version +.RS 0 +.IP \(bu 2 Default: process\.version -. -.IP "\(bu" 4 +.IP \(bu 2 Type: semver or false -. -.IP "" 0 -. -.P -The node version to use when checking package\'s "engines" hash\. -. -.SS "npat" -. -.IP "\(bu" 4 + +.RE +.P +The node version to use when checking package's "engines" hash\. +.SS npat +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Run tests on installation\. -. -.SS "onload\-script" -. -.IP "\(bu" 4 +.SS onload\-script +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: path -. -.IP "" 0 -. + +.RE .P A node module to \fBrequire()\fR when npm loads\. Useful for programmatic usage\. -. -.SS "optional" -. -.IP "\(bu" 4 +.SS optional +.RS 0 +.IP \(bu 2 Default: true -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Attempt to install packages in the \fBoptionalDependencies\fR hash\. Note that if these packages fail to install, the overall installation process is not aborted\. -. -.SS "parseable" -. -.IP "\(bu" 4 +.SS parseable +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Output parseable results from commands that write to standard output\. -. -.SS "prefix" -. -.IP "\(bu" 4 +.SS prefix +.RS 0 +.IP \(bu 2 Default: see npm help 5 folders -. -.IP "\(bu" 4 +.IP \(bu 2 Type: path -. -.IP "" 0 -. + +.RE .P The location to install global items\. If set on the command line, then it forces non\-global commands to run in the specified folder\. -. -.SS "production" -. -.IP "\(bu" 4 +.SS production +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Set to true to run in "production" mode\. -. -.IP "1" 4 +.RS 0 +.IP 1. 3 devDependencies are not installed at the topmost level when running local \fBnpm install\fR without any arguments\. -. -.IP "2" 4 +.IP 2. 3 Set the NODE_ENV="production" for lifecycle scripts\. -. -.IP "" 0 -. -.SS "proprietary\-attribs" -. -.IP "\(bu" 4 + +.RE +.SS proprietary\-attribs +.RS 0 +.IP \(bu 2 Default: true -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Whether or not to include proprietary extended attributes in the tarballs created by npm\. -. .P Unless you are expecting to unpack package tarballs with something other than npm \-\- particularly a very outdated tar implementation \-\- leave this as true\. -. -.SS "proxy" -. -.IP "\(bu" 4 +.SS proxy +.RS 0 +.IP \(bu 2 Default: \fBHTTP_PROXY\fR or \fBhttp_proxy\fR environment variable, or null -. -.IP "\(bu" 4 +.IP \(bu 2 Type: url -. -.IP "" 0 -. + +.RE .P A proxy to use for outgoing http requests\. -. -.SS "rebuild\-bundle" -. -.IP "\(bu" 4 +.SS rebuild\-bundle +.RS 0 +.IP \(bu 2 Default: true -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Rebuild bundled dependencies after installation\. -. -.SS "registry" -. -.IP "\(bu" 4 +.SS registry +.RS 0 +.IP \(bu 2 Default: https://registry\.npmjs\.org/ -. -.IP "\(bu" 4 +.IP \(bu 2 Type: url -. -.IP "" 0 -. + +.RE .P The base URL of the npm package registry\. -. -.SS "rollback" -. -.IP "\(bu" 4 +.SS rollback +.RS 0 +.IP \(bu 2 Default: true -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Remove failed installs\. -. -.SS "save" -. -.IP "\(bu" 4 +.SS save +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Save installed packages to a package\.json file as dependencies\. -. .P When used with the \fBnpm rm\fR command, it removes it from the dependencies hash\. -. .P Only works if there is already a package\.json file present\. -. -.SS "save\-bundle" -. -.IP "\(bu" 4 +.SS save\-bundle +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P -If a package would be saved at install time by the use of \fB\-\-save\fR, \fB\-\-save\-dev\fR, or \fB\-\-save\-optional\fR, then also put it in the \fBbundleDependencies\fR list\. -. +If a package would be saved at install time by the use of \fB\-\-save\fR, +\fB\-\-save\-dev\fR, or \fB\-\-save\-optional\fR, then also put it in the +\fBbundleDependencies\fR list\. .P When used with the \fBnpm rm\fR command, it removes it from the bundledDependencies list\. -. -.SS "save\-dev" -. -.IP "\(bu" 4 +.SS save\-dev +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Save installed packages to a package\.json file as devDependencies\. -. .P When used with the \fBnpm rm\fR command, it removes it from the devDependencies hash\. -. .P Only works if there is already a package\.json file present\. -. -.SS "save\-exact" -. -.IP "\(bu" 4 +.SS save\-exact +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. -.P -Dependencies saved to package\.json using \fB\-\-save\fR, \fB\-\-save\-dev\fR or \fB\-\-save\-optional\fR will be configured with an exact version rather than -using npm\'s default semver range operator\. -. -.SS "save\-optional" -. -.IP "\(bu" 4 + +.RE +.P +Dependencies saved to package\.json using \fB\-\-save\fR, \fB\-\-save\-dev\fR or +\fB\-\-save\-optional\fR will be configured with an exact version rather than +using npm's default semver range operator\. +.SS save\-optional +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Save installed packages to a package\.json file as optionalDependencies\. -. .P When used with the \fBnpm rm\fR command, it removes it from the devDependencies hash\. -. .P Only works if there is already a package\.json file present\. -. -.SS "save\-prefix" -. -.IP "\(bu" 4 -Default: \'^\' -. -.IP "\(bu" 4 +.SS save\-prefix +.RS 0 +.IP \(bu 2 +Default: '^' +.IP \(bu 2 Type: String -. -.IP "" 0 -. + +.RE .P -Configure how versions of packages installed to a package\.json file via \fB\-\-save\fR or \fB\-\-save\-dev\fR get prefixed\. -. +Configure how versions of packages installed to a package\.json file via +\fB\-\-save\fR or \fB\-\-save\-dev\fR get prefixed\. .P -For example if a package has version \fB1\.2\.3\fR, by default it\'s version is +For example if a package has version \fB1\.2\.3\fR, by default it's version is set to \fB^1\.2\.3\fR which allows minor upgrades for that package, but after -. -.br -\fBnpm config set save\-prefix=\'~\'\fR it would be set to \fB~1\.2\.3\fR which only allows +\fBnpm config set save\-prefix='~'\fR it would be set to \fB~1\.2\.3\fR which only allows patch upgrades\. -. -.SS "searchopts" -. -.IP "\(bu" 4 +.SS scope +.RS 0 +.IP \(bu 2 Default: "" -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "" 0 -. + +.RE +.P +Associate an operation with a scope for a scoped registry\. Useful when logging +in to a private registry for the first time: +\fBnpm login \-\-scope=@organization \-\-registry=registry\.organization\.com\fR, which +will cause \fB@organization\fR to be mapped to the registry for future installation +of packages specified according to the pattern \fB@organization/package\fR\|\. +.SS searchopts +.RS 0 +.IP \(bu 2 +Default: "" +.IP \(bu 2 +Type: String + +.RE .P Space\-separated options that are always passed to search\. -. -.SS "searchexclude" -. -.IP "\(bu" 4 +.SS searchexclude +.RS 0 +.IP \(bu 2 Default: "" -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "" 0 -. + +.RE .P Space\-separated options that limit the results from search\. -. -.SS "searchsort" -. -.IP "\(bu" 4 +.SS searchsort +.RS 0 +.IP \(bu 2 Default: "name" -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "\(bu" 4 +.IP \(bu 2 Values: "name", "\-name", "date", "\-date", "description", "\-description", "keywords", "\-keywords" -. -.IP "" 0 -. + +.RE .P Indication of which field to sort search results by\. Prefix with a \fB\-\fR character to indicate reverse sort\. -. -.SS "shell" -. -.IP "\(bu" 4 +.SS shell +.RS 0 +.IP \(bu 2 Default: SHELL environment variable, or "bash" on Posix, or "cmd" on Windows -. -.IP "\(bu" 4 +.IP \(bu 2 Type: path -. -.IP "" 0 -. + +.RE .P The shell to run for the \fBnpm explore\fR command\. -. -.SS "shrinkwrap" -. -.IP "\(bu" 4 +.SS shrinkwrap +.RS 0 +.IP \(bu 2 Default: true -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P If set to false, then ignore \fBnpm\-shrinkwrap\.json\fR files when installing\. -. -.SS "sign\-git\-tag" -. -.IP "\(bu" 4 +.SS sign\-git\-tag +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P If set to true, then the \fBnpm version\fR command will tag the version using \fB\-s\fR to add a signature\. -. .P Note that git requires you to have set up GPG keys in your git configs for this to work properly\. -. -.SS "spin" -. -.IP "\(bu" 4 +.SS spin +.RS 0 +.IP \(bu 2 Default: true -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean or \fB"always"\fR -. -.IP "" 0 -. + +.RE .P When set to \fBtrue\fR, npm will display an ascii spinner while it is doing things, if \fBprocess\.stderr\fR is a TTY\. -. .P Set to \fBfalse\fR to suppress the spinner, or set to \fBalways\fR to output the spinner even for non\-TTY outputs\. -. -.SS "strict\-ssl" -. -.IP "\(bu" 4 +.SS strict\-ssl +.RS 0 +.IP \(bu 2 Default: true -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Whether or not to do SSL key validation when making requests to the registry via https\. -. .P See also the \fBca\fR config\. -. -.SS "tag" -. -.IP "\(bu" 4 +.SS tag +.RS 0 +.IP \(bu 2 Default: latest -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "" 0 -. + +.RE .P -If you ask npm to install a package and don\'t tell it a specific version, then +If you ask npm to install a package and don't tell it a specific version, then it will install the specified tag\. -. .P Also the tag that is added to the package@version specified by the \fBnpm tag\fR command, if no explicit tag is given\. -. -.SS "tmp" -. -.IP "\(bu" 4 +.SS tmp +.RS 0 +.IP \(bu 2 Default: TMPDIR environment variable, or "/tmp" -. -.IP "\(bu" 4 +.IP \(bu 2 Type: path -. -.IP "" 0 -. + +.RE .P Where to store temporary files and folders\. All temp files are deleted on success, but left behind on failure for forensic purposes\. -. -.SS "unicode" -. -.IP "\(bu" 4 +.SS unicode +.RS 0 +.IP \(bu 2 Default: true -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P When set to true, npm uses unicode characters in the tree output\. When false, it uses ascii characters to draw trees\. -. -.SS "unsafe\-perm" -. -.IP "\(bu" 4 +.SS unsafe\-perm +.RS 0 +.IP \(bu 2 Default: false if running as root, true otherwise -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Set to true to suppress the UID/GID switching when running package scripts\. If set explicitly to false, then installing as a non\-root user will fail\. -. -.SS "usage" -. -.IP "\(bu" 4 +.SS usage +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Boolean -. -.IP "" 0 -. + +.RE .P Set to show short usage output (like the \-H output) instead of complete help when doing npm help \fBnpm\-help\fR\|\. -. -.SS "user" -. -.IP "\(bu" 4 +.SS user +.RS 0 +.IP \(bu 2 Default: "nobody" -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String or Number -. -.IP "" 0 -. + +.RE .P The UID to set to when running package scripts as root\. -. -.SS "username" -. -.IP "\(bu" 4 -Default: null -. -.IP "\(bu" 4 -Type: String -. -.IP "" 0 -. -.P -The username on the npm registry\. Set with \fBnpm adduser\fR -. -.SS "userconfig" -. -.IP "\(bu" 4 +.SS userconfig +.RS 0 +.IP \(bu 2 Default: ~/\.npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 Type: path -. -.IP "" 0 -. + +.RE .P The location of user\-level configuration settings\. -. -.SS "umask" -. -.IP "\(bu" 4 +.SS umask +.RS 0 +.IP \(bu 2 Default: 022 -. -.IP "\(bu" 4 +.IP \(bu 2 Type: Octal numeric string -. -.IP "" 0 -. + +.RE .P The "umask" value to use when setting the file creation mode on files and folders\. -. .P Folders and executables are given a mode which is \fB0777\fR masked against this value\. Other files are given a mode which is \fB0666\fR masked against this value\. Thus, the defaults are \fB0755\fR and \fB0644\fR respectively\. -. -.SS "user\-agent" -. -.IP "\(bu" 4 +.SS user\-agent +.RS 0 +.IP \(bu 2 Default: node/{process\.version} {process\.platform} {process\.arch} -. -.IP "\(bu" 4 +.IP \(bu 2 Type: String -. -.IP "" 0 -. + +.RE .P Sets a User\-Agent to the request header -. -.SS "version" -. -.IP "\(bu" 4 +.SS version +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: boolean -. -.IP "" 0 -. + +.RE .P If true, output the npm version and exit successfully\. -. .P Only relevant when specified explicitly on the command line\. -. -.SS "versions" -. -.IP "\(bu" 4 +.SS versions +.RS 0 +.IP \(bu 2 Default: false -. -.IP "\(bu" 4 +.IP \(bu 2 Type: boolean -. -.IP "" 0 -. + +.RE .P -If true, output the npm version as well as node\'s \fBprocess\.versions\fR +If true, output the npm version as well as node's \fBprocess\.versions\fR hash, and exit successfully\. -. .P Only relevant when specified explicitly on the command line\. -. -.SS "viewer" -. -.IP "\(bu" 4 +.SS viewer +.RS 0 +.IP \(bu 2 Default: "man" on Posix, "browser" on Windows -. -.IP "\(bu" 4 +.IP \(bu 2 Type: path -. -.IP "" 0 -. + +.RE .P The program to use to view help content\. -. .P Set to \fB"browser"\fR to view html help content in the default web browser\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 scripts -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 folders -. -.IP "\(bu" 4 +.IP \(bu 2 npm help npm -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man7/npm-developers.7 b/deps/npm/man/man7/npm-developers.7 index 071b8c2d79a..fbf7a3c10bb 100644 --- a/deps/npm/man/man7/npm-developers.7 +++ b/deps/npm/man/man7/npm-developers.7 @@ -1,335 +1,258 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-DEVELOPERS" "7" "September 2014" "" "" -. .SH "NAME" -\fBnpm-developers\fR \-\- Developer Guide -. -.SH "DESCRIPTION" -So, you\'ve decided to use npm to develop (and maybe publish/deploy) +\fBnpm-developers\fR \- Developer Guide +.SH DESCRIPTION +.P +So, you've decided to use npm to develop (and maybe publish/deploy) your project\. -. .P Fantastic! -. .P There are a few things that you need to do above the simple steps that your users will do to install your program\. -. -.SH "About These Documents" +.SH About These Documents +.P These are man pages\. If you install npm, you should be able to then do \fBman npm\-thing\fR to get the documentation on a particular topic, or \fBnpm help thing\fR to see the same information\. -. -.SH "What is a " +.SH What is a \fBpackage\fR +.P A package is: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 a) a folder containing a program described by a package\.json file -. -.IP "\(bu" 4 +.IP \(bu 2 b) a gzipped tarball containing (a) -. -.IP "\(bu" 4 +.IP \(bu 2 c) a url that resolves to (b) -. -.IP "\(bu" 4 +.IP \(bu 2 d) a \fB@\fR that is published on the registry with (c) -. -.IP "\(bu" 4 +.IP \(bu 2 e) a \fB@\fR that points to (d) -. -.IP "\(bu" 4 +.IP \(bu 2 f) a \fB\fR that has a "latest" tag satisfying (e) -. -.IP "\(bu" 4 +.IP \(bu 2 g) a \fBgit\fR url that, when cloned, results in (a)\. -. -.IP "" 0 -. + +.RE .P Even if you never publish your package, you can still get a lot of benefits of using npm if you just want to write a node program (a), and perhaps if you also want to be able to easily install it elsewhere after packing it up into a tarball (b)\. -. .P Git urls can be of the form: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX git://github\.com/user/project\.git#commit\-ish git+ssh://user@hostname:project\.git#commit\-ish git+http://user@hostname/project/blah\.git#commit\-ish git+https://user@hostname/project/blah\.git#commit\-ish -. -.fi -. -.IP "" 0 -. +.EE +.RE .P The \fBcommit\-ish\fR can be any tag, sha, or branch which can be supplied as an argument to \fBgit checkout\fR\|\. The default is \fBmaster\fR\|\. -. -.SH "The package\.json File" +.SH The package\.json File +.P You need to have a \fBpackage\.json\fR file in the root of your project to do much of anything with npm\. That is basically the whole interface\. -. .P See npm help 5 \fBpackage\.json\fR for details about what goes in that file\. At the very least, you need: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 name: This should be a string that identifies your project\. Please do not use the name to specify that it runs on node, or is in JavaScript\. You can use the "engines" field to explicitly state the versions of -node (or whatever else) that your program requires, and it\'s pretty -well assumed that it\'s javascript\. -. -.IP +node (or whatever else) that your program requires, and it's pretty +well assumed that it's javascript\. It does not necessarily need to match your github repository name\. -. -.IP So, \fBnode\-foo\fR and \fBbar\-js\fR are bad names\. \fBfoo\fR or \fBbar\fR are better\. -. -.IP "\(bu" 4 +.IP \(bu 2 version: A semver\-compatible version\. -. -.IP "\(bu" 4 +.IP \(bu 2 engines: Specify the versions of node (or whatever else) that your program runs on\. The node API changes a lot, and there may be bugs or new functionality that you depend on\. Be explicit\. -. -.IP "\(bu" 4 +.IP \(bu 2 author: Take some credit\. -. -.IP "\(bu" 4 +.IP \(bu 2 scripts: If you have a special compilation or installation script, then you should put it in the \fBscripts\fR hash\. You should definitely have at least a basic smoke\-test command as the "scripts\.test" field\. See npm help 7 scripts\. -. -.IP "\(bu" 4 +.IP \(bu 2 main: If you have a single module that serves as the entry point to your program (like what the "foo" package gives you at require("foo")), then you need to specify that in the "main" field\. -. -.IP "\(bu" 4 +.IP \(bu 2 directories: This is a hash of folders\. The best ones to include are "lib" and "doc", but if you specify a folder full of man pages in "man", then -they\'ll get installed just like these ones\. -. -.IP "" 0 -. +they'll get installed just like these ones\. + +.RE .P You can use \fBnpm init\fR in the root of your package in order to get you started with a pretty basic package\.json file\. See npm help \fBnpm\-init\fR for more info\. -. -.SH "Keeping files " -Use a \fB\|\.npmignore\fR file to keep stuff out of your package\. If there\'s +.SH Keeping files \fIout\fR of your package +.P +Use a \fB\|\.npmignore\fR file to keep stuff out of your package\. If there's no \fB\|\.npmignore\fR file, but there \fIis\fR a \fB\|\.gitignore\fR file, then npm will ignore the stuff matched by the \fB\|\.gitignore\fR file\. If you \fIwant\fR to include something that is excluded by your \fB\|\.gitignore\fR file, you can create an empty \fB\|\.npmignore\fR file to override it\. -. .P -By default, the following paths and files are ignored, so there\'s no +By default, the following paths and files are ignored, so there's no need to add them to \fB\|\.npmignore\fR explicitly: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 \fB\|\.*\.swp\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\|\._*\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\|\.DS_Store\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\|\.git\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\|\.hg\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\|\.lock\-wscript\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\|\.svn\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fB\|\.wafpickle\-*\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fBCVS\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fBnpm\-debug\.log\fR -. -.IP "" 0 -. + +.RE .P Additionally, everything in \fBnode_modules\fR is ignored, except for -bundled dependencies\. npm automatically handles this for you, so don\'t +bundled dependencies\. npm automatically handles this for you, so don't bother adding \fBnode_modules\fR to \fB\|\.npmignore\fR\|\. -. .P -The following paths and files are never ignored, so adding them to \fB\|\.npmignore\fR is pointless: -. -.IP "\(bu" 4 +The following paths and files are never ignored, so adding them to +\fB\|\.npmignore\fR is pointless: +.RS 0 +.IP \(bu 2 \fBpackage\.json\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fBREADME\.*\fR -. -.IP "" 0 -. -.SH "Link Packages" + +.RE +.SH Link Packages +.P \fBnpm link\fR is designed to install a development package and see the changes in real time without having to keep re\-installing it\. (You do need to either re\-link or \fBnpm rebuild \-g\fR to update compiled packages, of course\.) -. .P More info at npm help \fBnpm\-link\fR\|\. -. -.SH "Before Publishing: Make Sure Your Package Installs and Works" +.SH Before Publishing: Make Sure Your Package Installs and Works +.P \fBThis is important\.\fR -. .P -If you can not install it locally, you\'ll have -problems trying to publish it\. Or, worse yet, you\'ll be able to -publish it, but you\'ll be publishing a broken or pointless package\. -So don\'t do that\. -. +If you can not install it locally, you'll have +problems trying to publish it\. Or, worse yet, you'll be able to +publish it, but you'll be publishing a broken or pointless package\. +So don't do that\. .P In the root of your package, do this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm install \. \-g -. -.fi -. -.IP "" 0 -. +.EE +.RE .P -That\'ll show you that it\'s working\. If you\'d rather just create a symlink +That'll show you that it's working\. If you'd rather just create a symlink package that points to your working directory, then do this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm link -. -.fi -. -.IP "" 0 -. +.EE +.RE .P -Use \fBnpm ls \-g\fR to see if it\'s there\. -. +Use \fBnpm ls \-g\fR to see if it's there\. .P To test a local install, go into some other folder, and then do: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX cd \.\./some\-other\-folder npm install \.\./my\-package -. -.fi -. -.IP "" 0 -. +.EE +.RE .P to install it locally into the node_modules folder in that other place\. -. .P Then go into the node\-repl, and try using require("my\-thing") to -bring in your module\'s main module\. -. -.SH "Create a User Account" +bring in your module's main module\. +.SH Create a User Account +.P Create a user with the adduser command\. It works like this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm adduser -. -.fi -. -.IP "" 0 -. +.EE +.RE .P and then follow the prompts\. -. .P This is documented better in npm help adduser\. -. -.SH "Publish your package" -This part\'s easy\. IN the root of your folder, do this: -. -.IP "" 4 -. -.nf +.SH Publish your package +.P +This part's easy\. IN the root of your folder, do this: +.P +.RS 2 +.EX npm publish -. -.fi -. -.IP "" 0 -. +.EE +.RE .P You can give publish a url to a tarball, or a filename of a tarball, or a path to a folder\. -. .P Note that pretty much \fBeverything in that folder will be exposed\fR -by default\. So, if you have secret stuff in there, use a \fB\|\.npmignore\fR file to list out the globs to ignore, or publish +by default\. So, if you have secret stuff in there, use a +\fB\|\.npmignore\fR file to list out the globs to ignore, or publish from a fresh checkout\. -. -.SH "Brag about it" +.SH Brag about it +.P Send emails, write blogs, blab in IRC\. -. .P Tell the world how easy it is to install your program! -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 7 faq -. -.IP "\(bu" 4 +.IP \(bu 2 npm help npm -. -.IP "\(bu" 4 +.IP \(bu 2 npm help init -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 package\.json -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 scripts -. -.IP "\(bu" 4 +.IP \(bu 2 npm help publish -. -.IP "\(bu" 4 +.IP \(bu 2 npm help adduser -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 registry -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man7/npm-disputes.7 b/deps/npm/man/man7/npm-disputes.7 index a3163bcaec1..fb7fd25f0af 100644 --- a/deps/npm/man/man7/npm-disputes.7 +++ b/deps/npm/man/man7/npm-disputes.7 @@ -1,92 +1,78 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-DISPUTES" "7" "September 2014" "" "" -. .SH "NAME" -\fBnpm-disputes\fR \-\- Handling Module Name Disputes -. -.SH "SYNOPSIS" -. -.IP "1" 4 +\fBnpm-disputes\fR \- Handling Module Name Disputes +.SH SYNOPSIS +.RS 0 +.IP 1. 3 Get the author email with \fBnpm owner ls \fR -. -.IP "2" 4 -Email the author, CC \fIsupport@npmjs\.com\fR -. -.IP "3" 4 -After a few weeks, if there\'s no resolution, we\'ll sort it out\. -. -.IP "" 0 -. +.IP 2. 3 +Email the author, CC support@npmjs\.com +.IP 3. 3 +After a few weeks, if there's no resolution, we'll sort it out\. + +.RE +.P +Don't squat on package names\. Publish code or move out of the way\. +.SH DESCRIPTION .P -Don\'t squat on package names\. Publish code or move out of the way\. -. -.SH "DESCRIPTION" There sometimes arise cases where a user publishes a module, and then later, some other user wants to use that name\. Here are some common ways that happens (each of these is based on actual events\.) -. -.IP "1" 4 +.RS 0 +.IP 1. 3 Joe writes a JavaScript module \fBfoo\fR, which is not node\-specific\. -Joe doesn\'t use node at all\. Bob wants to use \fBfoo\fR in node, so he +Joe doesn't use node at all\. Bob wants to use \fBfoo\fR in node, so he wraps it in an npm module\. Some time later, Joe starts using node, and wants to take over management of his program\. -. -.IP "2" 4 +.IP 2. 3 Bob writes an npm module \fBfoo\fR, and publishes it\. Perhaps much later, Joe finds a bug in \fBfoo\fR, and fixes it\. He sends a pull -request to Bob, but Bob doesn\'t have the time to deal with it, +request to Bob, but Bob doesn't have the time to deal with it, because he has a new job and a new baby and is focused on his new erlang project, and kind of not involved with node any more\. Joe -would like to publish a new \fBfoo\fR, but can\'t, because the name is +would like to publish a new \fBfoo\fR, but can't, because the name is taken\. -. -.IP "3" 4 +.IP 3. 3 Bob writes a 10\-line flow\-control library, and calls it \fBfoo\fR, and publishes it to the npm registry\. Being a simple little thing, it never really has to be updated\. Joe works for Foo Inc, the makers of the critically acclaimed and widely\-marketed \fBfoo\fR JavaScript toolkit framework\. They publish it to npm as \fBfoojs\fR, but people are routinely confused when \fBnpm install foo\fR is some different thing\. -. -.IP "4" 4 +.IP 4. 3 Bob writes a parser for the widely\-known \fBfoo\fR file format, because he needs it for work\. Then, he gets a new job, and never updates the prototype\. Later on, Joe writes a much more complete \fBfoo\fR parser, -but can\'t publish, because Bob\'s \fBfoo\fR is in the way\. -. -.IP "" 0 -. +but can't publish, because Bob's \fBfoo\fR is in the way\. + +.RE .P -The validity of Joe\'s claim in each situation can be debated\. However, -Joe\'s appropriate course of action in each case is the same\. -. -.IP "1" 4 +The validity of Joe's claim in each situation can be debated\. However, +Joe's appropriate course of action in each case is the same\. +.RS 0 +.IP 1. 3 \fBnpm owner ls foo\fR\|\. This will tell Joe the email address of the owner (Bob)\. -. -.IP "2" 4 +.IP 2. 3 Joe emails Bob, explaining the situation \fBas respectfully as possible\fR, and what he would like to do with the module name\. He -adds the npm support staff \fIsupport@npmjs\.com\fR 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 \fBnpm owner add joe foo\fR to add Joe as an owner of the \fBfoo\fR package\. -. -.IP "3" 4 +.IP 3. 3 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 \fIsupport@npmjs\.com\fR and we\'ll sort it out\. ("Reasonable" is +Bob and Joe can't come to any sort of resolution, email support +support@npmjs\.com and we'll sort it out\. ("Reasonable" is usually at least 4 weeks, but extra time is allowed around common holidays\.) -. -.IP "" 0 -. -.SH "REASONING" + +.RE +.SH REASONING +.P In almost every case so far, the parties involved have been able to reach an amicable resolution without any major intervention\. Most people really do want to be reasonable, and are probably not even aware that -they\'re in your way\. -. +they're in your way\. .P Module ecosystems are most vibrant and powerful when they are as self\-directed as possible\. If an admin one day deletes something you @@ -94,53 +80,45 @@ had worked on, then that is going to make most people quite upset, regardless of the justification\. When humans solve their problems by talking to other humans with respect, everyone has the chance to end up feeling good about the interaction\. -. -.SH "EXCEPTIONS" +.SH EXCEPTIONS +.P Some things are not allowed, and will be removed without discussion if they are brought to the attention of the npm registry admins, including but not limited to: -. -.IP "1" 4 +.RS 0 +.IP 1. 3 Malware (that is, a package designed to exploit or harm the machine on which it is installed)\. -. -.IP "2" 4 +.IP 2. 3 Violations of copyright or licenses (for example, cloning an MIT\-licensed program, and then removing or changing the copyright and license statement)\. -. -.IP "3" 4 +.IP 3. 3 Illegal content\. -. -.IP "4" 4 -"Squatting" on a package name that you \fIplan\fR to use, but aren\'t -actually using\. Sorry, I don\'t care how great the name is, or how +.IP 4. 3 +"Squatting" on a package name that you \fIplan\fR to use, but aren't +actually using\. Sorry, I don't care how great the name is, or how perfect a fit it is for the thing that someday might happen\. If -someone wants to use it today, and you\'re just taking up space with -an empty tarball, you\'re going to be evicted\. -. -.IP "5" 4 +someone wants to use it today, and you're just taking up space with +an empty tarball, you're going to be evicted\. +.IP 5. 3 Putting empty packages in the registry\. Packages must have SOME -functionality\. It can be silly, but it can\'t be \fInothing\fR\|\. (See +functionality\. It can be silly, but it can't be \fInothing\fR\|\. (See also: squatting\.) -. -.IP "6" 4 +.IP 6. 3 Doing weird things with the registry, like using it as your own personal application database or otherwise putting non\-packagey things into it\. -. -.IP "" 0 -. + +.RE .P If you see bad behavior like this, please report it right away\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help 7 registry -. -.IP "\(bu" 4 +.IP \(bu 2 npm help owner -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man7/npm-faq.7 b/deps/npm/man/man7/npm-faq.7 index 5eefee8d06b..942d3c0140e 100644 --- a/deps/npm/man/man7/npm-faq.7 +++ b/deps/npm/man/man7/npm-faq.7 @@ -1,145 +1,118 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-FAQ" "7" "September 2014" "" "" -. .SH "NAME" -\fBnpm-faq\fR \-\- Frequently Asked Questions -. -.SH "Where can I find these docs in HTML?" -\fIhttps://www\.npmjs\.org/doc/\fR, or run: -. -.IP "" 4 -. -.nf +\fBnpm-faq\fR \- Frequently Asked Questions +.SH Where can I find these docs in HTML? +.P +https://www\.npmjs\.org/doc/, or run: +.P +.RS 2 +.EX npm config set viewer browser -. -.fi -. -.IP "" 0 -. +.EE +.RE .P to open these documents in your default web browser rather than \fBman\fR\|\. -. -.SH "It didn't work\." -That\'s not really a question\. -. -.SH "Why didn't it work?" -I don\'t know yet\. -. -.P -Read the error output, and if you can\'t figure out what it means, +.SH It didn't work\. +.P +That's not really a question\. +.SH Why didn't it work? +.P +I don't know yet\. +.P +Read the error output, and if you can't figure out what it means, do what it says and post a bug with all the information it asks for\. -. -.SH "Where does npm put stuff?" +.SH Where does npm put stuff? +.P See npm help 5 \fBnpm\-folders\fR -. .P tl;dr: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 Use the \fBnpm root\fR command to see where modules go, and the \fBnpm bin\fR command to see where executables go -. -.IP "\(bu" 4 +.IP \(bu 2 Global installs are different from local installs\. If you install something with the \fB\-g\fR flag, then its executables go in \fBnpm bin \-g\fR and its modules go in \fBnpm root \-g\fR\|\. -. -.IP "" 0 -. -.SH "How do I install something on my computer in a central location?" + +.RE +.SH How do I install something on my computer in a central location? +.P Install it globally by tacking \fB\-g\fR or \fB\-\-global\fR to the command\. (This is especially important for command line utilities that need to add their bins to the global system \fBPATH\fR\|\.) -. -.SH "I installed something globally, but I can't " +.SH I installed something globally, but I can't \fBrequire()\fR it +.P Install it locally\. -. .P The global install location is a place for command\-line utilities -to put their bins in the system \fBPATH\fR\|\. It\'s not for use with \fBrequire()\fR\|\. -. +to put their bins in the system \fBPATH\fR\|\. It's not for use with \fBrequire()\fR\|\. .P -If you \fBrequire()\fR a module in your code, then that means it\'s a +If you \fBrequire()\fR a module in your code, then that means it's a dependency, and a part of your program\. You need to install it locally in your program\. -. -.SH "Why can't npm just put everything in one place, like other package managers?" +.SH Why can't npm just put everything in one place, like other package managers? +.P Not every change is an improvement, but every improvement is a change\. -This would be like asking git to do network IO for every commit\. It\'s -not going to happen, because it\'s a terrible idea that causes more +This would be like asking git to do network IO for every commit\. It's +not going to happen, because it's a terrible idea that causes more problems than it solves\. -. .P It is much harder to avoid dependency conflicts without nesting dependencies\. This is fundamental to the way that npm works, and has proven to be an extremely successful approach\. See npm help 5 \fBnpm\-folders\fR for more details\. -. .P If you want a package to be installed in one place, and have all your programs reference the same copy of it, then use the \fBnpm link\fR command\. -That\'s what it\'s for\. Install it globally, then link it into each +That's what it's for\. Install it globally, then link it into each program that uses it\. -. -.SH "Whatever, I really want the old style 'everything global' style\." +.SH Whatever, I really want the old style 'everything global' style\. +.P Write your own package manager\. You could probably even wrap up \fBnpm\fR in a shell script if you really wanted to\. -. .P npm will not help you do something that is known to be a bad idea\. -. -.SH "Should I check my " -Mikeal Rogers answered this question very well: -. -.P -\fIhttp://www\.futurealoof\.com/posts/nodemodules\-in\-git\.html\fR -. -.P -tl;dr -. -.IP "\(bu" 4 -Check \fBnode_modules\fR into git for things you \fBdeploy\fR, such as -websites and apps\. -. -.IP "\(bu" 4 -Do not check \fBnode_modules\fR into git for libraries and modules -intended to be reused\. -. -.IP "\(bu" 4 -Use npm to manage dependencies in your dev environment, but not in -your deployment scripts\. -. -.IP "" 0 -. -.SH "Is it 'npm' or 'NPM' or 'Npm'?" +.SH Should I check my \fBnode_modules\fR folder into git? +.P +Usually, no\. Allow npm to resolve dependencies for your packages\. +.P +For packages you \fBdeploy\fR, such as websites and apps, +you should use npm shrinkwrap to lock down your full dependency tree: +.P +https://www\.npmjs\.org/doc/cli/npm\-shrinkwrap\.html +.P +If you are paranoid about depending on the npm ecosystem, +you should run a private npm mirror or a private cache\. +.P +If you want 100% confidence in being able to reproduce the specific bytes +included in a deployment, you should use an additional mechanism that can +verify contents rather than versions\. For example, +Amazon machine images, DigitalOcean snapshots, Heroku slugs, or simple tarballs\. +.SH Is it 'npm' or 'NPM' or 'Npm'? +.P npm should never be capitalized unless it is being displayed in a location that is customarily all\-caps (such as the title of man pages\.) -. -.SH "If 'npm' is an acronym, why is it never capitalized?" +.SH If 'npm' is an acronym, why is it never capitalized? +.P Contrary to the belief of many, "npm" is not in fact an abbreviation for "Node Package Manager"\. It is a recursive bacronymic abbreviation for "npm is not an acronym"\. (If it was "ninaa", then it would be an acronym, and thus incorrectly named\.) -. .P "NPM", however, \fIis\fR an acronym (more precisely, a capitonym) for the National Association of Pastoral Musicians\. You can learn more -about them at \fIhttp://npm\.org/\fR\|\. -. +about them at http://npm\.org/\|\. .P In software, "NPM" is a Non\-Parametric Mapping utility written by Chris Rorden\. You can analyze pictures of brains with it\. Learn more -about the (capitalized) NPM program at \fIhttp://www\.cabiatl\.com/mricro/npm/\fR\|\. -. +about the (capitalized) NPM program at http://www\.cabiatl\.com/mricro/npm/\|\. .P The first seed that eventually grew into this flower was a bash utility named "pm", which was a shortened descendent of "pkgmakeinst", a bash function that was used to install various different things on different -platforms, most often using Yahoo\'s \fByinst\fR\|\. If \fBnpm\fR was ever an +platforms, most often using Yahoo's \fByinst\fR\|\. If \fBnpm\fR was ever an acronym for anything, it was \fBnode pm\fR or maybe \fBnew pm\fR\|\. -. .P So, in all seriousness, the "npm" project is named after its command\-line utility, which was organically selected to be easily typed by a right\-handed @@ -147,183 +120,151 @@ programmer using a US QWERTY keyboard layout, ending with the right\-ring\-finger in a postition to type the \fB\-\fR key for flags and other command\-line arguments\. That command\-line utility is always lower\-case, though it starts most sentences it is a part of\. -. -.SH "How do I list installed packages?" +.SH How do I list installed packages? +.P \fBnpm ls\fR -. -.SH "How do I search for packages?" +.SH How do I search for packages? +.P \fBnpm search\fR -. .P Arguments are greps\. \fBnpm search jsdom\fR shows jsdom packages\. -. -.SH "How do I update npm?" -. -.nf +.SH How do I update npm? +.P +.RS 2 +.EX npm update npm \-g -. -.fi -. +.EE +.RE .P You can also update all outdated local packages by doing \fBnpm update\fR without any arguments, or global packages by doing \fBnpm update \-g\fR\|\. -. .P Occasionally, the version of npm will progress such that the current version cannot be properly installed with the version that you have installed already\. (Consider, if there is ever a bug in the \fBupdate\fR command\.) -. .P In those cases, you can do this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX curl https://www\.npmjs\.org/install\.sh | sh -. -.fi -. -.IP "" 0 -. -.SH "What is a " +.EE +.RE +.SH What is a \fBpackage\fR? +.P A package is: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 a) a folder containing a program described by a package\.json file -. -.IP "\(bu" 4 +.IP \(bu 2 b) a gzipped tarball containing (a) -. -.IP "\(bu" 4 +.IP \(bu 2 c) a url that resolves to (b) -. -.IP "\(bu" 4 +.IP \(bu 2 d) a \fB@\fR that is published on the registry with (c) -. -.IP "\(bu" 4 +.IP \(bu 2 e) a \fB@\fR that points to (d) -. -.IP "\(bu" 4 +.IP \(bu 2 f) a \fB\fR that has a "latest" tag satisfying (e) -. -.IP "\(bu" 4 +.IP \(bu 2 g) a \fBgit\fR url that, when cloned, results in (a)\. -. -.IP "" 0 -. + +.RE .P Even if you never publish your package, you can still get a lot of benefits of using npm if you just want to write a node program (a), and perhaps if you also want to be able to easily install it elsewhere after packing it up into a tarball (b)\. -. .P Git urls can be of the form: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX git://github\.com/user/project\.git#commit\-ish git+ssh://user@hostname:project\.git#commit\-ish git+http://user@hostname/project/blah\.git#commit\-ish git+https://user@hostname/project/blah\.git#commit\-ish -. -.fi -. -.IP "" 0 -. +.EE +.RE .P The \fBcommit\-ish\fR can be any tag, sha, or branch which can be supplied as an argument to \fBgit checkout\fR\|\. The default is \fBmaster\fR\|\. -. -.SH "What is a " +.SH What is a \fBmodule\fR? +.P A module is anything that can be loaded with \fBrequire()\fR in a Node\.js program\. The following things are all examples of things that can be loaded as modules: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 A folder with a \fBpackage\.json\fR file containing a \fBmain\fR field\. -. -.IP "\(bu" 4 +.IP \(bu 2 A folder with an \fBindex\.js\fR file in it\. -. -.IP "\(bu" 4 +.IP \(bu 2 A JavaScript file\. -. -.IP "" 0 -. + +.RE .P Most npm packages are modules, because they are libraries that you -load with \fBrequire\fR\|\. However, there\'s no requirement that an npm +load with \fBrequire\fR\|\. However, there's no requirement that an npm package be a module! Some only contain an executable command\-line -interface, and don\'t provide a \fBmain\fR field for use in Node programs\. -. +interface, and don't provide a \fBmain\fR field for use in Node programs\. .P -Almost all npm packages (at least, those that are Node programs) \fIcontain\fR many modules within them (because every file they load with \fBrequire()\fR is a module)\. -. +Almost all npm packages (at least, those that are Node programs) +\fIcontain\fR many modules within them (because every file they load with +\fBrequire()\fR is a module)\. .P In the context of a Node program, the \fBmodule\fR is also the thing that was loaded \fIfrom\fR a file\. For example, in the following program: -. -.IP "" 4 -. -.nf -var req = require(\'request\') -. -.fi -. -.IP "" 0 -. +.P +.RS 2 +.EX +var req = require('request') +.EE +.RE .P we might say that "The variable \fBreq\fR refers to the \fBrequest\fR module"\. -. -.SH "So, why is it the "" +.SH So, why is it the "\fBnode_modules\fR" folder, but "\fBpackage\.json\fR" file? Why not \fBnode_packages\fR or \fBmodule\.json\fR? +.P The \fBpackage\.json\fR file defines the package\. (See "What is a package?" above\.) -. .P The \fBnode_modules\fR folder is the place Node\.js looks for modules\. (See "What is a module?" above\.) -. .P For example, if you create a file at \fBnode_modules/foo\.js\fR and then -had a program that did \fBvar f = require(\'foo\.js\')\fR then it would load +had a program that did \fBvar f = require('foo\.js')\fR then it would load the module\. However, \fBfoo\.js\fR is not a "package" in this case, because it does not have a package\.json\. -. .P -Alternatively, if you create a package which does not have an \fBindex\.js\fR or a \fB"main"\fR field in the \fBpackage\.json\fR file, then it is -not a module\. Even if it\'s installed in \fBnode_modules\fR, it can\'t be +Alternatively, if you create a package which does not have an +\fBindex\.js\fR or a \fB"main"\fR field in the \fBpackage\.json\fR file, then it is +not a module\. Even if it's installed in \fBnode_modules\fR, it can't be an argument to \fBrequire()\fR\|\. -. -.SH ""node_modules"" +.SH \fB"node_modules"\fR is the name of my deity's arch\-rival, and a Forbidden Word in my religion\. Can I configure npm to use a different folder? +.P No\. This will never happen\. This question comes up sometimes, -because it seems silly from the outside that npm couldn\'t just be +because it seems silly from the outside that npm couldn't just be configured to put stuff somewhere else, and then npm could load them -from there\. It\'s an arbitrary spelling choice, right? What\'s the big +from there\. It's an arbitrary spelling choice, right? What's the big deal? -. .P -At the time of this writing, the string \fB\'node_modules\'\fR appears 151 +At the time of this writing, the string \fB\|'node_modules'\fR appears 151 times in 53 separate files in npm and node core (excluding tests and documentation)\. -. .P -Some of these references are in node\'s built\-in module loader\. Since +Some of these references are in node's built\-in module loader\. Since npm is not involved \fBat all\fR at run\-time, node itself would have to -be configured to know where you\'ve decided to stick stuff\. Complexity +be configured to know where you've decided to stick stuff\. Complexity hurdle #1\. Since the Node module system is locked, this cannot be -changed, and is enough to kill this request\. But I\'ll continue, in -deference to your deity\'s delicate feelings regarding spelling\. -. +changed, and is enough to kill this request\. But I'll continue, in +deference to your deity's delicate feelings regarding spelling\. .P Many of the others are in dependencies that npm uses, which are not necessarily tightly coupled to npm (in the sense that they do not read -npm\'s configuration files, etc\.) Each of these would have to be +npm's configuration files, etc\.) Each of these would have to be configured to take the name of the \fBnode_modules\fR folder as a parameter\. Complexity hurdle #2\. -. .P Furthermore, npm has the ability to "bundle" dependencies by adding the dep names to the \fB"bundledDependencies"\fR list in package\.json, @@ -332,148 +273,127 @@ if the author of a module bundles its dependencies, and they use a different spelling for \fBnode_modules\fR? npm would have to rename the folder at publish time, and then be smart enough to unpack it using your locally configured name\. Complexity hurdle #3\. -. .P -Furthermore, what happens when you \fIchange\fR this name? Fine, it\'s -easy enough the first time, just rename the \fBnode_modules\fR folders to \fB\|\./blergyblerp/\fR or whatever name you choose\. But what about when you -change it again? npm doesn\'t currently track any state about past +Furthermore, what happens when you \fIchange\fR this name? Fine, it's +easy enough the first time, just rename the \fBnode_modules\fR folders to +\fB\|\./blergyblerp/\fR or whatever name you choose\. But what about when you +change it again? npm doesn't currently track any state about past configuration settings, so this would be rather difficult to do properly\. It would have to track every previous value for this -config, and always accept any of them, or else yesterday\'s install may +config, and always accept any of them, or else yesterday's install may be broken tomorrow\. Complexity hurdle #4\. -. .P Never going to happen\. The folder is named \fBnode_modules\fR\|\. It is written indelibly in the Node Way, handed down from the ancient times of Node 0\.3\. -. -.SH "How do I install node with npm?" -You don\'t\. Try one of these node version managers: -. +.SH How do I install node with npm? +.P +You don't\. Try one of these node version managers: .P Unix: -. -.IP "\(bu" 4 -\fIhttp://github\.com/isaacs/nave\fR -. -.IP "\(bu" 4 -\fIhttp://github\.com/visionmedia/n\fR -. -.IP "\(bu" 4 -\fIhttp://github\.com/creationix/nvm\fR -. -.IP "" 0 -. +.RS 0 +.IP \(bu 2 +http://github\.com/isaacs/nave +.IP \(bu 2 +http://github\.com/visionmedia/n +.IP \(bu 2 +http://github\.com/creationix/nvm + +.RE .P Windows: -. -.IP "\(bu" 4 -\fIhttp://github\.com/marcelklehr/nodist\fR -. -.IP "\(bu" 4 -\fIhttps://github\.com/hakobera/nvmw\fR -. -.IP "\(bu" 4 -\fIhttps://github\.com/nanjingboy/nvmw\fR -. -.IP "" 0 -. -.SH "How can I use npm for development?" +.RS 0 +.IP \(bu 2 +http://github\.com/marcelklehr/nodist +.IP \(bu 2 +https://github\.com/hakobera/nvmw +.IP \(bu 2 +https://github\.com/nanjingboy/nvmw + +.RE +.SH How can I use npm for development? +.P See npm help 7 \fBnpm\-developers\fR and npm help 5 \fBpackage\.json\fR\|\. -. .P -You\'ll most likely want to \fBnpm link\fR your development folder\. That\'s +You'll most likely want to \fBnpm link\fR your development folder\. That's awesomely handy\. -. .P To set up your own private registry, check out npm help 7 \fBnpm\-registry\fR\|\. -. -.SH "Can I list a url as a dependency?" +.SH Can I list a url as a dependency? +.P Yes\. It should be a url to a gzipped tarball containing a single folder that has a package\.json in its root, or a git url\. (See "what is a package?" above\.) -. -.SH "How do I symlink to a dev folder so I don't have to keep re\-installing?" +.SH How do I symlink to a dev folder so I don't have to keep re\-installing? +.P See npm help \fBnpm\-link\fR -. -.SH "The package registry website\. What is that exactly?" +.SH The package registry website\. What is that exactly? +.P See npm help 7 \fBnpm\-registry\fR\|\. -. -.SH "I forgot my password, and can't publish\. How do I reset it?" -Go to \fIhttps://npmjs\.org/forgot\fR\|\. -. -.SH "I get ECONNREFUSED a lot\. What's up?" -Either the registry is down, or node\'s DNS isn\'t able to reach out\. -. -.P -To check if the registry is down, open up \fIhttps://registry\.npmjs\.org/\fR in a web browser\. This will also tell +.SH I forgot my password, and can't publish\. How do I reset it? +.P +Go to https://npmjs\.org/forgot\|\. +.SH I get ECONNREFUSED a lot\. What's up? +.P +Either the registry is down, or node's DNS isn't able to reach out\. +.P +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\. -. .P -If the registry IS down, let us know by emailing \fIsupport@npmjs\.com\fR -or posting an issue at \fIhttps://github\.com/npm/npm/issues\fR\|\. If it\'s -down for the world (and not just on your local network) then we\'re +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\. -. .P You can also often get a faster response by visiting the #npm channel on Freenode IRC\. -. -.SH "Why no namespaces?" -Please see this discussion: \fIhttps://github\.com/npm/npm/issues/798\fR -. +.SH Why no namespaces? +.P +Please see this discussion: https://github\.com/npm/npm/issues/798 .P -tl;dr \- It doesn\'t actually make things better, and can make them worse\. -. +tl;dr \- It doesn't actually make things better, and can make them worse\. .P -If you want to namespace your own packages, you may: simply use the \fB\-\fR character to separate the names\. npm is a mostly anarchic system\. +If you want to namespace your own packages, you may: simply use the +\fB\-\fR character to separate the names\. npm is a mostly anarchic system\. There is not sufficient need to impose namespace rules on everyone\. -. -.SH "Who does npm?" +.SH Who does npm? +.P npm was originally written by Isaac Z\. Schlueter, and many others have contributed to it, some of them quite substantially\. -. .P The npm open source project, The npm Registry, and the community website \fIhttps://www\.npmjs\.org\fR are maintained and operated by the good folks at npm, Inc\. \fIhttp://www\.npmjs\.com\fR -. -.SH "I have a question or request not addressed here\. Where should I put it?" +.SH I have a question or request not addressed here\. Where should I put it? +.P Post an issue on the github project: -. -.IP "\(bu" 4 -\fIhttps://github\.com/npm/npm/issues\fR -. -.IP "" 0 -. -.SH "Why does npm hate me?" +.RS 0 +.IP \(bu 2 +https://github\.com/npm/npm/issues + +.RE +.SH Why does npm hate me? +.P npm is not capable of hatred\. It loves everyone, especially you\. -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help npm -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 developers -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 package\.json -. -.IP "\(bu" 4 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 folders -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man7/npm-index.7 b/deps/npm/man/man7/npm-index.7 index 763b3dd3e52..5667722b278 100644 --- a/deps/npm/man/man7/npm-index.7 +++ b/deps/npm/man/man7/npm-index.7 @@ -1,322 +1,322 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-INDEX" "7" "September 2014" "" "" -. .SH "NAME" -\fBnpm-index\fR \-\- Index of all npm documentation -. -.SS "npm help README" +\fBnpm-index\fR \- Index of all npm documentation +.SS npm help README +.P node package manager -. -.SH "Command Line Documentation" +.SH Command Line Documentation +.P Using npm on the command line -. -.SS "npm help npm" +.SS npm help npm +.P node package manager -. -.SS "npm help adduser" +.SS npm help adduser +.P Add a registry user account -. -.SS "npm help bin" +.SS npm help bin +.P Display npm bin folder -. -.SS "npm help bugs" +.SS npm help bugs +.P Bugs for a package in a web browser maybe -. -.SS "npm help build" +.SS npm help build +.P Build a package -. -.SS "npm help bundle" +.SS npm help bundle +.P REMOVED -. -.SS "npm help cache" +.SS npm help cache +.P Manipulates packages cache -. -.SS "npm help completion" +.SS npm help completion +.P Tab Completion for npm -. -.SS "npm help config" +.SS npm help config +.P Manage the npm configuration files -. -.SS "npm help dedupe" +.SS npm help dedupe +.P Reduce duplication -. -.SS "npm help deprecate" +.SS npm help deprecate +.P Deprecate a version of a package -. -.SS "npm help docs" +.SS npm help docs +.P Docs for a package in a web browser maybe -. -.SS "npm help edit" +.SS npm help edit +.P Edit an installed package -. -.SS "npm help explore" +.SS npm help explore +.P Browse an installed package -. -.SS "npm help help\-search" +.SS npm help help\-search +.P Search npm help documentation -. -.SS "npm help help" +.SS npm help help +.P Get help on npm -. -.SS "npm help init" +.SS npm help init +.P Interactively create a package\.json file -. -.SS "npm help install" +.SS npm help install +.P Install a package -. -.SS "npm help link" +.SS npm help link +.P Symlink a package folder -. -.SS "npm help ls" +.SS npm help ls +.P List installed packages -. -.SS "npm help outdated" +.SS npm help outdated +.P Check for outdated packages -. -.SS "npm help owner" +.SS npm help owner +.P Manage package owners -. -.SS "npm help pack" +.SS npm help pack +.P Create a tarball from a package -. -.SS "npm help prefix" +.SS npm help prefix +.P Display prefix -. -.SS "npm help prune" +.SS npm help prune +.P Remove extraneous packages -. -.SS "npm help publish" +.SS npm help publish +.P Publish a package -. -.SS "npm help rebuild" +.SS npm help rebuild +.P Rebuild a package -. -.SS "npm help repo" +.SS npm help repo +.P Open package repository page in the browser -. -.SS "npm help restart" +.SS npm help restart +.P Start a package -. -.SS "npm help rm" +.SS npm help rm +.P Remove a package -. -.SS "npm help root" +.SS npm help root +.P Display npm root -. -.SS "npm help run\-script" +.SS npm help run\-script +.P Run arbitrary package scripts -. -.SS "npm help search" +.SS npm help search +.P Search for packages -. -.SS "npm help shrinkwrap" +.SS npm help shrinkwrap +.P Lock down dependency versions -. -.SS "npm help star" +.SS npm help star +.P Mark your favorite packages -. -.SS "npm help stars" +.SS npm help stars +.P View packages marked as favorites -. -.SS "npm help start" +.SS npm help start +.P Start a package -. -.SS "npm help stop" +.SS npm help stop +.P Stop a package -. -.SS "npm help submodule" +.SS npm help submodule +.P Add a package as a git submodule -. -.SS "npm help tag" +.SS npm help tag +.P Tag a published version -. -.SS "npm help test" +.SS npm help test +.P Test a package -. -.SS "npm help uninstall" +.SS npm help uninstall +.P Remove a package -. -.SS "npm help unpublish" +.SS npm help unpublish +.P Remove a package from the registry -. -.SS "npm help update" +.SS npm help update +.P Update a package -. -.SS "npm help version" +.SS npm help version +.P Bump a package version -. -.SS "npm help view" +.SS npm help view +.P View registry info -. -.SS "npm help whoami" +.SS npm help whoami +.P Display npm username -. -.SH "API Documentation" +.SH API Documentation +.P Using npm in your Node programs -. -.SS "npm apihelp npm" +.SS npm apihelp npm +.P node package manager -. -.SS "npm apihelp bin" +.SS npm apihelp bin +.P Display npm bin folder -. -.SS "npm apihelp bugs" +.SS npm apihelp bugs +.P Bugs for a package in a web browser maybe -. -.SS "npm apihelp cache" +.SS npm apihelp cache +.P manage the npm cache programmatically -. -.SS "npm apihelp commands" +.SS npm apihelp commands +.P npm commands -. -.SS "npm apihelp config" +.SS npm apihelp config +.P Manage the npm configuration files -. -.SS "npm apihelp deprecate" +.SS npm apihelp deprecate +.P Deprecate a version of a package -. -.SS "npm apihelp docs" +.SS npm apihelp docs +.P Docs for a package in a web browser maybe -. -.SS "npm apihelp edit" +.SS npm apihelp edit +.P Edit an installed package -. -.SS "npm apihelp explore" +.SS npm apihelp explore +.P Browse an installed package -. -.SS "npm apihelp help\-search" +.SS npm apihelp help\-search +.P Search the help pages -. -.SS "npm apihelp init" +.SS npm apihelp init +.P Interactively create a package\.json file -. -.SS "npm apihelp install" +.SS npm apihelp install +.P install a package programmatically -. -.SS "npm apihelp link" +.SS npm apihelp link +.P Symlink a package folder -. -.SS "npm apihelp load" +.SS npm apihelp load +.P Load config settings -. -.SS "npm apihelp ls" +.SS npm apihelp ls +.P List installed packages -. -.SS "npm apihelp outdated" +.SS npm apihelp outdated +.P Check for outdated packages -. -.SS "npm apihelp owner" +.SS npm apihelp owner +.P Manage package owners -. -.SS "npm apihelp pack" +.SS npm apihelp pack +.P Create a tarball from a package -. -.SS "npm apihelp prefix" +.SS npm apihelp prefix +.P Display prefix -. -.SS "npm apihelp prune" +.SS npm apihelp prune +.P Remove extraneous packages -. -.SS "npm apihelp publish" +.SS npm apihelp publish +.P Publish a package -. -.SS "npm apihelp rebuild" +.SS npm apihelp rebuild +.P Rebuild a package -. -.SS "npm apihelp repo" +.SS npm apihelp repo +.P Open package repository page in the browser -. -.SS "npm apihelp restart" +.SS npm apihelp restart +.P Start a package -. -.SS "npm apihelp root" +.SS npm apihelp root +.P Display npm root -. -.SS "npm apihelp run\-script" +.SS npm apihelp run\-script +.P Run arbitrary package scripts -. -.SS "npm apihelp search" +.SS npm apihelp search +.P Search for packages -. -.SS "npm apihelp shrinkwrap" +.SS npm apihelp shrinkwrap +.P programmatically generate package shrinkwrap file -. -.SS "npm apihelp start" +.SS npm apihelp start +.P Start a package -. -.SS "npm apihelp stop" +.SS npm apihelp stop +.P Stop a package -. -.SS "npm apihelp submodule" +.SS npm apihelp submodule +.P Add a package as a git submodule -. -.SS "npm apihelp tag" +.SS npm apihelp tag +.P Tag a published version -. -.SS "npm apihelp test" +.SS npm apihelp test +.P Test a package -. -.SS "npm apihelp uninstall" +.SS npm apihelp uninstall +.P uninstall a package programmatically -. -.SS "npm apihelp unpublish" +.SS npm apihelp unpublish +.P Remove a package from the registry -. -.SS "npm apihelp update" +.SS npm apihelp update +.P Update a package -. -.SS "npm apihelp version" +.SS npm apihelp version +.P Bump a package version -. -.SS "npm apihelp view" +.SS npm apihelp view +.P View registry info -. -.SS "npm apihelp whoami" +.SS npm apihelp whoami +.P Display npm username -. -.SH "Files" +.SH Files +.P File system structures npm uses -. -.SS "npm help 5 folders" +.SS npm help 5 folders +.P Folder Structures Used by npm -. -.SS "npm help 5 npmrc" +.SS npm help 5 npmrc +.P The npm config files -. -.SS "npm help 5 package\.json" -Specifics of npm\'s package\.json handling -. -.SH "Misc" +.SS npm help 5 package\.json +.P +Specifics of npm's package\.json handling +.SH Misc +.P Various other bits and bobs -. -.SS "npm help 7 coding\-style" -npm\'s "funny" coding style -. -.SS "npm help 7 config" +.SS npm help 7 coding\-style +.P +npm's "funny" coding style +.SS npm help 7 config +.P More than you probably want to know about npm configuration -. -.SS "npm help 7 developers" +.SS npm help 7 developers +.P Developer Guide -. -.SS "npm help 7 disputes" +.SS npm help 7 disputes +.P Handling Module Name Disputes -. -.SS "npm help 7 faq" +.SS npm help 7 faq +.P Frequently Asked Questions -. -.SS "npm help 7 index" +.SS npm help 7 index +.P Index of all npm documentation -. -.SS "npm help 7 registry" +.SS npm help 7 registry +.P The JavaScript Package Registry -. -.SS "npm help 7 scripts" +.SS npm help 7 scope +.P +Scoped packages +.SS npm help 7 scripts +.P How npm handles the "scripts" field -. -.SS "npm help 7 removing\-npm" +.SS npm help 7 removing\-npm +.P Cleaning the Slate -. -.SS "npm help 7 semver" +.SS npm help 7 semver +.P The semantic versioner for npm + diff --git a/deps/npm/man/man7/npm-registry.7 b/deps/npm/man/man7/npm-registry.7 index c190779ad1a..ac3059cae22 100644 --- a/deps/npm/man/man7/npm-registry.7 +++ b/deps/npm/man/man7/npm-registry.7 @@ -1,82 +1,70 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-REGISTRY" "7" "September 2014" "" "" -. .SH "NAME" -\fBnpm-registry\fR \-\- The JavaScript Package Registry -. -.SH "DESCRIPTION" +\fBnpm-registry\fR \- The JavaScript Package Registry +.SH DESCRIPTION +.P To resolve packages by name and version, npm talks to a registry website that implements the CommonJS Package Registry specification for reading package info\. -. .P -Additionally, npm\'s package registry implementation supports several +Additionally, npm's package registry implementation supports several write APIs as well, to allow for publishing packages and managing user account information\. -. .P -The official public npm registry is at \fIhttp://registry\.npmjs\.org/\fR\|\. It -is powered by a CouchDB database at \fIhttp://isaacs\.iriscouch\.com/registry\fR\|\. The code for the couchapp is -available at \fIhttp://github\.com/npm/npmjs\.org\fR\|\. npm user accounts -are CouchDB users, stored in the \fIhttp://isaacs\.iriscouch\.com/_users\fR -database\. -. +The official public npm registry is at http://registry\.npmjs\.org/\|\. It +is powered by a CouchDB database, of which there is a public mirror at +http://skimdb\.npmjs\.com/registry\|\. The code for the couchapp is +available at http://github\.com/npm/npm\-registry\-couchapp\|\. +.P +The registry URL used is determined by the scope of the package (see +npm help 7 \fBnpm\-scope\fR)\. If no scope is specified, the default registry is used, which is +supplied by the \fBregistry\fR config parameter\. See npm help \fBnpm\-config\fR, +npm help 5 \fBnpmrc\fR, and npm help 7 \fBnpm\-config\fR for more on managing npm's configuration\. +.SH Can I run my own private registry? .P -The registry URL is supplied by the \fBregistry\fR config parameter\. See npm help \fBnpm\-config\fR, npm help 5 \fBnpmrc\fR, and npm help 7 \fBnpm\-config\fR for more on managing -npm\'s configuration\. -. -.SH "Can I run my own private registry?" Yes! -. .P The easiest way is to replicate the couch database, and use the same (or similar) design doc to implement the APIs\. -. .P If you set up continuous replication from the official CouchDB, and then -set your internal CouchDB as the registry config, then you\'ll be able +set your internal CouchDB as the registry config, then you'll be able to read any published packages, in addition to your private ones, and by default will only publish internally\. If you then want to publish a -package for the whole world to see, you can simply override the \fB\-\-registry\fR config for that command\. -. -.SH "I don't want my package published in the official registry\. It's private\." +package for the whole world to see, you can simply override the +\fB\-\-registry\fR config for that command\. +.SH I don't want my package published in the official registry\. It's private\. +.P Set \fB"private": true\fR in your package\.json to prevent it from being -published at all, or \fB"publishConfig":{"registry":"http://my\-internal\-registry\.local"}\fR +published at all, or +\fB"publishConfig":{"registry":"http://my\-internal\-registry\.local"}\fR to force it to be published only to your internal registry\. -. .P See npm help 5 \fBpackage\.json\fR for more info on what goes in the package\.json file\. -. -.SH "Will you replicate from my registry into the public one?" +.SH Will you replicate from my registry into the public one? +.P No\. If you want things to be public, then publish them into the public registry using npm\. What little security there is would be for nought otherwise\. -. -.SH "Do I have to use couchdb to build a registry that npm can talk to?" -No, but it\'s way easier\. Basically, yes, you do, or you have to +.SH Do I have to use couchdb to build a registry that npm can talk to? +.P +No, but it's way easier\. Basically, yes, you do, or you have to effectively implement the entire CouchDB API anyway\. -. -.SH "Is there a website or something to see package docs and such?" -Yes, head over to \fIhttps://npmjs\.org/\fR -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH Is there a website or something to see package docs and such? +.P +Yes, head over to https://npmjs\.org/ +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 config -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 npmrc -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 developers -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 disputes -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man7/npm-scripts.7 b/deps/npm/man/man7/npm-scripts.7 index d4d045f8709..4cc93a64698 100644 --- a/deps/npm/man/man7/npm-scripts.7 +++ b/deps/npm/man/man7/npm-scripts.7 @@ -1,77 +1,64 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-SCRIPTS" "7" "September 2014" "" "" -. .SH "NAME" -\fBnpm-scripts\fR \-\- How npm handles the "scripts" field -. -.SH "DESCRIPTION" +\fBnpm-scripts\fR \- How npm handles the "scripts" field +.SH DESCRIPTION +.P npm supports the "scripts" member of the package\.json script, for the following scripts: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 prepublish: Run BEFORE the package is published\. (Also run on local \fBnpm install\fR without any arguments\.) -. -.IP "\(bu" 4 +.IP \(bu 2 publish, postpublish: Run AFTER the package is published\. -. -.IP "\(bu" 4 +.IP \(bu 2 preinstall: Run BEFORE the package is installed -. -.IP "\(bu" 4 +.IP \(bu 2 install, postinstall: Run AFTER the package is installed\. -. -.IP "\(bu" 4 +.IP \(bu 2 preuninstall, uninstall: Run BEFORE the package is uninstalled\. -. -.IP "\(bu" 4 +.IP \(bu 2 postuninstall: Run AFTER the package is uninstalled\. -. -.IP "\(bu" 4 +.IP \(bu 2 preupdate: Run BEFORE the package is updated with the update command\. -. -.IP "\(bu" 4 +.IP \(bu 2 update, postupdate: Run AFTER the package is updated with the update command\. -. -.IP "\(bu" 4 +.IP \(bu 2 pretest, test, posttest: Run by the \fBnpm test\fR command\. -. -.IP "\(bu" 4 +.IP \(bu 2 prestop, stop, poststop: Run by the \fBnpm stop\fR command\. -. -.IP "\(bu" 4 +.IP \(bu 2 prestart, start, poststart: Run by the \fBnpm start\fR command\. -. -.IP "\(bu" 4 +.IP \(bu 2 prerestart, restart, postrestart: Run by the \fBnpm restart\fR command\. Note: \fBnpm restart\fR will run the stop and start scripts if no \fBrestart\fR script is provided\. -. -.IP "" 0 -. + +.RE +.P +Additionally, arbitrary scripts can be executed by running `npm run\-script +.P + \fB\|\. *Pre* and *post* commands with matching names will be run for +those as well (e\.g\.\fRpremyscript\fB,\fRmyscript\fB,\fRpostmyscript`)\. +.SH NOTE: INSTALL SCRIPTS ARE AN ANTIPATTERN .P -Additionally, arbitrary scripts can be run by doing \fBnpm run\-script \fR\|\. -. -.SH "NOTE: INSTALL SCRIPTS ARE AN ANTIPATTERN" -\fBtl;dr\fR Don\'t use \fBinstall\fR\|\. Use a \fB\|\.gyp\fR file for compilation, and \fBprepublish\fR for anything else\. -. +\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 +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 @@ -79,276 +66,233 @@ 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 +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 that is not dependent on the operating system or architecture of the target system, then use a \fBprepublish\fR script instead\. This includes tasks such as: -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 Compile CoffeeScript source code into JavaScript\. -. -.IP "\(bu" 4 +.IP \(bu 2 Create minified versions of JavaScript source code\. -. -.IP "\(bu" 4 +.IP \(bu 2 Fetching remote resources that your package will use\. -. -.IP "" 0 -. + +.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 +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\. Additionally, this means that: -. -.IP "\(bu" 4 +.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" 4 -You don\'t need to include the minifiers in your package, reducing +your users don't need to have it installed\. +.IP \(bu 2 +You don't need to include the minifiers in your package, reducing the size for your users\. -. -.IP "\(bu" 4 -You don\'t need to rely on your users having \fBcurl\fR or \fBwget\fR or +.IP \(bu 2 +You don't need to rely on your users having \fBcurl\fR or \fBwget\fR or other system tools on the target machines\. -. -.IP "" 0 -. -.SH "DEFAULT VALUES" + +.RE +.SH DEFAULT VALUES +.P npm will default some script values based on package contents\. -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 \fB"start": "node server\.js"\fR: -. -.IP If there is a \fBserver\.js\fR file in the root of your package, then npm will default the \fBstart\fR command to \fBnode server\.js\fR\|\. -. -.IP "\(bu" 4 +.IP \(bu 2 \fB"preinstall": "node\-waf clean || true; node\-waf configure build"\fR: -. -.IP If there is a \fBwscript\fR file in the root of your package, npm will default the \fBpreinstall\fR command to compile using node\-waf\. -. -.IP "" 0 -. -.SH "USER" + +.RE +.SH USER +.P If npm was invoked with root privileges, then it will change the uid to the user account or uid specified by the \fBuser\fR config, which defaults to \fBnobody\fR\|\. Set the \fBunsafe\-perm\fR flag to run scripts with root privileges\. -. -.SH "ENVIRONMENT" +.SH ENVIRONMENT +.P Package scripts run in an environment where many pieces of information are made available regarding the setup of npm and the current state of the process\. -. -.SS "path" +.SS path +.P If you depend on modules that define executable scripts, like test suites, then those executables will be added to the \fBPATH\fR for executing the scripts\. So, if your package\.json has this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name" : "foo" , "dependencies" : { "bar" : "0\.1\.x" } , "scripts": { "start" : "bar \./test" } } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P then you could run \fBnpm start\fR to execute the \fBbar\fR script, which is exported into the \fBnode_modules/\.bin\fR directory on \fBnpm install\fR\|\. -. -.SS "package\.json vars" +.SS package\.json vars +.P The package\.json fields are tacked onto the \fBnpm_package_\fR prefix\. So, for instance, if you had \fB{"name":"foo", "version":"1\.2\.5"}\fR in your -package\.json file, then your package scripts would have the \fBnpm_package_name\fR environment variable set to "foo", and the \fBnpm_package_version\fR set to "1\.2\.5" -. -.SS "configuration" -Configuration parameters are put in the environment with the \fBnpm_config_\fR prefix\. For instance, you can view the effective \fBroot\fR +package\.json file, then your package scripts would have the +\fBnpm_package_name\fR environment variable set to "foo", and the +\fBnpm_package_version\fR set to "1\.2\.5" +.SS configuration +.P +Configuration parameters are put in the environment with the +\fBnpm_config_\fR prefix\. For instance, you can view the effective \fBroot\fR config by checking the \fBnpm_config_root\fR environment variable\. -. -.SS "Special: package\.json "config" hash" +.SS Special: package\.json "config" hash +.P The package\.json "config" keys are overwritten in the environment if there is a config param of \fB[@]:\fR\|\. For example, if the package\.json has this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "name" : "foo" , "config" : { "port" : "8080" } , "scripts" : { "start" : "node server\.js" } } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P and the server\.js is this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX http\.createServer(\.\.\.)\.listen(process\.env\.npm_package_config_port) -. -.fi -. -.IP "" 0 -. +.EE +.RE .P then the user could change the behavior by doing: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX npm config set foo:port 80 -. -.fi -. -.IP "" 0 -. -.SS "current lifecycle event" +.EE +.RE +.SS current lifecycle event +.P Lastly, the \fBnpm_lifecycle_event\fR environment variable is set to whichever stage of the cycle is being executed\. So, you could have a single script used for different parts of the process which switches -based on what\'s currently happening\. -. +based on what's currently happening\. .P -Objects are flattened following this format, so if you had \fB{"scripts":{"install":"foo\.js"}}\fR in your package\.json, then you\'d +Objects are flattened following this format, so if you had +\fB{"scripts":{"install":"foo\.js"}}\fR in your package\.json, then you'd see this in the script: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX process\.env\.npm_package_scripts_install === "foo\.js" -. -.fi -. -.IP "" 0 -. -.SH "EXAMPLES" +.EE +.RE +.SH EXAMPLES +.P For example, if your package\.json contains this: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "scripts" : { "install" : "scripts/install\.js" , "postinstall" : "scripts/install\.js" , "uninstall" : "scripts/uninstall\.js" } } -. -.fi -. -.IP "" 0 -. +.EE +.RE .P then the \fBscripts/install\.js\fR will be called for the install, post\-install, stages of the lifecycle, and the \fBscripts/uninstall\.js\fR -would be called when the package is uninstalled\. Since \fBscripts/install\.js\fR is running for three different phases, it would +would be called when the package is uninstalled\. Since +\fBscripts/install\.js\fR is running for three different phases, it would be wise in this case to look at the \fBnpm_lifecycle_event\fR environment variable\. -. .P If you want to run a make command, you can do so\. This works just fine: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX { "scripts" : { "preinstall" : "\./configure" , "install" : "make && make install" , "test" : "make test" } } -. -.fi -. -.IP "" 0 -. -.SH "EXITING" +.EE +.RE +.SH EXITING +.P Scripts are run by passing the line as a script argument to \fBsh\fR\|\. -. .P If the script exits with a code other than 0, then this will abort the process\. -. .P -Note that these script files don\'t have to be nodejs or even +Note that these script files don't have to be nodejs or even javascript programs\. They just have to be some kind of executable file\. -. -.SH "HOOK SCRIPTS" +.SH HOOK SCRIPTS +.P If you want to run a specific script at a specific lifecycle event for ALL packages, then you can use a hook script\. -. .P Place an executable file at \fBnode_modules/\.hooks/{eventname}\fR, and -it\'ll get run for all packages when they are going through that point +it'll get run for all packages when they are going through that point in the package lifecycle for any packages installed in that root\. -. .P Hook scripts are run exactly the same way as package\.json scripts\. That is, they are in a separate child process, with the env described above\. -. -.SH "BEST PRACTICES" -. -.IP "\(bu" 4 -Don\'t exit with a non\-zero error code unless you \fIreally\fR mean it\. +.SH BEST PRACTICES +.RS 0 +.IP \(bu 2 +Don't exit with a non\-zero error code unless you \fIreally\fR mean it\. Except for uninstall scripts, this will cause the npm action to fail, and potentially be rolled back\. If the failure is minor or -only will prevent some optional features, then it\'s better to just +only will prevent some optional features, then it's better to just print a warning and exit successfully\. -. -.IP "\(bu" 4 -Try not to use scripts to do what npm can do for you\. Read through npm help 5 \fBpackage\.json\fR to see all the things that you can specify and enable +.IP \(bu 2 +Try not to use scripts to do what npm can do for you\. Read through +npm help 5 \fBpackage\.json\fR to see all the things that you can specify and enable by simply describing your package appropriately\. In general, this will lead to a more robust and consistent state\. -. -.IP "\(bu" 4 +.IP \(bu 2 Inspect the env to determine where to put things\. For instance, if the \fBnpm_config_binroot\fR environ is set to \fB/home/user/bin\fR, then -don\'t try to install executables into \fB/usr/local/bin\fR\|\. The user +don't try to install executables into \fB/usr/local/bin\fR\|\. The user probably set it up that way for a reason\. -. -.IP "\(bu" 4 -Don\'t prefix your script commands with "sudo"\. If root permissions -are required for some reason, then it\'ll fail with that error, and +.IP \(bu 2 +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 "" 0 -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 + +.RE +.SH SEE ALSO +.RS 0 +.IP \(bu 2 npm help run\-script -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 5 package\.json -. -.IP "\(bu" 4 +.IP \(bu 2 npm help 7 developers -. -.IP "\(bu" 4 +.IP \(bu 2 npm help install -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man7/removing-npm.7 b/deps/npm/man/man7/removing-npm.7 index e8a60cdf954..ae3513c4df3 100644 --- a/deps/npm/man/man7/removing-npm.7 +++ b/deps/npm/man/man7/removing-npm.7 @@ -1,107 +1,78 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "NPM\-REMOVAL" "1" "September 2014" "" "" -. .SH "NAME" -\fBnpm-removal\fR \-\- Cleaning the Slate -. -.SH "SYNOPSIS" +\fBnpm-removal\fR \- Cleaning the Slate +.SH SYNOPSIS +.P So sad to see you go\. -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX sudo npm uninstall npm \-g -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Or, if that fails, get the npm source code, and do: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX sudo make uninstall -. -.fi -. -.IP "" 0 -. -.SH "More Severe Uninstalling" +.EE +.RE +.SH More Severe Uninstalling +.P Usually, the above instructions are sufficient\. That will remove -npm, but leave behind anything you\'ve installed\. -. +npm, but leave behind anything you've installed\. .P -If that doesn\'t work, or if you require more drastic measures, +If that doesn't work, or if you require more drastic measures, continue reading\. -. .P Note that this is only necessary for globally\-installed packages\. Local -installs are completely contained within a project\'s \fBnode_modules\fR -folder\. Delete that folder, and everything is gone (unless a package\'s +installs are completely contained within a project's \fBnode_modules\fR +folder\. Delete that folder, and everything is gone (unless a package's install script is particularly ill\-behaved)\. -. .P This assumes that you installed node and npm in the default place\. If you configured node with a different \fB\-\-prefix\fR, or installed npm with a -different prefix setting, then adjust the paths accordingly, replacing \fB/usr/local\fR with your install prefix\. -. +different prefix setting, then adjust the paths accordingly, replacing +\fB/usr/local\fR with your install prefix\. .P To remove everything npm\-related manually: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX rm \-rf /usr/local/{lib/node{,/\.npm,_modules},bin,share/man}/npm* -. -.fi -. -.IP "" 0 -. +.EE +.RE .P If you installed things \fIwith\fR npm, then your best bet is to uninstall them with npm first, and then install them again once you have a proper install\. This can help find any symlinks that are lying around: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX ls \-laF /usr/local/{lib/node{,/\.npm},bin,share/man} | grep npm -. -.fi -. -.IP "" 0 -. +.EE +.RE .P Prior to version 0\.3, npm used shim files for executables and node modules\. To track those down, you can do the following: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX find /usr/local/{lib/node,bin} \-exec grep \-l npm \\{\\} \\; ; -. -.fi -. -.IP "" 0 -. +.EE +.RE .P (This is also in the README file\.) -. -.SH "SEE ALSO" -. -.IP "\(bu" 4 +.SH SEE ALSO +.RS 0 +.IP \(bu 2 README -. -.IP "\(bu" 4 +.IP \(bu 2 npm help rm -. -.IP "\(bu" 4 +.IP \(bu 2 npm help prune -. -.IP "" 0 + +.RE diff --git a/deps/npm/man/man7/semver.7 b/deps/npm/man/man7/semver.7 index 1e64a8df20e..c2efd3d2cf1 100644 --- a/deps/npm/man/man7/semver.7 +++ b/deps/npm/man/man7/semver.7 @@ -1,243 +1,343 @@ -.\" Generated with Ronnjs 0.3.8 -.\" http://github.com/kapouer/ronnjs/ -. .TH "SEMVER" "7" "September 2014" "" "" -. .SH "NAME" -\fBsemver\fR \-\- The semantic versioner for npm -. -.SH "Usage" -. -.nf +\fBsemver\fR \- The semantic versioner for npm +.SH Usage +.P +.RS 2 +.EX $ npm install semver -semver\.valid(\'1\.2\.3\') // \'1\.2\.3\' -semver\.valid(\'a\.b\.c\') // null -semver\.clean(\' =v1\.2\.3 \') // \'1\.2\.3\' -semver\.satisfies(\'1\.2\.3\', \'1\.x || >=2\.5\.0 || 5\.0\.0 \- 7\.2\.3\') // true -semver\.gt(\'1\.2\.3\', \'9\.8\.7\') // false -semver\.lt(\'1\.2\.3\', \'9\.8\.7\') // true -. -.fi -. + +semver\.valid('1\.2\.3') // '1\.2\.3' +semver\.valid('a\.b\.c') // null +semver\.clean(' =v1\.2\.3 ') // '1\.2\.3' +semver\.satisfies('1\.2\.3', '1\.x || >=2\.5\.0 || 5\.0\.0 \- 7\.2\.3') // true +semver\.gt('1\.2\.3', '9\.8\.7') // false +semver\.lt('1\.2\.3', '9\.8\.7') // true +.EE +.RE .P As a command\-line utility: -. -.IP "" 4 -. -.nf +.P +.RS 2 +.EX $ semver \-h + Usage: semver [ [\.\.\.]] [\-r | \-i | \-d ] Test if version(s) satisfy the supplied range(s), and sort them\. + Multiple versions or ranges may be supplied, unless increment or decrement options are specified\. In that case, only a single version may be used, and it is incremented by the specified level + Program exits successfully if any valid version satisfies all supplied ranges, and prints all satisfying versions\. + If no versions are valid, or ranges are not satisfied, then exits failure\. + Versions are printed in ascending order, so supplying multiple versions to the utility will just sort them\. -. -.fi -. -.IP "" 0 -. -.SH "Versions" -A "version" is described by the \fBv2\.0\.0\fR specification found at \fIhttp://semver\.org/\fR\|\. -. +.EE +.RE +.SH Versions +.P +A "version" is described by the \fBv2\.0\.0\fR specification found at +http://semver\.org/\|\. .P A leading \fB"="\fR or \fB"v"\fR character is stripped off and ignored\. -. -.SH "Ranges" -The following range styles are supported: -. -.IP "\(bu" 4 -\fB1\.2\.3\fR A specific version\. When nothing else will do\. Must be a full -version number, with major, minor, and patch versions specified\. -Note that build metadata is still ignored, so \fB1\.2\.3+build2012\fR will -satisfy this range\. -. -.IP "\(bu" 4 -\fB>1\.2\.3\fR Greater than a specific version\. -. -.IP "\(bu" 4 -\fB<1\.2\.3\fR Less than a specific version\. If there is no prerelease -tag on the version range, then no prerelease version will be allowed -either, even though these are technically "less than"\. -. -.IP "\(bu" 4 -\fB>=1\.2\.3\fR Greater than or equal to\. Note that prerelease versions -are NOT equal to their "normal" equivalents, so \fB1\.2\.3\-beta\fR will -not satisfy this range, but \fB2\.3\.0\-beta\fR will\. -. -.IP "\(bu" 4 -\fB<=1\.2\.3\fR Less than or equal to\. In this case, prerelease versions -ARE allowed, so \fB1\.2\.3\-beta\fR would satisfy\. -. -.IP "\(bu" 4 +.SH Ranges +.P +A \fBversion range\fR is a set of \fBcomparators\fR which specify versions +that satisfy the range\. +.P +A \fBcomparator\fR is composed of an \fBoperator\fR and a \fBversion\fR\|\. The set +of primitive \fBoperators\fR is: +.RS 0 +.IP \(bu 2 +\fB<\fR Less than +.IP \(bu 2 +\fB<=\fR Less than or equal to +.IP \(bu 2 +\fB>\fR Greater than +.IP \(bu 2 +\fB>=\fR Greater than or equal to +.IP \(bu 2 +\fB=\fR Equal\. If no operator is specified, then equality is assumed, +so this operator is optional, but MAY be included\. + +.RE +.P +For example, the comparator \fB>=1\.2\.7\fR would match the versions +\fB1\.2\.7\fR, \fB1\.2\.8\fR, \fB2\.5\.3\fR, and \fB1\.3\.9\fR, but not the versions \fB1\.2\.6\fR +or \fB1\.1\.0\fR\|\. +.P +Comparators can be joined by whitespace to form a \fBcomparator set\fR, +which is satisfied by the \fBintersection\fR of all of the comparators +it includes\. +.P +A range is composed of one or more comparator sets, joined by \fB||\fR\|\. A +version matches a range if and only if every comparator in at least +one of the \fB||\fR\-separated comparator sets is satisfied by the version\. +.P +For example, the range \fB>=1\.2\.7 <1\.3\.0\fR would match the versions +\fB1\.2\.7\fR, \fB1\.2\.8\fR, and \fB1\.2\.99\fR, but not the versions \fB1\.2\.6\fR, \fB1\.3\.0\fR, +or \fB1\.1\.0\fR\|\. +.P +The range \fB1\.2\.7 || >=1\.2\.9 <2\.0\.0\fR would match the versions \fB1\.2\.7\fR, +\fB1\.2\.9\fR, and \fB1\.4\.6\fR, but not the versions \fB1\.2\.8\fR or \fB2\.0\.0\fR\|\. +.SS Prerelease Tags +.P +If a version has a prerelease tag (for example, \fB1\.2\.3\-alpha\.3\fR) then +it will only be allowed to satisfy comparator sets if at least one +comparator with the same \fB[major, minor, patch]\fR tuple also has a +prerelease tag\. +.P +For example, the range \fB>1\.2\.3\-alpha\.3\fR would be allowed to match the +version \fB1\.2\.3\-alpha\.7\fR, but it would \fInot\fR be satisfied by +\fB3\.4\.5\-alpha\.9\fR, even though \fB3\.4\.5\-alpha\.9\fR is technically "greater +than" \fB1\.2\.3\-alpha\.3\fR according to the SemVer sort rules\. The version +range only accepts prerelease tags on the \fB1\.2\.3\fR version\. The +version \fB3\.4\.5\fR \fIwould\fR satisfy the range, because it does not have a +prerelease flag, and \fB3\.4\.5\fR is greater than \fB1\.2\.3\-alpha\.7\fR\|\. +.P +The purpose for this behavior is twofold\. First, prerelease versions +frequently are updated very quickly, and contain many breaking changes +that are (by the author's design) not yet fit for public consumption\. +Therefore, by default, they are excluded from range matching +semantics\. +.P +Second, a user who has opted into using a prerelease version has +clearly indicated the intent to use \fIthat specific\fR set of +alpha/beta/rc versions\. By including a prerelease tag in the range, +the user is indicating that they are aware of the risk\. However, it +is still not appropriate to assume that they have opted into taking a +similar risk on the \fInext\fR set of prerelease versions\. +.SS Advanced Range Syntax +.P +Advanced range syntax desugars to primitive comparators in +deterministic ways\. +.P +Advanced ranges may be combined in the same way as primitive +comparators using white space or \fB||\fR\|\. +.SS Hyphen Ranges \fBX\.Y\.Z \- A\.B\.C\fR +.P +Specifies an inclusive set\. +.RS 0 +.IP \(bu 2 \fB1\.2\.3 \- 2\.3\.4\fR := \fB>=1\.2\.3 <=2\.3\.4\fR -. -.IP "\(bu" 4 -\fB~1\.2\.3\fR := \fB>=1\.2\.3\-0 <1\.3\.0\-0\fR "Reasonably close to \fB1\.2\.3\fR"\. When -using tilde operators, prerelease versions are supported as well, -but a prerelease of the next significant digit will NOT be -satisfactory, so \fB1\.3\.0\-beta\fR will not satisfy \fB~1\.2\.3\fR\|\. -. -.IP "\(bu" 4 -\fB^1\.2\.3\fR := \fB>=1\.2\.3\-0 <2\.0\.0\-0\fR "Compatible with \fB1\.2\.3\fR"\. When -using caret operators, anything from the specified version (including -prerelease) will be supported up to, but not including, the next -major version (or its prereleases)\. \fB1\.5\.1\fR will satisfy \fB^1\.2\.3\fR, -while \fB1\.2\.2\fR and \fB2\.0\.0\-beta\fR will not\. -. -.IP "\(bu" 4 -\fB^0\.1\.3\fR := \fB>=0\.1\.3\-0 <0\.2\.0\-0\fR "Compatible with \fB0\.1\.3\fR"\. \fB0\.x\.x\fR versions are -special: the first non\-zero component indicates potentially breaking changes, -meaning the caret operator matches any version with the same first non\-zero -component starting at the specified version\. -. -.IP "\(bu" 4 -\fB^0\.0\.2\fR := \fB=0\.0\.2\fR "Only the version \fB0\.0\.2\fR is considered compatible" -. -.IP "\(bu" 4 -\fB~1\.2\fR := \fB>=1\.2\.0\-0 <1\.3\.0\-0\fR "Any version starting with \fB1\.2\fR" -. -.IP "\(bu" 4 -\fB^1\.2\fR := \fB>=1\.2\.0\-0 <2\.0\.0\-0\fR "Any version compatible with \fB1\.2\fR" -. -.IP "\(bu" 4 -\fB1\.2\.x\fR := \fB>=1\.2\.0\-0 <1\.3\.0\-0\fR "Any version starting with \fB1\.2\fR" -. -.IP "\(bu" 4 -\fB1\.2\.*\fR Same as \fB1\.2\.x\fR\|\. -. -.IP "\(bu" 4 -\fB1\.2\fR Same as \fB1\.2\.x\fR\|\. -. -.IP "\(bu" 4 -\fB~1\fR := \fB>=1\.0\.0\-0 <2\.0\.0\-0\fR "Any version starting with \fB1\fR" -. -.IP "\(bu" 4 -\fB^1\fR := \fB>=1\.0\.0\-0 <2\.0\.0\-0\fR "Any version compatible with \fB1\fR" -. -.IP "\(bu" 4 -\fB1\.x\fR := \fB>=1\.0\.0\-0 <2\.0\.0\-0\fR "Any version starting with \fB1\fR" -. -.IP "\(bu" 4 -\fB1\.*\fR Same as \fB1\.x\fR\|\. -. -.IP "\(bu" 4 -\fB1\fR Same as \fB1\.x\fR\|\. -. -.IP "\(bu" 4 -\fB*\fR Any version whatsoever\. -. -.IP "\(bu" 4 -\fBx\fR Same as \fB*\fR\|\. -. -.IP "\(bu" 4 -\fB""\fR (just an empty string) Same as \fB*\fR\|\. -. -.IP "" 0 -. -.P -Ranges can be joined with either a space (which implies "and") or a \fB||\fR (which implies "or")\. -. -.SH "Functions" + +.RE +.P +If a partial version is provided as the first version in the inclusive +range, then the missing pieces are replaced with zeroes\. +.RS 0 +.IP \(bu 2 +\fB1\.2 \- 2\.3\.4\fR := \fB>=1\.2\.0 <=2\.3\.4\fR + +.RE +.P +If a partial version is provided as the second version in the +inclusive range, then all versions that start with the supplied parts +of the tuple are accepted, but nothing that would be greater than the +provided tuple parts\. +.RS 0 +.IP \(bu 2 +\fB1\.2\.3 \- 2\.3\fR := \fB>=1\.2\.3 <2\.4\.0\fR +.IP \(bu 2 +\fB1\.2\.3 \- 2\fR := \fB>=1\.2\.3 <3\.0\.0\fR + +.RE +.SS X\-Ranges \fB1\.2\.x\fR \fB1\.X\fR \fB1\.2\.*\fR \fB*\fR +.P +Any of \fBX\fR, \fBx\fR, or \fB*\fR may be used to "stand in" for one of the +numeric values in the \fB[major, minor, patch]\fR tuple\. +.RS 0 +.IP \(bu 2 +\fB*\fR := \fB>=0\.0\.0\fR (Any version satisfies) +.IP \(bu 2 +\fB1\.x\fR := \fB>=1\.0\.0 <2\.0\.0\fR (Matching major version) +.IP \(bu 2 +\fB1\.2\.x\fR := \fB>=1\.2\.0 <1\.3\.0\fR (Matching major and minor versions) + +.RE +.P +A partial version range is treated as an X\-Range, so the special +character is in fact optional\. +.RS 0 +.IP \(bu 2 +\fB` (empty string) :=\fR*\fB:=\fR>=0\.0\.0` +.IP \(bu 2 +\fB1\fR := \fB1\.x\.x\fR := \fB>=1\.0\.0 <2\.0\.0\fR +.IP \(bu 2 +\fB1\.2\fR := \fB1\.2\.x\fR := \fB>=1\.2\.0 <1\.3\.0\fR + +.RE +.SS Tilde Ranges \fB~1\.2\.3\fR \fB~1\.2\fR \fB~1\fR +.P +Allows patch\-level changes if a minor version is specified on the +comparator\. Allows minor\-level changes if not\. +.RS 0 +.IP \(bu 2 +\fB~1\.2\.3\fR := \fB>=1\.2\.3 <1\.(2+1)\.0\fR := \fB>=1\.2\.3 <1\.3\.0\fR +.IP \(bu 2 +\fB~1\.2\fR := \fB>=1\.2\.0 <1\.(2+1)\.0\fR := \fB>=1\.2\.0 <1\.3\.0\fR (Same as \fB1\.2\.x\fR) +.IP \(bu 2 +\fB~1\fR := \fB>=1\.0\.0 <(1+1)\.0\.0\fR := \fB>=1\.0\.0 <2\.0\.0\fR (Same as \fB1\.x\fR) +.IP \(bu 2 +\fB~0\.2\.3\fR := \fB>=0\.2\.3 <0\.(2+1)\.0\fR := \fB>=0\.2\.3 <0\.3\.0\fR +.IP \(bu 2 +\fB~0\.2\fR := \fB>=0\.2\.0 <0\.(2+1)\.0\fR := \fB>=0\.2\.0 <0\.3\.0\fR (Same as \fB0\.2\.x\fR) +.IP \(bu 2 +\fB~0\fR := \fB>=0\.0\.0 <(0+1)\.0\.0\fR := \fB>=0\.0\.0 <1\.0\.0\fR (Same as \fB0\.x\fR) +.IP \(bu 2 +\fB~1\.2\.3\-beta\.2\fR := \fB>=1\.2\.3\-beta\.2 <1\.3\.0\fR Note that prereleases in +the \fB1\.2\.3\fR version will be allowed, if they are greater than or +equal to \fBbeta\.2\fR\|\. So, \fB1\.2\.3\-beta\.4\fR would be allowed, but +\fB1\.2\.4\-beta\.2\fR would not, because it is a prerelease of a +different \fB[major, minor, patch]\fR tuple\. + +.RE +.P +Note: this is the same as the \fB~>\fR operator in rubygems\. +.SS Caret Ranges \fB^1\.2\.3\fR \fB^0\.2\.5\fR \fB^0\.0\.4\fR +.P +Allows changes that do not modify the left\-most non\-zero digit in the +\fB[major, minor, patch]\fR tuple\. In other words, this allows patch and +minor updates for versions \fB1\.0\.0\fR and above, patch updates for +versions \fB0\.X >=0\.1\.0\fR, and \fIno\fR updates for versions \fB0\.0\.X\fR\|\. +.P +Many authors treat a \fB0\.x\fR version as if the \fBx\fR were the major +"breaking\-change" indicator\. +.P +Caret ranges are ideal when an author may make breaking changes +between \fB0\.2\.4\fR and \fB0\.3\.0\fR releases, which is a common practice\. +However, it presumes that there will \fInot\fR be breaking changes between +\fB0\.2\.4\fR and \fB0\.2\.5\fR\|\. It allows for changes that are presumed to be +additive (but non\-breaking), according to commonly observed practices\. +.RS 0 +.IP \(bu 2 +\fB^1\.2\.3\fR := \fB>=1\.2\.3 <2\.0\.0\fR +.IP \(bu 2 +\fB^0\.2\.3\fR := \fB>=0\.2\.3 <0\.3\.0\fR +.IP \(bu 2 +\fB^0\.0\.3\fR := \fB>=0\.0\.3 <0\.0\.4\fR +.IP \(bu 2 +\fB^1\.2\.3\-beta\.2\fR := \fB>=1\.2\.3\-beta\.2 <2\.0\.0\fR Note that prereleases in +the \fB1\.2\.3\fR version will be allowed, if they are greater than or +equal to \fBbeta\.2\fR\|\. So, \fB1\.2\.3\-beta\.4\fR would be allowed, but +\fB1\.2\.4\-beta\.2\fR would not, because it is a prerelease of a +different \fB[major, minor, patch]\fR tuple\. +.IP \(bu 2 +\fB^0\.0\.3\-beta\fR := \fB>=0\.0\.3\-beta <0\.0\.4\fR Note that prereleases in the +\fB0\.0\.3\fR version \fIonly\fR will be allowed, if they are greater than or +equal to \fBbeta\fR\|\. So, \fB0\.0\.3\-pr\.2\fR would be allowed\. + +.RE +.P +When parsing caret ranges, a missing \fBpatch\fR value desugars to the +number \fB0\fR, but will allow flexibility within that value, even if the +major and minor versions are both \fB0\fR\|\. +.RS 0 +.IP \(bu 2 +\fB^1\.2\.x\fR := \fB>=1\.2\.0 <2\.0\.0\fR +.IP \(bu 2 +\fB^0\.0\.x\fR := \fB>=0\.0\.0 <0\.1\.0\fR +.IP \(bu 2 +\fB^0\.0\fR := \fB>=0\.0\.0 <0\.1\.0\fR + +.RE +.P +A missing \fBminor\fR and \fBpatch\fR values will desugar to zero, but also +allow flexibility within those values, even if the major version is +zero\. +.RS 0 +.IP \(bu 2 +\fB^1\.x\fR := \fB>=1\.0\.0 <2\.0\.0\fR +.IP \(bu 2 +\fB^0\.x\fR := \fB>=0\.0\.0 <1\.0\.0\fR + +.RE +.SH Functions +.P All methods and classes take a final \fBloose\fR boolean argument that, if true, will be more forgiving about not\-quite\-valid semver strings\. The resulting output will always be 100% strict, of course\. -. .P Strict\-mode Comparators and Ranges will be strict about the SemVer strings that they parse\. -. -.IP "\(bu" 4 -\fBvalid(v)\fR: Return the parsed version, or null if it\'s not valid\. -. -.IP "\(bu" 4 -\fBinc(v, release)\fR\fBmajor\fR\fBpremajor\fR\fBminor\fR\fBpreminor\fR\fBpatch\fR\fBprepatch\fR\fBprerelease\fR -. -.IP "\(bu" 4 +.RS 0 +.IP \(bu 2 +\fBvalid(v)\fR: Return the parsed version, or null if it's not valid\. +.IP \(bu 2 +\fBinc(v, release)\fR: Return the version incremented by the release +type (\fBmajor\fR, \fBpremajor\fR, \fBminor\fR, \fBpreminor\fR, \fBpatch\fR, +\fBprepatch\fR, or \fBprerelease\fR), or null if it's not valid +.RS 0 +.IP \(bu 2 \fBpremajor\fR in one call will bump the version up to the next major -version and down to a prerelease of that major version\. \fBpreminor\fR, and \fBprepatch\fR work the same way\. -. -.IP "\(bu" 4 +version and down to a prerelease of that major version\. +\fBpreminor\fR, and \fBprepatch\fR work the same way\. +.IP \(bu 2 If called from a non\-prerelease version, the \fBprerelease\fR will work the same as \fBprepatch\fR\|\. It increments the patch version, then makes a prerelease\. If the input version is already a prerelease it simply increments it\. -. -.IP "" 0 - -. -.IP "" 0 -. -.SS "Comparison" -. -.IP "\(bu" 4 + +.RE + +.RE +.SS Comparison +.RS 0 +.IP \(bu 2 \fBgt(v1, v2)\fR: \fBv1 > v2\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fBgte(v1, v2)\fR: \fBv1 >= v2\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fBlt(v1, v2)\fR: \fBv1 < v2\fR -. -.IP "\(bu" 4 +.IP \(bu 2 \fBlte(v1, v2)\fR: \fBv1 <= v2\fR -. -.IP "\(bu" 4 -\fBeq(v1, v2)\fR: \fBv1 == v2\fR This is true if they\'re logically equivalent, -even if they\'re not the exact same string\. You already know how to +.IP \(bu 2 +\fBeq(v1, v2)\fR: \fBv1 == v2\fR This is true if they're logically equivalent, +even if they're not the exact same string\. You already know how to compare strings\. -. -.IP "\(bu" 4 +.IP \(bu 2 \fBneq(v1, v2)\fR: \fBv1 != v2\fR The opposite of \fBeq\fR\|\. -. -.IP "\(bu" 4 -\fBcmp(v1, comparator, v2)\fR: Pass in a comparison string, and it\'ll call +.IP \(bu 2 +\fBcmp(v1, comparator, v2)\fR: Pass in a comparison string, and it'll call the corresponding function above\. \fB"==="\fR and \fB"!=="\fR do simple string comparison, but are included for completeness\. Throws if an invalid comparison string is provided\. -. -.IP "\(bu" 4 -\fBcompare(v1, v2)\fR: Return \fB0\fR if \fBv1 == v2\fR, or \fB1\fR if \fBv1\fR is greater, or \fB\-1\fR if \fBv2\fR is greater\. Sorts in ascending order if passed to \fBArray\.sort()\fR\|\. -. -.IP "\(bu" 4 +.IP \(bu 2 +\fBcompare(v1, v2)\fR: Return \fB0\fR if \fBv1 == v2\fR, or \fB1\fR if \fBv1\fR is greater, or \fB\-1\fR if +\fBv2\fR is greater\. Sorts in ascending order if passed to \fBArray\.sort()\fR\|\. +.IP \(bu 2 \fBrcompare(v1, v2)\fR: The reverse of compare\. Sorts an array of versions in descending order when passed to \fBArray\.sort()\fR\|\. -. -.IP "" 0 -. -.SS "Ranges" -. -.IP "\(bu" 4 -\fBvalidRange(range)\fR: Return the valid range or null if it\'s not valid -. -.IP "\(bu" 4 + +.RE +.SS Ranges +.RS 0 +.IP \(bu 2 +\fBvalidRange(range)\fR: Return the valid range or null if it's not valid +.IP \(bu 2 \fBsatisfies(version, range)\fR: Return true if the version satisfies the range\. -. -.IP "\(bu" 4 +.IP \(bu 2 \fBmaxSatisfying(versions, range)\fR: Return the highest version in the list that satisfies the range, or \fBnull\fR if none of them do\. -. -.IP "\(bu" 4 +.IP \(bu 2 \fBgtr(version, range)\fR: Return \fBtrue\fR if version is greater than all the versions possible in the range\. -. -.IP "\(bu" 4 +.IP \(bu 2 \fBltr(version, range)\fR: Return \fBtrue\fR if version is less than all the versions possible in the range\. -. -.IP "\(bu" 4 +.IP \(bu 2 \fBoutside(version, range, hilo)\fR: Return true if the version is outside -the bounds of the range in either the high or low direction\. The \fBhilo\fR argument must be either the string \fB\'>\'\fR or \fB\'<\'\fR\|\. (This is +the bounds of the range in either the high or low direction\. The +\fBhilo\fR argument must be either the string \fB\|'>'\fR or \fB\|'<'\fR\|\. (This is the function called by \fBgtr\fR and \fBltr\fR\|\.) -. -.IP "" 0 -. + +.RE .P Note that, since ranges may be non\-contiguous, a version might not be greater than a range, less than a range, \fIor\fR satisfy a range! For @@ -246,7 +346,7 @@ until \fB2\.0\.0\fR, so the version \fB1\.2\.10\fR would not be greater than the range (because \fB2\.0\.1\fR satisfies, which is higher), nor less than the range (since \fB1\.2\.8\fR satisfies, which is lower), and it also does not satisfy the range\. -. .P If you want to know if a version satisfies or does not satisfy a range, use the \fBsatisfies(version, range)\fR function\. + diff --git a/deps/npm/node_modules/async-some/.eslintrc b/deps/npm/node_modules/async-some/.eslintrc new file mode 100644 index 00000000000..5c39c67eca0 --- /dev/null +++ b/deps/npm/node_modules/async-some/.eslintrc @@ -0,0 +1,18 @@ +{ + "env" : { + "node" : true + }, + "rules" : { + "curly" : 0, + "no-lonely-if" : 1, + "no-mixed-requires" : 0, + "no-underscore-dangle" : 0, + "no-unused-vars" : [2, {"vars" : "all", "args" : "after-used"}], + "no-use-before-define" : [2, "nofunc"], + "quotes" : [1, "double", "avoid-escape"], + "semi" : [2, "never"], + "space-after-keywords" : 1, + "space-infix-ops" : 0, + "strict" : 0 + } +} diff --git a/deps/npm/node_modules/async-some/.npmignore b/deps/npm/node_modules/async-some/.npmignore new file mode 100644 index 00000000000..3c3629e647f --- /dev/null +++ b/deps/npm/node_modules/async-some/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/deps/npm/node_modules/async-some/README.md b/deps/npm/node_modules/async-some/README.md new file mode 100644 index 00000000000..bb502ee0608 --- /dev/null +++ b/deps/npm/node_modules/async-some/README.md @@ -0,0 +1,62 @@ +# some + +Short-circuited async Array.prototype.some implementation. + +Serially evaluates a list of values from a JS array or arraylike +against an asynchronous predicate, terminating on the first truthy +value. If the predicate encounters an error, pass it to the completion +callback. Otherwise, pass the truthy value passed by the predicate, or +`false` if no truthy value was passed. + +Is +[Zalgo](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony)-proof, +browser-safe, and pretty efficient. + +## Usage + +```javascript +var some = require("async-some"); +var resolve = require("path").resolve; +var stat = require("fs").stat; +var readFileSync = require("fs").readFileSync; + +some(["apple", "seaweed", "ham", "quince"], porkDetector, function (error, match) { + if (error) return console.error(error); + + if (match) return console.dir(JSON.parse(readFileSync(match))); + + console.error("time to buy more Sporkle™!"); +}); + +var PREFIX = resolve(__dirname, "../pork_store"); +function porkDetector(value, cb) { + var path = resolve(PREFIX, value + ".json"); + stat(path, function (er, stat) { + if (er) { + if (er.code === "ENOENT") return cb(null, false); + + return cb(er); + } + + cb(er, path); + }); +} +``` + +### some(list, test, callback) + +* `list` {Object} An arraylike (either an Array or the arguments arraylike) to + be checked. +* `test` {Function} The predicate against which the elements of `list` will be + tested. Takes two parameters: + * `element` {any} The element of the list to be tested. + * `callback` {Function} The continuation to be called once the test is + complete. Takes (again) two values: + * `error` {Error} Any errors that the predicate encountered. + * `value` {any} A truthy value. A non-falsy result terminates checking the + entire list. +* `callback` {Function} The callback to invoke when either a value has been + found or the entire input list has been processed with no result. Is invoked + with the traditional two parameters: + * `error` {Error} Errors that were encountered during the evaluation of some(). + * `match` {any} Value successfully matched by `test`, if any. diff --git a/deps/npm/node_modules/async-some/package.json b/deps/npm/node_modules/async-some/package.json new file mode 100644 index 00000000000..d32ae73fb2a --- /dev/null +++ b/deps/npm/node_modules/async-some/package.json @@ -0,0 +1,57 @@ +{ + "name": "async-some", + "version": "1.0.1", + "description": "short-circuited, asynchronous version of Array.protototype.some", + "main": "some.js", + "scripts": { + "test": "tap test/*.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/othiym23/async-some.git" + }, + "keywords": [ + "async", + "some", + "array", + "collections", + "fp" + ], + "author": { + "name": "Forrest L Norvell", + "email": "ogd@aoaioxxysz.net" + }, + "license": "ISC", + "bugs": { + "url": "https://github.com/othiym23/async-some/issues" + }, + "homepage": "https://github.com/othiym23/async-some", + "dependencies": { + "dezalgo": "^1.0.0" + }, + "devDependencies": { + "tap": "^0.4.11" + }, + "gitHead": "e73d6d1fbc03cca5a0d54f456f39bab294a4c7b7", + "_id": "async-some@1.0.1", + "_shasum": "8b54f08d46f0f9babc72ea9d646c245d23a4d9e5", + "_from": "async-some@>=1.0.1-0 <2.0.0-0", + "_npmVersion": "1.5.0-pre", + "_npmUser": { + "name": "othiym23", + "email": "ogd@aoaioxxysz.net" + }, + "maintainers": [ + { + "name": "othiym23", + "email": "ogd@aoaioxxysz.net" + } + ], + "dist": { + "shasum": "8b54f08d46f0f9babc72ea9d646c245d23a4d9e5", + "tarball": "http://registry.npmjs.org/async-some/-/async-some-1.0.1.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/async-some/-/async-some-1.0.1.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/deps/npm/node_modules/async-some/some.js b/deps/npm/node_modules/async-some/some.js new file mode 100644 index 00000000000..0419709f763 --- /dev/null +++ b/deps/npm/node_modules/async-some/some.js @@ -0,0 +1,47 @@ +var assert = require("assert") +var dezalgoify = require("dezalgo") + +module.exports = some + +/** + * short-circuited async Array.prototype.some implementation + * + * Serially evaluates a list of values from a JS array or arraylike + * against an asynchronous predicate, terminating on the first truthy + * value. If the predicate encounters an error, pass it to the completion + * callback. Otherwise, pass the truthy value passed by the predicate, or + * `false` if no truthy value was passed. + */ +function some (list, test, cb) { + assert("length" in list, "array must be arraylike") + assert.equal(typeof test, "function", "predicate must be callable") + assert.equal(typeof cb, "function", "callback must be callable") + + var array = slice(list) + , index = 0 + , length = array.length + , hecomes = dezalgoify(cb) + + map() + + function map () { + if (index >= length) return hecomes(null, false) + + test(array[index], reduce) + } + + function reduce (er, result) { + if (er) return hecomes(er, false) + if (result) return hecomes(null, result) + + index++ + map() + } +} + +// Array.prototype.slice on arguments arraylike is expensive +function slice(args) { + var l = args.length, a = [], i + for (i = 0; i < l; i++) a[i] = args[i] + return a +} diff --git a/deps/npm/node_modules/async-some/test/base-case.js b/deps/npm/node_modules/async-some/test/base-case.js new file mode 100644 index 00000000000..356890521d6 --- /dev/null +++ b/deps/npm/node_modules/async-some/test/base-case.js @@ -0,0 +1,35 @@ +var test = require("tap").test + +var some = require("../some.js") + +test("some() array base case", function (t) { + some([], failer, function (error, match) { + t.ifError(error, "ran successfully") + + t.notOk(match, "nothing to find, so nothing found") + + t.end() + }) + + function failer(value, cb) { + cb(new Error("test should never have been called")) + } +}) + +test("some() arguments arraylike base case", function (t) { + go() + + function go() { + some(arguments, failer, function (error, match) { + t.ifError(error, "ran successfully") + + t.notOk(match, "nothing to find, so nothing found") + + t.end() + }) + + function failer(value, cb) { + cb(new Error("test should never have been called")) + } + } +}) diff --git a/deps/npm/node_modules/async-some/test/parameters.js b/deps/npm/node_modules/async-some/test/parameters.js new file mode 100644 index 00000000000..0706d1da6fc --- /dev/null +++ b/deps/npm/node_modules/async-some/test/parameters.js @@ -0,0 +1,37 @@ +var test = require("tap").test + +var some = require("../some.js") + +var NOP = function () {} + +test("some() called with bogus parameters", function (t) { + t.throws(function () { + some() + }, "throws when called with no parameters") + + t.throws(function () { + some(null, NOP, NOP) + }, "throws when called with no list") + + t.throws(function () { + some([], null, NOP) + }, "throws when called with no predicate") + + t.throws(function () { + some([], NOP, null) + }, "throws when called with no callback") + + t.throws(function () { + some({}, NOP, NOP) + }, "throws when called with wrong list type") + + t.throws(function () { + some([], "ham", NOP) + }, "throws when called with wrong test type") + + t.throws(function () { + some([], NOP, "ham") + }, "throws when called with wrong test type") + + t.end() +}) diff --git a/deps/npm/node_modules/async-some/test/simple.js b/deps/npm/node_modules/async-some/test/simple.js new file mode 100644 index 00000000000..3d68e1e5076 --- /dev/null +++ b/deps/npm/node_modules/async-some/test/simple.js @@ -0,0 +1,60 @@ +var test = require("tap").test + +var some = require("../some.js") + +test("some() doesn't find anything asynchronously", function (t) { + some(["a", "b", "c", "d", "e", "f", "g"], predicate, function (error, match) { + t.ifError(error, "ran successfully") + + t.notOk(match, "nothing to find, so nothing found") + + t.end() + }) + + function predicate(value, cb) { + // dezalgo ensures it's safe to not do this, but just in case + setTimeout(function () { cb(null, value > "j" && value) }) + } +}) + +test("some() doesn't find anything synchronously", function (t) { + some(["a", "b", "c", "d", "e", "f", "g"], predicate, function (error, match) { + t.ifError(error, "ran successfully") + + t.notOk(match, "nothing to find, so nothing found") + + t.end() + }) + + function predicate(value, cb) { + cb(null, value > "j" && value) + } +}) + +test("some() doesn't find anything asynchronously", function (t) { + some(["a", "b", "c", "d", "e", "f", "g"], predicate, function (error, match) { + t.ifError(error, "ran successfully") + + t.equals(match, "d", "found expected element") + + t.end() + }) + + function predicate(value, cb) { + setTimeout(function () { cb(null, value > "c" && value) }) + } +}) + +test("some() doesn't find anything synchronously", function (t) { + some(["a", "b", "c", "d", "e", "f", "g"], predicate, function (error, match) { + t.ifError(error, "ran successfully") + + t.equals(match, "d", "found expected") + + t.end() + }) + + function predicate(value, cb) { + cb(null, value > "c" && value) + } +}) diff --git a/deps/npm/node_modules/cmd-shim/index.js b/deps/npm/node_modules/cmd-shim/index.js index 7853e8605db..59a1f6cbd62 100644 --- a/deps/npm/node_modules/cmd-shim/index.js +++ b/deps/npm/node_modules/cmd-shim/index.js @@ -11,11 +11,7 @@ module.exports = cmdShim cmdShim.ifExists = cmdShimIfExists -try { - var fs = require("graceful-fs") -} catch (e) { - var fs = require("fs") -} +var fs = require("graceful-fs") var mkdir = require("mkdirp") , path = require("path") diff --git a/deps/npm/node_modules/cmd-shim/package.json b/deps/npm/node_modules/cmd-shim/package.json index 09f0c48a4dc..e1f4f543ea7 100644 --- a/deps/npm/node_modules/cmd-shim/package.json +++ b/deps/npm/node_modules/cmd-shim/package.json @@ -1,6 +1,6 @@ { "name": "cmd-shim", - "version": "2.0.0", + "version": "2.0.1", "description": "Used in npm for command line application support", "scripts": { "test": "tap test/*.js" @@ -10,26 +10,37 @@ "url": "https://github.com/ForbesLindesay/cmd-shim.git" }, "license": "BSD", - "optionalDependencies": { - "graceful-fs": "^3.0.2" - }, "dependencies": { - "mkdirp": "~0.5.0", - "graceful-fs": "^3.0.2" + "graceful-fs": ">3.0.1 <4.0.0-0", + "mkdirp": "~0.5.0" }, "devDependencies": { "tap": "~0.4.11", "rimraf": "~2.2.8" }, - "readme": "# cmd-shim\n\nThe cmd-shim used in npm to create executable scripts on Windows,\nsince symlinks are not suitable for this purpose there.\n\nOn Unix systems, you should use a symbolic link instead.\n\n[![Build Status](https://img.shields.io/travis/ForbesLindesay/cmd-shim/master.svg)](https://travis-ci.org/ForbesLindesay/cmd-shim)\n[![Dependency Status](https://img.shields.io/gemnasium/ForbesLindesay/cmd-shim.svg)](https://gemnasium.com/ForbesLindesay/cmd-shim)\n[![NPM version](https://img.shields.io/npm/v/cmd-shim.svg)](http://badge.fury.io/js/cmd-shim)\n\n## Installation\n\n```\nnpm install cmd-shim\n```\n\n## API\n\n### cmdShim(from, to, cb)\n\nCreate a cmd shim at `to` for the command line program at `from`.\ne.g.\n\n```javascript\nvar cmdShim = require('cmd-shim');\ncmdShim(__dirname + '/cli.js', '/usr/bin/command-name', function (err) {\n if (err) throw err;\n});\n```\n\n### cmdShim.ifExists(from, to, cb)\n\nThe same as above, but will just continue if the file does not exist.\nSource:\n\n```javascript\nfunction cmdShimIfExists (from, to, cb) {\n fs.stat(from, function (er) {\n if (er) return cb()\n cmdShim(from, to, cb)\n })\n}\n```\n", - "readmeFilename": "README.md", + "gitHead": "6f53d506be590fe9ac20c9801512cd1a3aad5974", "bugs": { "url": "https://github.com/ForbesLindesay/cmd-shim/issues" }, "homepage": "https://github.com/ForbesLindesay/cmd-shim", - "_id": "cmd-shim@2.0.0", - "_shasum": "64fd5859110051571406f61821bf37d366bc3cb3", - "_resolved": "git://github.com/othiym23/cmd-shim#12de64ca97f45ac600910092f19afacc3d5376dd", - "_from": "git://github.com/othiym23/cmd-shim", - "_fromGithub": true + "_id": "cmd-shim@2.0.1", + "_shasum": "4512a373d2391679aec51ad1d4733559e9b85d4a", + "_from": "cmd-shim@>=2.0.1-0 <3.0.0-0", + "_npmVersion": "1.5.0-alpha-4", + "_npmUser": { + "name": "forbeslindesay", + "email": "forbes@lindesay.co.uk" + }, + "maintainers": [ + { + "name": "forbeslindesay", + "email": "forbes@lindesay.co.uk" + } + ], + "dist": { + "shasum": "4512a373d2391679aec51ad1d4733559e9b85d4a", + "tarball": "http://registry.npmjs.org/cmd-shim/-/cmd-shim-2.0.1.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-2.0.1.tgz" } diff --git a/deps/npm/node_modules/columnify/node_modules/strip-ansi/node_modules/ansi-regex/package.json b/deps/npm/node_modules/columnify/node_modules/strip-ansi/node_modules/ansi-regex/package.json index 716ae00899d..ca610250c9e 100644 --- a/deps/npm/node_modules/columnify/node_modules/strip-ansi/node_modules/ansi-regex/package.json +++ b/deps/npm/node_modules/columnify/node_modules/strip-ansi/node_modules/ansi-regex/package.json @@ -57,7 +57,7 @@ "homepage": "https://github.com/sindresorhus/ansi-regex", "_id": "ansi-regex@0.2.1", "_shasum": "0d8e946967a3d8143f93e24e298525fc1b2235f9", - "_from": "ansi-regex@^0.2.1", + "_from": "ansi-regex@0.2.1", "_npmVersion": "1.4.9", "_npmUser": { "name": "sindresorhus", @@ -74,6 +74,5 @@ "tarball": "http://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" } diff --git a/deps/npm/node_modules/columnify/node_modules/strip-ansi/package.json b/deps/npm/node_modules/columnify/node_modules/strip-ansi/package.json index 0fd180b6f27..64c4dee52c4 100644 --- a/deps/npm/node_modules/columnify/node_modules/strip-ansi/package.json +++ b/deps/npm/node_modules/columnify/node_modules/strip-ansi/package.json @@ -63,7 +63,7 @@ "homepage": "https://github.com/sindresorhus/strip-ansi", "_id": "strip-ansi@1.0.0", "_shasum": "6c021321d6ece161a3c608fbab268c7328901c73", - "_from": "strip-ansi@^1.0.0", + "_from": "strip-ansi@>=1.0.0-0 <2.0.0-0", "_npmVersion": "1.4.14", "_npmUser": { "name": "sindresorhus", @@ -84,6 +84,5 @@ "tarball": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-1.0.0.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-1.0.0.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-1.0.0.tgz" } diff --git a/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/package.json b/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/package.json index ee00ac7e54b..3c6b7764709 100644 --- a/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/package.json +++ b/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/package.json @@ -100,7 +100,7 @@ "homepage": "https://github.com/pvorb/node-clone", "_id": "clone@0.1.18", "_shasum": "64a0d5d57eaa85a1a8af380cd1db8c7b3a895f66", - "_from": "clone@~0.1.5", + "_from": "clone@>=0.1.5-0 <0.2.0-0", "_npmVersion": "1.4.14", "_npmUser": { "name": "pvorb", @@ -117,6 +117,5 @@ "tarball": "http://registry.npmjs.org/clone/-/clone-0.1.18.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/clone/-/clone-0.1.18.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/clone/-/clone-0.1.18.tgz" } diff --git a/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/package.json b/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/package.json index ba00482142e..f9243a12005 100644 --- a/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/package.json +++ b/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/package.json @@ -45,10 +45,6 @@ ], "directories": {}, "_shasum": "3ae25f44416c6c01f9809a25fcdd285912d2a6b1", - "_from": "defaults@^1.0.0", - "_resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.0.tgz", - "bugs": { - "url": "https://github.com/tmpvar/defaults/issues" - }, - "homepage": "https://github.com/tmpvar/defaults" + "_from": "defaults@>=1.0.0-0 <2.0.0-0", + "_resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.0.tgz" } diff --git a/deps/npm/node_modules/columnify/node_modules/wcwidth/package.json b/deps/npm/node_modules/columnify/node_modules/wcwidth/package.json index 0045c3cdba5..f12d49b789e 100644 --- a/deps/npm/node_modules/columnify/node_modules/wcwidth/package.json +++ b/deps/npm/node_modules/columnify/node_modules/wcwidth/package.json @@ -40,7 +40,7 @@ "gitHead": "5bc3aafd45c89f233c27b9479c18a23ca91ba660", "_id": "wcwidth@1.0.0", "_shasum": "02d059ff7a8fc741e0f6b5da1e69b2b40daeca6f", - "_from": "wcwidth@^1.0.0", + "_from": "wcwidth@>=1.0.0-0 <2.0.0-0", "_npmVersion": "1.4.23", "_npmUser": { "name": "timoxley", @@ -56,6 +56,5 @@ "shasum": "02d059ff7a8fc741e0f6b5da1e69b2b40daeca6f", "tarball": "http://registry.npmjs.org/wcwidth/-/wcwidth-1.0.0.tgz" }, - "_resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.0.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.0.tgz" } diff --git a/deps/npm/node_modules/columnify/package.json b/deps/npm/node_modules/columnify/package.json index 01ac64bb210..ef307b50925 100644 --- a/deps/npm/node_modules/columnify/package.json +++ b/deps/npm/node_modules/columnify/package.json @@ -43,7 +43,7 @@ "gitHead": "14e77bef3f57acaa3f390145915a9f2d2a4f882c", "_id": "columnify@1.2.1", "_shasum": "921ec51c178f4126d3c07e9acecd67a55c7953e4", - "_from": "columnify@^1.2.1", + "_from": "columnify@>=1.2.1-0 <2.0.0-0", "_npmVersion": "1.4.23", "_npmUser": { "name": "timoxley", @@ -59,6 +59,5 @@ "shasum": "921ec51c178f4126d3c07e9acecd67a55c7953e4", "tarball": "http://registry.npmjs.org/columnify/-/columnify-1.2.1.tgz" }, - "_resolved": "https://registry.npmjs.org/columnify/-/columnify-1.2.1.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/columnify/-/columnify-1.2.1.tgz" } diff --git a/deps/npm/node_modules/dezalgo/README.md b/deps/npm/node_modules/dezalgo/README.md new file mode 100644 index 00000000000..bdfc8ba80d0 --- /dev/null +++ b/deps/npm/node_modules/dezalgo/README.md @@ -0,0 +1,29 @@ +# dezalgo + +Contain async insanity so that the dark pony lord doesn't eat souls + +See [this blog +post](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony). + +## USAGE + +Pass a callback to `dezalgo` and it will ensure that it is *always* +called in a future tick, and never in this tick. + +```javascript +var dz = require('dezalgo') + +var cache = {} +function maybeSync(arg, cb) { + cb = dz(cb) + + // this will actually defer to nextTick + if (cache[arg]) cb(null, cache[arg]) + + fs.readFile(arg, function (er, data) { + // since this is *already* defered, it will call immediately + if (er) cb(er) + cb(null, cache[arg] = data) + }) +} +``` diff --git a/deps/npm/node_modules/dezalgo/dezalgo.js b/deps/npm/node_modules/dezalgo/dezalgo.js new file mode 100644 index 00000000000..cdc48aec8c2 --- /dev/null +++ b/deps/npm/node_modules/dezalgo/dezalgo.js @@ -0,0 +1,21 @@ +module.exports = dezalgo + +var asap = require('asap') + +function dezalgo (cb) { + var sync = true + asap(function () { + sync = false + }) + + return function zalgoSafe() { + var args = arguments + var me = this + if (sync) + asap(function() { + cb.apply(me, args) + }) + else + cb.apply(me, args) + } +} diff --git a/deps/npm/node_modules/dezalgo/node_modules/asap/LICENSE.md b/deps/npm/node_modules/dezalgo/node_modules/asap/LICENSE.md new file mode 100644 index 00000000000..5d98ad8fe99 --- /dev/null +++ b/deps/npm/node_modules/dezalgo/node_modules/asap/LICENSE.md @@ -0,0 +1,20 @@ + +Copyright 2009–2013 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. + diff --git a/deps/npm/node_modules/dezalgo/node_modules/asap/README.md b/deps/npm/node_modules/dezalgo/node_modules/asap/README.md new file mode 100644 index 00000000000..9a42759761d --- /dev/null +++ b/deps/npm/node_modules/dezalgo/node_modules/asap/README.md @@ -0,0 +1,81 @@ + +# ASAP + +This `asap` CommonJS package contains a single `asap` module that +exports a single `asap` function that executes a function **as soon as +possible**. + +```javascript +asap(function () { + // ... +}); +``` + +More formally, ASAP provides a fast event queue that will execute tasks +until it is empty before yielding to the JavaScript engine's underlying +event-loop. When the event queue becomes non-empty, ASAP schedules a +flush event, preferring for that event to occur before the JavaScript +engine has an opportunity to perform IO tasks or rendering, thus making +the first task and subsequent tasks semantically indistinguishable. +ASAP uses a variety of techniques to preserve this invariant on +different versions of browsers and NodeJS. + +By design, ASAP can starve the event loop on the theory that, if there +is enough work to be done synchronously, albeit in separate events, long +enough to starve input or output, it is a strong indicator that the +program needs to push back on scheduling more work. + +Take care. ASAP can sustain infinite recursive calls indefinitely +without warning. This is behaviorally equivalent to an infinite loop. +It will not halt from a stack overflow, but it *will* chew through +memory (which is an oddity I cannot explain at this time). Just as with +infinite loops, you can monitor a Node process for this behavior with a +heart-beat signal. As with infinite loops, a very small amount of +caution goes a long way to avoiding problems. + +```javascript +function loop() { + asap(loop); +} +loop(); +``` + +ASAP is distinct from `setImmediate` in that it does not suffer the +overhead of returning a handle and being possible to cancel. For a +`setImmediate` shim, consider [setImmediate][]. + +[setImmediate]: https://github.com/noblejs/setimmediate + +If a task throws an exception, it will not interrupt the flushing of +high-priority tasks. The exception will be postponed to a later, +low-priority event to avoid slow-downs, when the underlying JavaScript +engine will treat it as it does any unhandled exception. + +## Heritage + +ASAP has been factored out of the [Q][] asynchronous promise library. +It originally had a naïve implementation in terms of `setTimeout`, but +[Malte Ubl][NonBlocking] provided an insight that `postMessage` might be +useful for creating a high-priority, no-delay event dispatch hack. +Since then, Internet Explorer proposed and implemented `setImmediate`. +Robert Kratić began contributing to Q by measuring the performance of +the internal implementation of `asap`, paying particular attention to +error recovery. Domenic, Robert, and I collectively settled on the +current strategy of unrolling the high-priority event queue internally +regardless of what strategy we used to dispatch the potentially +lower-priority flush event. Domenic went on to make ASAP cooperate with +NodeJS domains. + +[Q]: https://github.com/kriskowal/q +[NonBlocking]: http://www.nonblocking.io/2011/06/windownexttick.html + +For further reading, Nicholas Zakas provided a thorough article on [The +Case for setImmediate][NCZ]. + +[NCZ]: http://www.nczonline.net/blog/2013/07/09/the-case-for-setimmediate/ + +## License + +Copyright 2009-2013 by Contributors +MIT License (enclosed) + diff --git a/deps/npm/node_modules/dezalgo/node_modules/asap/asap.js b/deps/npm/node_modules/dezalgo/node_modules/asap/asap.js new file mode 100644 index 00000000000..2f85516cde0 --- /dev/null +++ b/deps/npm/node_modules/dezalgo/node_modules/asap/asap.js @@ -0,0 +1,113 @@ + +// Use the fastest possible means to execute a task in a future turn +// of the event loop. + +// linked list of tasks (single, with head node) +var head = {task: void 0, next: null}; +var tail = head; +var flushing = false; +var requestFlush = void 0; +var isNodeJS = false; + +function flush() { + /* jshint loopfunc: true */ + + while (head.next) { + head = head.next; + var task = head.task; + head.task = void 0; + var domain = head.domain; + + if (domain) { + head.domain = void 0; + domain.enter(); + } + + try { + task(); + + } catch (e) { + if (isNodeJS) { + // In node, uncaught exceptions are considered fatal errors. + // Re-throw them synchronously to interrupt flushing! + + // Ensure continuation if the uncaught exception is suppressed + // listening "uncaughtException" events (as domains does). + // Continue in next event to avoid tick recursion. + if (domain) { + domain.exit(); + } + setTimeout(flush, 0); + if (domain) { + domain.enter(); + } + + throw e; + + } else { + // In browsers, uncaught exceptions are not fatal. + // Re-throw them asynchronously to avoid slow-downs. + setTimeout(function() { + throw e; + }, 0); + } + } + + if (domain) { + domain.exit(); + } + } + + flushing = false; +} + +if (typeof process !== "undefined" && process.nextTick) { + // Node.js before 0.9. Note that some fake-Node environments, like the + // Mocha test runner, introduce a `process` global without a `nextTick`. + isNodeJS = true; + + requestFlush = function () { + process.nextTick(flush); + }; + +} else if (typeof setImmediate === "function") { + // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate + if (typeof window !== "undefined") { + requestFlush = setImmediate.bind(window, flush); + } else { + requestFlush = function () { + setImmediate(flush); + }; + } + +} else if (typeof MessageChannel !== "undefined") { + // modern browsers + // http://www.nonblocking.io/2011/06/windownexttick.html + var channel = new MessageChannel(); + channel.port1.onmessage = flush; + requestFlush = function () { + channel.port2.postMessage(0); + }; + +} else { + // old browsers + requestFlush = function () { + setTimeout(flush, 0); + }; +} + +function asap(task) { + tail = tail.next = { + task: task, + domain: isNodeJS && process.domain, + next: null + }; + + if (!flushing) { + flushing = true; + requestFlush(); + } +}; + +module.exports = asap; + diff --git a/deps/npm/node_modules/dezalgo/node_modules/asap/package.json b/deps/npm/node_modules/dezalgo/node_modules/asap/package.json new file mode 100644 index 00000000000..1237784d41f --- /dev/null +++ b/deps/npm/node_modules/dezalgo/node_modules/asap/package.json @@ -0,0 +1,39 @@ +{ + "name": "asap", + "version": "1.0.0", + "description": "High-priority task queue for Node.js and browsers", + "keywords": [ + "event", + "task", + "queue" + ], + "licenses": [ + { + "type": "MIT", + "url": "https://github.com/kriskowal/asap/raw/master/LICENSE.md" + } + ], + "main": "asap", + "readme": "\n# ASAP\n\nThis `asap` CommonJS package contains a single `asap` module that\nexports a single `asap` function that executes a function **as soon as\npossible**.\n\n```javascript\nasap(function () {\n // ...\n});\n```\n\nMore formally, ASAP provides a fast event queue that will execute tasks\nuntil it is empty before yielding to the JavaScript engine's underlying\nevent-loop. When the event queue becomes non-empty, ASAP schedules a\nflush event, preferring for that event to occur before the JavaScript\nengine has an opportunity to perform IO tasks or rendering, thus making\nthe first task and subsequent tasks semantically indistinguishable.\nASAP uses a variety of techniques to preserve this invariant on\ndifferent versions of browsers and NodeJS.\n\nBy design, ASAP can starve the event loop on the theory that, if there\nis enough work to be done synchronously, albeit in separate events, long\nenough to starve input or output, it is a strong indicator that the\nprogram needs to push back on scheduling more work.\n\nTake care. ASAP can sustain infinite recursive calls indefinitely\nwithout warning. This is behaviorally equivalent to an infinite loop.\nIt will not halt from a stack overflow, but it *will* chew through\nmemory (which is an oddity I cannot explain at this time). Just as with\ninfinite loops, you can monitor a Node process for this behavior with a\nheart-beat signal. As with infinite loops, a very small amount of\ncaution goes a long way to avoiding problems.\n\n```javascript\nfunction loop() {\n asap(loop);\n}\nloop();\n```\n\nASAP is distinct from `setImmediate` in that it does not suffer the\noverhead of returning a handle and being possible to cancel. For a\n`setImmediate` shim, consider [setImmediate][].\n\n[setImmediate]: https://github.com/noblejs/setimmediate\n\nIf a task throws an exception, it will not interrupt the flushing of\nhigh-priority tasks. The exception will be postponed to a later,\nlow-priority event to avoid slow-downs, when the underlying JavaScript\nengine will treat it as it does any unhandled exception.\n\n## Heritage\n\nASAP has been factored out of the [Q][] asynchronous promise library.\nIt originally had a naïve implementation in terms of `setTimeout`, but\n[Malte Ubl][NonBlocking] provided an insight that `postMessage` might be\nuseful for creating a high-priority, no-delay event dispatch hack.\nSince then, Internet Explorer proposed and implemented `setImmediate`.\nRobert Kratić began contributing to Q by measuring the performance of\nthe internal implementation of `asap`, paying particular attention to\nerror recovery. Domenic, Robert, and I collectively settled on the\ncurrent strategy of unrolling the high-priority event queue internally\nregardless of what strategy we used to dispatch the potentially\nlower-priority flush event. Domenic went on to make ASAP cooperate with\nNodeJS domains.\n\n[Q]: https://github.com/kriskowal/q\n[NonBlocking]: http://www.nonblocking.io/2011/06/windownexttick.html\n\nFor further reading, Nicholas Zakas provided a thorough article on [The\nCase for setImmediate][NCZ].\n\n[NCZ]: http://www.nczonline.net/blog/2013/07/09/the-case-for-setimmediate/\n\n## License\n\nCopyright 2009-2013 by Contributors\nMIT License (enclosed)\n\n", + "readmeFilename": "README.md", + "_id": "asap@1.0.0", + "dist": { + "shasum": "b2a45da5fdfa20b0496fc3768cc27c12fa916a7d", + "tarball": "http://registry.npmjs.org/asap/-/asap-1.0.0.tgz" + }, + "_from": "asap@>=1.0.0-0 <2.0.0-0", + "_npmVersion": "1.2.15", + "_npmUser": { + "name": "kriskowal", + "email": "kris.kowal@cixar.com" + }, + "maintainers": [ + { + "name": "kriskowal", + "email": "kris.kowal@cixar.com" + } + ], + "directories": {}, + "_shasum": "b2a45da5fdfa20b0496fc3768cc27c12fa916a7d", + "_resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz" +} diff --git a/deps/npm/node_modules/dezalgo/package.json b/deps/npm/node_modules/dezalgo/package.json new file mode 100644 index 00000000000..072e2ad6f4c --- /dev/null +++ b/deps/npm/node_modules/dezalgo/package.json @@ -0,0 +1,66 @@ +{ + "name": "dezalgo", + "version": "1.0.0", + "description": "Contain async insanity so that the dark pony lord doesn't eat souls", + "main": "dezalgo.js", + "directories": { + "test": "test" + }, + "dependencies": { + "asap": "^1.0.0" + }, + "devDependencies": { + "tap": "^0.4.11" + }, + "scripts": { + "test": "tap test/*.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/npm/dezalgo" + }, + "keywords": [ + "async", + "zalgo", + "the dark pony", + "he comes", + "asynchrony of all holy and good", + "T̯̪ͅo̯͖̹ ̻̮̖̲͢i̥̖n̢͈͇̝͍v͏͉ok̭̬̝ͅe̞͍̩̫͍̩͝ ̩̮̖̟͇͉́t͔͔͎̗h͏̗̟e̘͉̰̦̠̞͓ ͕h͉̟͎̪̠̱͠ḭ̮̩v̺͉͇̩e̵͖-̺̪m͍i̜n̪̲̲̲̮d̷ ̢r̠̼̯̹̦̦͘ͅe͓̳͓̙p̺̗̫͙͘ͅr͔̰͜e̴͓̞s͉̩̩͟ͅe͏̣n͚͇̗̭̺͍tì͙̣n͏̖̥̗͎̰̪g̞͓̭̱̯̫̕ ̣̱͜ͅc̦̰̰̠̮͎͙̀hao̺̜̻͍͙ͅs͉͓̘.͎̼̺̼͕̹͘", + "̠̞̱̰I͖͇̝̻n̦̰͍̰̟v̤̺̫̳̭̼̗͘ò̹̟̩̩͚k̢̥̠͍͉̦̬i̖͓͔̮̱̻͘n̶̳͙̫͎g̖̯̣̲̪͉ ̞͎̗͕͚ͅt̲͕̘̺̯̗̦h̘̦̲̜̻e̳͎͉̬͙ ̴̞̪̲̥f̜̯͓͓̭̭͢e̱̘͔̮e̜̤l̺̱͖̯͓͙͈͢i̵̦̬͉͔̫͚͕n͉g̨͖̙̙̹̹̟̤ ͉̪o̞̠͍̪̰͙ͅf̬̲̺ ͔͕̲͕͕̲̕c̙͉h̝͔̩̙̕ͅa̲͖̻̗̹o̥̼̫s̝̖̜̝͚̫̟.̺͚ ̸̱̲W̶̥̣͖̦i͏̤̬̱̳̣ͅt͉h̗̪̪ ̷̱͚̹̪ǫ͕̗̣̳̦͎u̼̦͔̥̮̕ţ͖͎̻͔͉ ̴͎̩òr̹̰̖͉͈͝d̷̲̦̖͓e̲͓̠r", + "̧͚̜͓̰̭̭Ṯ̫̹̜̮̟̮͝h͚̘̩̘̖̰́e ̥̘͓͉͔͙̼N̟̜̣̘͔̪e̞̞̤͢z̰̖̘͇p̠͟e̺̱̣͍͙̝ṛ̘̬͔̙͇̠d͝ḭ̯̱̥̗̩a̛ͅn͏̦ ̷̥hi̥v̖̳̹͉̮̱͝e̹̪̘̖̰̟-̴͙͓͚̜̻mi̗̺̻͙̺ͅn̪̯͈d ͏̘͓̫̳ͅơ̹͔̳̖̣͓f͈̹̘ ͕ͅc̗̤̠̜̮̥̥h̡͍̩̭̫͚̱a̤͉̤͔͜os͕̤̼͍̲̀ͅ.̡̱ ̦Za̯̱̗̭͍̣͚l̗͉̰̤g͏̣̭̬̗̲͖ͅo̶̭̩̳̟͈.̪̦̰̳", + "H̴̱̦̗̬̣͓̺e̮ ͉̠̰̞͎̖͟ẁh̛̺̯ͅo̖̫͡ ̢Ẁa̡̗i̸t͖̣͉̀ş͔̯̩ ̤̦̮͇̞̦̲B͎̭͇̦̼e̢hin͏͙̟̪d̴̰͓̻̣̮͕ͅ T͖̮̕h͖e̘̺̰̙͘ ̥Ẁ̦͔̻͚a̞͖̪͉l̪̠̻̰̣̠l̲͎͞", + "Z̘͍̼͎̣͔͝Ą̲̜̱̱̹̤͇L̶̝̰̭͔G͍̖͍O̫͜ͅ!̼̤ͅ", + "H̝̪̜͓̀̌̂̒E̢̙̠̣ ̴̳͇̥̟̠͍̐C̹̓̑̐̆͝Ó̶̭͓̚M̬̼Ĕ̖̤͔͔̟̹̽̿̊ͥ̍ͫS̻̰̦̻̖̘̱̒ͪ͌̅͟" + ], + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": "ISC", + "bugs": { + "url": "https://github.com/npm/dezalgo/issues" + }, + "homepage": "https://github.com/npm/dezalgo", + "gitHead": "b10ea8ae0096d0e60c1acaa88d5334a9b372e4b0", + "_id": "dezalgo@1.0.0", + "_shasum": "050bb723f18b5617b309f26c2dc8fe6f2573b6fc", + "_from": "dezalgo@1.0.0", + "_npmVersion": "1.4.18", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "050bb723f18b5617b309f26c2dc8fe6f2573b6fc", + "tarball": "http://registry.npmjs.org/dezalgo/-/dezalgo-1.0.0.tgz" + }, + "_resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.0.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/deps/npm/node_modules/dezalgo/test/basic.js b/deps/npm/node_modules/dezalgo/test/basic.js new file mode 100644 index 00000000000..cc10336e039 --- /dev/null +++ b/deps/npm/node_modules/dezalgo/test/basic.js @@ -0,0 +1,25 @@ +var test = require('tap').test +var dz = require('../dezalgo.js') + +test('the dark pony', function(t) { + + var n = 0 + function foo(cb) { + cb = dz(cb) + if (++n % 2) cb() + else process.nextTick(cb) + } + + var called = 0 + for (var i = 0; i < 10; i++) { + foo(function() { + called++ + }) + t.equal(called, 0) + } + + setTimeout(function() { + t.equal(called, 10) + t.end() + }) +}) diff --git a/deps/npm/node_modules/fs-vacuum/.eslintrc b/deps/npm/node_modules/fs-vacuum/.eslintrc new file mode 100644 index 00000000000..5c39c67eca0 --- /dev/null +++ b/deps/npm/node_modules/fs-vacuum/.eslintrc @@ -0,0 +1,18 @@ +{ + "env" : { + "node" : true + }, + "rules" : { + "curly" : 0, + "no-lonely-if" : 1, + "no-mixed-requires" : 0, + "no-underscore-dangle" : 0, + "no-unused-vars" : [2, {"vars" : "all", "args" : "after-used"}], + "no-use-before-define" : [2, "nofunc"], + "quotes" : [1, "double", "avoid-escape"], + "semi" : [2, "never"], + "space-after-keywords" : 1, + "space-infix-ops" : 0, + "strict" : 0 + } +} diff --git a/deps/npm/node_modules/fs-vacuum/.npmignore b/deps/npm/node_modules/fs-vacuum/.npmignore new file mode 100644 index 00000000000..3c3629e647f --- /dev/null +++ b/deps/npm/node_modules/fs-vacuum/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/deps/npm/node_modules/fs-vacuum/README.md b/deps/npm/node_modules/fs-vacuum/README.md new file mode 100644 index 00000000000..df31243df5c --- /dev/null +++ b/deps/npm/node_modules/fs-vacuum/README.md @@ -0,0 +1,33 @@ +# fs-vacuum + +Remove the empty branches of a directory tree, optionally up to (but not +including) a specified base directory. Optionally nukes the leaf directory. + +## Usage + +```javascript +var logger = require("npmlog"); +var vacuum = require("fs-vacuum"); + +var options = { + base : "/path/to/my/tree/root", + purge : true, + log : logger.silly.bind(logger, "myCleanup") +}; + +/* Assuming there are no other files or directories in "out", "to", or "my", + * the final path will just be "/path/to/my/tree/root". + */ +vacuum("/path/to/my/tree/root/out/to/my/files", function (error) { + if (error) console.error("Unable to cleanly vacuum:", error.message); +}); +``` +# vacuum(directory, options, callback) + +* `directory` {String} Leaf node to remove. **Must be a directory, symlink, or file.** +* `options` {Object} + * `base` {String} No directories at or above this level of the filesystem will be removed. + * `purge` {Boolean} If set, nuke the whole leaf directory, including its contents. + * `log` {Function} A logging function that takes `npmlog`-compatible argument lists. +* `callback` {Function} Function to call once vacuuming is complete. + * `error` {Error} What went wrong along the way, if anything. diff --git a/deps/npm/node_modules/fs-vacuum/package.json b/deps/npm/node_modules/fs-vacuum/package.json new file mode 100644 index 00000000000..140536797f8 --- /dev/null +++ b/deps/npm/node_modules/fs-vacuum/package.json @@ -0,0 +1,42 @@ +{ + "name": "fs-vacuum", + "version": "1.2.1", + "description": "recursively remove empty directories -- to a point", + "main": "vacuum.js", + "scripts": { + "test": "tap test/*.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/npm/fs-vacuum.git" + }, + "keywords": [ + "rm", + "rimraf", + "clean" + ], + "author": { + "name": "Forrest L Norvell", + "email": "ogd@aoaioxxysz.net" + }, + "license": "ISC", + "bugs": { + "url": "https://github.com/npm/fs-vacuum/issues" + }, + "homepage": "https://github.com/npm/fs-vacuum", + "devDependencies": { + "mkdirp": "^0.5.0", + "tap": "^0.4.11", + "tmp": "0.0.23" + }, + "dependencies": { + "graceful-fs": "^3.0.2", + "rimraf": "^2.2.8" + }, + "readme": "# fs-vacuum\n\nRemove the empty branches of a directory tree, optionally up to (but not\nincluding) a specified base directory. Optionally nukes the leaf directory.\n\n## Usage\n\n```javascript\nvar logger = require(\"npmlog\");\nvar vacuum = require(\"fs-vacuum\");\n\nvar options = {\n base : \"/path/to/my/tree/root\",\n purge : true,\n log : logger.silly.bind(logger, \"myCleanup\")\n};\n\n/* Assuming there are no other files or directories in \"out\", \"to\", or \"my\",\n * the final path will just be \"/path/to/my/tree/root\".\n */\nvacuum(\"/path/to/my/tree/root/out/to/my/files\", function (error) {\n if (error) console.error(\"Unable to cleanly vacuum:\", error.message);\n});\n```\n# vacuum(directory, options, callback)\n\n* `directory` {String} Leaf node to remove. **Must be a directory, symlink, or file.**\n* `options` {Object}\n * `base` {String} No directories at or above this level of the filesystem will be removed.\n * `purge` {Boolean} If set, nuke the whole leaf directory, including its contents.\n * `log` {Function} A logging function that takes `npmlog`-compatible argument lists.\n* `callback` {Function} Function to call once vacuuming is complete.\n * `error` {Error} What went wrong along the way, if anything.\n", + "readmeFilename": "README.md", + "gitHead": "bad24b21c45d86b3da991f2c3d058ef03546d83e", + "_id": "fs-vacuum@1.2.1", + "_shasum": "1bc3c62da30d6272569b8b9089c9811abb0a600b", + "_from": "fs-vacuum@>=1.2.1-0 <1.3.0-0" +} diff --git a/deps/npm/node_modules/fs-vacuum/test/arguments.js b/deps/npm/node_modules/fs-vacuum/test/arguments.js new file mode 100644 index 00000000000..d77ce0627d2 --- /dev/null +++ b/deps/npm/node_modules/fs-vacuum/test/arguments.js @@ -0,0 +1,24 @@ +var test = require("tap").test + +var vacuum = require("../vacuum.js") + +test("vacuum throws on missing parameters", function (t) { + t.throws(vacuum, "called with no parameters") + t.throws(function () { vacuum("directory", {}) }, "called with no callback") + + t.end() +}) + +test('vacuum throws on incorrect types ("Forrest is pedantic" section)', function (t) { + t.throws(function () { + vacuum({}, {}, function () {}) + }, "called with path parameter of incorrect type") + t.throws(function () { + vacuum("directory", "directory", function () {}) + }, "called with options of wrong type") + t.throws(function () { + vacuum("directory", {}, "whoops") + }, "called with callback that isn't callable") + + t.end() +}) diff --git a/deps/npm/node_modules/fs-vacuum/test/base-leaf-mismatch.js b/deps/npm/node_modules/fs-vacuum/test/base-leaf-mismatch.js new file mode 100644 index 00000000000..cfdf074fe43 --- /dev/null +++ b/deps/npm/node_modules/fs-vacuum/test/base-leaf-mismatch.js @@ -0,0 +1,16 @@ +var test = require("tap").test + +var vacuum = require("../vacuum.js") + +test("vacuum errors when base is set and path is not under it", function (t) { + vacuum("/a/made/up/path", {base : "/root/elsewhere"}, function (er) { + t.ok(er, "got an error") + t.equal( + er.message, + "/a/made/up/path is not a child of /root/elsewhere", + "got the expected error message" + ) + + t.end() + }) +}) diff --git a/deps/npm/node_modules/fs-vacuum/test/no-entries-file-no-purge.js b/deps/npm/node_modules/fs-vacuum/test/no-entries-file-no-purge.js new file mode 100644 index 00000000000..6a6e51bcab8 --- /dev/null +++ b/deps/npm/node_modules/fs-vacuum/test/no-entries-file-no-purge.js @@ -0,0 +1,78 @@ +var path = require("path") + +var test = require("tap").test +var statSync = require("graceful-fs").statSync +var writeFile = require("graceful-fs").writeFile +var readdirSync = require("graceful-fs").readdirSync +var mkdtemp = require("tmp").dir +var mkdirp = require("mkdirp") + +var vacuum = require("../vacuum.js") + +// CONSTANTS +var TEMP_OPTIONS = { + unsafeCleanup : true, + mode : "0700" +} +var SHORT_PATH = path.join("i", "am", "a", "path") +var PARTIAL_PATH = path.join(SHORT_PATH, "that", "ends", "at", "a") +var FULL_PATH = path.join(PARTIAL_PATH, "file") + +var messages = [] +function log() { messages.push(Array.prototype.slice.call(arguments).join(" ")) } + +var testBase, partialPath, fullPath +test("xXx setup xXx", function (t) { + mkdtemp(TEMP_OPTIONS, function (er, tmpdir) { + t.ifError(er, "temp directory exists") + + testBase = path.resolve(tmpdir, SHORT_PATH) + partialPath = path.resolve(tmpdir, PARTIAL_PATH) + fullPath = path.resolve(tmpdir, FULL_PATH) + + mkdirp(partialPath, function (er) { + t.ifError(er, "made test path") + + writeFile(fullPath, new Buffer("hi"), function (er) { + t.ifError(er, "made file") + + t.end() + }) + }) + }) +}) + +test("remove up to a point", function (t) { + vacuum(fullPath, {purge : false, base : testBase, log : log}, function (er) { + t.ifError(er, "cleaned up to base") + + t.equal(messages.length, 6, "got 5 removal & 1 finish message") + t.equal(messages[5], "finished vacuuming up to " + testBase) + + var stat + var verifyPath = fullPath + + function verify() { stat = statSync(verifyPath) } + + // handle the file separately + t.throws(verify, verifyPath + " cannot be statted") + t.notOk(stat && stat.isFile(), verifyPath + " is totally gone") + verifyPath = path.dirname(verifyPath) + + for (var i = 0; i < 4; i++) { + t.throws(verify, verifyPath + " cannot be statted") + t.notOk(stat && stat.isDirectory(), verifyPath + " is totally gone") + verifyPath = path.dirname(verifyPath) + } + + t.doesNotThrow(function () { + stat = statSync(testBase) + }, testBase + " can be statted") + t.ok(stat && stat.isDirectory(), testBase + " is still a directory") + + var files = readdirSync(testBase) + t.equal(files.length, 0, "nothing left in base directory") + + t.end() + }) +}) diff --git a/deps/npm/node_modules/fs-vacuum/test/no-entries-link-no-purge.js b/deps/npm/node_modules/fs-vacuum/test/no-entries-link-no-purge.js new file mode 100644 index 00000000000..087c039d618 --- /dev/null +++ b/deps/npm/node_modules/fs-vacuum/test/no-entries-link-no-purge.js @@ -0,0 +1,78 @@ +var path = require("path") + +var test = require("tap").test +var statSync = require("graceful-fs").statSync +var symlinkSync = require("graceful-fs").symlinkSync +var readdirSync = require("graceful-fs").readdirSync +var mkdtemp = require("tmp").dir +var mkdirp = require("mkdirp") + +var vacuum = require("../vacuum.js") + +// CONSTANTS +var TEMP_OPTIONS = { + unsafeCleanup : true, + mode : "0700" +} +var SHORT_PATH = path.join("i", "am", "a", "path") +var TARGET_PATH = path.join("target-link", "in", "the", "middle") +var PARTIAL_PATH = path.join(SHORT_PATH, "with", "a") +var FULL_PATH = path.join(PARTIAL_PATH, "link") +var EXPANDO_PATH = path.join(SHORT_PATH, "with", "a", "link", "in", "the", "middle") + +var messages = [] +function log() { messages.push(Array.prototype.slice.call(arguments).join(" ")) } + +var testBase, targetPath, partialPath, fullPath, expandoPath +test("xXx setup xXx", function (t) { + mkdtemp(TEMP_OPTIONS, function (er, tmpdir) { + t.ifError(er, "temp directory exists") + + testBase = path.resolve(tmpdir, SHORT_PATH) + targetPath = path.resolve(tmpdir, TARGET_PATH) + partialPath = path.resolve(tmpdir, PARTIAL_PATH) + fullPath = path.resolve(tmpdir, FULL_PATH) + expandoPath = path.resolve(tmpdir, EXPANDO_PATH) + + mkdirp(partialPath, function (er) { + t.ifError(er, "made test path") + + mkdirp(targetPath, function (er) { + t.ifError(er, "made target path") + + symlinkSync(path.join(tmpdir, "target-link"), fullPath) + + t.end() + }) + }) + }) +}) + +test("remove up to a point", function (t) { + vacuum(expandoPath, {purge : false, base : testBase, log : log}, function (er) { + t.ifError(er, "cleaned up to base") + + t.equal(messages.length, 7, "got 6 removal & 1 finish message") + t.equal(messages[6], "finished vacuuming up to " + testBase) + + var stat + var verifyPath = expandoPath + function verify() { stat = statSync(verifyPath) } + + for (var i = 0; i < 6; i++) { + t.throws(verify, verifyPath + " cannot be statted") + t.notOk(stat && stat.isDirectory(), verifyPath + " is totally gone") + verifyPath = path.dirname(verifyPath) + } + + t.doesNotThrow(function () { + stat = statSync(testBase) + }, testBase + " can be statted") + t.ok(stat && stat.isDirectory(), testBase + " is still a directory") + + var files = readdirSync(testBase) + t.equal(files.length, 0, "nothing left in base directory") + + t.end() + }) +}) diff --git a/deps/npm/node_modules/fs-vacuum/test/no-entries-no-purge.js b/deps/npm/node_modules/fs-vacuum/test/no-entries-no-purge.js new file mode 100644 index 00000000000..346ab566976 --- /dev/null +++ b/deps/npm/node_modules/fs-vacuum/test/no-entries-no-purge.js @@ -0,0 +1,61 @@ +var path = require("path") + +var test = require("tap").test +var statSync = require("graceful-fs").statSync +var mkdtemp = require("tmp").dir +var mkdirp = require("mkdirp") + +var vacuum = require("../vacuum.js") + +// CONSTANTS +var TEMP_OPTIONS = { + unsafeCleanup : true, + mode : "0700" +} +var SHORT_PATH = path.join("i", "am", "a", "path") +var LONG_PATH = path.join(SHORT_PATH, "of", "a", "certain", "length") + +var messages = [] +function log() { messages.push(Array.prototype.slice.call(arguments).join(" ")) } + +var testPath, testBase +test("xXx setup xXx", function (t) { + mkdtemp(TEMP_OPTIONS, function (er, tmpdir) { + t.ifError(er, "temp directory exists") + + testBase = path.resolve(tmpdir, SHORT_PATH) + testPath = path.resolve(tmpdir, LONG_PATH) + + mkdirp(testPath, function (er) { + t.ifError(er, "made test path") + + t.end() + }) + }) +}) + +test("remove up to a point", function (t) { + vacuum(testPath, {purge : false, base : testBase, log : log}, function (er) { + t.ifError(er, "cleaned up to base") + + t.equal(messages.length, 5, "got 4 removal & 1 finish message") + t.equal(messages[4], "finished vacuuming up to " + testBase) + + var stat + var verifyPath = testPath + function verify() { stat = statSync(verifyPath) } + + for (var i = 0; i < 4; i++) { + t.throws(verify, verifyPath + " cannot be statted") + t.notOk(stat && stat.isDirectory(), verifyPath + " is totally gone") + verifyPath = path.dirname(verifyPath) + } + + t.doesNotThrow(function () { + stat = statSync(testBase) + }, testBase + " can be statted") + t.ok(stat && stat.isDirectory(), testBase + " is still a directory") + + t.end() + }) +}) diff --git a/deps/npm/node_modules/fs-vacuum/test/no-entries-with-link-purge.js b/deps/npm/node_modules/fs-vacuum/test/no-entries-with-link-purge.js new file mode 100644 index 00000000000..4ed1a393974 --- /dev/null +++ b/deps/npm/node_modules/fs-vacuum/test/no-entries-with-link-purge.js @@ -0,0 +1,78 @@ +var path = require("path") + +var test = require("tap").test +var statSync = require("graceful-fs").statSync +var writeFileSync = require("graceful-fs").writeFileSync +var symlinkSync = require("graceful-fs").symlinkSync +var mkdtemp = require("tmp").dir +var mkdirp = require("mkdirp") + +var vacuum = require("../vacuum.js") + +// CONSTANTS +var TEMP_OPTIONS = { + unsafeCleanup : true, + mode : "0700" +} +var SHORT_PATH = path.join("i", "am", "a", "path") +var TARGET_PATH = "link-target" +var FIRST_FILE = path.join(TARGET_PATH, "monsieurs") +var SECOND_FILE = path.join(TARGET_PATH, "mesdames") +var PARTIAL_PATH = path.join(SHORT_PATH, "with", "a", "definite") +var FULL_PATH = path.join(PARTIAL_PATH, "target") + +var messages = [] +function log() { messages.push(Array.prototype.slice.call(arguments).join(" ")) } + +var testBase, partialPath, fullPath, targetPath +test("xXx setup xXx", function (t) { + mkdtemp(TEMP_OPTIONS, function (er, tmpdir) { + t.ifError(er, "temp directory exists") + + testBase = path.resolve(tmpdir, SHORT_PATH) + targetPath = path.resolve(tmpdir, TARGET_PATH) + partialPath = path.resolve(tmpdir, PARTIAL_PATH) + fullPath = path.resolve(tmpdir, FULL_PATH) + + mkdirp(partialPath, function (er) { + t.ifError(er, "made test path") + + mkdirp(targetPath, function (er) { + t.ifError(er, "made target path") + + writeFileSync(path.resolve(tmpdir, FIRST_FILE), new Buffer("c'est vraiment joli")) + writeFileSync(path.resolve(tmpdir, SECOND_FILE), new Buffer("oui oui")) + symlinkSync(targetPath, fullPath) + + t.end() + }) + }) + }) +}) + +test("remove up to a point", function (t) { + vacuum(fullPath, {purge : true, base : testBase, log : log}, function (er) { + t.ifError(er, "cleaned up to base") + + t.equal(messages.length, 5, "got 4 removal & 1 finish message") + t.equal(messages[0], "purging " + fullPath) + t.equal(messages[4], "finished vacuuming up to " + testBase) + + var stat + var verifyPath = fullPath + function verify() { stat = statSync(verifyPath) } + + for (var i = 0; i < 4; i++) { + t.throws(verify, verifyPath + " cannot be statted") + t.notOk(stat && stat.isDirectory(), verifyPath + " is totally gone") + verifyPath = path.dirname(verifyPath) + } + + t.doesNotThrow(function () { + stat = statSync(testBase) + }, testBase + " can be statted") + t.ok(stat && stat.isDirectory(), testBase + " is still a directory") + + t.end() + }) +}) diff --git a/deps/npm/node_modules/fs-vacuum/test/no-entries-with-purge.js b/deps/npm/node_modules/fs-vacuum/test/no-entries-with-purge.js new file mode 100644 index 00000000000..10fa558552a --- /dev/null +++ b/deps/npm/node_modules/fs-vacuum/test/no-entries-with-purge.js @@ -0,0 +1,67 @@ +var path = require("path") + +var test = require("tap").test +var statSync = require("graceful-fs").statSync +var writeFileSync = require("graceful-fs").writeFileSync +var mkdtemp = require("tmp").dir +var mkdirp = require("mkdirp") + +var vacuum = require("../vacuum.js") + +// CONSTANTS +var TEMP_OPTIONS = { + unsafeCleanup : true, + mode : "0700" +} +var SHORT_PATH = path.join("i", "am", "a", "path") +var LONG_PATH = path.join(SHORT_PATH, "of", "a", "certain", "kind") +var FIRST_FILE = path.join(LONG_PATH, "monsieurs") +var SECOND_FILE = path.join(LONG_PATH, "mesdames") + +var messages = [] +function log() { messages.push(Array.prototype.slice.call(arguments).join(" ")) } + +var testPath, testBase +test("xXx setup xXx", function (t) { + mkdtemp(TEMP_OPTIONS, function (er, tmpdir) { + t.ifError(er, "temp directory exists") + + testBase = path.resolve(tmpdir, SHORT_PATH) + testPath = path.resolve(tmpdir, LONG_PATH) + + mkdirp(testPath, function (er) { + t.ifError(er, "made test path") + + writeFileSync(path.resolve(tmpdir, FIRST_FILE), new Buffer("c'est vraiment joli")) + writeFileSync(path.resolve(tmpdir, SECOND_FILE), new Buffer("oui oui")) + t.end() + }) + }) +}) + +test("remove up to a point", function (t) { + vacuum(testPath, {purge : true, base : testBase, log : log}, function (er) { + t.ifError(er, "cleaned up to base") + + t.equal(messages.length, 5, "got 4 removal & 1 finish message") + t.equal(messages[0], "purging " + testPath) + t.equal(messages[4], "finished vacuuming up to " + testBase) + + var stat + var verifyPath = testPath + function verify() { stat = statSync(verifyPath) } + + for (var i = 0; i < 4; i++) { + t.throws(verify, verifyPath + " cannot be statted") + t.notOk(stat && stat.isDirectory(), verifyPath + " is totally gone") + verifyPath = path.dirname(verifyPath) + } + + t.doesNotThrow(function () { + stat = statSync(testBase) + }, testBase + " can be statted") + t.ok(stat && stat.isDirectory(), testBase + " is still a directory") + + t.end() + }) +}) diff --git a/deps/npm/node_modules/fs-vacuum/test/other-directories-no-purge.js b/deps/npm/node_modules/fs-vacuum/test/other-directories-no-purge.js new file mode 100644 index 00000000000..dce785623e2 --- /dev/null +++ b/deps/npm/node_modules/fs-vacuum/test/other-directories-no-purge.js @@ -0,0 +1,76 @@ +var path = require("path") + +var test = require("tap").test +var statSync = require("graceful-fs").statSync +var mkdtemp = require("tmp").dir +var mkdirp = require("mkdirp") + +var vacuum = require("../vacuum.js") + +// CONSTANTS +var TEMP_OPTIONS = { + unsafeCleanup : true, + mode : "0700" +} +var SHORT_PATH = path.join("i", "am", "a", "path") +var REMOVE_PATH = path.join(SHORT_PATH, "of", "a", "certain", "length") +var OTHER_PATH = path.join(SHORT_PATH, "of", "no", "qualities") + +var messages = [] +function log() { messages.push(Array.prototype.slice.call(arguments).join(" ")) } + +var testBase, testPath, otherPath +test("xXx setup xXx", function (t) { + mkdtemp(TEMP_OPTIONS, function (er, tmpdir) { + t.ifError(er, "temp directory exists") + + testBase = path.resolve(tmpdir, SHORT_PATH) + testPath = path.resolve(tmpdir, REMOVE_PATH) + otherPath = path.resolve(tmpdir, OTHER_PATH) + + mkdirp(testPath, function (er) { + t.ifError(er, "made test path") + + mkdirp(otherPath, function (er) { + t.ifError(er, "made other path") + + t.end() + }) + }) + }) +}) + +test("remove up to a point", function (t) { + vacuum(testPath, {purge : false, base : testBase, log : log}, function (er) { + t.ifError(er, "cleaned up to base") + + t.equal(messages.length, 4, "got 3 removal & 1 finish message") + t.equal( + messages[3], "quitting because other entries in " + testBase + "/of", + "got expected final message" + ) + + var stat + var verifyPath = testPath + function verify() { stat = statSync(verifyPath) } + + for (var i = 0; i < 3; i++) { + t.throws(verify, verifyPath + " cannot be statted") + t.notOk(stat && stat.isDirectory(), verifyPath + " is totally gone") + verifyPath = path.dirname(verifyPath) + } + + t.doesNotThrow(function () { + stat = statSync(otherPath) + }, otherPath + " can be statted") + t.ok(stat && stat.isDirectory(), otherPath + " is still a directory") + + var intersection = path.join(testBase, "of") + t.doesNotThrow(function () { + stat = statSync(intersection) + }, intersection + " can be statted") + t.ok(stat && stat.isDirectory(), intersection + " is still a directory") + + t.end() + }) +}) diff --git a/deps/npm/node_modules/fs-vacuum/vacuum.js b/deps/npm/node_modules/fs-vacuum/vacuum.js new file mode 100644 index 00000000000..f706a4be68c --- /dev/null +++ b/deps/npm/node_modules/fs-vacuum/vacuum.js @@ -0,0 +1,104 @@ +var assert = require("assert") +var dirname = require("path").dirname +var resolve = require("path").resolve + +var rimraf = require("rimraf") +var lstat = require("graceful-fs").lstat +var readdir = require("graceful-fs").readdir +var rmdir = require("graceful-fs").rmdir +var unlink = require("graceful-fs").unlink + +module.exports = vacuum + +function vacuum(leaf, options, cb) { + assert(typeof leaf === "string", "must pass in path to remove") + assert(typeof cb === "function", "must pass in callback") + + if (!options) options = {} + assert(typeof options === "object", "options must be an object") + + var log = options.log ? options.log : function () {} + + var base = options.base + if (base && resolve(leaf).indexOf(resolve(base)) !== 0) { + return cb(new Error(resolve(leaf) + " is not a child of " + resolve(base))) + } + + lstat(leaf, function (error, stat) { + if (error) { + if (error.code === "ENOENT") return cb(null) + + log(error.stack) + return cb(error) + } + + if (!(stat && (stat.isDirectory() || stat.isSymbolicLink() || stat.isFile()))) { + log(leaf, "is not a directory, file, or link") + return cb(new Error(leaf + " is not a directory, file, or link")) + } + + if (options.purge) { + log("purging", leaf) + rimraf(leaf, function (error) { + if (error) return cb(error) + + next(dirname(leaf)) + }) + } + else if (!stat.isDirectory()) { + log("removing", leaf) + unlink(leaf, function (error) { + if (error) return cb(error) + + next(dirname(leaf)) + }) + } + else { + next(leaf) + } + }) + + function next(branch) { + // either we've reached the base or we've reached the root + if ((base && resolve(branch) === resolve(base)) || branch === dirname(branch)) { + log("finished vacuuming up to", branch) + return cb(null) + } + + readdir(branch, function (error, files) { + if (error) { + if (error.code === "ENOENT") return cb(null) + + log("unable to check directory", branch, "due to", error.message) + return cb(error) + } + + if (files.length > 0) { + log("quitting because other entries in", branch) + return cb(null) + } + + log("removing", branch) + lstat(branch, function (error, stat) { + if (error) { + if (error.code === "ENOENT") return cb(null) + + log("unable to lstat", branch, "due to", error.message) + return cb(error) + } + + var remove = stat.isDirectory() ? rmdir : unlink + remove(branch, function (error) { + if (error) { + if (error.code === "ENOENT") return cb(null) + + log("unable to remove", branch, "due to", error.message) + return cb(error) + } + + next(dirname(branch)) + }) + }) + }) + } +} diff --git a/deps/npm/node_modules/fstream/package.json b/deps/npm/node_modules/fstream/package.json index de7f7bc14f0..d0ac58243ad 100644 --- a/deps/npm/node_modules/fstream/package.json +++ b/deps/npm/node_modules/fstream/package.json @@ -28,8 +28,6 @@ "test": "tap examples/*.js" }, "license": "BSD", - "readme": "Like FS streams, but with stat on them, and supporting directories and\nsymbolic links, as well as normal files. Also, you can use this to set\nthe stats on a file, even if you don't change its contents, or to create\na symlink, etc.\n\nSo, for example, you can \"write\" a directory, and it'll call `mkdir`. You\ncan specify a uid and gid, and it'll call `chown`. You can specify a\n`mtime` and `atime`, and it'll call `utimes`. You can call it a symlink\nand provide a `linkpath` and it'll call `symlink`.\n\nNote that it won't automatically resolve symbolic links. So, if you\ncall `fstream.Reader('/some/symlink')` then you'll get an object\nthat stats and then ends immediately (since it has no data). To follow\nsymbolic links, do this: `fstream.Reader({path:'/some/symlink', follow:\ntrue })`.\n\nThere are various checks to make sure that the bytes emitted are the\nsame as the intended size, if the size is set.\n\n## Examples\n\n```javascript\nfstream\n .Writer({ path: \"path/to/file\"\n , mode: 0755\n , size: 6\n })\n .write(\"hello\\n\")\n .end()\n```\n\nThis will create the directories if they're missing, and then write\n`hello\\n` into the file, chmod it to 0755, and assert that 6 bytes have\nbeen written when it's done.\n\n```javascript\nfstream\n .Writer({ path: \"path/to/file\"\n , mode: 0755\n , size: 6\n , flags: \"a\"\n })\n .write(\"hello\\n\")\n .end()\n```\n\nYou can pass flags in, if you want to append to a file.\n\n```javascript\nfstream\n .Writer({ path: \"path/to/symlink\"\n , linkpath: \"./file\"\n , SymbolicLink: true\n , mode: \"0755\" // octal strings supported\n })\n .end()\n```\n\nIf isSymbolicLink is a function, it'll be called, and if it returns\ntrue, then it'll treat it as a symlink. If it's not a function, then\nany truish value will make a symlink, or you can set `type:\n'SymbolicLink'`, which does the same thing.\n\nNote that the linkpath is relative to the symbolic link location, not\nthe parent dir or cwd.\n\n```javascript\nfstream\n .Reader(\"path/to/dir\")\n .pipe(fstream.Writer(\"path/to/other/dir\"))\n```\n\nThis will do like `cp -Rp path/to/dir path/to/other/dir`. If the other\ndir exists and isn't a directory, then it'll emit an error. It'll also\nset the uid, gid, mode, etc. to be identical. In this way, it's more\nlike `rsync -a` than simply a copy.\n", - "readmeFilename": "README.md", "gitHead": "b3b74e92ef4a91ae206fab90b7998c7cd2e4290d", "bugs": { "url": "https://github.com/isaacs/fstream/issues" @@ -37,5 +35,23 @@ "homepage": "https://github.com/isaacs/fstream", "_id": "fstream@1.0.2", "_shasum": "56930ff1b4d4d7b1a689c8656b3a11e744ab92c6", - "_from": "fstream@latest" + "_from": "fstream@1.0.2", + "_npmVersion": "1.4.23", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "56930ff1b4d4d7b1a689c8656b3a11e744ab92c6", + "tarball": "http://registry.npmjs.org/fstream/-/fstream-1.0.2.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.2.tgz", + "readme": "ERROR: No README data found!" } diff --git a/deps/npm/node_modules/github-url-from-git/package.json b/deps/npm/node_modules/github-url-from-git/package.json index 978435c7da2..229af333ca4 100644 --- a/deps/npm/node_modules/github-url-from-git/package.json +++ b/deps/npm/node_modules/github-url-from-git/package.json @@ -32,7 +32,7 @@ "homepage": "https://github.com/visionmedia/node-github-url-from-git", "_id": "github-url-from-git@1.4.0", "_shasum": "285e6b520819001bde128674704379e4ff03e0de", - "_from": "github-url-from-git@^1.4.0", + "_from": "github-url-from-git@>=1.4.0-0 <2.0.0-0", "_npmVersion": "2.0.0-alpha.7", "_npmUser": { "name": "bcoe", @@ -53,6 +53,5 @@ "tarball": "http://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.4.0.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.4.0.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.4.0.tgz" } diff --git a/deps/npm/node_modules/github-url-from-username-repo/index.js b/deps/npm/node_modules/github-url-from-username-repo/index.js index 794daabf3bc..f9d77f952f5 100644 --- a/deps/npm/node_modules/github-url-from-username-repo/index.js +++ b/deps/npm/node_modules/github-url-from-username-repo/index.js @@ -2,7 +2,16 @@ module.exports = getUrl function getUrl (r, forBrowser) { if (!r) return null - if (/^[\w-]+\/[\w\.-]+(#[a-z0-9]*)?$/.test(r)) { + // Regex taken from https://github.com/npm/npm-package-arg/commit/01dce583c64afae07b66a2a8a6033aeba871c3cd + // Note: This does not fully test the git ref format. + // See https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html + // + // The only way to do this properly would be to shell out to + // git-check-ref-format, and as this is a fast sync function, + // we don't want to do that. Just let git fail if it turns + // out that the commit-ish is invalid. + // GH usernames cannot start with . or - + if (/^[^@%\/\s\.-][^:@%\/\s]*\/[^@\s\/%]+(?:#.*)?$/.test(r)) { if (forBrowser) r = r.replace("#", "/tree/") return "https://github.com/" + r diff --git a/deps/npm/node_modules/github-url-from-username-repo/package.json b/deps/npm/node_modules/github-url-from-username-repo/package.json index 8b6be10115d..f8aa80d5b6f 100644 --- a/deps/npm/node_modules/github-url-from-username-repo/package.json +++ b/deps/npm/node_modules/github-url-from-username-repo/package.json @@ -1,6 +1,6 @@ { "name": "github-url-from-username-repo", - "version": "1.0.0", + "version": "1.0.2", "description": "Create urls from username/repo", "main": "index.js", "scripts": { @@ -26,34 +26,11 @@ "github", "repo" ], - "gitHead": "d5b3c01193504d67b3ecc030e93d5c58c9b0df63", + "readme": "[![Build Status](https://travis-ci.org/robertkowalski/github-url-from-username-repo.png?branch=master)](https://travis-ci.org/robertkowalski/github-url-from-username-repo)\n[![Dependency Status](https://gemnasium.com/robertkowalski/github-url-from-username-repo.png)](https://gemnasium.com/robertkowalski/github-url-from-username-repo)\n\n\n# github-url-from-username-repo\n\n## API\n\n### getUrl(url, [forBrowser])\n\nGet's the url normalized for npm.\nIf `forBrowser` is true, return a GitHub url that is usable in a webbrowser.\n\n## Usage\n\n```javascript\n\nvar getUrl = require(\"github-url-from-username-repo\")\ngetUrl(\"visionmedia/express\") // https://github.com/visionmedia/express\n\n```\n", + "readmeFilename": "README.md", + "gitHead": "d404a13f7f04edaed0e2f068a43b81230b8c7aee", "homepage": "https://github.com/robertkowalski/github-url-from-username-repo", - "_id": "github-url-from-username-repo@1.0.0", - "_shasum": "848d4f19bc838dc428484ce0dc33da593e8400ed", - "_from": "github-url-from-username-repo@^1.0.0", - "_npmVersion": "1.4.21", - "_npmUser": { - "name": "robertkowalski", - "email": "rok@kowalski.gd" - }, - "maintainers": [ - { - "name": "robertkowalski", - "email": "rok@kowalski.gd" - }, - { - "name": "othiym23", - "email": "ogd@aoaioxxysz.net" - }, - { - "name": "forbeslindesay", - "email": "forbes@lindesay.co.uk" - } - ], - "dist": { - "shasum": "848d4f19bc838dc428484ce0dc33da593e8400ed", - "tarball": "http://registry.npmjs.org/github-url-from-username-repo/-/github-url-from-username-repo-1.0.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/github-url-from-username-repo/-/github-url-from-username-repo-1.0.0.tgz" + "_id": "github-url-from-username-repo@1.0.2", + "_shasum": "7dd79330d2abe69c10c2cef79714c97215791dfa", + "_from": "github-url-from-username-repo@>=1.0.2-0 <2.0.0-0" } diff --git a/deps/npm/node_modules/github-url-from-username-repo/test/index.js b/deps/npm/node_modules/github-url-from-username-repo/test/index.js index 935bb439d3e..10fe3a34cc3 100644 --- a/deps/npm/node_modules/github-url-from-username-repo/test/index.js +++ b/deps/npm/node_modules/github-url-from-username-repo/test/index.js @@ -17,6 +17,11 @@ describe("github url from username/repo", function () { assert.deepEqual(null, url) }) + it("returns null for something that's already a URI", function () { + var url = getUrl("file:../relative") + assert.deepEqual(null, url) + }) + it("works with .", function () { var url = getUrl("component/.download.er.js.") assert.equal("https://github.com/component/.download.er.js.", url) @@ -40,6 +45,13 @@ describe("github url from username/repo", function () { "4b477f04d947bd53c473799b277", url) }) + it("can handle branches with slashes", function () { + var url = getUrl( + "component/entejs#some/branch/name") + + assert.equal("https://github.com/component/entejs#some/branch/name", url) + }) + describe("browser mode", function () { it("is able to return urls for branches", function () { var url = getUrl( diff --git a/deps/npm/node_modules/init-package-json/node_modules/promzard/package.json b/deps/npm/node_modules/init-package-json/node_modules/promzard/package.json index bba3057d99a..703b34ac42a 100644 --- a/deps/npm/node_modules/init-package-json/node_modules/promzard/package.json +++ b/deps/npm/node_modules/init-package-json/node_modules/promzard/package.json @@ -27,7 +27,7 @@ "homepage": "https://github.com/isaacs/promzard", "_id": "promzard@0.2.2", "_shasum": "918b9f2b29458cb001781a8856502e4a79b016e0", - "_from": "promzard@~0.2.0", + "_from": "promzard@>=0.2.0-0 <0.3.0-0", "_npmVersion": "1.4.10", "_npmUser": { "name": "isaacs", @@ -44,6 +44,5 @@ "tarball": "http://registry.npmjs.org/promzard/-/promzard-0.2.2.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/promzard/-/promzard-0.2.2.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/promzard/-/promzard-0.2.2.tgz" } diff --git a/deps/npm/node_modules/init-package-json/package.json b/deps/npm/node_modules/init-package-json/package.json index ff9f926fc97..c716cd6e87b 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.0.0", + "version": "1.0.1", "main": "init-package-json.js", "scripts": { "test": "tap test/*.js" @@ -21,7 +21,7 @@ "promzard": "~0.2.0", "read": "~1.0.1", "read-package-json": "1", - "semver": "2.x || 3.x" + "semver": "2.x || 3.x || 4" }, "devDependencies": { "tap": "~0.2.5", @@ -37,15 +37,15 @@ "prompt", "start" ], - "gitHead": "e8c42e4be8877195e0ef2cd0b50d806afd2eec08", + "gitHead": "e1a5917ba1723ab5dcedacbffb5b10208d203e2f", "bugs": { "url": "https://github.com/isaacs/init-package-json/issues" }, "homepage": "https://github.com/isaacs/init-package-json", - "_id": "init-package-json@1.0.0", - "_shasum": "8985a99ef11589695d6d3a5d03300b1eab0dd47a", - "_from": "init-package-json@1.0.0", - "_npmVersion": "1.4.21", + "_id": "init-package-json@1.0.1", + "_shasum": "c01b08cc90504ebc448d57b468e66fc08293e8a8", + "_from": "init-package-json@>=1.0.0-0 <1.1.0-0", + "_npmVersion": "2.0.0-beta.3", "_npmUser": { "name": "isaacs", "email": "i@izs.me" @@ -57,9 +57,9 @@ } ], "dist": { - "shasum": "8985a99ef11589695d6d3a5d03300b1eab0dd47a", - "tarball": "http://registry.npmjs.org/init-package-json/-/init-package-json-1.0.0.tgz" + "shasum": "c01b08cc90504ebc448d57b468e66fc08293e8a8", + "tarball": "http://registry.npmjs.org/init-package-json/-/init-package-json-1.0.1.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.0.0.tgz" + "_resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.0.1.tgz" } diff --git a/deps/npm/node_modules/lockfile/package.json b/deps/npm/node_modules/lockfile/package.json index bf4a90dcfb5..27bd23777dc 100644 --- a/deps/npm/node_modules/lockfile/package.json +++ b/deps/npm/node_modules/lockfile/package.json @@ -31,8 +31,6 @@ }, "license": "BSD", "description": "A very polite lock file utility, which endeavors to not litter, and to wait patiently for others.", - "readme": "# lockfile\n\nA very polite lock file utility, which endeavors to not litter, and to\nwait patiently for others.\n\n## Usage\n\n```javascript\nvar lockFile = require('lockfile')\n\n// opts is optional, and defaults to {}\nlockFile.lock('some-file.lock', opts, function (er) {\n // if the er happens, then it failed to acquire a lock.\n // if there was not an error, then the file was created,\n // and won't be deleted until we unlock it.\n\n // do my stuff, free of interruptions\n // then, some time later, do:\n lockFile.unlock('some-file.lock', function (er) {\n // er means that an error happened, and is probably bad.\n })\n})\n```\n\n## Methods\n\nSync methods return the value/throw the error, others don't. Standard\nnode fs stuff.\n\nAll known locks are removed when the process exits. Of course, it's\npossible for certain types of failures to cause this to fail, but a best\neffort is made to not be a litterbug.\n\n### lockFile.lock(path, [opts], cb)\n\nAcquire a file lock on the specified path\n\n### lockFile.lockSync(path, [opts])\n\nAcquire a file lock on the specified path\n\n### lockFile.unlock(path, cb)\n\nClose and unlink the lockfile.\n\n### lockFile.unlockSync(path)\n\nClose and unlink the lockfile.\n\n### lockFile.check(path, [opts], cb)\n\nCheck if the lockfile is locked and not stale.\n\nReturns boolean.\n\n### lockFile.checkSync(path, [opts], cb)\n\nCheck if the lockfile is locked and not stale.\n\nCallback is called with `cb(error, isLocked)`.\n\n## Options\n\n### opts.wait\n\nA number of milliseconds to wait for locks to expire before giving up.\nOnly used by lockFile.lock. Poll for `opts.wait` ms. If the lock is\nnot cleared by the time the wait expires, then it returns with the\noriginal error.\n\n### opts.pollPeriod\n\nWhen using `opts.wait`, this is the period in ms in which it polls to\ncheck if the lock has expired. Defaults to `100`.\n\n### opts.stale\n\nA number of milliseconds before locks are considered to have expired.\n\n### opts.retries\n\nUsed by lock and lockSync. Retry `n` number of times before giving up.\n\n### opts.retryWait\n\nUsed by lock. Wait `n` milliseconds before retrying.\n", - "readmeFilename": "README.md", "gitHead": "9590c6f02521eb1bb154ddc3ca9a7e84ce770c45", "bugs": { "url": "https://github.com/isaacs/lockfile/issues" @@ -40,5 +38,26 @@ "homepage": "https://github.com/isaacs/lockfile", "_id": "lockfile@1.0.0", "_shasum": "b3a7609dda6012060083bacb0ab0ecbca58e9203", - "_from": "lockfile@latest" + "_from": "lockfile@1.0.0", + "_npmVersion": "1.4.23", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "trevorburnham", + "email": "trevorburnham@gmail.com" + }, + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "b3a7609dda6012060083bacb0ab0ecbca58e9203", + "tarball": "http://registry.npmjs.org/lockfile/-/lockfile-1.0.0.tgz" + }, + "_resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.0.tgz", + "readme": "ERROR: No README data found!" } diff --git a/deps/npm/node_modules/node-gyp/package.json b/deps/npm/node_modules/node-gyp/package.json index 8ee98695186..2e2e47c7a37 100644 --- a/deps/npm/node_modules/node-gyp/package.json +++ b/deps/npm/node_modules/node-gyp/package.json @@ -10,7 +10,7 @@ "bindings", "gyp" ], - "version": "1.0.1", + "version": "1.0.2", "installVersion": 9, "author": { "name": "Nathan Rajlich", @@ -37,22 +37,45 @@ "osenv": "0", "request": "2", "rimraf": "2", - "semver": "2.x || 3.x", + "semver": "2.x || 3.x || 4", "tar": "^1.0.0", "which": "1" }, "engines": { "node": ">= 0.8.0" }, - "readme": "node-gyp\n=========\n### Node.js native addon build tool\n\n`node-gyp` is a cross-platform command-line tool written in Node.js for compiling\nnative addon modules for Node.js. It bundles the [gyp](https://code.google.com/p/gyp/)\nproject used by the Chromium team and takes away the pain of dealing with the\nvarious differences in build platforms. It is the replacement to the `node-waf`\nprogram which is removed for node `v0.8`. If you have a native addon for node that\nstill has a `wscript` file, then you should definitely add a `binding.gyp` file\nto support the latest versions of node.\n\nMultiple target versions of node are supported (i.e. `0.8`, `0.9`, `0.10`, ..., `1.0`,\netc.), regardless of what version of node is actually installed on your system\n(`node-gyp` downloads the necessary development files for the target version).\n\n#### Features:\n\n * Easy to use, consistent interface\n * Same commands to build your module on every platform\n * Supports multiple target versions of Node\n\n\nInstallation\n------------\n\nYou can install with `npm`:\n\n``` bash\n$ npm install -g node-gyp\n```\n\nYou will also need to install:\n\n * On Unix:\n * `python` (`v2.7` recommended, `v3.x.x` is __*not*__ supported)\n * `make`\n * A proper C/C++ compiler toolchain, like GCC\n * On Windows:\n * [Python][windows-python] ([`v2.7.3`][windows-python-v2.7.3] recommended, `v3.x.x` is __*not*__ supported)\n * Windows XP/Vista/7:\n * Microsoft Visual Studio C++ 2010 ([Express][msvc2010] version works well)\n * For 64-bit builds of node and native modules you will _**also**_ need the [Windows 7 64-bit SDK][win7sdk]\n * If the install fails, try uninstalling any C++ 2010 x64&x86 Redistributable that you have installed first.\n * If you get errors that the 64-bit compilers are not installed you may also need the [compiler update for the Windows SDK 7.1]\n * Windows 7/8:\n * Microsoft Visual Studio C++ 2012 for Windows Desktop ([Express][msvc2012] version works well)\n\nIf you have multiple Python versions installed, you can identify which Python\nversion `node-gyp` uses by setting the '--python' variable:\n\n``` bash\n$ node-gyp --python /path/to/python2.7\n```\n\nIf `node-gyp` is called by way of `npm` *and* you have multiple versions of\nPython installed, then you can set `npm`'s 'python' config key to the appropriate\nvalue:\n\n``` bash\n$ npm config set python /path/to/executable/python2.7\n```\n\nNote that OS X is just a flavour of Unix and so needs `python`, `make`, and C/C++.\nAn easy way to obtain these is to install XCode from Apple,\nand then use it to install the command line tools (under Preferences -> Downloads).\n\nHow to Use\n----------\n\nTo compile your native addon, first go to its root directory:\n\n``` bash\n$ cd my_node_addon\n```\n\nThe next step is to generate the appropriate project build files for the current\nplatform. Use `configure` for that:\n\n``` bash\n$ node-gyp configure\n```\n\n__Note__: The `configure` step looks for the `binding.gyp` file in the current\ndirectory to processs. See below for instructions on creating the `binding.gyp` file.\n\nNow you will have either a `Makefile` (on Unix platforms) or a `vcxproj` file\n(on Windows) in the `build/` directory. Next invoke the `build` command:\n\n``` bash\n$ node-gyp build\n```\n\nNow you have your compiled `.node` bindings file! The compiled bindings end up\nin `build/Debug/` or `build/Release/`, depending on the build mode. At this point\nyou can require the `.node` file with Node and run your tests!\n\n__Note:__ To create a _Debug_ build of the bindings file, pass the `--debug` (or\n`-d`) switch when running the either `configure` or `build` command.\n\n\nThe \"binding.gyp\" file\n----------------------\n\nPreviously when node had `node-waf` you had to write a `wscript` file. The\nreplacement for that is the `binding.gyp` file, which describes the configuration\nto build your module in a JSON-like format. This file gets placed in the root of\nyour package, alongside the `package.json` file.\n\nA barebones `gyp` file appropriate for building a node addon looks like:\n\n``` python\n{\n \"targets\": [\n {\n \"target_name\": \"binding\",\n \"sources\": [ \"src/binding.cc\" ]\n }\n ]\n}\n```\n\nSome additional resources for writing `gyp` files:\n\n * [\"Hello World\" node addon example](https://github.com/joyent/node/tree/master/test/addons/hello-world)\n * [gyp user documentation](http://code.google.com/p/gyp/wiki/GypUserDocumentation)\n * [gyp input format reference](http://code.google.com/p/gyp/wiki/InputFormatReference)\n * [*\"binding.gyp\" files out in the wild* wiki page](https://github.com/TooTallNate/node-gyp/wiki/%22binding.gyp%22-files-out-in-the-wild)\n\n\nCommands\n--------\n\n`node-gyp` responds to the following commands:\n\n| **Command** | **Description**\n|:--------------|:---------------------------------------------------------------\n| `build` | Invokes `make`/`msbuild.exe` and builds the native addon\n| `clean` | Removes any the `build` dir if it exists\n| `configure` | Generates project build files for the current platform\n| `rebuild` | Runs \"clean\", \"configure\" and \"build\" all in a row\n| `install` | Installs node development header files for the given version\n| `list` | Lists the currently installed node development file versions\n| `remove` | Removes the node development header files for the given version\n\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n[windows-python]: http://www.python.org/getit/windows\n[windows-python-v2.7.3]: http://www.python.org/download/releases/2.7.3#download\n[msvc2010]: http://go.microsoft.com/?linkid=9709949\n[msvc2012]: http://go.microsoft.com/?linkid=9816758\n[win7sdk]: http://www.microsoft.com/en-us/download/details.aspx?id=8279\n[compiler update for the Windows SDK 7.1]: http://www.microsoft.com/en-us/download/details.aspx?id=4422\n", - "readmeFilename": "README.md", - "gitHead": "b2abd70377c356483c98509b14a01d71f1eaa17f", + "gitHead": "1e399b471945b35f3bfbca4a10fba31a6739b5db", "bugs": { "url": "https://github.com/TooTallNate/node-gyp/issues" }, "homepage": "https://github.com/TooTallNate/node-gyp", - "_id": "node-gyp@1.0.1", + "_id": "node-gyp@1.0.2", "scripts": {}, - "_shasum": "d5e364145ff10b259be9986855c83b5a76a2d975", - "_from": "node-gyp@latest" + "_shasum": "b0bb6d2d762271408dd904853e7aa3000ed2eb57", + "_from": "node-gyp@>=1.0.1-0 <1.1.0-0", + "_npmVersion": "2.0.0-beta.3", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "TooTallNate", + "email": "nathan@tootallnate.net" + }, + { + "name": "tootallnate", + "email": "nathan@tootallnate.net" + }, + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "b0bb6d2d762271408dd904853e7aa3000ed2eb57", + "tarball": "http://registry.npmjs.org/node-gyp/-/node-gyp-1.0.2.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-1.0.2.tgz" } diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/.npmignore b/deps/npm/node_modules/normalize-package-data/.npmignore similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/.npmignore rename to deps/npm/node_modules/normalize-package-data/.npmignore diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/.travis.yml b/deps/npm/node_modules/normalize-package-data/.travis.yml similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/.travis.yml rename to deps/npm/node_modules/normalize-package-data/.travis.yml diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/AUTHORS b/deps/npm/node_modules/normalize-package-data/AUTHORS similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/AUTHORS rename to deps/npm/node_modules/normalize-package-data/AUTHORS diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/LICENSE b/deps/npm/node_modules/normalize-package-data/LICENSE similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/LICENSE rename to deps/npm/node_modules/normalize-package-data/LICENSE diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/README.md b/deps/npm/node_modules/normalize-package-data/README.md similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/README.md rename to deps/npm/node_modules/normalize-package-data/README.md diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/core_module_names.json b/deps/npm/node_modules/normalize-package-data/lib/core_module_names.json similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/core_module_names.json rename to deps/npm/node_modules/normalize-package-data/lib/core_module_names.json diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/extract_description.js b/deps/npm/node_modules/normalize-package-data/lib/extract_description.js similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/extract_description.js rename to deps/npm/node_modules/normalize-package-data/lib/extract_description.js diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/fixer.js b/deps/npm/node_modules/normalize-package-data/lib/fixer.js similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/fixer.js rename to deps/npm/node_modules/normalize-package-data/lib/fixer.js diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/make_warning.js b/deps/npm/node_modules/normalize-package-data/lib/make_warning.js similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/make_warning.js rename to deps/npm/node_modules/normalize-package-data/lib/make_warning.js diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/normalize.js b/deps/npm/node_modules/normalize-package-data/lib/normalize.js similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/normalize.js rename to deps/npm/node_modules/normalize-package-data/lib/normalize.js diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/safe_format.js b/deps/npm/node_modules/normalize-package-data/lib/safe_format.js similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/safe_format.js rename to deps/npm/node_modules/normalize-package-data/lib/safe_format.js diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/typos.json b/deps/npm/node_modules/normalize-package-data/lib/typos.json similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/typos.json rename to deps/npm/node_modules/normalize-package-data/lib/typos.json diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/warning_messages.json b/deps/npm/node_modules/normalize-package-data/lib/warning_messages.json similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/warning_messages.json rename to deps/npm/node_modules/normalize-package-data/lib/warning_messages.json diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/package.json b/deps/npm/node_modules/normalize-package-data/package.json similarity index 74% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/package.json rename to deps/npm/node_modules/normalize-package-data/package.json index 084068ead7a..0471bcd6e0c 100644 --- a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/package.json +++ b/deps/npm/node_modules/normalize-package-data/package.json @@ -1,6 +1,6 @@ { "name": "normalize-package-data", - "version": "1.0.1", + "version": "1.0.2", "author": { "name": "Meryn Stol", "email": "merynstol@gmail.com" @@ -17,7 +17,7 @@ "dependencies": { "github-url-from-git": "^1.3.0", "github-url-from-username-repo": "^1.0.0", - "semver": "2 || 3" + "semver": "2 || 3 || 4" }, "devDependencies": { "tap": "~0.2.5", @@ -38,18 +38,18 @@ "email": "rok@kowalski.gd" } ], - "gitHead": "d260644f514672cc84f1cc471024679cccc4fd65", + "gitHead": "05fafb91466ac634fa7d591d0796d64b0b432dc0", "bugs": { "url": "https://github.com/meryn/normalize-package-data/issues" }, "homepage": "https://github.com/meryn/normalize-package-data", - "_id": "normalize-package-data@1.0.1", - "_shasum": "2a4b5200c82cc47bb91c8c9cf47d645499d200bf", - "_from": "normalize-package-data@^1.0.0", - "_npmVersion": "2.0.0-beta.0", + "_id": "normalize-package-data@1.0.2", + "_shasum": "32a902ad3cad3286f1106b9b9550062f44ee2118", + "_from": "normalize-package-data@>=1.0.1-0 <1.1.0-0", + "_npmVersion": "2.0.0-beta.3", "_npmUser": { - "name": "othiym23", - "email": "ogd@aoaioxxysz.net" + "name": "isaacs", + "email": "i@izs.me" }, "maintainers": [ { @@ -66,9 +66,9 @@ } ], "dist": { - "shasum": "2a4b5200c82cc47bb91c8c9cf47d645499d200bf", - "tarball": "http://registry.npmjs.org/normalize-package-data/-/normalize-package-data-1.0.1.tgz" + "shasum": "32a902ad3cad3286f1106b9b9550062f44ee2118", + "tarball": "http://registry.npmjs.org/normalize-package-data/-/normalize-package-data-1.0.2.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-1.0.1.tgz" + "_resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-1.0.2.tgz" } diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/basic.js b/deps/npm/node_modules/normalize-package-data/test/basic.js similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/basic.js rename to deps/npm/node_modules/normalize-package-data/test/basic.js diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/consistency.js b/deps/npm/node_modules/normalize-package-data/test/consistency.js similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/consistency.js rename to deps/npm/node_modules/normalize-package-data/test/consistency.js diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/dependencies.js b/deps/npm/node_modules/normalize-package-data/test/dependencies.js similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/dependencies.js rename to deps/npm/node_modules/normalize-package-data/test/dependencies.js diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/async.json b/deps/npm/node_modules/normalize-package-data/test/fixtures/async.json similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/async.json rename to deps/npm/node_modules/normalize-package-data/test/fixtures/async.json diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/bcrypt.json b/deps/npm/node_modules/normalize-package-data/test/fixtures/bcrypt.json similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/bcrypt.json rename to deps/npm/node_modules/normalize-package-data/test/fixtures/bcrypt.json diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/coffee-script.json b/deps/npm/node_modules/normalize-package-data/test/fixtures/coffee-script.json similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/coffee-script.json rename to deps/npm/node_modules/normalize-package-data/test/fixtures/coffee-script.json diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/http-server.json b/deps/npm/node_modules/normalize-package-data/test/fixtures/http-server.json similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/http-server.json rename to deps/npm/node_modules/normalize-package-data/test/fixtures/http-server.json diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/movefile.json b/deps/npm/node_modules/normalize-package-data/test/fixtures/movefile.json similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/movefile.json rename to deps/npm/node_modules/normalize-package-data/test/fixtures/movefile.json diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/no-description.json b/deps/npm/node_modules/normalize-package-data/test/fixtures/no-description.json similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/no-description.json rename to deps/npm/node_modules/normalize-package-data/test/fixtures/no-description.json diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/node-module_exist.json b/deps/npm/node_modules/normalize-package-data/test/fixtures/node-module_exist.json similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/node-module_exist.json rename to deps/npm/node_modules/normalize-package-data/test/fixtures/node-module_exist.json diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/npm.json b/deps/npm/node_modules/normalize-package-data/test/fixtures/npm.json similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/npm.json rename to deps/npm/node_modules/normalize-package-data/test/fixtures/npm.json diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/read-package-json.json b/deps/npm/node_modules/normalize-package-data/test/fixtures/read-package-json.json similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/read-package-json.json rename to deps/npm/node_modules/normalize-package-data/test/fixtures/read-package-json.json diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/request.json b/deps/npm/node_modules/normalize-package-data/test/fixtures/request.json similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/request.json rename to deps/npm/node_modules/normalize-package-data/test/fixtures/request.json diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/underscore.json b/deps/npm/node_modules/normalize-package-data/test/fixtures/underscore.json similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/underscore.json rename to deps/npm/node_modules/normalize-package-data/test/fixtures/underscore.json diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/github-urls.js b/deps/npm/node_modules/normalize-package-data/test/github-urls.js similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/github-urls.js rename to deps/npm/node_modules/normalize-package-data/test/github-urls.js diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/normalize.js b/deps/npm/node_modules/normalize-package-data/test/normalize.js similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/normalize.js rename to deps/npm/node_modules/normalize-package-data/test/normalize.js diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/scoped.js b/deps/npm/node_modules/normalize-package-data/test/scoped.js similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/scoped.js rename to deps/npm/node_modules/normalize-package-data/test/scoped.js diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/strict.js b/deps/npm/node_modules/normalize-package-data/test/strict.js similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/strict.js rename to deps/npm/node_modules/normalize-package-data/test/strict.js diff --git a/deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/typo.js b/deps/npm/node_modules/normalize-package-data/test/typo.js similarity index 100% rename from deps/npm/node_modules/read-package-json/node_modules/normalize-package-data/test/typo.js rename to deps/npm/node_modules/normalize-package-data/test/typo.js diff --git a/deps/npm/node_modules/npm-install-checks/package.json b/deps/npm/node_modules/npm-install-checks/package.json index 9457df0b5c3..06ca052e410 100644 --- a/deps/npm/node_modules/npm-install-checks/package.json +++ b/deps/npm/node_modules/npm-install-checks/package.json @@ -1,11 +1,11 @@ { "name": "npm-install-checks", - "version": "1.0.2", + "version": "1.0.4", "description": "checks that npm runs during the installation of a module", "main": "index.js", "dependencies": { "npmlog": "0.1", - "semver": "^2.3.0" + "semver": "^2.3.0 || 3.x || 4" }, "devDependencies": { "tap": "~0.4.8", @@ -32,10 +32,29 @@ "bugs": { "url": "https://github.com/npm/npm-install-checks/issues" }, - "readme": "# npm-install-checks\n\nA package that contains checks that npm runs during the installation.\n\n## API\n\n### .checkEngine(target, npmVer, nodeVer, force, strict, cb)\nCheck if node/npm version is supported by the package.\n\nError type: `ENOTSUP`\n\n### .checkPlatform(target, force, cb)\nCheck if OS/Arch is supported by the package.\n\nError type: `EBADPLATFORM`\n\n### .checkCycle(target, ancestors, cb)\nCheck for cyclic dependencies.\n\nError type: `ECYCLE`\n\n### .checkGit(folder, cb)\nCheck if a folder is a .git folder.\n\nError type: `EISGIT`\n", - "readmeFilename": "README.md", - "gitHead": "056ade7c5e3a6b3c720ca6a743c1b99a0705d29e", - "_id": "npm-install-checks@1.0.2", - "_shasum": "ebba769753fc8551308333ef411920743a6809f6", - "_from": "npm-install-checks@latest" + "gitHead": "05944f95860b0ac3769667551c4b7aa3d3fcdc32", + "_id": "npm-install-checks@1.0.4", + "_shasum": "9757c6f9d4d493c2489465da6d07a8ed416d44c8", + "_from": "npm-install-checks@>=1.0.2-0 <1.1.0-0", + "_npmVersion": "2.0.0-beta.3", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "robertkowalski", + "email": "rok@kowalski.gd" + }, + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "9757c6f9d4d493c2489465da6d07a8ed416d44c8", + "tarball": "http://registry.npmjs.org/npm-install-checks/-/npm-install-checks-1.0.4.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-1.0.4.tgz" } diff --git a/deps/npm/node_modules/npm-package-arg/LICENSE b/deps/npm/node_modules/npm-package-arg/LICENSE new file mode 100644 index 00000000000..05eeeb88c2e --- /dev/null +++ b/deps/npm/node_modules/npm-package-arg/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +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. diff --git a/deps/npm/node_modules/npm-package-arg/README.md b/deps/npm/node_modules/npm-package-arg/README.md new file mode 100644 index 00000000000..602277a378d --- /dev/null +++ b/deps/npm/node_modules/npm-package-arg/README.md @@ -0,0 +1,55 @@ +# npm-package-arg + +Parse the things that can be arguments to `npm install` + +Takes an argument like `foo@1.2`, or `foo@user/foo`, or +`http://x.com/foo.tgz`, or `git+https://github.com/user/foo`, and +figures out what type of thing it is. + +## USAGE + +```javascript +var assert = require("assert") +var npa = require("npm-package-arg") + +// Pass in the descriptor, and it'll return an object +var parsed = npa("foo@1.2") + +// Returns an object like: +// { +// name: "foo", // The bit in front of the @ +// type: "range", // the type of descriptor this is +// spec: "1.2" // the specifier for this descriptor +// } + +// Completely unreasonable invalid garbage throws an error +// Make sure you wrap this in a try/catch if you have not +// already sanitized the inputs! +assert.throws(function() { + npa("this is not \0 a valid package name or url") +}) +``` + +For more examples, see the test file. + +## Result Objects + +The objects that are returned by npm-package-arg contain the following +fields: + +* `name` - If known, the `name` field expected in the resulting pkg. +* `type` - One of the following strings: + * `git` - A git repo + * `github` - A github shorthand, like `user/project` + * `tag` - A tagged version, like `"foo@latest"` + * `version` - A specific version number, like `"foo@1.2.3"` + * `range` - A version range, like `"foo@2.x"` + * `local` - A local file or folder path + * `remote` - An http url (presumably to a tgz) +* `spec` - The "thing". URL, the range, git repo, etc. +* `raw` - The original un-modified string that was provided. +* `rawSpec` - The part after the `name@...`, as it was originally + provided. +* `scope` - If a name is something like `@org/module` then the `scope` + field will be set to `org`. If it doesn't have a scoped name, then + scope is `null`. diff --git a/deps/npm/node_modules/npm-package-arg/npa.js b/deps/npm/node_modules/npm-package-arg/npa.js new file mode 100644 index 00000000000..8333c75f442 --- /dev/null +++ b/deps/npm/node_modules/npm-package-arg/npa.js @@ -0,0 +1,187 @@ +var url = require("url") +var assert = require("assert") +var util = require("util") +var semver = require("semver") +var path = require("path") + +module.exports = npa + +var isWindows = process.platform === "win32" || global.FAKE_WINDOWS +var slashRe = isWindows ? /\\|\// : /\// + +var parseName = /^(?:@([^\/]+?)\/)?([^\/]+?)$/ +var nameAt = /^(@([^\/]+?)\/)?([^\/]+?)@/ +var debug = util.debuglog ? util.debuglog("npa") + : /\bnpa\b/i.test(process.env.NODE_DEBUG || "") + ? function () { + console.error("NPA: " + util.format.apply(util, arguments).split("\n").join("\nNPA: ")) + } : function () {} + +function validName (name) { + if (!name) { + debug("not a name %j", name) + return false + } + var n = name.trim() + if (!n || n.charAt(0) === "." + || !n.match(/^[a-zA-Z0-9]/) + || n.match(/[\/\(\)&\?#\|<>@:%\s\\\*'"!~`]/) + || n.toLowerCase() === "node_modules" + || n !== encodeURIComponent(n) + || n.toLowerCase() === "favicon.ico") { + debug("not a valid name %j", name) + return false + } + return n +} + +function npa (arg) { + assert.equal(typeof arg, "string") + arg = arg.trim() + + var res = new Result + res.raw = arg + res.scope = null + + // See if it's something like foo@... + var nameparse = arg.match(nameAt) + debug("nameparse", nameparse) + if (nameparse && validName(nameparse[3]) && + (!nameparse[2] || validName(nameparse[2]))) { + res.name = (nameparse[1] || "") + nameparse[3] + if (nameparse[2]) + res.scope = "@" + nameparse[2] + arg = arg.substr(nameparse[0].length) + } else { + res.name = null + } + + res.rawSpec = arg + res.spec = arg + + var urlparse = url.parse(arg) + debug("urlparse", urlparse) + + // windows paths look like urls + // don't be fooled! + if (isWindows && urlparse && urlparse.protocol && + urlparse.protocol.match(/^[a-zA-Z]:$/)) { + debug("windows url-ish local path", urlparse) + urlparse = {} + } + + if (urlparse.protocol) { + return parseUrl(res, arg, urlparse) + } + + // parse git stuff + // parse tag/range/local/remote + + if (maybeGitHubShorthand(arg)) { + res.type = "github" + res.spec = arg + return res + } + + // at this point, it's not a url, and not github + // If it's a valid name, and doesn't already have a name, then assume + // $name@"" range + // + // if it's got / chars in it, then assume that it's local. + + if (res.name) { + var version = semver.valid(arg, true) + var range = semver.validRange(arg, true) + // foo@... + if (version) { + res.spec = version + res.type = "version" + } else if (range) { + res.spec = range + res.type = "range" + } else if (slashRe.test(arg)) { + parseLocal(res, arg) + } else { + res.type = "tag" + res.spec = arg + } + } else { + var p = arg.match(parseName) + if (p && validName(p[2]) && + (!p[1] || validName(p[1]))) { + res.type = "range" + res.spec = "*" + res.rawSpec = "" + res.name = arg + if (p[1]) + res.scope = "@" + p[1] + } else { + parseLocal(res, arg) + } + } + + return res +} + +function parseLocal (res, arg) { + // turns out nearly every character is allowed in fs paths + if (/\0/.test(arg)) { + throw new Error("Invalid Path: " + JSON.stringify(arg)) + } + res.type = "local" + res.spec = path.resolve(arg) +} + +function maybeGitHubShorthand (arg) { + // Note: This does not fully test the git ref format. + // See https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html + // + // The only way to do this properly would be to shell out to + // git-check-ref-format, and as this is a fast sync function, + // we don't want to do that. Just let git fail if it turns + // out that the commit-ish is invalid. + // GH usernames cannot start with . or - + return /^[^@%\/\s\.-][^@%\/\s]*\/[^@\s\/%]+(?:#.*)?$/.test(arg) +} + +function parseUrl (res, arg, urlparse) { + // check the protocol, and then see if it's git or not + switch (urlparse.protocol) { + case "git:": + case "git+http:": + case "git+https:": + case "git+rsync:": + case "git+ftp:": + case "git+ssh:": + case "git+file:": + res.type = 'git' + res.spec = arg.replace(/^git\+/, '') + break + + case 'http:': + case 'https:': + res.type = 'remote' + res.spec = arg + break + + case 'file:': + res.type = 'local' + res.spec = urlparse.pathname + break; + + default: + throw new Error('Unsupported URL Type: ' + arg) + break + } + + return res +} + + +function Result () { + if (!(this instanceof Result)) return new Result +} +Result.prototype.name = null +Result.prototype.type = null +Result.prototype.spec = null +Result.prototype.raw = null diff --git a/deps/npm/node_modules/npm-package-arg/package.json b/deps/npm/node_modules/npm-package-arg/package.json new file mode 100644 index 00000000000..45604cb0861 --- /dev/null +++ b/deps/npm/node_modules/npm-package-arg/package.json @@ -0,0 +1,38 @@ +{ + "name": "npm-package-arg", + "version": "2.1.2", + "description": "Parse the things that can be arguments to `npm install`", + "main": "npa.js", + "directories": { + "test": "test" + }, + "dependencies": { + "semver": "^2.3.0 || 3.x || 4" + }, + "devDependencies": { + "tap": "^0.4.9" + }, + "scripts": { + "test": "tap test/*.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/npm/npm-package-arg" + }, + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": "ISC", + "bugs": { + "url": "https://github.com/npm/npm-package-arg/issues" + }, + "homepage": "https://github.com/npm/npm-package-arg", + "readme": "# npm-package-arg\n\nParse the things that can be arguments to `npm install`\n\nTakes an argument like `foo@1.2`, or `foo@user/foo`, or\n`http://x.com/foo.tgz`, or `git+https://github.com/user/foo`, and\nfigures out what type of thing it is.\n\n## USAGE\n\n```javascript\nvar assert = require(\"assert\")\nvar npa = require(\"npm-package-arg\")\n\n// Pass in the descriptor, and it'll return an object\nvar parsed = npa(\"foo@1.2\")\n\n// Returns an object like:\n// {\n// name: \"foo\", // The bit in front of the @\n// type: \"range\", // the type of descriptor this is\n// spec: \"1.2\" // the specifier for this descriptor\n// }\n\n// Completely unreasonable invalid garbage throws an error\n// Make sure you wrap this in a try/catch if you have not\n// already sanitized the inputs!\nassert.throws(function() {\n npa(\"this is not \\0 a valid package name or url\")\n})\n```\n\nFor more examples, see the test file.\n\n## Result Objects\n\nThe objects that are returned by npm-package-arg contain the following\nfields:\n\n* `name` - If known, the `name` field expected in the resulting pkg.\n* `type` - One of the following strings:\n * `git` - A git repo\n * `github` - A github shorthand, like `user/project`\n * `tag` - A tagged version, like `\"foo@latest\"`\n * `version` - A specific version number, like `\"foo@1.2.3\"`\n * `range` - A version range, like `\"foo@2.x\"`\n * `local` - A local file or folder path\n * `remote` - An http url (presumably to a tgz)\n* `spec` - The \"thing\". URL, the range, git repo, etc.\n* `raw` - The original un-modified string that was provided.\n* `rawSpec` - The part after the `name@...`, as it was originally\n provided.\n* `scope` - If a name is something like `@org/module` then the `scope`\n field will be set to `org`. If it doesn't have a scoped name, then\n scope is `null`.\n", + "readmeFilename": "README.md", + "gitHead": "ebb3c5ee4c362aca5722cf805adf871f86b5c4f2", + "_id": "npm-package-arg@2.1.2", + "_shasum": "14f9be32e203a77977dd8120cf749d0db8c93761", + "_from": "npm-package-arg@>=2.1.2 <2.2.0" +} diff --git a/deps/npm/node_modules/npm-package-arg/test/basic.js b/deps/npm/node_modules/npm-package-arg/test/basic.js new file mode 100644 index 00000000000..3bc984e9d76 --- /dev/null +++ b/deps/npm/node_modules/npm-package-arg/test/basic.js @@ -0,0 +1,203 @@ +var npa = require("../npa.js") +var path = require("path") + +require("tap").test("basic", function (t) { + t.setMaxListeners(999) + + var tests = { + "foo@1.2": { + name: "foo", + type: "range", + spec: ">=1.2.0-0 <1.3.0-0", + raw: "foo@1.2", + rawSpec: "1.2" + }, + + "@foo/bar": { + raw: "@foo/bar", + name: "@foo/bar", + scope: "@foo", + rawSpec: "", + spec: "*", + type: "range" + }, + + "@foo/bar@": { + raw: "@foo/bar@", + name: "@foo/bar", + scope: "@foo", + rawSpec: "", + spec: "*", + type: "range" + }, + + "@foo/bar@baz": { + raw: "@foo/bar@baz", + name: "@foo/bar", + scope: "@foo", + rawSpec: "baz", + spec: "baz", + type: "tag" + }, + + "@f fo o al/ a d s ;f ": { + raw: "@f fo o al/ a d s ;f", + name: null, + rawSpec: "@f fo o al/ a d s ;f", + spec: path.resolve("@f fo o al/ a d s ;f"), + type: "local" + }, + + "foo@1.2.3": { + name: "foo", + type: "version", + spec: "1.2.3", + raw: "foo@1.2.3" + }, + + "foo@=v1.2.3": { + name: "foo", + type: "version", + spec: "1.2.3", + raw: "foo@=v1.2.3", + rawSpec: "=v1.2.3" + }, + + "git+ssh://git@github.com/user/foo#1.2.3": { + name: null, + type: "git", + spec: "ssh://git@github.com/user/foo#1.2.3", + raw: "git+ssh://git@github.com/user/foo#1.2.3" + }, + + "git+file://path/to/repo#1.2.3": { + name: null, + type: "git", + spec: "file://path/to/repo#1.2.3", + raw: "git+file://path/to/repo#1.2.3" + }, + + "git://github.com/user/foo": { + name: null, + type: "git", + spec: "git://github.com/user/foo", + raw: "git://github.com/user/foo" + }, + + "@foo/bar@git+ssh://github.com/user/foo": { + name: "@foo/bar", + scope: "@foo", + spec: "ssh://github.com/user/foo", + rawSpec: "git+ssh://github.com/user/foo", + raw: "@foo/bar@git+ssh://github.com/user/foo" + }, + + "/path/to/foo": { + name: null, + type: "local", + spec: "/path/to/foo", + raw: "/path/to/foo" + }, + + "file:path/to/foo": { + name: null, + type: "local", + spec: "path/to/foo", + raw: "file:path/to/foo" + }, + + "file:~/path/to/foo": { + name: null, + type: "local", + spec: "~/path/to/foo", + raw: "file:~/path/to/foo" + }, + + "file:../path/to/foo": { + name: null, + type: "local", + spec: "../path/to/foo", + raw: "file:../path/to/foo" + }, + + "file:///path/to/foo": { + name: null, + type: "local", + spec: "/path/to/foo", + raw: "file:///path/to/foo" + }, + + "https://server.com/foo.tgz": { + name: null, + type: "remote", + spec: "https://server.com/foo.tgz", + raw: "https://server.com/foo.tgz" + }, + + "user/foo-js": { + name: null, + type: "github", + spec: "user/foo-js", + raw: "user/foo-js" + }, + + "user/foo-js#bar/baz": { + name: null, + type: "github", + spec: "user/foo-js#bar/baz", + raw: "user/foo-js#bar/baz" + }, + + "user..blerg--/..foo-js# . . . . . some . tags / / /": { + name: null, + type: "github", + spec: "user..blerg--/..foo-js# . . . . . some . tags / / /", + raw: "user..blerg--/..foo-js# . . . . . some . tags / / /" + }, + + "user/foo-js#bar/baz/bin": { + name: null, + type: "github", + spec: "user/foo-js#bar/baz/bin", + raw: "user/foo-js#bar/baz/bin" + }, + + "foo@user/foo-js": { + name: "foo", + type: "github", + spec: "user/foo-js", + raw: "foo@user/foo-js" + }, + + "foo@latest": { + name: "foo", + type: "tag", + spec: "latest", + raw: "foo@latest" + }, + + "foo": { + name: "foo", + type: "range", + spec: "*", + raw: "foo" + } + } + + Object.keys(tests).forEach(function (arg) { + var res = npa(arg) + t.type(res, "Result") + t.has(res, tests[arg]) + }) + + // Completely unreasonable invalid garbage throws an error + t.throws(function() { + npa("this is not a \0 valid package name or url") + }) + + t.throws(function() { + npa("gopher://yea right") + }, "Unsupported URL Type: gopher://yea right") + + t.end() +}) diff --git a/deps/npm/node_modules/npm-package-arg/test/windows.js b/deps/npm/node_modules/npm-package-arg/test/windows.js new file mode 100644 index 00000000000..51629fe075e --- /dev/null +++ b/deps/npm/node_modules/npm-package-arg/test/windows.js @@ -0,0 +1,41 @@ +global.FAKE_WINDOWS = true + +var npa = require("../npa.js") +var test = require("tap").test +var path = require("path") + +var cases = { + "C:\\x\\y\\z": { + raw: 'C:\\x\\y\\z', + scope: null, + name: null, + rawSpec: 'C:\\x\\y\\z', + spec: path.resolve('C:\\x\\y\\z'), + type: 'local' + }, + "foo@C:\\x\\y\\z": { + raw: 'foo@C:\\x\\y\\z', + scope: null, + name: 'foo', + rawSpec: 'C:\\x\\y\\z', + spec: path.resolve('C:\\x\\y\\z'), + type: 'local' + }, + "foo@/foo/bar/baz": { + raw: 'foo@/foo/bar/baz', + scope: null, + name: 'foo', + rawSpec: '/foo/bar/baz', + spec: path.resolve('/foo/bar/baz'), + type: 'local' + } +} + +test("parse a windows path", function (t) { + Object.keys(cases).forEach(function (c) { + var expect = cases[c] + var actual = npa(c) + t.same(actual, expect, c) + }) + t.end() +}) diff --git a/deps/npm/node_modules/npm-registry-client/.npmignore b/deps/npm/node_modules/npm-registry-client/.npmignore index 187ab679536..bea2db6203a 100644 --- a/deps/npm/node_modules/npm-registry-client/.npmignore +++ b/deps/npm/node_modules/npm-registry-client/.npmignore @@ -1,3 +1,5 @@ test/fixtures/cache node_modules npm-debug.log +.eslintrc +.jshintrc diff --git a/deps/npm/node_modules/npm-registry-client/lib/adduser.js b/deps/npm/node_modules/npm-registry-client/lib/adduser.js index d1fcac8e918..e449c258089 100644 --- a/deps/npm/node_modules/npm-registry-client/lib/adduser.js +++ b/deps/npm/node_modules/npm-registry-client/lib/adduser.js @@ -29,15 +29,13 @@ function adduser (base, username, password, email, cb) { // pluck off any other username/password/token. it needs to be the // same as the user we're becoming now. replace them on error. - var pre = { username: this.conf.get('username') - , password: this.conf.get('_password') - , auth: this.conf.get('_auth') + var c = this.conf.getCredentialsByURI(base) + var pre = { username: c.username + , password: c.password + , email: c.email , token: this.conf.get('_token') } this.conf.del('_token') - this.conf.del('username') - this.conf.del('_auth') - this.conf.del('_password') if (this.couchLogin) { this.couchLogin.token = null } @@ -61,13 +59,15 @@ function adduser (base, username, password, email, cb) { , function (error, data, json, response) { // if it worked, then we just created a new user, and all is well. // but if we're updating a current record, then it'll 409 first - if (error && !this.conf.get('_auth')) { + var c = this.conf.getCredentialsByURI(base) + if (error && !c.auth) { // must be trying to re-auth on a new machine. // use this info as auth - var b = new Buffer(username + ":" + password) - this.conf.set('_auth', b.toString("base64")) - this.conf.set('username', username) - this.conf.set('_password', password) + this.conf.setCredentialsByURI(base, { + username : username, + password : password, + email : email + }) } if (!error || !response || response.statusCode !== 409) { @@ -94,39 +94,43 @@ function adduser (base, username, password, email, cb) { , cb) }.bind(this)) }.bind(this)) -} -function done (cb, pre) { - return function (error, data, json, response) { - if (!error && (!response || response.statusCode === 201)) { - return cb(error, data, json, response) - } - - // there was some kind of error, re-instate previous auth/token/etc. - this.conf.set('_token', pre.token) - if (this.couchLogin) { - this.couchLogin.token = pre.token - if (this.couchLogin.tokenSet) { - this.couchLogin.tokenSet(pre.token) + function done (cb, pre) { + return function (error, data, json, response) { + if (!error && (!response || response.statusCode === 201)) { + return cb(error, data, json, response) + } + + // there was some kind of error, re-instate previous auth/token/etc. + this.conf.set('_token', pre.token) + if (this.couchLogin) { + this.couchLogin.token = pre.token + if (this.couchLogin.tokenSet) { + this.couchLogin.tokenSet(pre.token) + } + } + this.conf.setCredentialsByURI(base, { + username : pre.username, + password : pre.password, + email : pre.email + }) + + this.log.verbose("adduser", "back", [error, data, json]) + if (!error) { + error = new Error( + (response && response.statusCode || "") + " " + + "Could not create user\n" + JSON.stringify(data) + ) } - } - this.conf.set('username', pre.username) - this.conf.set('_password', pre.password) - this.conf.set('_auth', pre.auth) - - this.log.verbose("adduser", "back", [error, data, json]) - if (!error) { - error = new Error( (response && response.statusCode || "") + " "+ - "Could not create user\n"+JSON.stringify(data)) - } - if (response - && (response.statusCode === 401 || response.statusCode === 403)) { - this.log.warn("adduser", "Incorrect username or password\n" - +"You can reset your account by visiting:\n" - +"\n" - +" https://npmjs.org/forgot\n") - } - - return cb(error) - }.bind(this) + + if (response && (response.statusCode === 401 || response.statusCode === 403)) { + this.log.warn("adduser", "Incorrect username or password\n" + + "You can reset your account by visiting:\n" + + "\n" + + " https://npmjs.org/forgot\n") + } + + return cb(error) + }.bind(this) + } } diff --git a/deps/npm/node_modules/npm-registry-client/lib/attempt.js b/deps/npm/node_modules/npm-registry-client/lib/attempt.js new file mode 100644 index 00000000000..0794fdc3bff --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/lib/attempt.js @@ -0,0 +1,22 @@ +var retry = require("retry") + +module.exports = attempt + +function attempt(cb) { + // Tuned to spread 3 attempts over about a minute. + // See formula at . + var operation = retry.operation({ + retries : this.conf.get("fetch-retries") || 2, + factor : this.conf.get("fetch-retry-factor"), + minTimeout : this.conf.get("fetch-retry-mintimeout") || 10000, + maxTimeout : this.conf.get("fetch-retry-maxtimeout") || 60000 + }) + + var client = this + operation.attempt(function (currentAttempt) { + client.log.info("attempt", "registry request try #"+currentAttempt+ + " at "+(new Date()).toLocaleTimeString()) + + cb(operation) + }) +} diff --git a/deps/npm/node_modules/npm-registry-client/lib/authify.js b/deps/npm/node_modules/npm-registry-client/lib/authify.js new file mode 100644 index 00000000000..2b0c7a2a33a --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/lib/authify.js @@ -0,0 +1,27 @@ +var url = require("url") + +module.exports = authify + +function authify (authed, parsed, headers) { + var c = this.conf.getCredentialsByURI(url.format(parsed)) + + if (c && c.token) { + this.log.verbose("request", "using bearer token for auth") + headers.authorization = "Bearer " + c.token + + return null + } + + if (authed) { + if (c && c.username && c.password) { + var username = encodeURIComponent(c.username) + var password = encodeURIComponent(c.password) + parsed.auth = username + ":" + password + } + else { + return new Error( + "This request requires auth credentials. Run `npm login` and repeat the request." + ) + } + } +} diff --git a/deps/npm/node_modules/npm-registry-client/lib/deprecate.js b/deps/npm/node_modules/npm-registry-client/lib/deprecate.js index 078968dd327..f5fd597047b 100644 --- a/deps/npm/node_modules/npm-registry-client/lib/deprecate.js +++ b/deps/npm/node_modules/npm-registry-client/lib/deprecate.js @@ -4,7 +4,8 @@ var url = require("url") var semver = require("semver") function deprecate (uri, ver, message, cb) { - if (!this.conf.get('username')) { + var c = this.conf.getCredentialsByURI(uri) + if (!(c.token || c.auth)) { return cb(new Error("Must be logged in to deprecate a package")) } diff --git a/deps/npm/node_modules/npm-registry-client/lib/fetch.js b/deps/npm/node_modules/npm-registry-client/lib/fetch.js new file mode 100644 index 00000000000..8dd6b28b076 --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/lib/fetch.js @@ -0,0 +1,85 @@ +var assert = require("assert") + , url = require("url") + +var request = require("request") + , once = require("once") + +module.exports = fetch + +function fetch (uri, headers, cb) { + assert(uri, "must pass resource to fetch") + assert(cb, "must pass callback") + + if (!headers) headers = {} + + cb = once(cb) + + var client = this + this.attempt(function (operation) { + makeRequest.call(client, uri, headers, function (er, req) { + if (er) return cb(er) + + req.on("error", function (er) { + if (operation.retry(er)) { + client.log.info("retry", "will retry, error on last attempt: " + er) + } + }) + + req.on("response", function (res) { + client.log.http("fetch", "" + res.statusCode, uri) + + var er + var statusCode = res && res.statusCode + if (statusCode === 200) { + // Work around bug in node v0.10.0 where the CryptoStream + // gets stuck and never starts reading again. + res.resume() + if (process.version === "v0.10.0") unstick(res) + + return cb(null, res) + } + // Only retry on 408, 5xx or no `response`. + else if (statusCode === 408) { + er = new Error("request timed out") + } + else if (statusCode >= 500) { + er = new Error("server error " + statusCode) + } + + if (er && operation.retry(er)) { + client.log.info("retry", "will retry, error on last attempt: " + er) + } + else { + cb(new Error("fetch failed with status code " + statusCode)) + } + }) + }) + }) +} + +function unstick(response) { + response.resume = function (orig) { return function() { + var ret = orig.apply(response, arguments) + if (response.socket.encrypted) response.socket.encrypted.read(0) + return ret + }}(response.resume) +} + +function makeRequest (remote, headers, cb) { + var parsed = url.parse(remote) + this.log.http("fetch", "GET", parsed.href) + + var er = this.authify(this.conf.get("always-auth"), parsed, headers) + if (er) return cb(er) + + var opts = this.initialize( + parsed, + "GET", + "application/x-tar", + headers + ) + // always want to follow redirects for fetch + opts.followRedirect = true + + cb(null, request(opts)) +} diff --git a/deps/npm/node_modules/npm-registry-client/lib/initialize.js b/deps/npm/node_modules/npm-registry-client/lib/initialize.js new file mode 100644 index 00000000000..b6e89ffe957 --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/lib/initialize.js @@ -0,0 +1,41 @@ +var crypto = require("crypto") + +var pkg = require("../package.json") + +module.exports = initialize + +function initialize (uri, method, accept, headers) { + if (!this.sessionToken) { + this.sessionToken = crypto.randomBytes(8).toString("hex") + this.log.verbose("request id", this.sessionToken) + } + + var strict = this.conf.get("strict-ssl") + if (strict === undefined) strict = true + + var p = this.conf.get("proxy") + var sp = this.conf.get("https-proxy") || p + + var opts = { + url : uri, + method : method, + headers : headers, + proxy : uri.protocol === "https:" ? sp : p, + localAddress : this.conf.get("local-address"), + strictSSL : strict, + cert : this.conf.get("cert"), + key : this.conf.get("key"), + ca : this.conf.get("ca") + } + + headers.version = this.version || pkg.version + headers.accept = accept + + if (this.refer) headers.referer = this.refer + + headers["npm-session"] = this.sessionToken + headers["user-agent"] = this.conf.get("user-agent") || + "node/" + process.version + + return opts +} diff --git a/deps/npm/node_modules/npm-registry-client/lib/publish.js b/deps/npm/node_modules/npm-registry-client/lib/publish.js index 5504658d332..c3b2f3e1f2a 100644 --- a/deps/npm/node_modules/npm-registry-client/lib/publish.js +++ b/deps/npm/node_modules/npm-registry-client/lib/publish.js @@ -5,20 +5,26 @@ var url = require("url") , semver = require("semver") , crypto = require("crypto") , fs = require("fs") + , fixNameField = require("normalize-package-data/lib/fixer.js").fixNameField -function publish (uri, data, tarball, cb) { - var email = this.conf.get('email') - var auth = this.conf.get('_auth') - var username = this.conf.get('username') +function escaped(name) { + return name.replace("/", "%2f") +} - if (!email || !auth || !username) { +function publish (uri, data, tarball, cb) { + var c = this.conf.getCredentialsByURI(uri) + if (!(c.token || (c.auth && c.username && c.email))) { var er = new Error("auth and email required for publishing") er.code = 'ENEEDAUTH' return cb(er) } - if (data.name !== encodeURIComponent(data.name)) - return cb(new Error('invalid name: must be url-safe')) + try { + fixNameField(data, true) + } + catch (er) { + return cb(er) + } var ver = semver.clean(data.version) if (!ver) @@ -30,12 +36,12 @@ function publish (uri, data, tarball, cb) { if (er) return cb(er) fs.readFile(tarball, function(er, tarbuffer) { if (er) return cb(er) - putFirst.call(self, uri, data, tarbuffer, s, username, email, cb) + putFirst.call(self, uri, data, tarbuffer, s, c, cb) }) }) } -function putFirst (registry, data, tarbuffer, stat, username, email, cb) { +function putFirst (registry, data, tarbuffer, stat, creds, cb) { // optimistically try to PUT all in one single atomic thing. // If 409, then GET and merge, try again. // If other error, then fail. @@ -47,15 +53,14 @@ function putFirst (registry, data, tarbuffer, stat, username, email, cb) { , "dist-tags" : {} , versions : {} , readme: data.readme || "" - , maintainers : - [ { name : username - , email : email - } - ] } + if (!creds.token) { + root.maintainers = [{name : creds.username, email : creds.email}] + data.maintainers = JSON.parse(JSON.stringify(root.maintainers)) + } + root.versions[ data.version ] = data - data.maintainers = JSON.parse(JSON.stringify(root.maintainers)) var tag = data.tag || this.conf.get('tag') || "latest" root["dist-tags"][tag] = data.version @@ -70,12 +75,12 @@ function putFirst (registry, data, tarbuffer, stat, username, email, cb) { root._attachments = {} root._attachments[ tbName ] = { - content_type: 'application/octet-stream', - data: tarbuffer.toString('base64'), - length: stat.size - }; + "content_type": "application/octet-stream", + "data": tarbuffer.toString("base64"), + "length": stat.size + } - var fixed = url.resolve(registry, data.name) + var fixed = url.resolve(registry, escaped(data.name)) this.request("PUT", fixed, { body : root }, function (er, parsed, json, res) { var r409 = "must supply latest _rev to update existing package" var r409b = "Document update conflict." @@ -94,8 +99,7 @@ function putFirst (registry, data, tarbuffer, stat, username, email, cb) { return cb(er, parsed, json, res) // let's see what versions are already published. - var getUrl = url.resolve(registry, data.name + "?write=true") - this.request("GET", getUrl, null, function (er, current) { + this.request("GET", fixed + "?write=true", null, function (er, current) { if (er) return cb(er) putNext.call(this, registry, data.version, root, current, cb) @@ -133,7 +137,7 @@ function putNext(registry, newVersion, root, current, cb) { // ignore these case 'maintainers': - break; + break // copy default: @@ -143,7 +147,8 @@ function putNext(registry, newVersion, root, current, cb) { var maint = JSON.parse(JSON.stringify(root.maintainers)) root.versions[newVersion].maintainers = maint - this.request("PUT", url.resolve(registry, root.name), { body : current }, cb) + var uri = url.resolve(registry, escaped(root.name)) + this.request("PUT", uri, { body : current }, cb) } function conflictError (pkgid, version) { diff --git a/deps/npm/node_modules/npm-registry-client/lib/request.js b/deps/npm/node_modules/npm-registry-client/lib/request.js index 7a770a6d22a..498b326f28b 100644 --- a/deps/npm/node_modules/npm-registry-client/lib/request.js +++ b/deps/npm/node_modules/npm-registry-client/lib/request.js @@ -1,15 +1,13 @@ -module.exports = regRequest - -var url = require("url") +var assert = require("assert") + , url = require("url") , zlib = require("zlib") - , assert = require("assert") - , rm = require("rimraf") , Stream = require("stream").Stream + +var rm = require("rimraf") , request = require("request") - , retry = require("retry") - , crypto = require("crypto") - , pkg = require("../package.json") + , once = require("once") +module.exports = regRequest // npm: means // 1. https @@ -20,59 +18,43 @@ function regRequest (method, uri, options, cb_) { assert(cb_, "must pass callback") options = options || {} - var nofollow = (typeof options.follow === 'boolean' ? !options.follow : false) - var etag = options.etag - var what = options.body var parsed = url.parse(uri) - - var authThis = false - if (parsed.protocol === "npm") { - parsed.protocol = "https" - authThis = true - } - var where = parsed.pathname + var what = options.body + var follow = (typeof options.follow === "boolean" ? options.follow : true) + this.log.verbose("request", "on initialization, where is", where) + if (parsed.search) { where = where + parsed.search parsed.search = "" } parsed.pathname = "/" - this.log.verbose("request", "where is", where) - - var registry = url.format(parsed) - this.log.verbose("request", "registry", registry) - - if (!this.sessionToken) { - this.sessionToken = crypto.randomBytes(8).toString("hex") - this.log.verbose("request id", this.sessionToken) - } + this.log.verbose("request", "after pass 1, where is", where) // Since there are multiple places where an error could occur, // don't let the cb be called more than once. - var errState = null - function cb (er) { - if (errState) return - if (er) errState = er - cb_.apply(null, arguments) - } + var cb = once(cb_) if (where.match(/^\/?favicon.ico/)) { return cb(new Error("favicon.ico isn't a package, it's a picture.")) } var adduserChange = /^\/?-\/user\/org\.couchdb\.user:([^\/]+)\/-rev/ - , adduserNew = /^\/?-\/user\/org\.couchdb\.user:([^\/]+)/ - , nu = where.match(adduserNew) - , uc = where.match(adduserChange) - , alwaysAuth = this.conf.get('always-auth') - , isDel = method === "DELETE" - , isWrite = what || isDel - , authRequired = (authThis || alwaysAuth || isWrite) && !nu || uc || isDel + , isUserChange = where.match(adduserChange) + , adduserNew = /^\/?-\/user\/org\.couchdb\.user:([^\/]+)$/ + , isNewUser = where.match(adduserNew) + , alwaysAuth = this.conf.get("always-auth") + , isDelete = method === "DELETE" + , isWrite = what || isDelete + + if (isUserChange && !isWrite) { + return cb(new Error("trying to change user document without writing(?!)")) + } // resolve to a full url on the registry if (!where.match(/^https?:\/\//)) { - this.log.verbose("url raw", where) + this.log.verbose("request", "url raw", where) var q = where.split("?") where = q.shift() @@ -84,56 +66,44 @@ function regRequest (method, uri, options, cb_) { if (p.match(/^org.couchdb.user/)) { return p.replace(/\//g, encodeURIComponent("/")) } - return encodeURIComponent(p) + return p }).join("/") if (q) where += "?" + q - this.log.verbose("url resolving", [registry, where]) - where = url.resolve(registry, where) - this.log.verbose("url resolved", where) - } - this.log.verbose("request", "where is", where) - var remote = url.parse(where) - , auth = this.conf.get('_auth') + var registry = url.format(parsed) + this.log.verbose("request", "resolving registry", [registry, where]) - if (authRequired && !auth) { - var un = this.conf.get('username') - var pw = this.conf.get('_password') - if (un && pw) - auth = new Buffer(un + ':' + pw).toString('base64') + where = url.resolve(registry, where) + this.log.verbose("request", "after pass 2, where is", where) } - if (authRequired && !auth) { - return cb(new Error( - "This request requires auth credentials. Run `npm login` and repeat the request.")) + var authed + // new users can *not* use auth, because they don't *have* auth yet + if (isNewUser) { + this.log.verbose("request", "new user, so can't send auth") + authed = false } - - if (auth && authRequired) { - // Escape any weird characters that might be in the auth string - // TODO(isaacs) Clean up this awful back and forth mess. - var remoteAuth = new Buffer(auth, "base64").toString("utf8") - remoteAuth = encodeURIComponent(remoteAuth).replace(/%3A/, ":") - remote.auth = remoteAuth + else if (alwaysAuth) { + this.log.verbose("request", "always-auth set; sending authorization") + authed = true + } + else if (isWrite) { + this.log.verbose("request", "sending authorization for write operation") + authed = true + } + else { + // most of the time we don't want to auth + this.log.verbose("request", "no auth needed") + authed = false } - - // Tuned to spread 3 attempts over about a minute. - // See formula at . - var operation = retry.operation({ - retries: this.conf.get('fetch-retries') || 2, - factor: this.conf.get('fetch-retry-factor'), - minTimeout: this.conf.get('fetch-retry-mintimeout') || 10000, - maxTimeout: this.conf.get('fetch-retry-maxtimeout') || 60000 - }) var self = this - operation.attempt(function (currentAttempt) { - self.log.info("trying", "registry request attempt " + currentAttempt - + " at " + (new Date()).toLocaleTimeString()) - makeRequest.call(self, method, remote, where, what, etag, nofollow + this.attempt(function (operation) { + makeRequest.call(self, method, where, what, options.etag, follow, authed , function (er, parsed, raw, response) { if (!er || (er.message && er.message.match(/^SSL Error/))) { if (er) - er.code = 'ESSL' + er.code = "ESSL" return cb(er, parsed, raw, response) } @@ -145,61 +115,47 @@ function regRequest (method, uri, options, cb_) { var statusRetry = !statusCode || timeout || serverError if (er && statusRetry && operation.retry(er)) { self.log.info("retry", "will retry, error on last attempt: " + er) - return + return undefined } if (response) { - this.log.verbose("headers", response.headers) + self.log.verbose("headers", response.headers) if (response.headers["npm-notice"]) { - this.log.warn("notice", response.headers["npm-notice"]) + self.log.warn("notice", response.headers["npm-notice"]) } } cb.apply(null, arguments) - }.bind(this)) - }.bind(this)) + }) + }) } -function makeRequest (method, remote, where, what, etag, nofollow, cb_) { - var cbCalled = false - function cb () { - if (cbCalled) return - cbCalled = true - cb_.apply(null, arguments) - } +function makeRequest (method, where, what, etag, follow, authed, cb_) { + var cb = once(cb_) - var strict = this.conf.get('strict-ssl') - if (strict === undefined) strict = true - var opts = { url: remote - , method: method - , encoding: null // tell request let body be Buffer instance - , ca: this.conf.get('ca') - , localAddress: this.conf.get('local-address') - , cert: this.conf.get('cert') - , key: this.conf.get('key') - , strictSSL: strict } - , headers = opts.headers = {} - if (etag) { - this.log.verbose("etag", etag) - headers[method === "GET" ? "if-none-match" : "if-match"] = etag - } + var parsed = url.parse(where) + var headers = {} - headers['npm-session'] = this.sessionToken - headers.version = this.version || pkg.version + // metadata should be compressed + headers["accept-encoding"] = "gzip" - if (this.refer) { - headers.referer = this.refer - } + var er = this.authify(authed, parsed, headers) + if (er) return cb_(er) - headers.accept = "application/json" - headers['accept-encoding'] = 'gzip' + var opts = this.initialize( + parsed, + method, + "application/json", + headers + ) - headers["user-agent"] = this.conf.get('user-agent') || - 'node/' + process.version + opts.followRedirect = follow + opts.encoding = null // tell request let body be Buffer instance - var p = this.conf.get('proxy') - var sp = this.conf.get('https-proxy') || p - opts.proxy = remote.protocol === "https:" ? sp : p + if (etag) { + this.log.verbose("etag", etag) + headers[method === "GET" ? "if-none-match" : "if-match"] = etag + } - // figure out wth 'what' is + // figure out wth "what" is if (what) { if (Buffer.isBuffer(what) || typeof what === "string") { opts.body = what @@ -214,11 +170,7 @@ function makeRequest (method, remote, where, what, etag, nofollow, cb_) { } } - if (nofollow) { - opts.followRedirect = false - } - - this.log.http(method, remote.href || "/") + this.log.http("request", method, parsed.href || "/") var done = requestDone.call(this, method, where, cb) var req = request(opts, decodeResponseBody(done)) @@ -243,7 +195,7 @@ function decodeResponseBody(cb) { response.socket.destroy() } - if (response.headers['content-encoding'] !== 'gzip') return cb(er, response, data) + if (response.headers["content-encoding"] !== "gzip") return cb(er, response, data) zlib.gunzip(data, function (er, buf) { if (er) return cb(er, response, data) @@ -260,7 +212,7 @@ function requestDone (method, where, cb) { var urlObj = url.parse(where) if (urlObj.auth) - urlObj.auth = '***' + urlObj.auth = "***" this.log.http(response.statusCode, url.format(urlObj)) var parsed @@ -298,16 +250,21 @@ function requestDone (method, where, cb) { if (parsed && parsed.error && response.statusCode >= 400) { var w = url.parse(where).pathname.substr(1) var name - if (!w.match(/^-/) && parsed.error === "not_found") { + if (!w.match(/^-/)) { w = w.split("/") name = w[w.indexOf("_rewrite") + 1] - er = new Error("404 Not Found: "+name) - er.code = "E404" - er.pkgid = name + } + + if (name && parsed.error === "not_found") { + er = new Error("404 Not Found: " + name) } else { er = new Error( parsed.error + " " + (parsed.reason || "") + ": " + w) } + if (name) er.pkgid = name + er.statusCode = response.statusCode + er.code = "E" + er.statusCode + } else if (method !== "HEAD" && method !== "GET") { // invalidate cache // This is irrelevant for commands that do etag caching, but diff --git a/deps/npm/node_modules/npm-registry-client/lib/star.js b/deps/npm/node_modules/npm-registry-client/lib/star.js index c0590f1e2ee..97745851ea1 100644 --- a/deps/npm/node_modules/npm-registry-client/lib/star.js +++ b/deps/npm/node_modules/npm-registry-client/lib/star.js @@ -2,10 +2,15 @@ module.exports = star function star (uri, starred, cb) { - if (!this.conf.get('username')) return cb(new Error( - "Must be logged in to star/unstar packages")) + var c = this.conf.getCredentialsByURI(uri) + if (c.token) { + return cb(new Error("This operation is unsupported for token-based auth")) + } + else if (!c.auth) { + return cb(new Error("Must be logged in to star/unstar packages")) + } - this.request("GET", uri+"?write=true", null, function (er, fullData) { + this.request("GET", uri + "?write=true", null, function (er, fullData) { if (er) return cb(er) fullData = { _id: fullData._id @@ -14,10 +19,10 @@ function star (uri, starred, cb) { if (starred) { this.log.info("starring", fullData._id) - fullData.users[this.conf.get('username')] = true + fullData.users[c.username] = true this.log.verbose("starring", fullData) } else { - delete fullData.users[this.conf.get('username')] + delete fullData.users[c.username] this.log.info("unstarring", fullData._id) this.log.verbose("unstarring", fullData) } diff --git a/deps/npm/node_modules/npm-registry-client/lib/unpublish.js b/deps/npm/node_modules/npm-registry-client/lib/unpublish.js index 6a4ac8a1916..346d537fe6f 100644 --- a/deps/npm/node_modules/npm-registry-client/lib/unpublish.js +++ b/deps/npm/node_modules/npm-registry-client/lib/unpublish.js @@ -22,7 +22,7 @@ function unpublish (uri, ver, cb) { // remove all if no version specified if (!ver) { this.log.info("unpublish", "No version specified, removing all") - return this.request("DELETE", uri+'/-rev/'+data._rev, null, cb) + return this.request("DELETE", uri+"/-rev/"+data._rev, null, cb) } var versions = data.versions || {} @@ -72,7 +72,7 @@ function unpublish (uri, ver, cb) { function detacher (uri, data, dist, cb) { return function (er) { if (er) return cb(er) - this.get(url.resolve(uri, data.name), null, function (er, data) { + this.get(escape(uri, data.name), null, function (er, data) { if (er) return cb(er) var tb = url.parse(dist.tarball) @@ -96,10 +96,15 @@ function detach (uri, data, path, rev, cb) { this.log.info("detach", path) return this.request("DELETE", url.resolve(uri, path), null, cb) } - this.get(url.resolve(uri, data.name), null, function (er, data) { + this.get(escape(uri, data.name), null, function (er, data) { rev = data._rev if (!rev) return cb(new Error( "No _rev found in "+data._id)) detach.call(this, data, path, rev, cb) }.bind(this)) } + +function escape (base, name) { + var escaped = name.replace(/\//, "%2f") + return url.resolve(base, escaped) +} diff --git a/deps/npm/node_modules/npm-registry-client/lib/util/nerf-dart.js b/deps/npm/node_modules/npm-registry-client/lib/util/nerf-dart.js new file mode 100644 index 00000000000..3b26a56c65f --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/lib/util/nerf-dart.js @@ -0,0 +1,21 @@ +var url = require("url") + +module.exports = toNerfDart + +/** + * Maps a URL to an identifier. + * + * Name courtesy schiffertronix media LLC, a New Jersey corporation + * + * @param {String} uri The URL to be nerfed. + * + * @returns {String} A nerfed URL. + */ +function toNerfDart(uri) { + var parsed = url.parse(uri) + parsed.pathname = "/" + delete parsed.protocol + delete parsed.auth + + return url.format(parsed) +} diff --git a/deps/npm/node_modules/npm-registry-client/lib/whoami.js b/deps/npm/node_modules/npm-registry-client/lib/whoami.js new file mode 100644 index 00000000000..ffa7bd704e6 --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/lib/whoami.js @@ -0,0 +1,15 @@ +module.exports = whoami + +var url = require("url") + +function whoami (uri, cb) { + if (!this.conf.getCredentialsByURI(uri)) { + return cb(new Error("Must be logged in to see who you are")) + } + + this.request("GET", url.resolve(uri, "whoami"), null, function (er, userdata) { + if (er) return cb(er) + + cb(null, userdata.username) + }) +} diff --git a/deps/npm/node_modules/npm-registry-client/package.json b/deps/npm/node_modules/npm-registry-client/package.json index 6d29da9ddfd..5de4bd2aa31 100644 --- a/deps/npm/node_modules/npm-registry-client/package.json +++ b/deps/npm/node_modules/npm-registry-client/package.json @@ -6,7 +6,7 @@ }, "name": "npm-registry-client", "description": "Client for the npm registry", - "version": "2.0.7", + "version": "3.2.1", "repository": { "url": "git://github.com/isaacs/npm-registry-client" }, @@ -18,15 +18,18 @@ "chownr": "0", "graceful-fs": "^3.0.0", "mkdirp": "^0.5.0", + "normalize-package-data": "~1.0.1", "npm-cache-filename": "^1.0.0", + "once": "^1.3.0", "request": "2 >=2.25.0", "retry": "0.6.0", - "rimraf": "~2", - "semver": "2 >=2.2.1", - "slide": "~1.1.3", + "rimraf": "2", + "semver": "2 >=2.2.1 || 3.x || 4", + "slide": "^1.1.3", "npmlog": "" }, "devDependencies": { + "concat-stream": "^1.4.6", "tap": "" }, "optionalDependencies": { @@ -35,12 +38,12 @@ "license": "ISC", "readme": "# npm-registry-client\n\nThe code that npm uses to talk to the registry.\n\nIt handles all the caching and HTTP calls.\n\n## Usage\n\n```javascript\nvar RegClient = require('npm-registry-client')\nvar client = new RegClient(config)\nvar uri = \"npm://registry.npmjs.org/npm\"\nvar options = {timeout: 1000}\n\nclient.get(uri, options, function (error, data, raw, res) {\n // error is an error if there was a problem.\n // data is the parsed data object\n // raw is the json string\n // res is the response from couch\n})\n```\n\n# Registry URLs\n\nThe registry calls take either a full URL pointing to a resource in the\nregistry, or a base URL for the registry as a whole (for the base URL, any path\nwill be ignored). In addition to `http` and `https`, `npm` URLs are allowed.\n`npm` URLs are `https` URLs with the additional restrictions that they will\nalways include authorization credentials, and the response is always registry\nmetadata (and not tarballs or other attachments).\n\n# Configuration\n\nThis program is designed to work with\n[npmconf](https://npmjs.org/package/npmconf), but you can also pass in\na plain-jane object with the appropriate configs, and it'll shim it\nfor you. Any configuration thingie that has get/set/del methods will\nalso be accepted.\n\n* `cache` **Required** {String} Path to the cache folder\n* `always-auth` {Boolean} Auth even for GET requests.\n* `auth` {String} A base64-encoded `username:password`\n* `email` {String} User's email address\n* `tag` {String} The default tag to use when publishing new packages.\n Default = `\"latest\"`\n* `ca` {String} Cerficate signing authority certificates to trust.\n* `cert` {String} Client certificate (PEM encoded). Enable access\n to servers that require client certificates\n* `key` {String} Private key (PEM encoded) for client certificate 'cert'\n* `strict-ssl` {Boolean} Whether or not to be strict with SSL\n certificates. Default = `true`\n* `user-agent` {String} User agent header to send. Default =\n `\"node/{process.version} {process.platform} {process.arch}\"`\n* `log` {Object} The logger to use. Defaults to `require(\"npmlog\")` if\n that works, otherwise logs are disabled.\n* `fetch-retries` {Number} Number of times to retry on GET failures.\n Default=2\n* `fetch-retry-factor` {Number} `factor` setting for `node-retry`. Default=10\n* `fetch-retry-mintimeout` {Number} `minTimeout` setting for `node-retry`.\n Default=10000 (10 seconds)\n* `fetch-retry-maxtimeout` {Number} `maxTimeout` setting for `node-retry`.\n Default=60000 (60 seconds)\n* `proxy` {URL} The url to proxy requests through.\n* `https-proxy` {URL} The url to proxy https requests through.\n Defaults to be the same as `proxy` if unset.\n* `_auth` {String} The base64-encoded authorization header.\n* `username` `_password` {String} Username/password to use to generate\n `_auth` if not supplied.\n* `_token` {Object} A token for use with\n [couch-login](https://npmjs.org/package/couch-login)\n\n# client.request(method, uri, options, cb)\n\n* `method` {String} HTTP method\n* `uri` {String} URI pointing to the resource to request\n* `options` {Object} Object containing optional per-request properties.\n * `what` {Stream | Buffer | String | Object} The request body. Objects\n that are not Buffers or Streams are encoded as JSON.\n * `etag` {String} The cached ETag\n * `follow` {Boolean} Follow 302/301 responses (defaults to true)\n* `cb` {Function}\n * `error` {Error | null}\n * `data` {Object} the parsed data object\n * `raw` {String} the json\n * `res` {Response Object} response from couch\n\nMake a request to the registry. All the other methods are wrappers around\n`request`.\n\n# client.adduser(base, username, password, email, cb)\n\n* `base` {String} Base registry URL\n* `username` {String}\n* `password` {String}\n* `email` {String}\n* `cb` {Function}\n\nAdd a user account to the registry, or verify the credentials.\n\n# client.deprecate(uri, version, message, cb)\n\n* `uri` {String} Full registry URI for the deprecated package\n* `version` {String} Semver version range\n* `message` {String} The message to use as a deprecation warning\n* `cb` {Function}\n\nDeprecate a version of a package in the registry.\n\n# client.bugs(uri, cb)\n\n* `uri` {String} Full registry URI for the package\n* `cb` {Function}\n\nGet the url for bugs of a package\n\n# client.get(uri, options, cb)\n\n* `uri` {String} The complete registry URI to fetch\n* `options` {Object} Object containing optional per-request properties.\n * `timeout` {Number} Duration before the request times out.\n * `follow` {Boolean} Follow 302/301 responses (defaults to true)\n * `staleOk` {Boolean} If there's cached data available, then return that\n to the callback quickly, and update the cache the background.\n\nFetches data from the registry via a GET request, saving it in the cache folder\nwith the ETag.\n\n# client.publish(uri, data, tarball, cb)\n\n* `uri` {String} The registry URI to publish to\n* `data` {Object} Package data\n* `tarball` {String | Stream} Filename or stream of the package tarball\n* `cb` {Function}\n\nPublish a package to the registry.\n\nNote that this does not create the tarball from a folder. However, it can\naccept a gzipped tar stream or a filename to a tarball.\n\n# client.star(uri, starred, cb)\n\n* `uri` {String} The complete registry URI to star\n* `starred` {Boolean} True to star the package, false to unstar it.\n* `cb` {Function}\n\nStar or unstar a package.\n\nNote that the user does not have to be the package owner to star or unstar a\npackage, though other writes do require that the user be the package owner.\n\n# client.stars(base, username, cb)\n\n* `base` {String} The base URL for the registry\n* `username` {String} Name of user to fetch starred packages for.\n* `cb` {Function}\n\nView your own or another user's starred packages.\n\n# client.tag(uri, version, tag, cb)\n\n* `uri` {String} The complete registry URI to tag\n* `version` {String} Version to tag\n* `tag` {String} Tag name to apply\n* `cb` {Function}\n\nMark a version in the `dist-tags` hash, so that `pkg@tag` will fetch the\nspecified version.\n\n# client.unpublish(uri, [ver], cb)\n\n* `uri` {String} The complete registry URI to unpublish\n* `ver` {String} version to unpublish. Leave blank to unpublish all\n versions.\n* `cb` {Function}\n\nRemove a version of a package (or all versions) from the registry. When the\nlast version us unpublished, the entire document is removed from the database.\n\n# client.upload(uri, file, [etag], [nofollow], cb)\n\n* `uri` {String} The complete registry URI to upload to\n* `file` {String | Stream} Either the filename or a readable stream\n* `etag` {String} Cache ETag\n* `nofollow` {Boolean} Do not follow 301/302 responses\n* `cb` {Function}\n\nUpload an attachment. Mostly used by `client.publish()`.\n", "readmeFilename": "README.md", - "gitHead": "bb534a209f9a36d77aff57cd4318ba3985501360", + "gitHead": "c60d91b1e8dceba21e33ec40eeaf1b0d02cac8c6", "bugs": { "url": "https://github.com/isaacs/npm-registry-client/issues" }, "homepage": "https://github.com/isaacs/npm-registry-client", - "_id": "npm-registry-client@2.0.7", - "_shasum": "97a2cdca5aba753b4b5b334b4ae65669c6641085", - "_from": "npm-registry-client@^2.0.7" + "_id": "npm-registry-client@3.2.1", + "_shasum": "a502a818de273085e8e1a931ff7beac6e3fe2a7a", + "_from": "npm-registry-client@>=3.2.1-0 <3.3.0-0" } diff --git a/deps/npm/node_modules/npm-registry-client/test/bugs.js b/deps/npm/node_modules/npm-registry-client/test/bugs.js index a7336b4a585..799445295d3 100644 --- a/deps/npm/node_modules/npm-registry-client/test/bugs.js +++ b/deps/npm/node_modules/npm-registry-client/test/bugs.js @@ -2,13 +2,7 @@ var tap = require("tap") var server = require("./lib/server.js") var common = require("./lib/common.js") -var client = common.freshClient({ - username : "username", - password : "%1234@asdf%", - email : "ogd@aoaioxxysz.net", - _auth : new Buffer("username:%1234@asdf%").toString("base64"), - "always-auth" : true -}) +var client = common.freshClient() tap.test("get the URL for the bugs page on a package", function (t) { server.expect("GET", "/sample/latest", function (req, res) { @@ -23,7 +17,8 @@ tap.test("get the URL for the bugs page on a package", function (t) { }) client.bugs("http://localhost:1337/sample", function (error, info) { - t.notOk(error, "no errors") + t.ifError(error) + t.ok(info.url, "got the URL") t.ok(info.email, "got the email address") diff --git a/deps/npm/node_modules/npm-registry-client/test/deprecate.js b/deps/npm/node_modules/npm-registry-client/test/deprecate.js index 29d33742c70..76a5ba128d8 100644 --- a/deps/npm/node_modules/npm-registry-client/test/deprecate.js +++ b/deps/npm/node_modules/npm-registry-client/test/deprecate.js @@ -2,13 +2,13 @@ var tap = require("tap") var server = require("./lib/server.js") var common = require("./lib/common.js") -var client = common.freshClient({ - username : "username", - password : "password", - email : "ogd@aoaioxxysz.net", - _auth : new Buffer("username:%1234@asdf%").toString("base64"), - "always-auth" : true -}) + +var nerfed = "//localhost:" + server.port + "/:" + +var configuration = {} +configuration[nerfed + "_authToken"] = "not-bad-meaning-bad-but-bad-meaning-wombat" + +var client = common.freshClient(configuration) var cache = require("./fixtures/underscore/cache.json") @@ -57,8 +57,8 @@ tap.test("deprecate a package", function (t) { }) }) - client.deprecate("http://localhost:1337/underscore", VERSION, MESSAGE, function (error, data) { - t.notOk(error, "no errors") + client.deprecate(common.registry + "/underscore", VERSION, MESSAGE, function (er, data) { + t.ifError(er) t.ok(data.deprecated, "was deprecated") t.end() diff --git a/deps/npm/node_modules/npm-registry-client/test/fetch-404.js b/deps/npm/node_modules/npm-registry-client/test/fetch-404.js new file mode 100644 index 00000000000..2ce3b212b04 --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/test/fetch-404.js @@ -0,0 +1,44 @@ +var resolve = require("path").resolve +var createReadStream = require("graceful-fs").createReadStream +var readFileSync = require("graceful-fs").readFileSync + +var tap = require("tap") +var cat = require("concat-stream") + +var server = require("./lib/server.js") +var common = require("./lib/common.js") + +var tgz = resolve(__dirname, "./fixtures/underscore/1.3.3/package.tgz") + +tap.test("basic fetch", function (t) { + server.expect("/underscore/-/underscore-1.3.3.tgz", function (req, res) { + t.equal(req.method, "GET", "got expected method") + + res.writeHead(200, { + "content-type" : "application/x-tar", + "content-encoding" : "gzip" + }) + + createReadStream(tgz).pipe(res) + }) + + var client = common.freshClient() + client.fetch( + "http://localhost:1337/underscore/-/underscore-1.3.3.tgz", + null, + function (er, res) { + t.ifError(er, "loaded successfully") + + var sink = cat(function (data) { + t.deepEqual(data, readFileSync(tgz)) + t.end() + }) + + res.on("error", function (error) { + t.ifError(error, "no errors on stream") + }) + + res.pipe(sink) + } + ) +}) diff --git a/deps/npm/node_modules/npm-registry-client/test/fetch-408.js b/deps/npm/node_modules/npm-registry-client/test/fetch-408.js new file mode 100644 index 00000000000..bdd8bf07034 --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/test/fetch-408.js @@ -0,0 +1,52 @@ +var resolve = require("path").resolve +var createReadStream = require("graceful-fs").createReadStream +var readFileSync = require("graceful-fs").readFileSync + +var tap = require("tap") +var cat = require("concat-stream") + +var server = require("./lib/server.js") +var common = require("./lib/common.js") + +var tgz = resolve(__dirname, "./fixtures/underscore/1.3.3/package.tgz") + +tap.test("fetch with retry on timeout", function (t) { + server.expect("/underscore/-/underscore-1.3.3.tgz", function (req, res) { + t.equal(req.method, "GET", "got expected method") + + res.writeHead(408) + res.end() + }) + + server.expect("/underscore/-/underscore-1.3.3.tgz", function (req, res) { + t.equal(req.method, "GET", "got expected method") + + res.writeHead(200, { + "content-type" : "application/x-tar", + "content-encoding" : "gzip" + }) + + createReadStream(tgz).pipe(res) + }) + + var client = common.freshClient() + client.conf.set("fetch-retry-mintimeout", 100) + client.fetch( + "http://localhost:1337/underscore/-/underscore-1.3.3.tgz", + {}, + function (er, res) { + t.ifError(er, "loaded successfully") + + var sink = cat(function (data) { + t.deepEqual(data, readFileSync(tgz)) + t.end() + }) + + res.on("error", function (error) { + t.ifError(error, "no errors on stream") + }) + + res.pipe(sink) + } + ) +}) diff --git a/deps/npm/node_modules/npm-registry-client/test/fetch-503.js b/deps/npm/node_modules/npm-registry-client/test/fetch-503.js new file mode 100644 index 00000000000..91cd6754daf --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/test/fetch-503.js @@ -0,0 +1,52 @@ +var resolve = require("path").resolve +var createReadStream = require("graceful-fs").createReadStream +var readFileSync = require("graceful-fs").readFileSync + +var tap = require("tap") +var cat = require("concat-stream") + +var server = require("./lib/server.js") +var common = require("./lib/common.js") + +var tgz = resolve(__dirname, "./fixtures/underscore/1.3.3/package.tgz") + +tap.test("fetch with retry on server error", function (t) { + server.expect("/underscore/-/underscore-1.3.3.tgz", function (req, res) { + t.equal(req.method, "GET", "got expected method") + + res.writeHead(503) + res.end() + }) + + server.expect("/underscore/-/underscore-1.3.3.tgz", function (req, res) { + t.equal(req.method, "GET", "got expected method") + + res.writeHead(200, { + "content-type" : "application/x-tar", + "content-encoding" : "gzip" + }) + + createReadStream(tgz).pipe(res) + }) + + var client = common.freshClient() + client.conf.set("fetch-retry-mintimeout", 100) + client.fetch( + "http://localhost:1337/underscore/-/underscore-1.3.3.tgz", + {}, + function (er, res) { + t.ifError(er, "loaded successfully") + + var sink = cat(function (data) { + t.deepEqual(data, readFileSync(tgz)) + t.end() + }) + + res.on("error", function (error) { + t.ifError(error, "no errors on stream") + }) + + res.pipe(sink) + } + ) +}) diff --git a/deps/npm/node_modules/npm-registry-client/test/fetch-basic.js b/deps/npm/node_modules/npm-registry-client/test/fetch-basic.js new file mode 100644 index 00000000000..2ce3b212b04 --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/test/fetch-basic.js @@ -0,0 +1,44 @@ +var resolve = require("path").resolve +var createReadStream = require("graceful-fs").createReadStream +var readFileSync = require("graceful-fs").readFileSync + +var tap = require("tap") +var cat = require("concat-stream") + +var server = require("./lib/server.js") +var common = require("./lib/common.js") + +var tgz = resolve(__dirname, "./fixtures/underscore/1.3.3/package.tgz") + +tap.test("basic fetch", function (t) { + server.expect("/underscore/-/underscore-1.3.3.tgz", function (req, res) { + t.equal(req.method, "GET", "got expected method") + + res.writeHead(200, { + "content-type" : "application/x-tar", + "content-encoding" : "gzip" + }) + + createReadStream(tgz).pipe(res) + }) + + var client = common.freshClient() + client.fetch( + "http://localhost:1337/underscore/-/underscore-1.3.3.tgz", + null, + function (er, res) { + t.ifError(er, "loaded successfully") + + var sink = cat(function (data) { + t.deepEqual(data, readFileSync(tgz)) + t.end() + }) + + res.on("error", function (error) { + t.ifError(error, "no errors on stream") + }) + + res.pipe(sink) + } + ) +}) diff --git a/deps/npm/node_modules/npm-registry-client/test/get-all.js b/deps/npm/node_modules/npm-registry-client/test/get-all.js index 86978b26703..75570fcbb6c 100644 --- a/deps/npm/node_modules/npm-registry-client/test/get-all.js +++ b/deps/npm/node_modules/npm-registry-client/test/get-all.js @@ -10,7 +10,7 @@ tap.test("basic request", function (t) { }) client.get("http://localhost:1337/-/all", null, function (er) { - t.notOk(er, "no error") + t.ifError(er, "no error") t.end() }) }) diff --git a/deps/npm/node_modules/npm-registry-client/test/get-basic.js b/deps/npm/node_modules/npm-registry-client/test/get-basic.js index 10c48b0b876..240dc876221 100644 --- a/deps/npm/node_modules/npm-registry-client/test/get-basic.js +++ b/deps/npm/node_modules/npm-registry-client/test/get-basic.js @@ -16,7 +16,11 @@ tap.test("basic request", function (t) { res.json(usroot) }) - t.plan(2) + server.expect("/@bigco%2funderscore", function (req, res) { + res.json(usroot) + }) + + t.plan(3) client.get("http://localhost:1337/underscore/1.3.3", null, function (er, data) { t.deepEqual(data, us) }) @@ -24,4 +28,8 @@ tap.test("basic request", function (t) { client.get("http://localhost:1337/underscore", null, function (er, data) { t.deepEqual(data, usroot) }) + + client.get("http://localhost:1337/@bigco%2funderscore", null, function (er, data) { + t.deepEqual(data, usroot) + }) }) diff --git a/deps/npm/node_modules/npm-registry-client/test/get-error-403.js b/deps/npm/node_modules/npm-registry-client/test/get-error-403.js new file mode 100644 index 00000000000..27406b1680c --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/test/get-error-403.js @@ -0,0 +1,33 @@ +var tap = require("tap") + +var server = require("./lib/server.js") +var common = require("./lib/common.js") + +tap.test("get fails with 403", function (t) { + server.expect("/habanero", function (req, res) { + t.equal(req.method, "GET", "got expected method") + + res.writeHead(403) + res.end("{\"error\":\"get that cat out of the toilet that's gross omg\"}") + }) + + var client = common.freshClient() + client.conf.set("fetch-retry-mintimeout", 100) + client.get( + "http://localhost:1337/habanero", + {}, + function (er) { + t.ok(er, "failed as expected") + + t.equal(er.statusCode, 403, "status code was attached as expected") + t.equal(er.code, "E403", "error code was formatted as expected") + t.equal( + er.message, + "get that cat out of the toilet that's gross omg : habanero", + "got error message" + ) + + t.end() + } + ) +}) diff --git a/deps/npm/node_modules/npm-registry-client/test/lib/common.js b/deps/npm/node_modules/npm-registry-client/test/lib/common.js index f9048c09453..bbf55ca3023 100644 --- a/deps/npm/node_modules/npm-registry-client/test/lib/common.js +++ b/deps/npm/node_modules/npm-registry-client/test/lib/common.js @@ -1,16 +1,76 @@ var resolve = require("path").resolve -var server = require('./server.js') -var RC = require('../../') + +var server = require("./server.js") +var RC = require("../../") +var toNerfDart = require("../../lib/util/nerf-dart.js") + +var REGISTRY = "http://localhost:" + server.port module.exports = { + port : server.port, + registry : REGISTRY, freshClient : function freshClient(config) { config = config || {} - config.cache = resolve(__dirname, '../fixtures/cache') - config.registry = 'http://localhost:' + server.port + config.cache = resolve(__dirname, "../fixtures/cache") + config.registry = REGISTRY + var container = { + get: function (k) { return config[k] }, + set: function (k, v) { config[k] = v }, + del: function (k) { delete config[k] }, + getCredentialsByURI: function(uri) { + var nerfed = toNerfDart(uri) + var c = {scope : nerfed} + + if (this.get(nerfed + ":_authToken")) { + c.token = this.get(nerfed + ":_authToken") + // the bearer token is enough, don't confuse things + return c + } + + if (this.get(nerfed + ":_password")) { + c.password = new Buffer(this.get(nerfed + ":_password"), "base64").toString("utf8") + } + + if (this.get(nerfed + ":username")) { + c.username = this.get(nerfed + ":username") + } + + if (this.get(nerfed + ":email")) { + c.email = this.get(nerfed + ":email") + } + + if (c.username && c.password) { + c.auth = new Buffer(c.username + ":" + c.password).toString("base64") + } + + return c + }, + setCredentialsByURI: function (uri, c) { + var nerfed = toNerfDart(uri) + + if (c.token) { + this.set(nerfed + ":_authToken", c.token, "user") + this.del(nerfed + ":_password", "user") + this.del(nerfed + ":username", "user") + this.del(nerfed + ":email", "user") + } + else if (c.username || c.password || c.email) { + this.del(nerfed + ":_authToken", "user") + + var encoded = new Buffer(c.password, "utf8").toString("base64") + this.set(nerfed + ":_password", encoded, "user") + this.set(nerfed + ":username", c.username, "user") + this.set(nerfed + ":email", c.email, "user") + } + else { + throw new Error("No credentials to set.") + } + } + } - var client = new RC(config) + var client = new RC(container) server.log = client.log - client.log.level = 'silent' + client.log.level = "silent" return client } diff --git a/deps/npm/node_modules/npm-registry-client/test/lib/server.js b/deps/npm/node_modules/npm-registry-client/test/lib/server.js index b195d9a9b30..37cfae04177 100644 --- a/deps/npm/node_modules/npm-registry-client/test/lib/server.js +++ b/deps/npm/node_modules/npm-registry-client/test/lib/server.js @@ -14,7 +14,7 @@ function handler (req, res) { req.connection.setTimeout(1000) // If we got authorization, make sure it's the right password. - if (req.headers.authorization) { + if (req.headers.authorization && req.headers.authorization.match(/^Basic/)) { var auth = req.headers.authorization.replace(/^Basic /, "") auth = new Buffer(auth, "base64").toString("utf8") assert.equal(auth, "username:%1234@asdf%") diff --git a/deps/npm/node_modules/npm-registry-client/test/publish-again-scoped.js b/deps/npm/node_modules/npm-registry-client/test/publish-again-scoped.js new file mode 100644 index 00000000000..97838ca44dc --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/test/publish-again-scoped.js @@ -0,0 +1,82 @@ +var tap = require("tap") +var fs = require("fs") + +var server = require("./lib/server.js") +var common = require("./lib/common.js") + +var nerfed = "//localhost:" + server.port + "/:" + +var configuration = {} +configuration[nerfed + "username"] = "username" +configuration[nerfed + "_password"] = new Buffer("%1234@asdf%").toString("base64") +configuration[nerfed + "email"] = "i@izs.me" + +var client = common.freshClient(configuration) + +tap.test("publish again", function (t) { + // not really a tarball, but doesn't matter + var tarball = require.resolve("../package.json") + var pd = fs.readFileSync(tarball, "base64") + var pkg = require("../package.json") + var lastTime = null + + server.expect("/@npm%2fnpm-registry-client", function (req, res) { + t.equal(req.method, "PUT") + var b = "" + req.setEncoding("utf8") + req.on("data", function (d) { + b += d + }) + + req.on("end", function () { + var o = lastTime = JSON.parse(b) + t.equal(o._id, "@npm/npm-registry-client") + t.equal(o["dist-tags"].latest, pkg.version) + t.has(o.versions[pkg.version], pkg) + t.same(o.maintainers, [ { name: "username", email: "i@izs.me" } ]) + var att = o._attachments[ pkg.name + "-" + pkg.version + ".tgz" ] + t.same(att.data, pd) + res.statusCode = 409 + res.json({reason: "must supply latest _rev to update existing package"}) + }) + }) + + server.expect("/@npm%2fnpm-registry-client?write=true", function (req, res) { + t.equal(req.method, "GET") + t.ok(lastTime) + for (var i in lastTime.versions) { + var v = lastTime.versions[i] + delete lastTime.versions[i] + lastTime.versions["0.0.2"] = v + lastTime["dist-tags"] = { latest: "0.0.2" } + } + lastTime._rev = "asdf" + res.json(lastTime) + }) + + server.expect("/@npm%2fnpm-registry-client", function (req, res) { + t.equal(req.method, "PUT") + t.ok(lastTime) + + var b = "" + req.setEncoding("utf8") + req.on("data", function (d) { + b += d + }) + + req.on("end", function() { + var o = JSON.parse(b) + t.equal(o._rev, "asdf") + t.deepEqual(o.versions["0.0.2"], o.versions[pkg.version]) + res.statusCode = 201 + res.json({created: true}) + }) + }) + + pkg.name = "@npm/npm-registry-client" + client.publish("http://localhost:1337/", pkg, tarball, function (er, data) { + if (er) throw er + t.deepEqual(data, { created: true }) + t.end() + }) +}) diff --git a/deps/npm/node_modules/npm-registry-client/test/publish-again.js b/deps/npm/node_modules/npm-registry-client/test/publish-again.js index 6d286fb7eba..39c368fd35b 100644 --- a/deps/npm/node_modules/npm-registry-client/test/publish-again.js +++ b/deps/npm/node_modules/npm-registry-client/test/publish-again.js @@ -3,16 +3,23 @@ var fs = require("fs") var server = require("./lib/server.js") var common = require("./lib/common.js") -var client = common.freshClient({ - username: "username", - password: "%1234@asdf%", - email: "i@izs.me", - _auth: new Buffer("username:%1234@asdf%").toString("base64"), - "always-auth": true -}) + +var nerfed = "//localhost:" + server.port + "/:" + +var configuration = {} +configuration[nerfed + "username"] = "username" +configuration[nerfed + "_password"] = new Buffer("%1234@asdf%").toString("base64") +configuration[nerfed + "email"] = "i@izs.me" + +var client = common.freshClient(configuration) tap.test("publish again", function (t) { + // not really a tarball, but doesn't matter + var tarball = require.resolve("../package.json") + var pd = fs.readFileSync(tarball, "base64") + var pkg = require("../package.json") var lastTime = null + server.expect("/npm-registry-client", function (req, res) { t.equal(req.method, "PUT") var b = "" @@ -66,11 +73,6 @@ tap.test("publish again", function (t) { }) }) - - // not really a tarball, but doesn't matter - var tarball = require.resolve("../package.json") - var pd = fs.readFileSync(tarball, "base64") - var pkg = require("../package.json") client.publish("http://localhost:1337/", pkg, tarball, function (er, data) { if (er) throw er t.deepEqual(data, { created: true }) diff --git a/deps/npm/node_modules/npm-registry-client/test/publish-scoped-auth-token.js b/deps/npm/node_modules/npm-registry-client/test/publish-scoped-auth-token.js new file mode 100644 index 00000000000..e1bb7dd1ee2 --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/test/publish-scoped-auth-token.js @@ -0,0 +1,52 @@ +var tap = require("tap") +var crypto = require("crypto") +var fs = require("fs") + +var server = require("./lib/server.js") +var common = require("./lib/common.js") + +var nerfed = "//localhost:" + server.port + "/:" + +var configuration = {} +configuration[nerfed + "_authToken"] = "of-glad-tidings" + +var client = common.freshClient(configuration) + +tap.test("publish", function (t) { + // not really a tarball, but doesn't matter + var tarball = require.resolve("../package.json") + var pd = fs.readFileSync(tarball, "base64") + var pkg = require("../package.json") + pkg.name = "@npm/npm-registry-client" + + server.expect("/@npm%2fnpm-registry-client", function (req, res) { + t.equal(req.method, "PUT") + t.equal(req.headers.authorization, "Bearer of-glad-tidings") + + var b = "" + req.setEncoding("utf8") + req.on("data", function (d) { + b += d + }) + + req.on("end", function () { + var o = JSON.parse(b) + t.equal(o._id, "@npm/npm-registry-client") + t.equal(o["dist-tags"].latest, pkg.version) + t.has(o.versions[pkg.version], pkg) + t.same(o.maintainers, o.versions[pkg.version].maintainers) + var att = o._attachments[ pkg.name + "-" + pkg.version + ".tgz" ] + t.same(att.data, pd) + var hash = crypto.createHash("sha1").update(pd, "base64").digest("hex") + t.equal(o.versions[pkg.version].dist.shasum, hash) + res.statusCode = 201 + res.json({created:true}) + }) + }) + + client.publish(common.registry, pkg, tarball, function (er, data) { + if (er) throw er + t.deepEqual(data, { created: true }) + t.end() + }) +}) diff --git a/deps/npm/node_modules/npm-registry-client/test/publish-scoped.js b/deps/npm/node_modules/npm-registry-client/test/publish-scoped.js new file mode 100644 index 00000000000..b5dea3649c3 --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/test/publish-scoped.js @@ -0,0 +1,57 @@ +var tap = require("tap") +var crypto = require("crypto") +var fs = require("fs") + +var server = require("./lib/server.js") +var common = require("./lib/common.js") + +var nerfed = "//localhost:" + server.port + "/:" + +var configuration = {} +configuration[nerfed + "username"] = "username" +configuration[nerfed + "_password"] = new Buffer("%1234@asdf%").toString("base64") +configuration[nerfed + "email"] = "ogd@aoaioxxysz.net" + +var client = common.freshClient(configuration) + +var _auth = new Buffer("username:%1234@asdf%").toString("base64") + +tap.test("publish", function (t) { + // not really a tarball, but doesn't matter + var tarball = require.resolve("../package.json") + var pd = fs.readFileSync(tarball, "base64") + var pkg = require("../package.json") + pkg.name = "@npm/npm-registry-client" + + server.expect("/@npm%2fnpm-registry-client", function (req, res) { + t.equal(req.method, "PUT") + t.equal(req.headers.authorization, "Basic " + _auth) + + var b = "" + req.setEncoding("utf8") + req.on("data", function (d) { + b += d + }) + + req.on("end", function () { + var o = JSON.parse(b) + t.equal(o._id, "@npm/npm-registry-client") + t.equal(o["dist-tags"].latest, pkg.version) + t.has(o.versions[pkg.version], pkg) + t.same(o.maintainers, [ { name: "username", email: "ogd@aoaioxxysz.net" } ]) + t.same(o.maintainers, o.versions[pkg.version].maintainers) + var att = o._attachments[ pkg.name + "-" + pkg.version + ".tgz" ] + t.same(att.data, pd) + var hash = crypto.createHash("sha1").update(pd, "base64").digest("hex") + t.equal(o.versions[pkg.version].dist.shasum, hash) + res.statusCode = 201 + res.json({created:true}) + }) + }) + + client.publish(common.registry, pkg, tarball, function (er, data) { + if (er) throw er + t.deepEqual(data, { created: true }) + t.end() + }) +}) diff --git a/deps/npm/node_modules/npm-registry-client/test/publish.js b/deps/npm/node_modules/npm-registry-client/test/publish.js index c34bf6c5340..2d76dfae202 100644 --- a/deps/npm/node_modules/npm-registry-client/test/publish.js +++ b/deps/npm/node_modules/npm-registry-client/test/publish.js @@ -4,16 +4,22 @@ var fs = require("fs") var server = require("./lib/server.js") var common = require("./lib/common.js") -var client = common.freshClient({ - username: "username", - password: "%1234@asdf%", - email: "i@izs.me", - _auth: new Buffer("username:%1234@asdf%").toString("base64"), - "always-auth": true -}) +var nerfed = "//localhost:" + server.port + "/:" + +var configuration = {} +configuration[nerfed + "username"] = "username" +configuration[nerfed + "_password"] = new Buffer("%1234@asdf%").toString("base64") +configuration[nerfed + "email"] = "i@izs.me" + +var client = common.freshClient(configuration) tap.test("publish", function (t) { + // not really a tarball, but doesn't matter + var tarball = require.resolve("../package.json") + var pd = fs.readFileSync(tarball, "base64") + var pkg = require("../package.json") + server.expect("/npm-registry-client", function (req, res) { t.equal(req.method, "PUT") var b = "" @@ -38,10 +44,6 @@ tap.test("publish", function (t) { }) }) - // not really a tarball, but doesn't matter - var tarball = require.resolve("../package.json") - var pd = fs.readFileSync(tarball, "base64") - var pkg = require("../package.json") client.publish("http://localhost:1337/", pkg, tarball, function (er, data) { if (er) throw er t.deepEqual(data, { created: true }) diff --git a/deps/npm/node_modules/npm-registry-client/test/request-gzip-content.js b/deps/npm/node_modules/npm-registry-client/test/request-gzip-content.js index 79c2e8dc02e..1085bfaca20 100644 --- a/deps/npm/node_modules/npm-registry-client/test/request-gzip-content.js +++ b/deps/npm/node_modules/npm-registry-client/test/request-gzip-content.js @@ -19,10 +19,12 @@ var pkg = { zlib.gzip(JSON.stringify(pkg), function (err, pkgGzip) { tap.test("request gzip package content", function (t) { + t.ifError(err, "example package compressed") + server.expect("GET", "/some-package-gzip/1.2.3", function (req, res) { res.statusCode = 200 - res.setHeader("Content-Encoding", "gzip"); - res.setHeader("Content-Type", "application/json"); + res.setHeader("Content-Encoding", "gzip") + res.setHeader("Content-Type", "application/json") res.end(pkgGzip) }) @@ -46,4 +48,4 @@ zlib.gzip(JSON.stringify(pkg), function (err, pkgGzip) { t.end() }) }) -}); +}) diff --git a/deps/npm/node_modules/npm-registry-client/test/star.js b/deps/npm/node_modules/npm-registry-client/test/star.js index 0e43e10d76d..43c8888ef20 100644 --- a/deps/npm/node_modules/npm-registry-client/test/star.js +++ b/deps/npm/node_modules/npm-registry-client/test/star.js @@ -2,18 +2,20 @@ var tap = require("tap") var server = require("./lib/server.js") var common = require("./lib/common.js") -var client = common.freshClient({ - username : "username", - password : "%1234@asdf%", - email : "ogd@aoaioxxysz.net", - _auth : new Buffer("username:%1234@asdf%").toString("base64"), - "always-auth" : true -}) - -var cache = require("./fixtures/underscore/cache.json") var DEP_USER = "username" +var nerfed = "//localhost:" + server.port + "/:" + +var configuration = {} +configuration[nerfed + "username"] = DEP_USER +configuration[nerfed + "_password"] = new Buffer("%1234@asdf%").toString("base64") +configuration[nerfed + "email"] = "i@izs.me" + +var client = common.freshClient(configuration) + +var cache = require("./fixtures/underscore/cache.json") + tap.test("star a package", function (t) { server.expect("GET", "/underscore?write=true", function (req, res) { t.equal(req.method, "GET") @@ -52,7 +54,7 @@ tap.test("star a package", function (t) { }) client.star("http://localhost:1337/underscore", true, function (error, data) { - t.notOk(error, "no errors") + t.ifError(error, "no errors") t.ok(data.starred, "was starred") t.end() diff --git a/deps/npm/node_modules/npm-registry-client/test/stars.js b/deps/npm/node_modules/npm-registry-client/test/stars.js index ae1ddbb49d6..28f8a98d766 100644 --- a/deps/npm/node_modules/npm-registry-client/test/stars.js +++ b/deps/npm/node_modules/npm-registry-client/test/stars.js @@ -2,13 +2,7 @@ var tap = require("tap") var server = require("./lib/server.js") var common = require("./lib/common.js") -var client = common.freshClient({ - username : "username", - password : "%1234@asdf%", - email : "ogd@aoaioxxysz.net", - _auth : new Buffer("username:%1234@asdf%").toString("base64"), - "always-auth" : true -}) +var client = common.freshClient() var users = [ "benjamincoe", @@ -24,7 +18,7 @@ tap.test("get the URL for the bugs page on a package", function (t) { }) client.stars("http://localhost:1337/", "sample", function (error, info) { - t.notOk(error, "no errors") + t.ifError(error, "no errors") t.deepEqual(info, users, "got the list of users") t.end() diff --git a/deps/npm/node_modules/npm-registry-client/test/tag.js b/deps/npm/node_modules/npm-registry-client/test/tag.js index 216ac6c520b..7551569307b 100644 --- a/deps/npm/node_modules/npm-registry-client/test/tag.js +++ b/deps/npm/node_modules/npm-registry-client/test/tag.js @@ -2,13 +2,15 @@ var tap = require("tap") var server = require("./lib/server.js") var common = require("./lib/common.js") -var client = common.freshClient({ - username : "username", - password : "%1234@asdf%", - email : "ogd@aoaioxxysz.net", - _auth : new Buffer("username:%1234@asdf%").toString("base64"), - "always-auth" : true -}) + +var nerfed = "//localhost:" + server.port + "/:" + +var configuration = {} +configuration[nerfed + "username"] = "username" +configuration[nerfed + "_password"] = new Buffer("%1234@asdf%").toString("base64") +configuration[nerfed + "email"] = "i@izs.me" + +var client = common.freshClient(configuration) tap.test("tag a package", function (t) { server.expect("PUT", "/underscore/not-lodash", function (req, res) { @@ -31,7 +33,7 @@ tap.test("tag a package", function (t) { }) client.tag("http://localhost:1337/underscore", {"1.3.2":{}}, "not-lodash", function (error, data) { - t.notOk(error, "no errors") + t.ifError(error, "no errors") t.ok(data.tagged, "was tagged") t.end() diff --git a/deps/npm/node_modules/npm-registry-client/test/unpublish-scoped.js b/deps/npm/node_modules/npm-registry-client/test/unpublish-scoped.js new file mode 100644 index 00000000000..0e5cb8606d1 --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/test/unpublish-scoped.js @@ -0,0 +1,59 @@ +var tap = require("tap") + +var server = require("./lib/server.js") +var common = require("./lib/common.js") + +var nerfed = "//localhost:" + server.port + "/:" + +var configuration = {} +configuration[nerfed + "_authToken"] = "of-glad-tidings" + +var client = common.freshClient(configuration) + +var cache = require("./fixtures/@npm/npm-registry-client/cache.json") + +var REV = "/-rev/213-0a1049cf56172b7d9a1184742c6477b9" +var VERSION = "3.0.6" + +tap.test("unpublish a package", function (t) { + server.expect("GET", "/@npm%2fnpm-registry-client?write=true", function (req, res) { + t.equal(req.method, "GET") + + res.json(cache) + }) + + server.expect("PUT", "/@npm%2fnpm-registry-client" + REV, function (req, res) { + t.equal(req.method, "PUT") + + var b = "" + req.setEncoding("utf-8") + req.on("data", function (d) { + b += d + }) + + req.on("end", function () { + var updated = JSON.parse(b) + t.notOk(updated.versions[VERSION]) + }) + + res.json(cache) + }) + + server.expect("GET", "/@npm%2fnpm-registry-client", function (req, res) { + t.equal(req.method, "GET") + + res.json(cache) + }) + + server.expect("DELETE", "/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-" + VERSION + ".tgz" + REV, function (req, res) { + t.equal(req.method, "DELETE") + + res.json({unpublished:true}) + }) + + client.unpublish("http://localhost:1337/@npm%2fnpm-registry-client", VERSION, function (error) { + t.ifError(error, "no errors") + + t.end() + }) +}) diff --git a/deps/npm/node_modules/npm-registry-client/test/unpublish.js b/deps/npm/node_modules/npm-registry-client/test/unpublish.js index 47c5617c8ac..7a60431faca 100644 --- a/deps/npm/node_modules/npm-registry-client/test/unpublish.js +++ b/deps/npm/node_modules/npm-registry-client/test/unpublish.js @@ -2,13 +2,13 @@ var tap = require("tap") var server = require("./lib/server.js") var common = require("./lib/common.js") -var client = common.freshClient({ - username : "username", - password : "%1234@asdf%", - email : "ogd@aoaioxxysz.net", - _auth : new Buffer("username:%1234@asdf%").toString("base64"), - "always-auth" : true -}) + +var nerfed = "//localhost:" + server.port + "/:" + +var configuration = {} +configuration[nerfed + "_authToken"] = "of-glad-tidings" + +var client = common.freshClient(configuration) var cache = require("./fixtures/underscore/cache.json") @@ -52,7 +52,7 @@ tap.test("unpublish a package", function (t) { }) client.unpublish("http://localhost:1337/underscore", VERSION, function (error) { - t.notOk(error, "no errors") + t.ifError(error, "no errors") t.end() }) diff --git a/deps/npm/node_modules/npm-registry-client/test/upload.js b/deps/npm/node_modules/npm-registry-client/test/upload.js index 434ad36f019..fa197e3681d 100644 --- a/deps/npm/node_modules/npm-registry-client/test/upload.js +++ b/deps/npm/node_modules/npm-registry-client/test/upload.js @@ -7,13 +7,12 @@ var server = require("./lib/server.js") var cache = require("./fixtures/underscore/cache.json") -var client = common.freshClient({ - username : "username", - password : "%1234@asdf%", - email : "ogd@aoaioxxysz.net", - _auth : new Buffer("username:%1234@asdf%").toString("base64"), - "always-auth" : true -}) +var nerfed = "//localhost:" + server.port + "/:" + +var configuration = {} +configuration[nerfed + "_authToken"] = "of-glad-tidings" + +var client = common.freshClient(configuration) function OneA() { Readable.call(this) @@ -22,7 +21,7 @@ function OneA() { } inherits(OneA, Readable) -tap.test("unpublish a package", function (t) { +tap.test("uploading a tarball", function (t) { server.expect("PUT", "/underscore", function (req, res) { t.equal(req.method, "PUT") @@ -30,7 +29,7 @@ tap.test("unpublish a package", function (t) { }) client.upload("http://localhost:1337/underscore", new OneA(), "daedabeefa", true, function (error) { - t.notOk(error, "no errors") + t.ifError(error, "no errors") t.end() }) diff --git a/deps/npm/node_modules/npm-registry-client/test/whoami.js b/deps/npm/node_modules/npm-registry-client/test/whoami.js new file mode 100644 index 00000000000..f9c817684f2 --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/test/whoami.js @@ -0,0 +1,30 @@ +var tap = require("tap") + +var server = require("./lib/server.js") +var common = require("./lib/common.js") + +var nerfed = "//localhost:" + server.port + "/:" + +var configuration = {} +configuration[nerfed + "_authToken"] = "not-bad-meaning-bad-but-bad-meaning-wombat" + +var client = common.freshClient(configuration) + +var WHOIAM = "wombat" + +tap.test("whoami", function (t) { + server.expect("GET", "/whoami", function (req, res) { + t.equal(req.method, "GET") + // only available for token-based auth for now + t.equal(req.headers.authorization, "Bearer not-bad-meaning-bad-but-bad-meaning-wombat") + + res.json({username : WHOIAM}) + }) + + client.whoami(common.registry, function (error, wombat) { + t.ifError(error, "no errors") + t.equal(wombat, WHOIAM, "im a wombat") + + t.end() + }) +}) diff --git a/deps/npm/node_modules/npmconf/.npmignore b/deps/npm/node_modules/npmconf/.npmignore index baa471ca800..485007791f3 100644 --- a/deps/npm/node_modules/npmconf/.npmignore +++ b/deps/npm/node_modules/npmconf/.npmignore @@ -1 +1,3 @@ /test/fixtures/userconfig-with-gc +.eslintrc +.jshintrc diff --git a/deps/npm/node_modules/npmconf/LICENSE b/deps/npm/node_modules/npmconf/LICENSE index 19129e315fe..0c44ae716db 100644 --- a/deps/npm/node_modules/npmconf/LICENSE +++ b/deps/npm/node_modules/npmconf/LICENSE @@ -1,15 +1,27 @@ -The ISC License +Copyright (c) Isaac Z. Schlueter ("Author") +All rights reserved. -Copyright (c) Isaac Z. Schlueter and Contributors +The BSD License -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. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: -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. +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/deps/npm/node_modules/npmconf/config-defs.js b/deps/npm/node_modules/npmconf/config-defs.js index 31522fb6434..b0b4acf22d3 100644 --- a/deps/npm/node_modules/npmconf/config-defs.js +++ b/deps/npm/node_modules/npmconf/config-defs.js @@ -16,7 +16,7 @@ try { } catch (er) { var util = require("util") log = { warn: function (m) { - console.warn(m + util.format.apply(util, [].slice.call(arguments, 1))) + console.warn(m + ' ' + util.format.apply(util, [].slice.call(arguments, 1))) } } } @@ -40,6 +40,12 @@ function validateSemver (data, k, val) { data[k] = semver.valid(val) } +function validateTag (data, k, val) { + val = ('' + val).trim() + if (!val || semver.validRange(val)) return false + data[k] = val +} + function validateStream (data, k, val) { if (!(val instanceof Stream)) return false data[k] = val @@ -49,6 +55,10 @@ nopt.typeDefs.semver = { type: semver, validate: validateSemver } nopt.typeDefs.Octal = { type: Octal, validate: validateOctal } nopt.typeDefs.Stream = { type: Stream, validate: validateStream } +// Don't let --tag=1.2.3 ever be a thing +var tag = {} +nopt.typeDefs.tag = { type: tag, validate: validateTag } + nopt.invalidHandler = function (k, val, type) { log.warn("invalid config", k + "=" + JSON.stringify(val)) @@ -58,6 +68,9 @@ nopt.invalidHandler = function (k, val, type) { } switch (type) { + case tag: + log.warn("invalid config", "Tag must not be a SemVer range") + break case Octal: log.warn("invalid config", "Must be octal number, starting with 0") break @@ -137,7 +150,6 @@ Object.defineProperty(exports, "defaults", {get: function () { , description : true , dev : false , editor : osenv.editor() - , email: "" , "engine-strict": false , force : false @@ -159,6 +171,7 @@ Object.defineProperty(exports, "defaults", {get: function () { , "init.author.name" : "" , "init.author.email" : "" , "init.author.url" : "" + , "init.version": "1.0.0" , "init.license": "ISC" , json: false , key: null @@ -192,6 +205,7 @@ Object.defineProperty(exports, "defaults", {get: function () { , "save-exact" : false , "save-optional" : false , "save-prefix": "^" + , scope : "" , searchopts: "" , searchexclude: null , searchsort: "name" @@ -210,7 +224,6 @@ Object.defineProperty(exports, "defaults", {get: function () { || process.getuid() !== 0 , usage : false , user : process.platform === "win32" ? 0 : "nobody" - , username : "" , userconfig : path.resolve(home, ".npmrc") , umask: process.umask ? process.umask() : parseInt("022", 8) , version : false @@ -239,7 +252,6 @@ exports.types = , description : Boolean , dev : Boolean , editor : String - , email: [null, String] , "engine-strict": Boolean , force : Boolean , "fetch-retries": Number @@ -260,13 +272,14 @@ exports.types = , "init.author.email" : String , "init.author.url" : ["", url] , "init.license": String + , "init.version": semver , json: Boolean , key: [null, String] , link: Boolean // local-address must be listed as an IP for a local network interface // must be IPv4 due to node bug , "local-address" : getLocalAddresses() - , loglevel : ["silent","win","error","warn","http","info","verbose","silly"] + , loglevel : ["silent","error","warn","http","info","verbose","silly"] , logstream : Stream , long : Boolean , message: String @@ -288,6 +301,7 @@ exports.types = , "save-exact" : Boolean , "save-optional" : Boolean , "save-prefix": String + , scope : String , searchopts : String , searchexclude: [null, String] , searchsort: [ "name", "-name" @@ -300,20 +314,18 @@ exports.types = , "sign-git-tag": Boolean , spin: ["always", Boolean] , "strict-ssl": Boolean - , tag : String + , tag : tag , tmp : path , unicode : Boolean , "unsafe-perm" : Boolean , usage : Boolean , user : [Number, String] - , username : String , userconfig : path , umask: Octal , version : Boolean , versions : Boolean , viewer: String , _exit : Boolean - , _password: String } function getLocalAddresses() { @@ -365,4 +377,5 @@ exports.shorthands = , y : ["--yes"] , n : ["--no-yes"] , B : ["--save-bundle"] + , C : ["--prefix"] } diff --git a/deps/npm/node_modules/npmconf/lib/get-credentials-by-uri.js b/deps/npm/node_modules/npmconf/lib/get-credentials-by-uri.js new file mode 100644 index 00000000000..6fb8f317077 --- /dev/null +++ b/deps/npm/node_modules/npmconf/lib/get-credentials-by-uri.js @@ -0,0 +1,57 @@ +var assert = require("assert") + +var toNerfDart = require("./nerf-dart.js") + +module.exports = getCredentialsByURI + +function getCredentialsByURI (uri) { + assert(uri && typeof uri === "string", "registry URL is required") + var nerfed = toNerfDart(uri) + var defnerf = toNerfDart(this.get("registry")) + + var c = {scope : nerfed} + + if (this.get(nerfed + ":_authToken")) { + c.token = this.get(nerfed + ":_authToken") + // the bearer token is enough, don't confuse things + return c + } + + // Handle the old-style _auth= style for the default + // registry, if set. + // + // XXX(isaacs): Remove when npm 1.4 is no longer relevant + var authDef = this.get("_auth") + var userDef = this.get("username") + var passDef = this.get("_password") + if (authDef && !(userDef && passDef)) { + authDef = new Buffer(authDef, "base64").toString() + authDef = authDef.split(":") + userDef = authDef.shift() + passDef = authDef.join(":") + } + + if (this.get(nerfed + ":_password")) { + c.password = new Buffer(this.get(nerfed + ":_password"), "base64").toString("utf8") + } else if (nerfed === defnerf && passDef) { + c.password = passDef + } + + if (this.get(nerfed + ":username")) { + c.username = this.get(nerfed + ":username") + } else if (nerfed === defnerf && userDef) { + c.username = userDef + } + + if (this.get(nerfed + ":email")) { + c.email = this.get(nerfed + ":email") + } else if (this.get("email")) { + c.email = this.get("email") + } + + if (c.username && c.password) { + c.auth = new Buffer(c.username + ":" + c.password).toString("base64") + } + + return c +} diff --git a/deps/npm/node_modules/npmconf/lib/nerf-dart.js b/deps/npm/node_modules/npmconf/lib/nerf-dart.js new file mode 100644 index 00000000000..3b26a56c65f --- /dev/null +++ b/deps/npm/node_modules/npmconf/lib/nerf-dart.js @@ -0,0 +1,21 @@ +var url = require("url") + +module.exports = toNerfDart + +/** + * Maps a URL to an identifier. + * + * Name courtesy schiffertronix media LLC, a New Jersey corporation + * + * @param {String} uri The URL to be nerfed. + * + * @returns {String} A nerfed URL. + */ +function toNerfDart(uri) { + var parsed = url.parse(uri) + parsed.pathname = "/" + delete parsed.protocol + delete parsed.auth + + return url.format(parsed) +} diff --git a/deps/npm/node_modules/npmconf/lib/set-credentials-by-uri.js b/deps/npm/node_modules/npmconf/lib/set-credentials-by-uri.js new file mode 100644 index 00000000000..2fa0d19e369 --- /dev/null +++ b/deps/npm/node_modules/npmconf/lib/set-credentials-by-uri.js @@ -0,0 +1,34 @@ +var assert = require("assert") + +var toNerfDart = require("./nerf-dart.js") + +module.exports = setCredentialsByURI + +function setCredentialsByURI (uri, c) { + assert(uri && typeof uri === "string", "registry URL is required") + assert(c && typeof c === "object", "credentials are required") + + var nerfed = toNerfDart(uri) + + if (c.token) { + this.set(nerfed + ":_authToken", c.token, "user") + this.del(nerfed + ":_password", "user") + this.del(nerfed + ":username", "user") + this.del(nerfed + ":email", "user") + } + else if (c.username || c.password || c.email) { + assert(c.username, "must include username") + assert(c.password, "must include password") + assert(c.email, "must include email address") + + this.del(nerfed + ":_authToken", "user") + + var encoded = new Buffer(c.password, "utf8").toString("base64") + this.set(nerfed + ":_password", encoded, "user") + this.set(nerfed + ":username", c.username, "user") + this.set(nerfed + ":email", c.email, "user") + } + else { + throw new Error("No credentials to set.") + } +} diff --git a/deps/npm/node_modules/npmconf/node_modules/config-chain/node_modules/proto-list/package.json b/deps/npm/node_modules/npmconf/node_modules/config-chain/node_modules/proto-list/package.json index 2dff2917c05..391d876d2f1 100644 --- a/deps/npm/node_modules/npmconf/node_modules/config-chain/node_modules/proto-list/package.json +++ b/deps/npm/node_modules/npmconf/node_modules/config-chain/node_modules/proto-list/package.json @@ -29,7 +29,7 @@ "homepage": "https://github.com/isaacs/proto-list", "_id": "proto-list@1.2.3", "_shasum": "6235554a1bca1f0d15e3ca12ca7329d5def42bd9", - "_from": "proto-list@~1.2.1", + "_from": "proto-list@>=1.2.1-0 <1.3.0-0", "_npmVersion": "1.4.14", "_npmUser": { "name": "isaacs", @@ -46,6 +46,5 @@ "tarball": "http://registry.npmjs.org/proto-list/-/proto-list-1.2.3.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.3.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.3.tgz" } diff --git a/deps/npm/node_modules/npmconf/node_modules/config-chain/package.json b/deps/npm/node_modules/npmconf/node_modules/config-chain/package.json index c59f5ceeb6d..bec4626e6de 100644 --- a/deps/npm/node_modules/npmconf/node_modules/config-chain/package.json +++ b/deps/npm/node_modules/npmconf/node_modules/config-chain/package.json @@ -32,7 +32,7 @@ "shasum": "0943d0b7227213a20d4eaff4434f4a1c0a052cad", "tarball": "http://registry.npmjs.org/config-chain/-/config-chain-1.1.8.tgz" }, - "_from": "config-chain@~1.1.8", + "_from": "config-chain@>=1.1.8-0 <1.2.0-0", "_npmVersion": "1.3.6", "_npmUser": { "name": "dominictarr", diff --git a/deps/npm/node_modules/npmconf/npmconf.js b/deps/npm/node_modules/npmconf/npmconf.js index a17705447a6..7607b50f829 100644 --- a/deps/npm/node_modules/npmconf/npmconf.js +++ b/deps/npm/node_modules/npmconf/npmconf.js @@ -10,7 +10,6 @@ var nopt = require('nopt') var ini = require('ini') var Octal = configDefs.Octal var mkdirp = require('mkdirp') -var path = require('path') exports.load = load exports.Conf = Conf @@ -181,7 +180,7 @@ function load_(builtin, rc, cli, cb) { finalize() } - function finalize(er, cadata) { + function finalize(er) { if (er) { return cb(er) } @@ -217,6 +216,8 @@ Conf.prototype.loadCAFile = require('./lib/load-cafile.js') Conf.prototype.loadUid = require('./lib/load-uid.js') Conf.prototype.setUser = require('./lib/set-user.js') Conf.prototype.findPrefix = require('./lib/find-prefix.js') +Conf.prototype.getCredentialsByURI = require('./lib/get-credentials-by-uri.js') +Conf.prototype.setCredentialsByURI = require('./lib/set-credentials-by-uri.js') Conf.prototype.loadExtras = function(cb) { this.setUser(function(er) { @@ -235,7 +236,7 @@ Conf.prototype.save = function (where, cb) { var target = this.sources[where] if (!target || !(target.path || target.source) || !target.data) { if (where !== 'builtin') - var er = new Error('bad save target: '+where) + var er = new Error('bad save target: ' + where) if (cb) { process.nextTick(cb.bind(null, er)) return this @@ -252,28 +253,13 @@ Conf.prototype.save = function (where, cb) { return this } - var data = target.data - - if (typeof data._password === 'string' && - typeof data.username === 'string') { - var auth = data.username + ':' + data._password - data = Object.keys(data).reduce(function (c, k) { - if (k === 'username' || k === '_password') - return c - c[k] = data[k] - return c - }, { _auth: new Buffer(auth, 'utf8').toString('base64') }) - delete data.username - delete data._password - } - - data = ini.stringify(data) + var data = ini.stringify(target.data) then = then.bind(this) done = done.bind(this) this._saving ++ - var mode = where === 'user' ? 0600 : 0666 + var mode = where === 'user' ? "0600" : "0666" if (!data.trim()) { fs.unlink(target.path, function (er) { // ignore the possible error (e.g. the file doesn't exist) @@ -338,13 +324,6 @@ Conf.prototype.add = function (data, marker) { Object.keys(data).forEach(function (k) { data[k] = parseField(data[k], k) }) - if (Object.prototype.hasOwnProperty.call(data, '_auth')) { - var auth = new Buffer(data._auth, 'base64').toString('utf8').split(':') - var username = auth.shift() - var password = auth.join(':') - data.username = username - data._password = password - } return CC.prototype.add.call(this, data, marker) } @@ -367,7 +346,7 @@ Conf.prototype.addEnv = function (env) { return CC.prototype.addEnv.call(this, '', conf, 'env') } -function parseField (f, k, emptyIsFalse) { +function parseField (f, k) { if (typeof f !== 'string' && !(f instanceof String)) return f @@ -415,7 +394,7 @@ function envReplace (f) { // replace any ${ENV} values with the appropriate environ. var envExpr = /(\\*)\$\{([^}]+)\}/g - return f.replace(envExpr, function (orig, esc, name, i, s) { + return f.replace(envExpr, function (orig, esc, name) { esc = esc.length && esc.length % 2 if (esc) return orig @@ -427,7 +406,7 @@ function envReplace (f) { function validate (cl) { // warn about invalid configs at every level. - cl.list.forEach(function (conf, level) { + cl.list.forEach(function (conf) { nopt.clean(conf, configDefs.types) }) diff --git a/deps/npm/node_modules/npmconf/package.json b/deps/npm/node_modules/npmconf/package.json index 55daab66e1e..2699e90b836 100644 --- a/deps/npm/node_modules/npmconf/package.json +++ b/deps/npm/node_modules/npmconf/package.json @@ -1,6 +1,6 @@ { "name": "npmconf", - "version": "1.1.8", + "version": "2.0.9", "description": "The config thing npm uses", "main": "npmconf.js", "directories": { @@ -14,7 +14,7 @@ "nopt": "~3.0.1", "once": "~1.3.0", "osenv": "^0.1.0", - "semver": "2", + "semver": "2 || 3 || 4", "uid-number": "0.0.5" }, "devDependencies": { @@ -39,15 +39,33 @@ "email": "i@izs.me", "url": "http://blog.izs.me" }, - "license": "ISC", - "readme": "# npmconf\n\nThe config thing npm uses\n\nIf you are interested in interacting with the config settings that npm\nuses, then use this module.\n\nHowever, if you are writing a new Node.js program, and want\nconfiguration functionality similar to what npm has, but for your\nown thing, then I'd recommend using [rc](https://github.com/dominictarr/rc),\nwhich is probably what you want.\n\nIf I were to do it all over again, that's what I'd do for npm. But,\nalas, there are many systems depending on many of the particulars of\nnpm's configuration setup, so it's not worth the cost of changing.\n\n## USAGE\n\n```javascript\nvar npmconf = require('npmconf')\n\n// pass in the cli options that you read from the cli\n// or whatever top-level configs you want npm to use for now.\nnpmconf.load({some:'configs'}, function (er, conf) {\n // do stuff with conf\n conf.get('some', 'cli') // 'configs'\n conf.get('username') // 'joebobwhatevers'\n conf.set('foo', 'bar', 'user')\n conf.save('user', function (er) {\n // foo = bar is now saved to ~/.npmrc or wherever\n })\n})\n```\n", - "readmeFilename": "README.md", - "gitHead": "98e8ed0e2a307470f8db14d2727a165d8524b567", + "license": "BSD", + "gitHead": "1f07a91b86f3bbba00967d7079dc6a456e746734", "bugs": { "url": "https://github.com/isaacs/npmconf/issues" }, "homepage": "https://github.com/isaacs/npmconf", - "_id": "npmconf@1.1.8", - "_shasum": "350e3d7a4da8e4958dfd0391c81e9a750b01cde2", - "_from": "npmconf@^1.1.8" + "_id": "npmconf@2.0.9", + "_shasum": "5c87e5fb308104eceeca781e3d9115d216351ef2", + "_from": "npmconf@>=2.0.8-0 <2.1.0-0", + "_npmVersion": "2.0.0-beta.3", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + }, + { + "name": "othiym23", + "email": "ogd@aoaioxxysz.net" + } + ], + "dist": { + "shasum": "5c87e5fb308104eceeca781e3d9115d216351ef2", + "tarball": "http://registry.npmjs.org/npmconf/-/npmconf-2.0.9.tgz" + }, + "_resolved": "https://registry.npmjs.org/npmconf/-/npmconf-2.0.9.tgz" } diff --git a/deps/npm/node_modules/npmconf/test/00-setup.js b/deps/npm/node_modules/npmconf/test/00-setup.js index d009e81eb6b..3f5109f0439 100644 --- a/deps/npm/node_modules/npmconf/test/00-setup.js +++ b/deps/npm/node_modules/npmconf/test/00-setup.js @@ -3,6 +3,30 @@ var userconfigSrc = path.resolve(__dirname, 'fixtures', 'userconfig') exports.userconfig = userconfigSrc + '-with-gc' exports.globalconfig = path.resolve(__dirname, 'fixtures', 'globalconfig') exports.builtin = path.resolve(__dirname, 'fixtures', 'builtin') +exports.ucData = + { globalconfig: exports.globalconfig, + email: 'i@izs.me', + 'env-thing': 'asdf', + 'init.author.name': 'Isaac Z. Schlueter', + 'init.author.email': 'i@izs.me', + 'init.author.url': 'http://blog.izs.me/', + 'init.version': '1.2.3', + 'proprietary-attribs': false, + 'npm:publishtest': true, + '_npmjs.org:couch': 'https://admin:password@localhost:5984/registry', + 'npm-www:nocache': '1', + nodedir: '/Users/isaacs/dev/js/node-v0.8', + 'sign-git-tag': true, + message: 'v%s', + 'strict-ssl': false, + 'tmp': process.env.HOME + '/.tmp', + _auth: 'dXNlcm5hbWU6cGFzc3dvcmQ=', + _token: + { AuthSession: 'yabba-dabba-doodle', + version: '1', + expires: '1345001053415', + path: '/', + httponly: true } } // set the userconfig in the env // unset anything else that npm might be trying to foist on us diff --git a/deps/npm/node_modules/npmconf/test/basic.js b/deps/npm/node_modules/npmconf/test/basic.js index 29d708b3a67..e3a684f947a 100644 --- a/deps/npm/node_modules/npmconf/test/basic.js +++ b/deps/npm/node_modules/npmconf/test/basic.js @@ -5,32 +5,7 @@ var path = require('path') var projectData = {} -var ucData = - { globalconfig: common.globalconfig, - email: 'i@izs.me', - 'env-thing': 'asdf', - 'init.author.name': 'Isaac Z. Schlueter', - 'init.author.email': 'i@izs.me', - 'init.author.url': 'http://blog.izs.me/', - 'proprietary-attribs': false, - 'npm:publishtest': true, - '_npmjs.org:couch': 'https://admin:password@localhost:5984/registry', - _auth: 'dXNlcm5hbWU6cGFzc3dvcmQ=', - 'npm-www:nocache': '1', - nodedir: '/Users/isaacs/dev/js/node-v0.8', - 'sign-git-tag': true, - message: 'v%s', - 'strict-ssl': false, - 'tmp': process.env.HOME + '/.tmp', - username : "username", - _password : "password", - _token: - { AuthSession: 'yabba-dabba-doodle', - version: '1', - expires: '1345001053415', - path: '/', - httponly: true } } - +var ucData = common.ucData var envData = common.envData var envDataFix = common.envDataFix diff --git a/deps/npm/node_modules/npmconf/test/builtin.js b/deps/npm/node_modules/npmconf/test/builtin.js index 15cb9083aaf..c94de8abdcb 100644 --- a/deps/npm/node_modules/npmconf/test/builtin.js +++ b/deps/npm/node_modules/npmconf/test/builtin.js @@ -3,31 +3,7 @@ var npmconf = require('../npmconf.js') var common = require('./00-setup.js') var path = require('path') -var ucData = - { globalconfig: common.globalconfig, - email: 'i@izs.me', - 'env-thing': 'asdf', - 'init.author.name': 'Isaac Z. Schlueter', - 'init.author.email': 'i@izs.me', - 'init.author.url': 'http://blog.izs.me/', - 'proprietary-attribs': false, - 'npm:publishtest': true, - '_npmjs.org:couch': 'https://admin:password@localhost:5984/registry', - _auth: 'dXNlcm5hbWU6cGFzc3dvcmQ=', - 'npm-www:nocache': '1', - nodedir: '/Users/isaacs/dev/js/node-v0.8', - 'sign-git-tag': true, - message: 'v%s', - 'strict-ssl': false, - 'tmp': process.env.HOME + '/.tmp', - username : "username", - _password : "password", - _token: - { AuthSession: 'yabba-dabba-doodle', - version: '1', - expires: '1345001053415', - path: '/', - httponly: true } } +var ucData = common.ucData var envData = common.envData var envDataFix = common.envDataFix diff --git a/deps/npm/node_modules/npmconf/test/credentials.js b/deps/npm/node_modules/npmconf/test/credentials.js new file mode 100644 index 00000000000..85632f9f11e --- /dev/null +++ b/deps/npm/node_modules/npmconf/test/credentials.js @@ -0,0 +1,166 @@ +var test = require("tap").test + +var npmconf = require("../npmconf.js") +var common = require("./00-setup.js") + +var URI = "https://registry.lvh.me:8661/" + +test("getting scope with no credentials set", function (t) { + npmconf.load({}, function (er, conf) { + t.ifError(er, "configuration loaded") + + var basic = conf.getCredentialsByURI(URI) + t.equal(basic.scope, "//registry.lvh.me:8661/", "nerfed URL extracted") + + t.end() + }) +}) + +test("trying to set credentials with no URI", function (t) { + npmconf.load(common.builtin, function (er, conf) { + t.ifError(er, "configuration loaded") + + t.throws(function () { + conf.setCredentialsByURI() + }, "enforced missing URI") + + t.end() + }) +}) + +test("set with missing credentials object", function (t) { + npmconf.load(common.builtin, function (er, conf) { + t.ifError(er, "configuration loaded") + + t.throws(function () { + conf.setCredentialsByURI(URI) + }, "enforced missing credentials") + + t.end() + }) +}) + +test("set with empty credentials object", function (t) { + npmconf.load(common.builtin, function (er, conf) { + t.ifError(er, "configuration loaded") + + t.throws(function () { + conf.setCredentialsByURI(URI, {}) + }, "enforced missing credentials") + + t.end() + }) +}) + +test("set with token", function (t) { + npmconf.load(common.builtin, function (er, conf) { + t.ifError(er, "configuration loaded") + + t.doesNotThrow(function () { + conf.setCredentialsByURI(URI, {token : "simple-token"}) + }, "needs only token") + + var expected = { + scope : "//registry.lvh.me:8661/", + token : "simple-token" + } + + t.same(conf.getCredentialsByURI(URI), expected, "got bearer token and scope") + + t.end() + }) +}) + +test("set with missing username", function (t) { + npmconf.load(common.builtin, function (er, conf) { + t.ifError(er, "configuration loaded") + + var credentials = { + password : "password", + email : "ogd@aoaioxxysz.net" + } + + t.throws(function () { + conf.setCredentialsByURI(URI, credentials) + }, "enforced missing email") + + t.end() + }) +}) + +test("set with missing password", function (t) { + npmconf.load(common.builtin, function (er, conf) { + t.ifError(er, "configuration loaded") + + var credentials = { + username : "username", + email : "ogd@aoaioxxysz.net" + } + + t.throws(function () { + conf.setCredentialsByURI(URI, credentials) + }, "enforced missing email") + + t.end() + }) +}) + +test("set with missing email", function (t) { + npmconf.load(common.builtin, function (er, conf) { + t.ifError(er, "configuration loaded") + + var credentials = { + username : "username", + password : "password" + } + + t.throws(function () { + conf.setCredentialsByURI(URI, credentials) + }, "enforced missing email") + + t.end() + }) +}) + +test("set with old-style credentials", function (t) { + npmconf.load(common.builtin, function (er, conf) { + t.ifError(er, "configuration loaded") + + var credentials = { + username : "username", + password : "password", + email : "ogd@aoaioxxysz.net" + } + + t.doesNotThrow(function () { + conf.setCredentialsByURI(URI, credentials) + }, "requires all of username, password, and email") + + var expected = { + scope : "//registry.lvh.me:8661/", + username : "username", + password : "password", + email : "ogd@aoaioxxysz.net", + auth : "dXNlcm5hbWU6cGFzc3dvcmQ=" + } + + t.same(conf.getCredentialsByURI(URI), expected, "got credentials") + + t.end() + }) +}) + +test("get old-style credentials for default registry", function (t) { + npmconf.load(common.builtin, function (er, conf) { + var actual = conf.getCredentialsByURI(conf.get("registry")) + var expected = { + scope: '//registry.npmjs.org/', + password: 'password', + username: 'username', + email: 'i@izs.me', + auth: 'dXNlcm5hbWU6cGFzc3dvcmQ=' + } + t.same(actual, expected) + t.end() + }) +}) diff --git a/deps/npm/node_modules/npmconf/test/fixtures/userconfig b/deps/npm/node_modules/npmconf/test/fixtures/userconfig index bda1eb82ae8..d600c0664e2 100644 --- a/deps/npm/node_modules/npmconf/test/fixtures/userconfig +++ b/deps/npm/node_modules/npmconf/test/fixtures/userconfig @@ -3,16 +3,17 @@ env-thing = ${random_env_var} init.author.name = Isaac Z. Schlueter init.author.email = i@izs.me init.author.url = http://blog.izs.me/ +init.version = 1.2.3 proprietary-attribs = false npm:publishtest = true _npmjs.org:couch = https://admin:password@localhost:5984/registry -_auth = dXNlcm5hbWU6cGFzc3dvcmQ= npm-www:nocache = 1 nodedir = /Users/isaacs/dev/js/node-v0.8 sign-git-tag = true message = v%s strict-ssl = false tmp = ~/.tmp +_auth = dXNlcm5hbWU6cGFzc3dvcmQ= [_token] AuthSession = yabba-dabba-doodle diff --git a/deps/npm/node_modules/npmconf/test/project.js b/deps/npm/node_modules/npmconf/test/project.js index fa21e43d22b..d9a0bdbcc5e 100644 --- a/deps/npm/node_modules/npmconf/test/project.js +++ b/deps/npm/node_modules/npmconf/test/project.js @@ -7,32 +7,7 @@ var projectRc = path.resolve(fix, '.npmrc') var projectData = { just: 'testing' } -var ucData = - { globalconfig: common.globalconfig, - email: 'i@izs.me', - 'env-thing': 'asdf', - 'init.author.name': 'Isaac Z. Schlueter', - 'init.author.email': 'i@izs.me', - 'init.author.url': 'http://blog.izs.me/', - 'proprietary-attribs': false, - 'npm:publishtest': true, - '_npmjs.org:couch': 'https://admin:password@localhost:5984/registry', - _auth: 'dXNlcm5hbWU6cGFzc3dvcmQ=', - 'npm-www:nocache': '1', - nodedir: '/Users/isaacs/dev/js/node-v0.8', - 'sign-git-tag': true, - message: 'v%s', - 'strict-ssl': false, - 'tmp': process.env.HOME + '/.tmp', - username : "username", - _password : "password", - _token: - { AuthSession: 'yabba-dabba-doodle', - version: '1', - expires: '1345001053415', - path: '/', - httponly: true } } - +var ucData = common.ucData var envData = common.envData var envDataFix = common.envDataFix diff --git a/deps/npm/node_modules/npmconf/test/save.js b/deps/npm/node_modules/npmconf/test/save.js index 64b114449ee..0d2f1978f98 100644 --- a/deps/npm/node_modules/npmconf/test/save.js +++ b/deps/npm/node_modules/npmconf/test/save.js @@ -10,16 +10,15 @@ var expectConf = 'init.author.name = Isaac Z. Schlueter', 'init.author.email = i@izs.me', 'init.author.url = http://blog.izs.me/', + 'init.version = 1.2.3', 'proprietary-attribs = false', 'npm:publishtest = true', '_npmjs.org:couch = https://admin:password@localhost:5984/registry', - '_auth = dXNlcm5hbWU6cGFzc3dvcmQ=', 'npm-www:nocache = 1', 'sign-git-tag = false', 'message = v%s', 'strict-ssl = false', - 'username = username', - '_password = password', + '_auth = dXNlcm5hbWU6cGFzc3dvcmQ=', '', '[_token]', 'AuthSession = yabba-dabba-doodle', @@ -35,14 +34,15 @@ var expectFile = 'init.author.name = Isaac Z. Schlueter', 'init.author.email = i@izs.me', 'init.author.url = http://blog.izs.me/', + 'init.version = 1.2.3', 'proprietary-attribs = false', 'npm:publishtest = true', '_npmjs.org:couch = https://admin:password@localhost:5984/registry', - '_auth = dXNlcm5hbWU6cGFzc3dvcmQ=', 'npm-www:nocache = 1', 'sign-git-tag = false', 'message = v%s', 'strict-ssl = false', + '_auth = dXNlcm5hbWU6cGFzc3dvcmQ=', '', '[_token]', 'AuthSession = yabba-dabba-doodle', diff --git a/deps/npm/node_modules/npmconf/test/semver-tag.js b/deps/npm/node_modules/npmconf/test/semver-tag.js new file mode 100644 index 00000000000..b0ce27f1b3d --- /dev/null +++ b/deps/npm/node_modules/npmconf/test/semver-tag.js @@ -0,0 +1,65 @@ +var test = require('tap').test +var npmconf = require('../npmconf.js') +var common = require('./00-setup.js') +var path = require('path') + +var ucData = common.ucData + +var envData = common.envData +var envDataFix = common.envDataFix + +var gcData = { 'package-config:foo': 'boo' } + +var biData = { 'builtin-config': true } + +var cli = { tag: 'v2.x' } + +var projectData = {} + +var expectList = +[ cli, + envDataFix, + projectData, + ucData, + gcData, + biData ] + + +var expectSources = +{ cli: { data: cli }, + env: + { data: envDataFix, + source: envData, + prefix: '' }, + project: + { path: path.resolve(__dirname, '..', '.npmrc'), + type: 'ini', + data: projectData }, + user: + { path: common.userconfig, + type: 'ini', + data: ucData }, + global: + { path: common.globalconfig, + type: 'ini', + data: gcData }, + builtin: { data: biData } } + +test('tag cannot be a SemVer', function (t) { + var messages = [] + console.warn = function (m) { + messages.push(m) + } + + var expect = [ + 'invalid config tag="v2.x"', + 'invalid config Tag must not be a SemVer range' + ] + + npmconf.load(cli, common.builtin, function (er, conf) { + if (er) throw er + t.equal(conf.get('tag'), 'latest') + t.same(messages, expect) + t.end() + }) +}) diff --git a/deps/npm/node_modules/read-installed/node_modules/debuglog/LICENSE b/deps/npm/node_modules/read-installed/node_modules/debuglog/LICENSE new file mode 100644 index 00000000000..a3187cc1002 --- /dev/null +++ b/deps/npm/node_modules/read-installed/node_modules/debuglog/LICENSE @@ -0,0 +1,19 @@ +Copyright Joyent, Inc. and other Node 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. diff --git a/deps/npm/node_modules/read-installed/node_modules/debuglog/README.md b/deps/npm/node_modules/read-installed/node_modules/debuglog/README.md new file mode 100644 index 00000000000..dc6fccecc32 --- /dev/null +++ b/deps/npm/node_modules/read-installed/node_modules/debuglog/README.md @@ -0,0 +1,40 @@ +# debuglog - backport of util.debuglog() from node v0.11 + +To facilitate using the `util.debuglog()` function that will be available when +node v0.12 is released now, this is a copy extracted from the source. + +## require('debuglog') + +Return `util.debuglog`, if it exists, otherwise it will return an internal copy +of the implementation from node v0.11. + +## debuglog(section) + +* `section` {String} The section of the program to be debugged +* Returns: {Function} The logging function + +This is used to create a function which conditionally writes to stderr +based on the existence of a `NODE_DEBUG` environment variable. If the +`section` name appears in that environment variable, then the returned +function will be similar to `console.error()`. If not, then the +returned function is a no-op. + +For example: + +```javascript +var debuglog = util.debuglog('foo'); + +var bar = 123; +debuglog('hello from foo [%d]', bar); +``` + +If this program is run with `NODE_DEBUG=foo` in the environment, then +it will output something like: + + FOO 3245: hello from foo [123] + +where `3245` is the process id. If it is not run with that +environment variable set, then it will not print anything. + +You may separate multiple `NODE_DEBUG` environment variables with a +comma. For example, `NODE_DEBUG=fs,net,tls`. diff --git a/deps/npm/node_modules/read-installed/node_modules/debuglog/debuglog.js b/deps/npm/node_modules/read-installed/node_modules/debuglog/debuglog.js new file mode 100644 index 00000000000..748fd72a1a6 --- /dev/null +++ b/deps/npm/node_modules/read-installed/node_modules/debuglog/debuglog.js @@ -0,0 +1,22 @@ +var util = require('util'); + +module.exports = (util && util.debuglog) || debuglog; + +var debugs = {}; +var debugEnviron = process.env.NODE_DEBUG || ''; + +function debuglog(set) { + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = util.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; diff --git a/deps/npm/node_modules/read-installed/node_modules/debuglog/package.json b/deps/npm/node_modules/read-installed/node_modules/debuglog/package.json new file mode 100644 index 00000000000..3966625621e --- /dev/null +++ b/deps/npm/node_modules/read-installed/node_modules/debuglog/package.json @@ -0,0 +1,45 @@ +{ + "name": "debuglog", + "version": "1.0.1", + "description": "backport of util.debuglog from node v0.11", + "license": "MIT", + "main": "debuglog.js", + "repository": { + "type": "git", + "url": "https://github.com/sam-github/node-debuglog.git" + }, + "author": { + "name": "Sam Roberts", + "email": "sam@strongloop.com" + }, + "engines": { + "node": "*" + }, + "browser": { + "util": false + }, + "bugs": { + "url": "https://github.com/sam-github/node-debuglog/issues" + }, + "homepage": "https://github.com/sam-github/node-debuglog", + "_id": "debuglog@1.0.1", + "dist": { + "shasum": "aa24ffb9ac3df9a2351837cfb2d279360cd78492", + "tarball": "http://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz" + }, + "_from": "debuglog@>=1.0.1-0 <2.0.0-0", + "_npmVersion": "1.4.3", + "_npmUser": { + "name": "octet", + "email": "sam@strongloop.com" + }, + "maintainers": [ + { + "name": "octet", + "email": "sam@strongloop.com" + } + ], + "directories": {}, + "_shasum": "aa24ffb9ac3df9a2351837cfb2d279360cd78492", + "_resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz" +} diff --git a/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/LICENSE b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/LICENSE new file mode 100644 index 00000000000..19129e315fe --- /dev/null +++ b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +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. diff --git a/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/README.md b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/README.md new file mode 100644 index 00000000000..ade57a186dc --- /dev/null +++ b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/README.md @@ -0,0 +1,17 @@ +# readdir-scoped-modules + +Like `fs.readdir` but handling `@org/module` dirs as if they were +a single entry. + +Used by npm. + +## USAGE + +```javascript +var readdir = require('readdir-scoped-modules') + +readdir('node_modules', function (er, entries) { + // entries will be something like + // ['a', '@org/foo', '@org/bar'] +}) +``` diff --git a/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/package.json b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/package.json new file mode 100644 index 00000000000..84b91e75a55 --- /dev/null +++ b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/package.json @@ -0,0 +1,54 @@ +{ + "name": "readdir-scoped-modules", + "version": "1.0.0", + "description": "Like `fs.readdir` but handling `@org/module` dirs as if they were a single entry.", + "main": "readdir.js", + "directories": { + "test": "test" + }, + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "once": "^1.3.0" + }, + "devDependencies": { + "tap": "0.4" + }, + "scripts": { + "test": "tap test/*.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/npm/readdir-scoped-modules" + }, + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": "ISC", + "bugs": { + "url": "https://github.com/npm/readdir-scoped-modules/issues" + }, + "homepage": "https://github.com/npm/readdir-scoped-modules", + "gitHead": "35a4a7a2325d12ed25ed322cd61f976b740f7fb7", + "_id": "readdir-scoped-modules@1.0.0", + "_shasum": "e939de969b38b3e7dfaa14fbcfe7a2fd15a4ea37", + "_from": "readdir-scoped-modules@>=1.0.0-0 <2.0.0-0", + "_npmVersion": "2.0.0-alpha.6.0", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "e939de969b38b3e7dfaa14fbcfe7a2fd15a4ea37", + "tarball": "http://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.0.tgz" + }, + "_resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.0.tgz" +} diff --git a/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/readdir.js b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/readdir.js new file mode 100644 index 00000000000..91978a739db --- /dev/null +++ b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/readdir.js @@ -0,0 +1,71 @@ +var fs = require ('fs') +var dz = require ('dezalgo') +var once = require ('once') +var path = require ('path') +var debug = require ('debuglog') ('rds') + +module . exports = readdir + +function readdir (dir, cb) { + fs . readdir (dir, function (er, kids) { + if (er) + return cb (er) + + debug ('dir=%j, kids=%j', dir, kids) + readScopes (dir, kids, function (er, data) { + if (er) + return cb (er) + + // Sort for bonus consistency points + data = data . sort (function (a, b) { + return a > b ? 1 : -1 + }) + + return cb (null, data) + }) + }) +} + +// Turn [ 'a', '@scope' ] into +// ['a', '@scope/foo', '@scope/bar'] +function readScopes (root, kids, cb) { + var scopes = kids . filter (function (kid) { + return kid . charAt (0) === '@' + }) + + kids = kids . filter (function (kid) { + return kid . charAt (0) !== '@' + }) + + debug ('scopes=%j', scopes) + + if (scopes . length === 0) + dz (cb) (null, kids) // prevent maybe-sync zalgo release + + cb = once (cb) + var l = scopes . length + scopes . forEach (function (scope) { + var scopedir = path . resolve (root, scope) + debug ('root=%j scope=%j scopedir=%j', root, scope, scopedir) + fs . readdir (scopedir, then . bind (null, scope)) + }) + + function then (scope, er, scopekids) { + if (er) + return cb (er) + + // XXX: Not sure how old this node bug is. Maybe superstition? + scopekids = scopekids . filter (function (scopekid) { + return !(scopekid === '.' || scopekid === '..' || !scopekid) + }) + + kids . push . apply (kids, scopekids . map (function (scopekid) { + return scope + '/' + scopekid + })) + + debug ('scope=%j scopekids=%j kids=%j', scope, scopekids, kids) + + if (--l === 0) + cb (null, kids) + } +} diff --git a/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/basic.js b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/basic.js new file mode 100644 index 00000000000..715c40d584b --- /dev/null +++ b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/basic.js @@ -0,0 +1,14 @@ +var test = require ('tap') . test +var readdir = require ('../readdir.js') + +test ('basic', function (t) { + // should not get {a,b}/{x,y}, but SHOULD get @org/ and @scope children + var expect = [ '@org/x', '@org/y', '@scope/x', '@scope/y', 'a', 'b' ] + + readdir (__dirname + '/fixtures', function (er, kids) { + if (er) + throw er + t.same(kids, expect) + t.end() + }) +}) diff --git a/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/@org/x/.keep b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/@org/x/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/@org/y/.keep b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/@org/y/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/@scope/x/.keep b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/@scope/x/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/@scope/y/.keep b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/@scope/y/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/a/x/.keep b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/a/x/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/a/y/.keep b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/a/y/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/b/x/.keep b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/b/x/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/b/y/.keep b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/b/y/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/deps/npm/node_modules/read-installed/node_modules/util-extend/package.json b/deps/npm/node_modules/read-installed/node_modules/util-extend/package.json index 96f5a3f51bf..0bab48d3297 100644 --- a/deps/npm/node_modules/read-installed/node_modules/util-extend/package.json +++ b/deps/npm/node_modules/read-installed/node_modules/util-extend/package.json @@ -22,7 +22,7 @@ "shasum": "bb703b79480293ddcdcfb3c6a9fea20f483415bc", "tarball": "http://registry.npmjs.org/util-extend/-/util-extend-1.0.1.tgz" }, - "_from": "util-extend@^1.0.1", + "_from": "util-extend@>=1.0.1-0 <2.0.0-0", "_npmVersion": "1.3.4", "_npmUser": { "name": "isaacs", diff --git a/deps/npm/node_modules/read-installed/package.json b/deps/npm/node_modules/read-installed/package.json index de958a544e8..2c50225534f 100644 --- a/deps/npm/node_modules/read-installed/package.json +++ b/deps/npm/node_modules/read-installed/package.json @@ -1,7 +1,7 @@ { "name": "read-installed", "description": "Read all the installed packages in a folder, and return a tree structure with all the data.", - "version": "2.0.5", + "version": "3.1.3", "repository": { "type": "git", "url": "git://github.com/isaacs/read-installed" @@ -11,8 +11,10 @@ "test": "tap ./test/*.js" }, "dependencies": { + "debuglog": "^1.0.1", "read-package-json": "1", - "semver": "2", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4", "slide": "~1.1.3", "util-extend": "^1.0.1", "graceful-fs": "2 || 3" @@ -27,16 +29,37 @@ }, "license": "ISC", "devDependencies": { + "mkdirp": "^0.5.0", + "rimraf": "^2.2.8", "tap": "~0.4.8" }, - "readme": "# read-installed\n\nRead all the installed packages in a folder, and return a tree\nstructure with all the data.\n\nnpm uses this.\n\n## 2.0.0\n\nBreaking changes in `2.0.0`:\n\nThe second argument is now an `Object` that contains the following keys:\n\n * `depth` optional, defaults to Infinity\n * `log` optional log Function\n * `dev` optional, default false, set to true to include devDependencies\n\n## Usage\n\n```javascript\nvar readInstalled = require(\"read-installed\")\n// optional options\nvar options = { dev: false, log: fn, depth: 2 }\nreadInstalled(folder, options, function (er, data) {\n ...\n})\n```\n", - "readmeFilename": "README.md", - "gitHead": "2595631e4d3cbd64b26cee63dc3b5ce9f53e3533", + "gitHead": "50e45af7581b1a879c62146fafbfa1b92842f7df", "bugs": { "url": "https://github.com/isaacs/read-installed/issues" }, "homepage": "https://github.com/isaacs/read-installed", - "_id": "read-installed@2.0.5", - "_shasum": "761eda1fd2dc322f8e77844a8bf1ddedbcfc754b", - "_from": "read-installed@latest" + "_id": "read-installed@3.1.3", + "_shasum": "c09092a13c2117f22842cad16804f3b059129d11", + "_from": "read-installed@>=3.1.2-0 <3.2.0-0", + "_npmVersion": "2.0.0-beta.3", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + }, + { + "name": "othiym23", + "email": "ogd@aoaioxxysz.net" + } + ], + "dist": { + "shasum": "c09092a13c2117f22842cad16804f3b059129d11", + "tarball": "http://registry.npmjs.org/read-installed/-/read-installed-3.1.3.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/read-installed/-/read-installed-3.1.3.tgz" } diff --git a/deps/npm/node_modules/read-installed/read-installed.js b/deps/npm/node_modules/read-installed/read-installed.js index 9b5a4796226..a92ed3fbee3 100644 --- a/deps/npm/node_modules/read-installed/read-installed.js +++ b/deps/npm/node_modules/read-installed/read-installed.js @@ -101,6 +101,10 @@ var url = require("url") var util = require("util") var extend = require("util-extend") +var debug = require("debuglog")("read-installed") + +var readdir = require("readdir-scoped-modules") + module.exports = readInstalled function readInstalled (folder, opts, cb) { @@ -120,25 +124,29 @@ function readInstalled (folder, opts, cb) { opts.log = function () {} opts.dev = !!opts.dev + opts.realpathSeen = {} + opts.findUnmetSeen = [] + readInstalled_(folder, null, null, null, 0, opts, function (er, obj) { if (er) return cb(er) // now obj has all the installed things, where they're installed // figure out the inheritance links, now that the object is built. resolveInheritance(obj, opts) - markExtraneous(obj) + obj.root = true + unmarkExtraneous(obj, opts) cb(null, obj) }) } -var rpSeen = {} function readInstalled_ (folder, parent, name, reqver, depth, opts, cb) { var installed , obj , real , link + , realpathSeen = opts.realpathSeen - fs.readdir(path.resolve(folder, "node_modules"), function (er, i) { + readdir(path.resolve(folder, "node_modules"), function (er, i) { // error indicates that nothing is installed here if (er) i = [] installed = i.filter(function (f) { return f.charAt(0) !== "." }) @@ -161,7 +169,7 @@ function readInstalled_ (folder, parent, name, reqver, depth, opts, cb) { return next(er) } fs.realpath(folder, function (er, rp) { - //console.error("realpath(%j) = %j", folder, rp) + debug("realpath(%j) = %j", folder, rp) real = rp if (st.isSymbolicLink()) link = rp next(er) @@ -176,10 +184,10 @@ function readInstalled_ (folder, parent, name, reqver, depth, opts, cb) { errState = er return cb(null, []) } - //console.error('next', installed, obj && typeof obj, name, real) + debug('next', installed, obj && typeof obj, name, real) if (!installed || !obj || !real || called) return called = true - if (rpSeen[real]) return cb(null, rpSeen[real]) + if (realpathSeen[real]) return cb(null, realpathSeen[real]) if (obj === true) { obj = {dependencies:{}, path:folder} installed.forEach(function (i) { obj.dependencies[i] = "*" }) @@ -188,6 +196,9 @@ function readInstalled_ (folder, parent, name, reqver, depth, opts, cb) { obj.realName = name || obj.name obj.dependencies = obj.dependencies || {} + // At this point, figure out what dependencies we NEED to get met + obj._dependencies = copy(obj.dependencies) + // "foo":"http://blah" and "foo":"latest" are always presumed valid if (reqver && semver.validRange(reqver, true) @@ -195,21 +206,17 @@ function readInstalled_ (folder, parent, name, reqver, depth, opts, cb) { obj.invalid = true } - if (parent) { - var deps = parent.dependencies || {} - var inDeps = name in deps - var devDeps = parent.devDependencies || {} - var inDev = opts.dev && (name in devDeps) - if (!inDeps && !inDev) { - obj.extraneous = true - } - } + // Mark as extraneous at this point. + // This will be un-marked in unmarkExtraneous, where we mark as + // not-extraneous everything that is required in some way from + // the root object. + obj.extraneous = true obj.path = obj.path || folder obj.realPath = real obj.link = link if (parent && !obj.link) obj.parent = parent - rpSeen[real] = obj + realpathSeen[real] = obj obj.depth = depth //if (depth >= opts.depth) return cb(null, obj) asyncMap(installed, function (pkg, cb) { @@ -259,50 +266,45 @@ function resolveInheritance (obj, opts) { findUnmet(obj.dependencies[dep], opts) }) Object.keys(obj.dependencies).forEach(function (dep) { - resolveInheritance(obj.dependencies[dep], opts) + if (typeof obj.dependencies[dep] === "object") { + resolveInheritance(obj.dependencies[dep], opts) + } else { + debug("unmet dep! %s %s@%s", obj.name, dep, obj.dependencies[dep]) + } }) findUnmet(obj, opts) } // find unmet deps by walking up the tree object. // No I/O -var fuSeen = [] function findUnmet (obj, opts) { - if (fuSeen.indexOf(obj) !== -1) return - fuSeen.push(obj) - //console.error("find unmet", obj.name, obj.parent && obj.parent.name) + var findUnmetSeen = opts.findUnmetSeen + if (findUnmetSeen.indexOf(obj) !== -1) return + findUnmetSeen.push(obj) + debug("find unmet parent=%s obj=", obj.parent && obj.parent.name, obj.name || obj) var deps = obj.dependencies = obj.dependencies || {} - //console.error(deps) + debug(deps) Object.keys(deps) .filter(function (d) { return typeof deps[d] === "string" }) .forEach(function (d) { - //console.error("find unmet", obj.name, d, deps[d]) - var r = obj.parent - , found = null - while (r && !found && typeof deps[d] === "string") { - // if r is a valid choice, then use that. - found = r.dependencies[d] - if (!found && r.realName === d) found = r - - if (!found) { - r = r.link ? null : r.parent - continue - } - // "foo":"http://blah" and "foo":"latest" are always presumed valid - if ( typeof deps[d] === "string" - && semver.validRange(deps[d], true) - && !semver.satisfies(found.version, deps[d], true)) { - // the bad thing will happen - opts.log("unmet dependency", obj.path + " requires "+d+"@'"+deps[d] - +"' but will load\n" - +found.path+",\nwhich is version "+found.version - ) - found.invalid = true - } + var found = findDep(obj, d) + debug("finding dep %j", d, found && found.name || found) + // "foo":"http://blah" and "foo":"latest" are always presumed valid + if (typeof deps[d] === "string" && + semver.validRange(deps[d], true) && + found && + !semver.satisfies(found.version, deps[d], true)) { + // the bad thing will happen + opts.log( "unmet dependency" + , obj.path + " requires "+d+"@'"+deps[d] + + "' but will load\n" + + found.path+",\nwhich is version "+found.version ) + found.invalid = true + } + if (found) { deps[d] = found } - }) var peerDeps = obj.peerDependencies = obj.peerDependencies || {} @@ -329,34 +331,58 @@ function findUnmet (obj, opts) { obj.dependencies[d] = peerDeps[d] } else if (!semver.satisfies(dependency.version, peerDeps[d], true)) { dependency.peerInvalid = true - } else { - dependency.extraneous = false } }) return obj } -function recursivelyMarkExtraneous (obj, extraneous) { - // stop recursion if we're not changing anything - if (obj.extraneous === extraneous) return +function unmarkExtraneous (obj, opts) { + // Mark all non-required deps as extraneous. + // start from the root object and mark as non-extraneous all modules + // that haven't been previously flagged as extraneous then propagate + // to all their dependencies - obj.extraneous = extraneous - var deps = obj.dependencies = obj.dependencies || {} - Object.keys(deps).forEach(function(d){ - recursivelyMarkExtraneous(deps[d], extraneous) - }); + obj.extraneous = false + + var deps = obj._dependencies + if (opts.dev && obj.devDependencies && (obj.root || obj.link)) { + Object.keys(obj.devDependencies).forEach(function (k) { + deps[k] = obj.devDependencies[k] + }) + } + + if (obj.peerDependencies) { + Object.keys(obj.peerDependencies).forEach(function (k) { + deps[k] = obj.peerDependencies[k] + }) + } + + debug("not extraneous", obj._id, deps) + Object.keys(deps).forEach(function (d) { + var dep = findDep(obj, d) + if (dep && dep.extraneous) { + unmarkExtraneous(dep, opts) + } + }) } -function markExtraneous (obj) { - // start from the root object and mark as non-extraneous all modules that haven't been previously flagged as - // extraneous then propagate to all their dependencies - var deps = obj.dependencies = obj.dependencies || {} - Object.keys(deps).forEach(function(d){ - if (!deps[d].extraneous){ - recursivelyMarkExtraneous(deps[d], false); +// Find the one that will actually be loaded by require() +// so we can make sure it's valid etc. +function findDep (obj, d) { + var r = obj + , found = null + while (r && !found) { + // if r is a valid choice, then use that. + // kinda weird if a pkg depends on itself, but after the first + // iteration of this loop, it indicates a dep cycle. + if (typeof r.dependencies[d] === "object") { + found = r.dependencies[d] } - }); + if (!found && r.realName === d) found = r + r = r.link ? null : r.parent + } + return found } function copy (obj) { diff --git a/deps/npm/node_modules/read-installed/test/basic.js b/deps/npm/node_modules/read-installed/test/basic.js index 4d83cd0ca59..f497848879d 100644 --- a/deps/npm/node_modules/read-installed/test/basic.js +++ b/deps/npm/node_modules/read-installed/test/basic.js @@ -1,8 +1,9 @@ var readInstalled = require("../read-installed.js") -var json = require("./fixtures/package.json") -var known = [].concat(Object.keys(json.dependencies) - , Object.keys(json.optionalDependencies) - , Object.keys(json.devDependencies)).sort() +var json = require("../package.json") +var d = Object.keys(json.dependencies) +var dd = Object.keys(json.devDependencies) +var od = Object.keys(json.optionalDependencies) +var known = d.concat(dd).concat(od).sort() var test = require("tap").test var path = require("path") @@ -36,9 +37,7 @@ function cleanup (map) { default: delete map[i] } var dep = map.dependencies -// delete map.dependencies if (dep) { -// map.dependencies = dep for (var i in dep) if (typeof dep[i] === "object") { cleanup(dep[i]) } diff --git a/deps/npm/node_modules/read-installed/test/cyclic-extraneous-peer-deps.js b/deps/npm/node_modules/read-installed/test/cyclic-extraneous-peer-deps.js new file mode 100644 index 00000000000..58bf6a649a0 --- /dev/null +++ b/deps/npm/node_modules/read-installed/test/cyclic-extraneous-peer-deps.js @@ -0,0 +1,81 @@ +var test = require("tap").test +var mkdirp = require("mkdirp") +var rimraf = require("rimraf") +var fs = require("fs") +var path = require("path") +var readInstalled = require("../read-installed.js") + +var parent = { + name: "parent", + version: "1.2.3", + dependencies: {}, + devDependencies: { + "child1":"*" + }, + readme:"." +} + +var child1 = { + name: "child1", + version: "1.2.3", + peerDependencies: { + child2: "*" + }, + readme:"." +} + +var child2 = { + name: "child2", + version: "1.2.3", + peerDependencies: { + child1: "*" + }, + readme:"." +} + + +var root = path.resolve(__dirname, "cyclic-extraneous-peer-deps") +var parentjson = path.resolve(root, "package.json") +var child1root = path.resolve(root, "node_modules/child1") +var child1json = path.resolve(child1root, "package.json") +var child2root = path.resolve(root, "node_modules/child2") +var child2json = path.resolve(child2root, "package.json") + +test("setup", function (t) { + rimraf.sync(root) + mkdirp.sync(child1root) + mkdirp.sync(child2root) + fs.writeFileSync(parentjson, JSON.stringify(parent, null, 2) + "\n", "utf8") + fs.writeFileSync(child1json, JSON.stringify(child1, null, 2) + "\n", "utf8") + fs.writeFileSync(child2json, JSON.stringify(child2, null, 2) + "\n", "utf8") + t.pass("setup done") + t.end() +}) + +test("dev mode", function (t) { + // peer dev deps should both be not extraneous. + readInstalled(root, { dev: true }, function (er, data) { + if (er) + throw er + t.notOk(data.dependencies.child1.extraneous, "c1 not extra") + t.notOk(data.dependencies.child2.extraneous, "c2 not extra") + t.end() + }) +}) + +test("prod mode", function (t) { + readInstalled(root, { dev: false }, function (er, data) { + if (er) + throw er + t.ok(data.dependencies.child1.extraneous, "c1 extra") + t.ok(data.dependencies.child2.extraneous, "c2 extra") + t.end() + }) +}) + + +test("cleanup", function (t) { + rimraf.sync(root) + t.pass("cleanup done") + t.end() +}) diff --git a/deps/npm/node_modules/read-installed/test/dev.js b/deps/npm/node_modules/read-installed/test/dev.js index f6f4857bb09..5e5a994a88d 100644 --- a/deps/npm/node_modules/read-installed/test/dev.js +++ b/deps/npm/node_modules/read-installed/test/dev.js @@ -1,6 +1,6 @@ var readInstalled = require("../read-installed.js") var test = require("tap").test -var json = require("./fixtures/package.json") +var json = require("../package.json") var path = require("path") var known = [].concat(Object.keys(json.dependencies) , Object.keys(json.optionalDependencies) @@ -17,7 +17,7 @@ test("make sure that it works without dev deps", function (t) { var deps = Object.keys(map.dependencies).sort() t.equal(deps.length, known.length, "array lengths are equal") t.deepEqual(deps, known, "arrays should be equal") - t.ok(map.dependencies.tap.extraneous, 'extraneous is set on devDep') + t.ok(map.dependencies.tap.extraneous, "extraneous is set on devDep") t.end() }) }) diff --git a/deps/npm/node_modules/read-installed/test/extraneous-dev.js b/deps/npm/node_modules/read-installed/test/extraneous-dev.js new file mode 100644 index 00000000000..2f9012d548b --- /dev/null +++ b/deps/npm/node_modules/read-installed/test/extraneous-dev.js @@ -0,0 +1,20 @@ +var readInstalled = require("../read-installed.js") +var test = require("tap").test +var path = require("path") + +test("extraneous detected", function(t) { + // This test verifies read-installed#16 + readInstalled( + path.join(__dirname, "fixtures/extraneous-dev-dep"), + { + log: console.error, + dev: true + }, + function (err, map) { + t.ifError(err, "read-installed made it") + + t.notOk(map.dependencies.d.extraneous, "d is not extraneous, it's required by root") + t.ok(map.dependencies.x.extraneous, "x is extraneous, it's only a dev dep of d") + t.end() + }) +}) diff --git a/deps/npm/node_modules/read-installed/test/extraneous.js b/deps/npm/node_modules/read-installed/test/extraneous.js index 2cc0d04e7a5..e999c9b4fc3 100644 --- a/deps/npm/node_modules/read-installed/test/extraneous.js +++ b/deps/npm/node_modules/read-installed/test/extraneous.js @@ -1,6 +1,6 @@ var readInstalled = require('../read-installed.js') var test = require('tap').test -var path = require('path'); +var path = require('path') test('extraneous detected', function(t) { // This test verifies read-installed#16 @@ -12,6 +12,6 @@ test('extraneous detected', function(t) { t.ok(map.dependencies.bar.extraneous, 'bar is extraneous, it\'s not required by any module') t.notOk(map.dependencies.asdf.extraneous, 'asdf is not extraneous, it\'s required by ghjk') t.notOk(map.dependencies.ghjk.extraneous, 'ghjk is not extraneous, it\'s required by our root module') - t.end(); + t.end() }) }) diff --git a/deps/npm/node_modules/read-installed/test/fixtures/extraneous-dev-dep/package.json b/deps/npm/node_modules/read-installed/test/fixtures/extraneous-dev-dep/package.json new file mode 100644 index 00000000000..9bfa7ce8f58 --- /dev/null +++ b/deps/npm/node_modules/read-installed/test/fixtures/extraneous-dev-dep/package.json @@ -0,0 +1,7 @@ +{ + "name": "extraneous-dev-dep", + "version": "0.0.0", + "dependencies": { + "d": "1.0.0" + } +} diff --git a/deps/npm/node_modules/read-installed/test/fixtures/grandparent-peer-dev/package.json b/deps/npm/node_modules/read-installed/test/fixtures/grandparent-peer-dev/package.json new file mode 100644 index 00000000000..1a229c1cff0 --- /dev/null +++ b/deps/npm/node_modules/read-installed/test/fixtures/grandparent-peer-dev/package.json @@ -0,0 +1,8 @@ +{ + "name": "example", + "version": "0.0.0", + "devDependencies": { + "plugin-wrapper": "0.0.0", + "framework": "0.0.0" + } +} diff --git a/deps/npm/node_modules/read-installed/test/grandparent-peer-dev.js b/deps/npm/node_modules/read-installed/test/grandparent-peer-dev.js new file mode 100644 index 00000000000..fd7c2d2bc9c --- /dev/null +++ b/deps/npm/node_modules/read-installed/test/grandparent-peer-dev.js @@ -0,0 +1,20 @@ +var readInstalled = require('../read-installed.js') +var test = require('tap').test +var path = require('path'); + +function allValid(t, map) { + var deps = Object.keys(map.dependencies || {}) + deps.forEach(function (dep) { + t.ok(map.dependencies[dep].extraneous, 'dependency ' + dep + ' of ' + map.name + ' is extraneous') + }) +} + +test('grandparent dev peer dependencies should be extraneous', function(t) { + readInstalled( + path.join(__dirname, 'fixtures/grandparent-peer-dev'), + { log: console.error }, + function(err, map) { + allValid(t, map) + t.end() + }) +}) diff --git a/deps/npm/node_modules/read-installed/test/linked-dep-dev-deps-extraneous.js b/deps/npm/node_modules/read-installed/test/linked-dep-dev-deps-extraneous.js new file mode 100644 index 00000000000..65605133045 --- /dev/null +++ b/deps/npm/node_modules/read-installed/test/linked-dep-dev-deps-extraneous.js @@ -0,0 +1,59 @@ +var test = require('tap').test +var path = require('path') +var fs = require('fs') +var mkdirp = require('mkdirp') +var rimraf = require('rimraf') +var readInstalled = require('../') + +var root = path.resolve(__dirname, 'root') +var pkg = path.resolve(root, 'pkg') +var pkgnm = path.resolve(pkg, 'node_modules') +var linkdepSrc = path.resolve(root, 'linkdep') +var linkdepLink = path.resolve(pkgnm, 'linkdep') +var devdep = path.resolve(linkdepSrc, 'node_modules', 'devdep') + +function pjson (dir, data) { + mkdirp.sync(dir) + var d = path.resolve(dir, 'package.json') + fs.writeFileSync(d, JSON.stringify(data)) +} + +test('setup', function (t) { + rimraf.sync(root) + pjson(pkg, { + name: 'root', + version: '1.2.3', + dependencies: { + linkdep: '' + } + }) + pjson(linkdepSrc, { + name: 'linkdep', + version: '1.2.3', + devDependencies: { + devdep: '' + } + }) + pjson(devdep, { + name: 'devdep', + version: '1.2.3' + }) + + mkdirp.sync(pkgnm) + fs.symlinkSync(linkdepSrc, linkdepLink, 'dir') + + t.end() +}) + +test('basic', function (t) { + readInstalled(pkg, { dev: true }, function (er, data) { + var dd = data.dependencies.linkdep.dependencies.devdep + t.notOk(dd.extraneous, 'linked dev dep should not be extraneous') + t.end() + }) +}) + +test('cleanup', function (t) { + rimraf.sync(root) + t.end() +}) diff --git a/deps/npm/node_modules/read-installed/test/noargs.js b/deps/npm/node_modules/read-installed/test/noargs.js index a84a8f4cfa2..66fabeb74ec 100644 --- a/deps/npm/node_modules/read-installed/test/noargs.js +++ b/deps/npm/node_modules/read-installed/test/noargs.js @@ -1,6 +1,6 @@ var readInstalled = require("../read-installed.js") var test = require("tap").test -var json = require("./fixtures/package.json") +var json = require("../package.json") var path = require("path") var known = [].concat(Object.keys(json.dependencies) , Object.keys(json.optionalDependencies) diff --git a/deps/npm/node_modules/read-package-json/package.json b/deps/npm/node_modules/read-package-json/package.json index 8b67330c1d5..1fd2f674f78 100644 --- a/deps/npm/node_modules/read-package-json/package.json +++ b/deps/npm/node_modules/read-package-json/package.json @@ -37,7 +37,7 @@ "homepage": "https://github.com/isaacs/read-package-json", "_id": "read-package-json@1.2.7", "_shasum": "f0b440c461a218f4dbf48b094e80fc65c5248502", - "_from": "read-package-json@^1.2.7", + "_from": "read-package-json@>=1.2.7-0 <1.3.0-0", "_npmVersion": "2.0.0-beta.0", "_npmUser": { "name": "othiym23", diff --git a/deps/npm/node_modules/request/node_modules/aws-sign2/package.json b/deps/npm/node_modules/request/node_modules/aws-sign2/package.json index 719d4887064..d04010d6037 100644 --- a/deps/npm/node_modules/request/node_modules/aws-sign2/package.json +++ b/deps/npm/node_modules/request/node_modules/aws-sign2/package.json @@ -27,7 +27,7 @@ "shasum": "c57103f7a17fc037f02d7c2e64b602ea223f7d63", "tarball": "http://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz" }, - "_from": "aws-sign2@~0.5.0", + "_from": "aws-sign2@>=0.5.0-0 <0.6.0-0", "_npmVersion": "1.3.2", "_npmUser": { "name": "mikeal", 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/bl/node_modules/readable-stream/node_modules/core-util-is/package.json b/deps/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json index add87edf58d..8e79c3a7481 100644 --- a/deps/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json +++ b/deps/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json @@ -35,7 +35,7 @@ "shasum": "6b07085aef9a3ccac6ee53bf9d3df0c1521a5538", "tarball": "http://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" }, - "_from": "core-util-is@~1.0.0", + "_from": "core-util-is@>=1.0.0-0 <1.1.0-0", "_npmVersion": "1.3.23", "_npmUser": { "name": "isaacs", diff --git a/deps/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/package.json b/deps/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/package.json index a8c586bfb90..752eab63cc9 100644 --- a/deps/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/package.json +++ b/deps/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/package.json @@ -28,7 +28,7 @@ }, "_id": "string_decoder@0.10.31", "_shasum": "62e203bc41766c6c28c9fc84301dab1c5310fa94", - "_from": "string_decoder@~0.10.x", + "_from": "string_decoder@>=0.10.0-0 <0.11.0-0", "_npmVersion": "1.4.23", "_npmUser": { "name": "rvagg", diff --git a/deps/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/package.json b/deps/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/package.json index 14485870130..6c73ab37659 100644 --- a/deps/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/package.json +++ b/deps/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/package.json @@ -39,7 +39,7 @@ "homepage": "https://github.com/isaacs/readable-stream", "_id": "readable-stream@1.0.31", "_shasum": "8f2502e0bc9e3b0da1b94520aabb4e2603ecafae", - "_from": "readable-stream@~1.0.26", + "_from": "readable-stream@>=1.0.26-0 <1.1.0-0", "_npmVersion": "1.4.9", "_npmUser": { "name": "rvagg", diff --git a/deps/npm/node_modules/request/node_modules/bl/package.json b/deps/npm/node_modules/request/node_modules/bl/package.json index 19c4ac079f4..e94473d36ce 100644 --- a/deps/npm/node_modules/request/node_modules/bl/package.json +++ b/deps/npm/node_modules/request/node_modules/bl/package.json @@ -38,7 +38,7 @@ }, "_id": "bl@0.9.1", "_shasum": "d262c5b83aa5cf4386cea1d998c82b36d7ae2942", - "_from": "bl@~0.9.0", + "_from": "bl@>=0.9.0-0 <0.10.0-0", "_npmVersion": "1.4.21", "_npmUser": { "name": "rvagg", diff --git a/deps/npm/node_modules/request/node_modules/caseless/package.json b/deps/npm/node_modules/request/node_modules/caseless/package.json index 62d467544dd..e3cd409c78d 100644 --- a/deps/npm/node_modules/request/node_modules/caseless/package.json +++ b/deps/npm/node_modules/request/node_modules/caseless/package.json @@ -30,7 +30,7 @@ "homepage": "https://github.com/mikeal/caseless", "_id": "caseless@0.6.0", "_shasum": "8167c1ab8397fb5bb95f96d28e5a81c50f247ac4", - "_from": "caseless@~0.6.0", + "_from": "caseless@>=0.6.0-0 <0.7.0-0", "_npmVersion": "1.4.9", "_npmUser": { "name": "mikeal", diff --git a/deps/npm/node_modules/request/node_modules/forever-agent/package.json b/deps/npm/node_modules/request/node_modules/forever-agent/package.json index 764ca1e2c4f..65a6c55f269 100644 --- a/deps/npm/node_modules/request/node_modules/forever-agent/package.json +++ b/deps/npm/node_modules/request/node_modules/forever-agent/package.json @@ -26,7 +26,7 @@ "shasum": "6d0e09c4921f94a27f63d3b49c5feff1ea4c5130", "tarball": "http://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz" }, - "_from": "forever-agent@~0.5.0", + "_from": "forever-agent@>=0.5.0-0 <0.6.0-0", "_npmVersion": "1.3.21", "_npmUser": { "name": "mikeal", diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/async/package.json b/deps/npm/node_modules/request/node_modules/form-data/node_modules/async/package.json index bdbe740109c..3b921537e75 100644 --- a/deps/npm/node_modules/request/node_modules/form-data/node_modules/async/package.json +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/async/package.json @@ -41,7 +41,7 @@ "shasum": "ac3613b1da9bed1b47510bb4651b8931e47146c7", "tarball": "http://registry.npmjs.org/async/-/async-0.9.0.tgz" }, - "_from": "async@~0.9.0", + "_from": "async@>=0.9.0-0 <0.10.0-0", "_npmVersion": "1.4.3", "_npmUser": { "name": "caolan", diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json b/deps/npm/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json index 37c37314cc0..fd82201d20d 100644 --- a/deps/npm/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json @@ -31,7 +31,7 @@ }, "_id": "combined-stream@0.0.5", "_shasum": "29ed76e5c9aad07c4acf9ca3d32601cce28697a2", - "_from": "combined-stream@~0.0.4", + "_from": "combined-stream@>=0.0.4-0 <0.1.0-0", "_npmVersion": "1.4.14", "_npmUser": { "name": "alexindigo", diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime/package.json b/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime/package.json index 259822b788e..8f4c3926624 100644 --- a/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime/package.json +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime/package.json @@ -35,7 +35,7 @@ "shasum": "58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10", "tarball": "http://registry.npmjs.org/mime/-/mime-1.2.11.tgz" }, - "_from": "mime@~1.2.11", + "_from": "mime@>=1.2.11-0 <1.3.0-0", "_npmVersion": "1.3.6", "_npmUser": { "name": "broofa", diff --git a/deps/npm/node_modules/request/node_modules/form-data/package.json b/deps/npm/node_modules/request/node_modules/form-data/package.json index afda8b6c30c..04d7ec69dd1 100644 --- a/deps/npm/node_modules/request/node_modules/form-data/package.json +++ b/deps/npm/node_modules/request/node_modules/form-data/package.json @@ -42,7 +42,7 @@ "homepage": "https://github.com/felixge/node-form-data", "_id": "form-data@0.1.4", "_shasum": "91abd788aba9702b1aabfa8bc01031a2ac9e3b12", - "_from": "form-data@~0.1.0", + "_from": "form-data@>=0.1.0-0 <0.2.0-0", "_npmVersion": "1.4.14", "_npmUser": { "name": "alexindigo", diff --git a/deps/npm/node_modules/request/node_modules/hawk/node_modules/boom/package.json b/deps/npm/node_modules/request/node_modules/hawk/node_modules/boom/package.json index 2406a49a5db..c95faa9e27d 100755 --- a/deps/npm/node_modules/request/node_modules/hawk/node_modules/boom/package.json +++ b/deps/npm/node_modules/request/node_modules/hawk/node_modules/boom/package.json @@ -41,7 +41,7 @@ "shasum": "7a636e9ded4efcefb19cef4947a3c67dfaee911b", "tarball": "http://registry.npmjs.org/boom/-/boom-0.4.2.tgz" }, - "_from": "boom@0.4.x", + "_from": "boom@>=0.4.0-0 <0.5.0-0", "_npmVersion": "1.2.18", "_npmUser": { "name": "hueniverse", diff --git a/deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json b/deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json index c4cd1b23426..3ed098bea52 100755 --- a/deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json +++ b/deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json @@ -45,7 +45,7 @@ "shasum": "ed91ff1f17ad13d3748288594f8a48a0d26f325c", "tarball": "http://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz" }, - "_from": "cryptiles@0.2.x", + "_from": "cryptiles@>=0.2.0-0 <0.3.0-0", "_npmVersion": "1.2.24", "_npmUser": { "name": "hueniverse", diff --git a/deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/package.json b/deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/package.json index 4e4eb74b7a2..bbc70311332 100755 --- a/deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/package.json +++ b/deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/package.json @@ -43,7 +43,7 @@ "shasum": "3d322462badf07716ea7eb85baf88079cddce505", "tarball": "http://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz" }, - "_from": "hoek@0.9.x", + "_from": "hoek@>=0.9.0-0 <0.10.0-0", "_npmVersion": "1.2.18", "_npmUser": { "name": "hueniverse", diff --git a/deps/npm/node_modules/request/node_modules/hawk/node_modules/sntp/package.json b/deps/npm/node_modules/request/node_modules/hawk/node_modules/sntp/package.json index c96e8482aca..ff73fbc12ac 100755 --- a/deps/npm/node_modules/request/node_modules/hawk/node_modules/sntp/package.json +++ b/deps/npm/node_modules/request/node_modules/hawk/node_modules/sntp/package.json @@ -42,7 +42,7 @@ "shasum": "fb885f18b0f3aad189f824862536bceeec750900", "tarball": "http://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz" }, - "_from": "sntp@0.2.x", + "_from": "sntp@>=0.2.0-0 <0.3.0-0", "_npmVersion": "1.2.18", "_npmUser": { "name": "hueniverse", diff --git a/deps/npm/node_modules/request/node_modules/http-signature/package.json b/deps/npm/node_modules/request/node_modules/http-signature/package.json index 6d646d4ad08..270f9891bf5 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/package.json +++ b/deps/npm/node_modules/request/node_modules/http-signature/package.json @@ -32,7 +32,7 @@ "shasum": "1494e4f5000a83c0f11bcc12d6007c530cb99582", "tarball": "http://registry.npmjs.org/http-signature/-/http-signature-0.10.0.tgz" }, - "_from": "http-signature@~0.10.0", + "_from": "http-signature@>=0.10.0-0 <0.11.0-0", "_npmVersion": "1.2.18", "_npmUser": { "name": "mcavage", diff --git a/deps/npm/node_modules/request/node_modules/json-stringify-safe/package.json b/deps/npm/node_modules/request/node_modules/json-stringify-safe/package.json index 3ddf83680c1..2e415ac6607 100644 --- a/deps/npm/node_modules/request/node_modules/json-stringify-safe/package.json +++ b/deps/npm/node_modules/request/node_modules/json-stringify-safe/package.json @@ -32,7 +32,7 @@ "shasum": "4c1f228b5050837eba9d21f50c2e6e320624566e", "tarball": "http://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz" }, - "_from": "json-stringify-safe@~5.0.0", + "_from": "json-stringify-safe@>=5.0.0-0 <5.1.0-0", "_npmVersion": "1.3.6", "_npmUser": { "name": "isaacs", diff --git a/deps/npm/node_modules/request/node_modules/mime-types/package.json b/deps/npm/node_modules/request/node_modules/mime-types/package.json index baa79a956c7..9d59fb8d9df 100644 --- a/deps/npm/node_modules/request/node_modules/mime-types/package.json +++ b/deps/npm/node_modules/request/node_modules/mime-types/package.json @@ -39,7 +39,7 @@ "homepage": "https://github.com/expressjs/mime-types", "_id": "mime-types@1.0.2", "_shasum": "995ae1392ab8affcbfcb2641dd054e943c0d5dce", - "_from": "mime-types@~1.0.1", + "_from": "mime-types@>=1.0.1-0 <1.1.0-0", "_npmVersion": "1.4.21", "_npmUser": { "name": "dougwilson", diff --git a/deps/npm/node_modules/request/node_modules/node-uuid/package.json b/deps/npm/node_modules/request/node_modules/node-uuid/package.json index ee93121fc32..491d93ad4ae 100644 --- a/deps/npm/node_modules/request/node_modules/node-uuid/package.json +++ b/deps/npm/node_modules/request/node_modules/node-uuid/package.json @@ -34,7 +34,7 @@ "shasum": "39aef510e5889a3dca9c895b506c73aae1bac048", "tarball": "http://registry.npmjs.org/node-uuid/-/node-uuid-1.4.1.tgz" }, - "_from": "node-uuid@~1.4.0", + "_from": "node-uuid@>=1.4.0-0 <1.5.0-0", "_npmVersion": "1.3.6", "_npmUser": { "name": "broofa", diff --git a/deps/npm/node_modules/request/node_modules/oauth-sign/package.json b/deps/npm/node_modules/request/node_modules/oauth-sign/package.json index d0e82fecb07..16a7645861d 100644 --- a/deps/npm/node_modules/request/node_modules/oauth-sign/package.json +++ b/deps/npm/node_modules/request/node_modules/oauth-sign/package.json @@ -30,7 +30,7 @@ "shasum": "f22956f31ea7151a821e5f2fb32c113cad8b9f69", "tarball": "http://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz" }, - "_from": "oauth-sign@~0.4.0", + "_from": "oauth-sign@>=0.4.0-0 <0.5.0-0", "_npmVersion": "1.3.2", "_npmUser": { "name": "mikeal", 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/qs/package.json b/deps/npm/node_modules/request/node_modules/qs/package.json index 7b1917023f9..51be52c711d 100755 --- a/deps/npm/node_modules/request/node_modules/qs/package.json +++ b/deps/npm/node_modules/request/node_modules/qs/package.json @@ -35,7 +35,7 @@ }, "_id": "qs@1.2.2", "_shasum": "19b57ff24dc2a99ce1f8bdf6afcda59f8ef61f88", - "_from": "qs@~1.2.0", + "_from": "qs@>=1.2.0-0 <1.3.0-0", "_npmVersion": "1.4.21", "_npmUser": { "name": "hueniverse", diff --git a/deps/npm/node_modules/request/node_modules/stringstream/package.json b/deps/npm/node_modules/request/node_modules/stringstream/package.json index f9caf4b8434..980932c18b3 100644 --- a/deps/npm/node_modules/request/node_modules/stringstream/package.json +++ b/deps/npm/node_modules/request/node_modules/stringstream/package.json @@ -39,7 +39,7 @@ ], "directories": {}, "_shasum": "0f0e3423f942960b5692ac324a57dd093bc41a92", - "_from": "stringstream@~0.0.4", + "_from": "stringstream@>=0.0.4-0 <0.1.0-0", "_resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz", "bugs": { "url": "https://github.com/mhart/StringStream/issues" 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/request/node_modules/tunnel-agent/package.json b/deps/npm/node_modules/request/node_modules/tunnel-agent/package.json index 59c7f5cb509..12e2407c091 100644 --- a/deps/npm/node_modules/request/node_modules/tunnel-agent/package.json +++ b/deps/npm/node_modules/request/node_modules/tunnel-agent/package.json @@ -26,7 +26,7 @@ "shasum": "b1184e312ffbcf70b3b4c78e8c219de7ebb1c550", "tarball": "http://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.0.tgz" }, - "_from": "tunnel-agent@~0.4.0", + "_from": "tunnel-agent@>=0.4.0-0 <0.5.0-0", "_npmVersion": "1.3.21", "_npmUser": { "name": "mikeal", diff --git a/deps/npm/node_modules/request/package.json b/deps/npm/node_modules/request/package.json index 0e94d8d149b..d2db65f595b 100755 --- a/deps/npm/node_modules/request/package.json +++ b/deps/npm/node_modules/request/package.json @@ -59,7 +59,7 @@ "homepage": "https://github.com/mikeal/request", "_id": "request@2.42.0", "_shasum": "572bd0148938564040ac7ab148b96423a063304a", - "_from": "request@^2.42.0", + "_from": "request@>=2.42.0-0 <3.0.0-0", "_npmVersion": "1.4.9", "_npmUser": { "name": "mikeal", diff --git a/deps/npm/node_modules/semver/Makefile b/deps/npm/node_modules/semver/Makefile index 5717ccf42bf..71af0e9750c 100644 --- a/deps/npm/node_modules/semver/Makefile +++ b/deps/npm/node_modules/semver/Makefile @@ -8,12 +8,12 @@ all: $(files) clean: rm -f $(files) -semver.browser.js: head.js semver.js foot.js - ( cat head.js; \ +semver.browser.js: head.js.txt semver.js foot.js.txt + ( cat head.js.txt; \ cat semver.js | \ egrep -v '^ *\/\* nomin \*\/' | \ perl -pi -e 's/debug\([^\)]+\)//g'; \ - cat foot.js ) > semver.browser.js + cat foot.js.txt ) > semver.browser.js semver.min.js: semver.browser.js uglifyjs -m semver.min.js diff --git a/deps/npm/node_modules/semver/README.md b/deps/npm/node_modules/semver/README.md index 4e95b846566..0f8a755a4cf 100644 --- a/deps/npm/node_modules/semver/README.md +++ b/deps/npm/node_modules/semver/README.md @@ -41,53 +41,170 @@ A leading `"="` or `"v"` character is stripped off and ignored. ## Ranges -The following range styles are supported: - -* `1.2.3` A specific version. When nothing else will do. Must be a full - version number, with major, minor, and patch versions specified. - Note that build metadata is still ignored, so `1.2.3+build2012` will - satisfy this range. -* `>1.2.3` Greater than a specific version. -* `<1.2.3` Less than a specific version. If there is no prerelease - tag on the version range, then no prerelease version will be allowed - either, even though these are technically "less than". -* `>=1.2.3` Greater than or equal to. Note that prerelease versions - are NOT equal to their "normal" equivalents, so `1.2.3-beta` will - not satisfy this range, but `2.3.0-beta` will. -* `<=1.2.3` Less than or equal to. In this case, prerelease versions - ARE allowed, so `1.2.3-beta` would satisfy. +A `version range` is a set of `comparators` which specify versions +that satisfy the range. + +A `comparator` is composed of an `operator` and a `version`. The set +of primitive `operators` is: + +* `<` Less than +* `<=` Less than or equal to +* `>` Greater than +* `>=` Greater than or equal to +* `=` Equal. If no operator is specified, then equality is assumed, + so this operator is optional, but MAY be included. + +For example, the comparator `>=1.2.7` would match the versions +`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6` +or `1.1.0`. + +Comparators can be joined by whitespace to form a `comparator set`, +which is satisfied by the **intersection** of all of the comparators +it includes. + +A range is composed of one or more comparator sets, joined by `||`. A +version matches a range if and only if every comparator in at least +one of the `||`-separated comparator sets is satisfied by the version. + +For example, the range `>=1.2.7 <1.3.0` would match the versions +`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`, +or `1.1.0`. + +The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`, +`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`. + +### Prerelease Tags + +If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then +it will only be allowed to satisfy comparator sets if at least one +comparator with the same `[major, minor, patch]` tuple also has a +prerelease tag. + +For example, the range `>1.2.3-alpha.3` would be allowed to match the +version `1.2.3-alpha.7`, but it would *not* be satisfied by +`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater +than" `1.2.3-alpha.3` according to the SemVer sort rules. The version +range only accepts prerelease tags on the `1.2.3` version. The +version `3.4.5` *would* satisfy the range, because it does not have a +prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`. + +The purpose for this behavior is twofold. First, prerelease versions +frequently are updated very quickly, and contain many breaking changes +that are (by the author's design) not yet fit for public consumption. +Therefore, by default, they are excluded from range matching +semantics. + +Second, a user who has opted into using a prerelease version has +clearly indicated the intent to use *that specific* set of +alpha/beta/rc versions. By including a prerelease tag in the range, +the user is indicating that they are aware of the risk. However, it +is still not appropriate to assume that they have opted into taking a +similar risk on the *next* set of prerelease versions. + +### Advanced Range Syntax + +Advanced range syntax desugars to primitive comparators in +deterministic ways. + +Advanced ranges may be combined in the same way as primitive +comparators using white space or `||`. + +#### Hyphen Ranges `X.Y.Z - A.B.C` + +Specifies an inclusive set. + * `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4` -* `~1.2.3` := `>=1.2.3-0 <1.3.0-0` "Reasonably close to `1.2.3`". When - using tilde operators, prerelease versions are supported as well, - but a prerelease of the next significant digit will NOT be - satisfactory, so `1.3.0-beta` will not satisfy `~1.2.3`. -* `^1.2.3` := `>=1.2.3-0 <2.0.0-0` "Compatible with `1.2.3`". When - using caret operators, anything from the specified version (including - prerelease) will be supported up to, but not including, the next - major version (or its prereleases). `1.5.1` will satisfy `^1.2.3`, - while `1.2.2` and `2.0.0-beta` will not. -* `^0.1.3` := `>=0.1.3-0 <0.2.0-0` "Compatible with `0.1.3`". `0.x.x` versions are - special: the first non-zero component indicates potentially breaking changes, - meaning the caret operator matches any version with the same first non-zero - component starting at the specified version. -* `^0.0.2` := `=0.0.2` "Only the version `0.0.2` is considered compatible" -* `~1.2` := `>=1.2.0-0 <1.3.0-0` "Any version starting with `1.2`" -* `^1.2` := `>=1.2.0-0 <2.0.0-0` "Any version compatible with `1.2`" -* `1.2.x` := `>=1.2.0-0 <1.3.0-0` "Any version starting with `1.2`" -* `1.2.*` Same as `1.2.x`. -* `1.2` Same as `1.2.x`. -* `~1` := `>=1.0.0-0 <2.0.0-0` "Any version starting with `1`" -* `^1` := `>=1.0.0-0 <2.0.0-0` "Any version compatible with `1`" -* `1.x` := `>=1.0.0-0 <2.0.0-0` "Any version starting with `1`" -* `1.*` Same as `1.x`. -* `1` Same as `1.x`. -* `*` Any version whatsoever. -* `x` Same as `*`. -* `""` (just an empty string) Same as `*`. - - -Ranges can be joined with either a space (which implies "and") or a -`||` (which implies "or"). + +If a partial version is provided as the first version in the inclusive +range, then the missing pieces are replaced with zeroes. + +* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4` + +If a partial version is provided as the second version in the +inclusive range, then all versions that start with the supplied parts +of the tuple are accepted, but nothing that would be greater than the +provided tuple parts. + +* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0` +* `1.2.3 - 2` := `>=1.2.3 <3.0.0` + +#### X-Ranges `1.2.x` `1.X` `1.2.*` `*` + +Any of `X`, `x`, or `*` may be used to "stand in" for one of the +numeric values in the `[major, minor, patch]` tuple. + +* `*` := `>=0.0.0` (Any version satisfies) +* `1.x` := `>=1.0.0 <2.0.0` (Matching major version) +* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions) + +A partial version range is treated as an X-Range, so the special +character is in fact optional. + +* `` (empty string) := `*` := `>=0.0.0` +* `1` := `1.x.x` := `>=1.0.0 <2.0.0` +* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0` + +#### Tilde Ranges `~1.2.3` `~1.2` `~1` + +Allows patch-level changes if a minor version is specified on the +comparator. Allows minor-level changes if not. + +* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0` +* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`) +* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`) +* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0` +* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`) +* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`) +* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in + the `1.2.3` version will be allowed, if they are greater than or + equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but + `1.2.4-beta.2` would not, because it is a prerelease of a + different `[major, minor, patch]` tuple. + +Note: this is the same as the `~>` operator in rubygems. + +#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4` + +Allows changes that do not modify the left-most non-zero digit in the +`[major, minor, patch]` tuple. In other words, this allows patch and +minor updates for versions `1.0.0` and above, patch updates for +versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`. + +Many authors treat a `0.x` version as if the `x` were the major +"breaking-change" indicator. + +Caret ranges are ideal when an author may make breaking changes +between `0.2.4` and `0.3.0` releases, which is a common practice. +However, it presumes that there will *not* be breaking changes between +`0.2.4` and `0.2.5`. It allows for changes that are presumed to be +additive (but non-breaking), according to commonly observed practices. + +* `^1.2.3` := `>=1.2.3 <2.0.0` +* `^0.2.3` := `>=0.2.3 <0.3.0` +* `^0.0.3` := `>=0.0.3 <0.0.4` +* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in + the `1.2.3` version will be allowed, if they are greater than or + equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but + `1.2.4-beta.2` would not, because it is a prerelease of a + different `[major, minor, patch]` tuple. +* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4` Note that prereleases in the + `0.0.3` version *only* will be allowed, if they are greater than or + equal to `beta`. So, `0.0.3-pr.2` would be allowed. + +When parsing caret ranges, a missing `patch` value desugars to the +number `0`, but will allow flexibility within that value, even if the +major and minor versions are both `0`. + +* `^1.2.x` := `>=1.2.0 <2.0.0` +* `^0.0.x` := `>=0.0.0 <0.1.0` +* `^0.0` := `>=0.0.0 <0.1.0` + +A missing `minor` and `patch` values will desugar to zero, but also +allow flexibility within those values, even if the major version is +zero. + +* `^1.x` := `>=1.0.0 <2.0.0` +* `^0.x` := `>=0.0.0 <1.0.0` ## Functions diff --git a/deps/npm/node_modules/semver/bin/semver b/deps/npm/node_modules/semver/bin/semver index 848420630b6..41c148fb860 100755 --- a/deps/npm/node_modules/semver/bin/semver +++ b/deps/npm/node_modules/semver/bin/semver @@ -107,8 +107,8 @@ function help () { ,"" ,"-i --increment []" ," Increment a version by the specified level. Level can" - ," be one of: major, minor, patch, or prerelease" - ," Default level is 'patch'." + ," be one of: major, minor, patch, premajor, preminor," + ," prepatch, or prerelease. Default level is 'patch'." ," Only one version may be specified." ,"" ,"-l --loose" diff --git a/deps/npm/node_modules/semver/foot.js b/deps/npm/node_modules/semver/foot.js.txt similarity index 100% rename from deps/npm/node_modules/semver/foot.js rename to deps/npm/node_modules/semver/foot.js.txt diff --git a/deps/npm/node_modules/semver/head.js b/deps/npm/node_modules/semver/head.js.txt similarity index 100% rename from deps/npm/node_modules/semver/head.js rename to deps/npm/node_modules/semver/head.js.txt diff --git a/deps/npm/node_modules/semver/package.json b/deps/npm/node_modules/semver/package.json index b65d866c307..a575f0ebd40 100644 --- a/deps/npm/node_modules/semver/package.json +++ b/deps/npm/node_modules/semver/package.json @@ -1,6 +1,6 @@ { "name": "semver", - "version": "2.3.0", + "version": "4.0.0", "description": "The semantic version parser used by npm.", "main": "semver.js", "browser": "semver.browser.js", @@ -21,13 +21,30 @@ "bin": { "semver": "./bin/semver" }, - "readme": "semver(1) -- The semantic versioner for npm\n===========================================\n\n## Usage\n\n $ npm install semver\n\n semver.valid('1.2.3') // '1.2.3'\n semver.valid('a.b.c') // null\n semver.clean(' =v1.2.3 ') // '1.2.3'\n semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true\n semver.gt('1.2.3', '9.8.7') // false\n semver.lt('1.2.3', '9.8.7') // true\n\nAs a command-line utility:\n\n $ semver -h\n\n Usage: semver [ [...]] [-r | -i | -d ]\n Test if version(s) satisfy the supplied range(s), and sort them.\n\n Multiple versions or ranges may be supplied, unless increment\n or decrement options are specified. In that case, only a single\n version may be used, and it is incremented by the specified level\n\n Program exits successfully if any valid version satisfies\n all supplied ranges, and prints all satisfying versions.\n\n If no versions are valid, or ranges are not satisfied,\n then exits failure.\n\n Versions are printed in ascending order, so supplying\n multiple versions to the utility will just sort them.\n\n## Versions\n\nA \"version\" is described by the `v2.0.0` specification found at\n.\n\nA leading `\"=\"` or `\"v\"` character is stripped off and ignored.\n\n## Ranges\n\nThe following range styles are supported:\n\n* `1.2.3` A specific version. When nothing else will do. Must be a full\n version number, with major, minor, and patch versions specified.\n Note that build metadata is still ignored, so `1.2.3+build2012` will\n satisfy this range.\n* `>1.2.3` Greater than a specific version.\n* `<1.2.3` Less than a specific version. If there is no prerelease\n tag on the version range, then no prerelease version will be allowed\n either, even though these are technically \"less than\".\n* `>=1.2.3` Greater than or equal to. Note that prerelease versions\n are NOT equal to their \"normal\" equivalents, so `1.2.3-beta` will\n not satisfy this range, but `2.3.0-beta` will.\n* `<=1.2.3` Less than or equal to. In this case, prerelease versions\n ARE allowed, so `1.2.3-beta` would satisfy.\n* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`\n* `~1.2.3` := `>=1.2.3-0 <1.3.0-0` \"Reasonably close to `1.2.3`\". When\n using tilde operators, prerelease versions are supported as well,\n but a prerelease of the next significant digit will NOT be\n satisfactory, so `1.3.0-beta` will not satisfy `~1.2.3`.\n* `^1.2.3` := `>=1.2.3-0 <2.0.0-0` \"Compatible with `1.2.3`\". When\n using caret operators, anything from the specified version (including\n prerelease) will be supported up to, but not including, the next\n major version (or its prereleases). `1.5.1` will satisfy `^1.2.3`,\n while `1.2.2` and `2.0.0-beta` will not.\n* `^0.1.3` := `>=0.1.3-0 <0.2.0-0` \"Compatible with `0.1.3`\". `0.x.x` versions are\n special: the first non-zero component indicates potentially breaking changes,\n meaning the caret operator matches any version with the same first non-zero\n component starting at the specified version.\n* `^0.0.2` := `=0.0.2` \"Only the version `0.0.2` is considered compatible\"\n* `~1.2` := `>=1.2.0-0 <1.3.0-0` \"Any version starting with `1.2`\"\n* `^1.2` := `>=1.2.0-0 <2.0.0-0` \"Any version compatible with `1.2`\"\n* `1.2.x` := `>=1.2.0-0 <1.3.0-0` \"Any version starting with `1.2`\"\n* `1.2.*` Same as `1.2.x`.\n* `1.2` Same as `1.2.x`.\n* `~1` := `>=1.0.0-0 <2.0.0-0` \"Any version starting with `1`\"\n* `^1` := `>=1.0.0-0 <2.0.0-0` \"Any version compatible with `1`\"\n* `1.x` := `>=1.0.0-0 <2.0.0-0` \"Any version starting with `1`\"\n* `1.*` Same as `1.x`.\n* `1` Same as `1.x`.\n* `*` Any version whatsoever.\n* `x` Same as `*`.\n* `\"\"` (just an empty string) Same as `*`.\n\n\nRanges can be joined with either a space (which implies \"and\") or a\n`||` (which implies \"or\").\n\n## Functions\n\nAll methods and classes take a final `loose` boolean argument that, if\ntrue, will be more forgiving about not-quite-valid semver strings.\nThe resulting output will always be 100% strict, of course.\n\nStrict-mode Comparators and Ranges will be strict about the SemVer\nstrings that they parse.\n\n* `valid(v)`: Return the parsed version, or null if it's not valid.\n* `inc(v, release)`: Return the version incremented by the release\n type (`major`, `premajor`, `minor`, `preminor`, `patch`,\n `prepatch`, or `prerelease`), or null if it's not valid\n * `premajor` in one call will bump the version up to the next major\n version and down to a prerelease of that major version.\n `preminor`, and `prepatch` work the same way.\n * If called from a non-prerelease version, the `prerelease` will work the\n same as `prepatch`. It increments the patch version, then makes a\n prerelease. If the input version is already a prerelease it simply\n increments it.\n\n### Comparison\n\n* `gt(v1, v2)`: `v1 > v2`\n* `gte(v1, v2)`: `v1 >= v2`\n* `lt(v1, v2)`: `v1 < v2`\n* `lte(v1, v2)`: `v1 <= v2`\n* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent,\n even if they're not the exact same string. You already know how to\n compare strings.\n* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`.\n* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call\n the corresponding function above. `\"===\"` and `\"!==\"` do simple\n string comparison, but are included for completeness. Throws if an\n invalid comparison string is provided.\n* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if\n `v2` is greater. Sorts in ascending order if passed to `Array.sort()`.\n* `rcompare(v1, v2)`: The reverse of compare. Sorts an array of versions\n in descending order when passed to `Array.sort()`.\n\n\n### Ranges\n\n* `validRange(range)`: Return the valid range or null if it's not valid\n* `satisfies(version, range)`: Return true if the version satisfies the\n range.\n* `maxSatisfying(versions, range)`: Return the highest version in the list\n that satisfies the range, or `null` if none of them do.\n* `gtr(version, range)`: Return `true` if version is greater than all the\n versions possible in the range.\n* `ltr(version, range)`: Return `true` if version is less than all the\n versions possible in the range.\n* `outside(version, range, hilo)`: Return true if the version is outside\n the bounds of the range in either the high or low direction. The\n `hilo` argument must be either the string `'>'` or `'<'`. (This is\n the function called by `gtr` and `ltr`.)\n\nNote that, since ranges may be non-contiguous, a version might not be\ngreater than a range, less than a range, *or* satisfy a range! For\nexample, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9`\nuntil `2.0.0`, so the version `1.2.10` would not be greater than the\nrange (because `2.0.1` satisfies, which is higher), nor less than the\nrange (since `1.2.8` satisfies, which is lower), and it also does not\nsatisfy the range.\n\nIf you want to know if a version satisfies or does not satisfy a\nrange, use the `satisfies(version, range)` function.\n", - "readmeFilename": "README.md", + "gitHead": "f71a46b52f5d413aff1cb3afa7d2f940b23ab1a0", "bugs": { "url": "https://github.com/isaacs/node-semver/issues" }, "homepage": "https://github.com/isaacs/node-semver", - "_id": "semver@2.3.0", - "_shasum": "d31b2903ebe2a1806c05b8e763916a7183108a15", - "_from": "semver@latest" + "_id": "semver@4.0.0", + "_shasum": "7be868416a5e669923a8e3af8bafa5faf62a151a", + "_from": "semver@>=4.0.0-0 <5.0.0-0", + "_npmVersion": "2.0.0-beta.3", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "7be868416a5e669923a8e3af8bafa5faf62a151a", + "tarball": "http://registry.npmjs.org/semver/-/semver-4.0.0.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/semver/-/semver-4.0.0.tgz", + "readme": "ERROR: No README data found!" } diff --git a/deps/npm/node_modules/semver/semver.browser.js b/deps/npm/node_modules/semver/semver.browser.js index 0f414c3d8d3..afb68ac0c45 100644 --- a/deps/npm/node_modules/semver/semver.browser.js +++ b/deps/npm/node_modules/semver/semver.browser.js @@ -128,18 +128,18 @@ var XRANGEPLAIN = R++; src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + - '(?:(' + src[PRERELEASE] + ')' + - ')?)?)?'; + '(?:' + src[PRERELEASE] + ')?' + + src[BUILD] + '?' + + ')?)?'; var XRANGEPLAINLOOSE = R++; src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:(' + src[PRERELEASELOOSE] + ')' + - ')?)?)?'; + '(?:' + src[PRERELEASELOOSE] + ')?' + + src[BUILD] + '?' + + ')?)?'; -// >=2.x, for example, means >=2.0.0-0 -// <1.x would be the same as "<1.0.0-0", though. var XRANGE = R++; src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'; var XRANGELOOSE = R++; @@ -236,7 +236,7 @@ function valid(version, loose) { exports.clean = clean; function clean(version, loose) { - var s = parse(version, loose); + var s = parse(version.trim().replace(/^[=v]+/, ''), loose); return s ? s.version : null; } @@ -348,14 +348,23 @@ SemVer.prototype.comparePre = function(other) { SemVer.prototype.inc = function(release) { switch (release) { case 'premajor': - this.inc('major'); + this.prerelease.length = 0; + this.patch = 0; + this.minor = 0; + this.major++; this.inc('pre'); break; case 'preminor': - this.inc('minor'); + this.prerelease.length = 0; + this.patch = 0; + this.minor++; this.inc('pre'); break; case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0; this.inc('patch'); this.inc('pre'); break; @@ -366,11 +375,25 @@ SemVer.prototype.inc = function(release) { this.inc('patch'); this.inc('pre'); break; + case 'major': - this.major++; - this.minor = -1; + // If this is a pre-major version, bump up to the same major version. + // Otherwise increment major. + // 1.0.0-5 bumps to 1.0.0 + // 1.1.0 bumps to 2.0.0 + if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) + this.major++; + this.minor = 0; + this.patch = 0; + this.prerelease = []; + break; case 'minor': - this.minor++; + // If this is a pre-minor version, bump up to the same minor version. + // Otherwise increment minor. + // 1.2.0-5 bumps to 1.2.0 + // 1.2.1 bumps to 1.3.0 + if (this.patch !== 0 || this.prerelease.length === 0) + this.minor++; this.patch = 0; this.prerelease = []; break; @@ -383,8 +406,8 @@ SemVer.prototype.inc = function(release) { this.patch++; this.prerelease = []; break; - // This probably shouldn't be used publically. - // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. + // This probably shouldn't be used publicly. + // 1.0.0 "pre" would become 1.0.0 which is the wrong direction. case 'pre': if (this.prerelease.length === 0) this.prerelease = [0]; @@ -504,8 +527,16 @@ exports.cmp = cmp; function cmp(a, op, b, loose) { var ret; switch (op) { - case '===': ret = a === b; break; - case '!==': ret = a !== b; break; + case '===': + if (typeof a === 'object') a = a.version; + if (typeof b === 'object') b = b.version; + ret = a === b; + break; + case '!==': + if (typeof a === 'object') a = a.version; + if (typeof b === 'object') b = b.version; + ret = a !== b; + break; case '': case '=': case '==': ret = eq(a, b, loose); break; case '!=': ret = neq(a, b, loose); break; case '>': ret = gt(a, b, loose); break; @@ -537,6 +568,8 @@ function Comparator(comp, loose) { this.value = ''; else this.value = this.operator + this.semver.version; + + ; } var ANY = {}; @@ -548,24 +581,14 @@ Comparator.prototype.parse = function(comp) { throw new TypeError('Invalid comparator: ' + comp); this.operator = m[1]; + if (this.operator === '=') + this.operator = ''; + // if it literally is just '>' or '' then allow anything. if (!m[2]) this.semver = ANY; - else { + else this.semver = new SemVer(m[2], this.loose); - - // <1.2.3-rc DOES allow 1.2.3-beta (has prerelease) - // >=1.2.3 DOES NOT allow 1.2.3-beta - // <=1.2.3 DOES allow 1.2.3-beta - // However, <1.2.3 does NOT allow 1.2.3-beta, - // even though `1.2.3-beta < 1.2.3` - // The assumption is that the 1.2.3 version has something you - // *don't* want, so we push the prerelease down to the minimum. - if (this.operator === '<' && !this.semver.prerelease.length) { - this.semver.prerelease = ['0']; - this.semver.format(); - } - } }; Comparator.prototype.inspect = function() { @@ -578,8 +601,14 @@ Comparator.prototype.toString = function() { Comparator.prototype.test = function(version) { ; - return (this.semver === ANY) ? true : - cmp(version, this.operator, this.semver, this.loose); + + if (this.semver === ANY) + return true; + + if (typeof version === 'string') + version = new SemVer(version, this.loose); + + return cmp(version, this.operator, this.semver, this.loose); }; @@ -716,20 +745,20 @@ function replaceTilde(comp, loose) { if (isX(M)) ret = ''; else if (isX(m)) - ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0'; + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; else if (isX(p)) // ~1.2 == >=1.2.0- <1.3.0- - ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0'; + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; else if (pr) { ; if (pr.charAt(0) !== '-') pr = '-' + pr; ret = '>=' + M + '.' + m + '.' + p + pr + - ' <' + M + '.' + (+m + 1) + '.0-0'; + ' <' + M + '.' + (+m + 1) + '.0'; } else - // ~1.2.3 == >=1.2.3-0 <1.3.0-0 - ret = '>=' + M + '.' + m + '.' + p + '-0' + - ' <' + M + '.' + (+m + 1) + '.0-0'; + // ~1.2.3 == >=1.2.3 <1.3.0 + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0'; ; return ret; @@ -749,6 +778,7 @@ function replaceCarets(comp, loose) { } function replaceCaret(comp, loose) { + ; var r = loose ? re[CARETLOOSE] : re[CARET]; return comp.replace(r, function(_, M, m, p, pr) { ; @@ -757,35 +787,38 @@ function replaceCaret(comp, loose) { if (isX(M)) ret = ''; else if (isX(m)) - ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0'; + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; else if (isX(p)) { if (M === '0') - ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0'; + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; else - ret = '>=' + M + '.' + m + '.0-0 <' + (+M + 1) + '.0.0-0'; + ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'; } else if (pr) { ; if (pr.charAt(0) !== '-') pr = '-' + pr; if (M === '0') { if (m === '0') - ret = '=' + M + '.' + m + '.' + p + pr; + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + m + '.' + (+p + 1); else ret = '>=' + M + '.' + m + '.' + p + pr + - ' <' + M + '.' + (+m + 1) + '.0-0'; + ' <' + M + '.' + (+m + 1) + '.0'; } else ret = '>=' + M + '.' + m + '.' + p + pr + - ' <' + (+M + 1) + '.0.0-0'; + ' <' + (+M + 1) + '.0.0'; } else { + ; if (M === '0') { if (m === '0') - ret = '=' + M + '.' + m + '.' + p; + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + m + '.' + (+p + 1); else - ret = '>=' + M + '.' + m + '.' + p + '-0' + - ' <' + M + '.' + (+m + 1) + '.0-0'; + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0'; } else - ret = '>=' + M + '.' + m + '.' + p + '-0' + - ' <' + (+M + 1) + '.0.0-0'; + ret = '>=' + M + '.' + m + '.' + p + + ' <' + (+M + 1) + '.0.0'; } ; @@ -814,7 +847,7 @@ function replaceXRange(comp, loose) { gtlt = ''; if (gtlt && anyX) { - // replace X with 0, and then append the -0 min-prerelease + // replace X with 0 if (xM) M = 0; if (xm) @@ -823,9 +856,9 @@ function replaceXRange(comp, loose) { p = 0; if (gtlt === '>') { - // >1 => >=2.0.0-0 - // >1.2 => >=1.3.0-0 - // >1.2.3 => >= 1.2.4-0 + // >1 => >=2.0.0 + // >1.2 => >=1.3.0 + // >1.2.3 => >= 1.2.4 gtlt = '>='; if (xM) { // no change @@ -840,17 +873,14 @@ function replaceXRange(comp, loose) { } - ret = gtlt + M + '.' + m + '.' + p + '-0'; + ret = gtlt + M + '.' + m + '.' + p; } else if (xM) { // allow any ret = '*'; } else if (xm) { - // append '-0' onto the version, otherwise - // '1.x.x' matches '2.0.0-beta', since the tag - // *lowers* the version value - ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0'; + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; } else if (xp) { - ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0'; + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; } ; @@ -869,9 +899,9 @@ function replaceStars(comp, loose) { // This function is passed to string.replace(re[HYPHENRANGE]) // M, m, patch, prerelease, build -// 1.2 - 3.4.5 => >=1.2.0-0 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0-0 <3.5.0-0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0-0 <3.5.0-0 +// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 +// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0 <3.5.0 function hyphenReplace($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr, tb) { @@ -879,18 +909,18 @@ function hyphenReplace($0, if (isX(fM)) from = ''; else if (isX(fm)) - from = '>=' + fM + '.0.0-0'; + from = '>=' + fM + '.0.0'; else if (isX(fp)) - from = '>=' + fM + '.' + fm + '.0-0'; + from = '>=' + fM + '.' + fm + '.0'; else from = '>=' + from; if (isX(tM)) to = ''; else if (isX(tm)) - to = '<' + (+tM + 1) + '.0.0-0'; + to = '<' + (+tM + 1) + '.0.0'; else if (isX(tp)) - to = '<' + tM + '.' + (+tm + 1) + '.0-0'; + to = '<' + tM + '.' + (+tm + 1) + '.0'; else if (tpr) to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; else @@ -904,6 +934,10 @@ function hyphenReplace($0, Range.prototype.test = function(version) { if (!version) return false; + + if (typeof version === 'string') + version = new SemVer(version, this.loose); + for (var i = 0; i < this.set.length; i++) { if (testSet(this.set[i], version)) return true; @@ -916,6 +950,31 @@ function testSet(set, version) { if (!set[i].test(version)) return false; } + + if (version.prerelease.length) { + // Find the set of versions that are allowed to have prereleases + // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 + // That should allow `1.2.3-pr.2` to pass. + // However, `1.2.4-alpha.notready` should NOT be allowed, + // even though it's within the range set by the comparators. + for (var i = 0; i < set.length; i++) { + ; + if (set[i].semver === ANY) + return true; + + if (set[i].semver.prerelease.length > 0) { + var allowed = set[i].semver; + if (allowed.major === version.major && + allowed.minor === version.minor && + allowed.patch === version.patch) + return true; + } + } + + // Version has a -pre, but it's not one of the ones we like. + return false; + } + return true; } diff --git a/deps/npm/node_modules/semver/semver.browser.js.gz b/deps/npm/node_modules/semver/semver.browser.js.gz index 2b07bae519b5715db7703a41dfad904df1b8b236..2d01ad972b424b66456744de7519f408bcfd0a5b 100644 GIT binary patch literal 7391 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 R$2A!9{{Zq|>=xK@006A5N234$ literal 7180 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 O=Klc8YZo2)YXATW=g(CD diff --git a/deps/npm/node_modules/semver/semver.js b/deps/npm/node_modules/semver/semver.js index a7385b41c51..8b5b93f96d0 100644 --- a/deps/npm/node_modules/semver/semver.js +++ b/deps/npm/node_modules/semver/semver.js @@ -138,18 +138,18 @@ var XRANGEPLAIN = R++; src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + - '(?:(' + src[PRERELEASE] + ')' + - ')?)?)?'; + '(?:' + src[PRERELEASE] + ')?' + + src[BUILD] + '?' + + ')?)?'; var XRANGEPLAINLOOSE = R++; src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:(' + src[PRERELEASELOOSE] + ')' + - ')?)?)?'; + '(?:' + src[PRERELEASELOOSE] + ')?' + + src[BUILD] + '?' + + ')?)?'; -// >=2.x, for example, means >=2.0.0-0 -// <1.x would be the same as "<1.0.0-0", though. var XRANGE = R++; src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'; var XRANGELOOSE = R++; @@ -246,7 +246,7 @@ function valid(version, loose) { exports.clean = clean; function clean(version, loose) { - var s = parse(version, loose); + var s = parse(version.trim().replace(/^[=v]+/, ''), loose); return s ? s.version : null; } @@ -358,14 +358,23 @@ SemVer.prototype.comparePre = function(other) { SemVer.prototype.inc = function(release) { switch (release) { case 'premajor': - this.inc('major'); + this.prerelease.length = 0; + this.patch = 0; + this.minor = 0; + this.major++; this.inc('pre'); break; case 'preminor': - this.inc('minor'); + this.prerelease.length = 0; + this.patch = 0; + this.minor++; this.inc('pre'); break; case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0; this.inc('patch'); this.inc('pre'); break; @@ -376,11 +385,25 @@ SemVer.prototype.inc = function(release) { this.inc('patch'); this.inc('pre'); break; + case 'major': - this.major++; - this.minor = -1; + // If this is a pre-major version, bump up to the same major version. + // Otherwise increment major. + // 1.0.0-5 bumps to 1.0.0 + // 1.1.0 bumps to 2.0.0 + if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) + this.major++; + this.minor = 0; + this.patch = 0; + this.prerelease = []; + break; case 'minor': - this.minor++; + // If this is a pre-minor version, bump up to the same minor version. + // Otherwise increment minor. + // 1.2.0-5 bumps to 1.2.0 + // 1.2.1 bumps to 1.3.0 + if (this.patch !== 0 || this.prerelease.length === 0) + this.minor++; this.patch = 0; this.prerelease = []; break; @@ -393,8 +416,8 @@ SemVer.prototype.inc = function(release) { this.patch++; this.prerelease = []; break; - // This probably shouldn't be used publically. - // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. + // This probably shouldn't be used publicly. + // 1.0.0 "pre" would become 1.0.0 which is the wrong direction. case 'pre': if (this.prerelease.length === 0) this.prerelease = [0]; @@ -514,8 +537,16 @@ exports.cmp = cmp; function cmp(a, op, b, loose) { var ret; switch (op) { - case '===': ret = a === b; break; - case '!==': ret = a !== b; break; + case '===': + if (typeof a === 'object') a = a.version; + if (typeof b === 'object') b = b.version; + ret = a === b; + break; + case '!==': + if (typeof a === 'object') a = a.version; + if (typeof b === 'object') b = b.version; + ret = a !== b; + break; case '': case '=': case '==': ret = eq(a, b, loose); break; case '!=': ret = neq(a, b, loose); break; case '>': ret = gt(a, b, loose); break; @@ -547,6 +578,8 @@ function Comparator(comp, loose) { this.value = ''; else this.value = this.operator + this.semver.version; + + debug('comp', this); } var ANY = {}; @@ -558,24 +591,14 @@ Comparator.prototype.parse = function(comp) { throw new TypeError('Invalid comparator: ' + comp); this.operator = m[1]; + if (this.operator === '=') + this.operator = ''; + // if it literally is just '>' or '' then allow anything. if (!m[2]) this.semver = ANY; - else { + else this.semver = new SemVer(m[2], this.loose); - - // <1.2.3-rc DOES allow 1.2.3-beta (has prerelease) - // >=1.2.3 DOES NOT allow 1.2.3-beta - // <=1.2.3 DOES allow 1.2.3-beta - // However, <1.2.3 does NOT allow 1.2.3-beta, - // even though `1.2.3-beta < 1.2.3` - // The assumption is that the 1.2.3 version has something you - // *don't* want, so we push the prerelease down to the minimum. - if (this.operator === '<' && !this.semver.prerelease.length) { - this.semver.prerelease = ['0']; - this.semver.format(); - } - } }; Comparator.prototype.inspect = function() { @@ -588,8 +611,14 @@ Comparator.prototype.toString = function() { Comparator.prototype.test = function(version) { debug('Comparator.test', version, this.loose); - return (this.semver === ANY) ? true : - cmp(version, this.operator, this.semver, this.loose); + + if (this.semver === ANY) + return true; + + if (typeof version === 'string') + version = new SemVer(version, this.loose); + + return cmp(version, this.operator, this.semver, this.loose); }; @@ -726,20 +755,20 @@ function replaceTilde(comp, loose) { if (isX(M)) ret = ''; else if (isX(m)) - ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0'; + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; else if (isX(p)) // ~1.2 == >=1.2.0- <1.3.0- - ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0'; + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; else if (pr) { debug('replaceTilde pr', pr); if (pr.charAt(0) !== '-') pr = '-' + pr; ret = '>=' + M + '.' + m + '.' + p + pr + - ' <' + M + '.' + (+m + 1) + '.0-0'; + ' <' + M + '.' + (+m + 1) + '.0'; } else - // ~1.2.3 == >=1.2.3-0 <1.3.0-0 - ret = '>=' + M + '.' + m + '.' + p + '-0' + - ' <' + M + '.' + (+m + 1) + '.0-0'; + // ~1.2.3 == >=1.2.3 <1.3.0 + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0'; debug('tilde return', ret); return ret; @@ -759,6 +788,7 @@ function replaceCarets(comp, loose) { } function replaceCaret(comp, loose) { + debug('caret', comp, loose); var r = loose ? re[CARETLOOSE] : re[CARET]; return comp.replace(r, function(_, M, m, p, pr) { debug('caret', comp, _, M, m, p, pr); @@ -767,35 +797,38 @@ function replaceCaret(comp, loose) { if (isX(M)) ret = ''; else if (isX(m)) - ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0'; + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; else if (isX(p)) { if (M === '0') - ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0'; + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; else - ret = '>=' + M + '.' + m + '.0-0 <' + (+M + 1) + '.0.0-0'; + ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'; } else if (pr) { debug('replaceCaret pr', pr); if (pr.charAt(0) !== '-') pr = '-' + pr; if (M === '0') { if (m === '0') - ret = '=' + M + '.' + m + '.' + p + pr; + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + m + '.' + (+p + 1); else ret = '>=' + M + '.' + m + '.' + p + pr + - ' <' + M + '.' + (+m + 1) + '.0-0'; + ' <' + M + '.' + (+m + 1) + '.0'; } else ret = '>=' + M + '.' + m + '.' + p + pr + - ' <' + (+M + 1) + '.0.0-0'; + ' <' + (+M + 1) + '.0.0'; } else { + debug('no pr'); if (M === '0') { if (m === '0') - ret = '=' + M + '.' + m + '.' + p; + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + m + '.' + (+p + 1); else - ret = '>=' + M + '.' + m + '.' + p + '-0' + - ' <' + M + '.' + (+m + 1) + '.0-0'; + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0'; } else - ret = '>=' + M + '.' + m + '.' + p + '-0' + - ' <' + (+M + 1) + '.0.0-0'; + ret = '>=' + M + '.' + m + '.' + p + + ' <' + (+M + 1) + '.0.0'; } debug('caret return', ret); @@ -824,7 +857,7 @@ function replaceXRange(comp, loose) { gtlt = ''; if (gtlt && anyX) { - // replace X with 0, and then append the -0 min-prerelease + // replace X with 0 if (xM) M = 0; if (xm) @@ -833,9 +866,9 @@ function replaceXRange(comp, loose) { p = 0; if (gtlt === '>') { - // >1 => >=2.0.0-0 - // >1.2 => >=1.3.0-0 - // >1.2.3 => >= 1.2.4-0 + // >1 => >=2.0.0 + // >1.2 => >=1.3.0 + // >1.2.3 => >= 1.2.4 gtlt = '>='; if (xM) { // no change @@ -850,17 +883,14 @@ function replaceXRange(comp, loose) { } - ret = gtlt + M + '.' + m + '.' + p + '-0'; + ret = gtlt + M + '.' + m + '.' + p; } else if (xM) { // allow any ret = '*'; } else if (xm) { - // append '-0' onto the version, otherwise - // '1.x.x' matches '2.0.0-beta', since the tag - // *lowers* the version value - ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0'; + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; } else if (xp) { - ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0'; + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; } debug('xRange return', ret); @@ -879,9 +909,9 @@ function replaceStars(comp, loose) { // This function is passed to string.replace(re[HYPHENRANGE]) // M, m, patch, prerelease, build -// 1.2 - 3.4.5 => >=1.2.0-0 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0-0 <3.5.0-0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0-0 <3.5.0-0 +// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 +// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0 <3.5.0 function hyphenReplace($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr, tb) { @@ -889,18 +919,18 @@ function hyphenReplace($0, if (isX(fM)) from = ''; else if (isX(fm)) - from = '>=' + fM + '.0.0-0'; + from = '>=' + fM + '.0.0'; else if (isX(fp)) - from = '>=' + fM + '.' + fm + '.0-0'; + from = '>=' + fM + '.' + fm + '.0'; else from = '>=' + from; if (isX(tM)) to = ''; else if (isX(tm)) - to = '<' + (+tM + 1) + '.0.0-0'; + to = '<' + (+tM + 1) + '.0.0'; else if (isX(tp)) - to = '<' + tM + '.' + (+tm + 1) + '.0-0'; + to = '<' + tM + '.' + (+tm + 1) + '.0'; else if (tpr) to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; else @@ -914,6 +944,10 @@ function hyphenReplace($0, Range.prototype.test = function(version) { if (!version) return false; + + if (typeof version === 'string') + version = new SemVer(version, this.loose); + for (var i = 0; i < this.set.length; i++) { if (testSet(this.set[i], version)) return true; @@ -926,6 +960,31 @@ function testSet(set, version) { if (!set[i].test(version)) return false; } + + if (version.prerelease.length) { + // Find the set of versions that are allowed to have prereleases + // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 + // That should allow `1.2.3-pr.2` to pass. + // However, `1.2.4-alpha.notready` should NOT be allowed, + // even though it's within the range set by the comparators. + for (var i = 0; i < set.length; i++) { + debug(set[i].semver); + if (set[i].semver === ANY) + return true; + + if (set[i].semver.prerelease.length > 0) { + var allowed = set[i].semver; + if (allowed.major === version.major && + allowed.minor === version.minor && + allowed.patch === version.patch) + return true; + } + } + + // Version has a -pre, but it's not one of the ones we like. + return false; + } + return true; } diff --git a/deps/npm/node_modules/semver/semver.min.js b/deps/npm/node_modules/semver/semver.min.js index 66e13b86332..0dd841cb4e9 100644 --- a/deps/npm/node_modules/semver/semver.min.js +++ b/deps/npm/node_modules/semver/semver.min.js @@ -1 +1 @@ -(function(e){if(typeof module==="object"&&module.exports===e)e=module.exports=H;e.SEMVER_SPEC_VERSION="2.0.0";var r=e.re=[];var t=e.src=[];var n=0;var i=n++;t[i]="0|[1-9]\\d*";var s=n++;t[s]="[0-9]+";var a=n++;t[a]="\\d*[a-zA-Z-][a-zA-Z0-9-]*";var o=n++;t[o]="("+t[i]+")\\."+"("+t[i]+")\\."+"("+t[i]+")";var f=n++;t[f]="("+t[s]+")\\."+"("+t[s]+")\\."+"("+t[s]+")";var u=n++;t[u]="(?:"+t[i]+"|"+t[a]+")";var c=n++;t[c]="(?:"+t[s]+"|"+t[a]+")";var l=n++;t[l]="(?:-("+t[u]+"(?:\\."+t[u]+")*))";var p=n++;t[p]="(?:-?("+t[c]+"(?:\\."+t[c]+")*))";var h=n++;t[h]="[0-9A-Za-z-]+";var v=n++;t[v]="(?:\\+("+t[h]+"(?:\\."+t[h]+")*))";var m=n++;var g="v?"+t[o]+t[l]+"?"+t[v]+"?";t[m]="^"+g+"$";var w="[v=\\s]*"+t[f]+t[p]+"?"+t[v]+"?";var d=n++;t[d]="^"+w+"$";var y=n++;t[y]="((?:<|>)?=?)";var b=n++;t[b]=t[s]+"|x|X|\\*";var $=n++;t[$]=t[i]+"|x|X|\\*";var j=n++;t[j]="[v=\\s]*("+t[$]+")"+"(?:\\.("+t[$]+")"+"(?:\\.("+t[$]+")"+"(?:("+t[l]+")"+")?)?)?";var k=n++;t[k]="[v=\\s]*("+t[b]+")"+"(?:\\.("+t[b]+")"+"(?:\\.("+t[b]+")"+"(?:("+t[p]+")"+")?)?)?";var E=n++;t[E]="^"+t[y]+"\\s*"+t[j]+"$";var x=n++;t[x]="^"+t[y]+"\\s*"+t[k]+"$";var R=n++;t[R]="(?:~>?)";var S=n++;t[S]="(\\s*)"+t[R]+"\\s+";r[S]=new RegExp(t[S],"g");var V="$1~";var I=n++;t[I]="^"+t[R]+t[j]+"$";var T=n++;t[T]="^"+t[R]+t[k]+"$";var A=n++;t[A]="(?:\\^)";var C=n++;t[C]="(\\s*)"+t[A]+"\\s+";r[C]=new RegExp(t[C],"g");var M="$1^";var z=n++;t[z]="^"+t[A]+t[j]+"$";var P=n++;t[P]="^"+t[A]+t[k]+"$";var Z=n++;t[Z]="^"+t[y]+"\\s*("+w+")$|^$";var q=n++;t[q]="^"+t[y]+"\\s*("+g+")$|^$";var L=n++;t[L]="(\\s*)"+t[y]+"\\s*("+w+"|"+t[j]+")";r[L]=new RegExp(t[L],"g");var X="$1$2$3";var _=n++;t[_]="^\\s*("+t[j]+")"+"\\s+-\\s+"+"("+t[j]+")"+"\\s*$";var N=n++;t[N]="^\\s*("+t[k]+")"+"\\s+-\\s+"+"("+t[k]+")"+"\\s*$";var O=n++;t[O]="(<|>)?=?\\s*\\*";for(var B=0;B'};H.prototype.toString=function(){return this.version};H.prototype.compare=function(e){if(!(e instanceof H))e=new H(e,this.loose);return this.compareMain(e)||this.comparePre(e)};H.prototype.compareMain=function(e){if(!(e instanceof H))e=new H(e,this.loose);return Q(this.major,e.major)||Q(this.minor,e.minor)||Q(this.patch,e.patch)};H.prototype.comparePre=function(e){if(!(e instanceof H))e=new H(e,this.loose);if(this.prerelease.length&&!e.prerelease.length)return-1;else if(!this.prerelease.length&&e.prerelease.length)return 1;else if(!this.prerelease.length&&!e.prerelease.length)return 0;var r=0;do{var t=this.prerelease[r];var n=e.prerelease[r];if(t===undefined&&n===undefined)return 0;else if(n===undefined)return 1;else if(t===undefined)return-1;else if(t===n)continue;else return Q(t,n)}while(++r)};H.prototype.inc=function(e){switch(e){case"premajor":this.inc("major");this.inc("pre");break;case"preminor":this.inc("minor");this.inc("pre");break;case"prepatch":this.inc("patch");this.inc("pre");break;case"prerelease":if(this.prerelease.length===0)this.inc("patch");this.inc("pre");break;case"major":this.major++;this.minor=-1;case"minor":this.minor++;this.patch=0;this.prerelease=[];break;case"patch":if(this.prerelease.length===0)this.patch++;this.prerelease=[];break;case"pre":if(this.prerelease.length===0)this.prerelease=[0];else{var r=this.prerelease.length;while(--r>=0){if(typeof this.prerelease[r]==="number"){this.prerelease[r]++;r=-2}}if(r===-1)this.prerelease.push(0)}break;default:throw new Error("invalid increment argument: "+e)}this.format();return this};e.inc=J;function J(e,r,t){try{return new H(e,t).inc(r).version}catch(n){return null}}e.compareIdentifiers=Q;var K=/^[0-9]+$/;function Q(e,r){var t=K.test(e);var n=K.test(r);if(t&&n){e=+e;r=+r}return t&&!n?-1:n&&!t?1:er?1:0}e.rcompareIdentifiers=U;function U(e,r){return Q(r,e)}e.compare=W;function W(e,r,t){return new H(e,t).compare(r)}e.compareLoose=Y;function Y(e,r){return W(e,r,true)}e.rcompare=er;function er(e,r,t){return W(r,e,t)}e.sort=rr;function rr(r,t){return r.sort(function(r,n){return e.compare(r,n,t)})}e.rsort=tr;function tr(r,t){return r.sort(function(r,n){return e.rcompare(r,n,t)})}e.gt=nr;function nr(e,r,t){return W(e,r,t)>0}e.lt=ir;function ir(e,r,t){return W(e,r,t)<0}e.eq=sr;function sr(e,r,t){return W(e,r,t)===0}e.neq=ar;function ar(e,r,t){return W(e,r,t)!==0}e.gte=or;function or(e,r,t){return W(e,r,t)>=0}e.lte=fr;function fr(e,r,t){return W(e,r,t)<=0}e.cmp=ur;function ur(e,r,t,n){var i;switch(r){case"===":i=e===t;break;case"!==":i=e!==t;break;case"":case"=":case"==":i=sr(e,t,n);break;case"!=":i=ar(e,t,n);break;case">":i=nr(e,t,n);break;case">=":i=or(e,t,n);break;case"<":i=ir(e,t,n);break;case"<=":i=fr(e,t,n);break;default:throw new TypeError("Invalid operator: "+r)}return i}e.Comparator=cr;function cr(e,r){if(e instanceof cr){if(e.loose===r)return e;else e=e.value}if(!(this instanceof cr))return new cr(e,r);this.loose=r;this.parse(e);if(this.semver===lr)this.value="";else this.value=this.operator+this.semver.version}var lr={};cr.prototype.parse=function(e){var t=this.loose?r[Z]:r[q];var n=e.match(t);if(!n)throw new TypeError("Invalid comparator: "+e);this.operator=n[1];if(!n[2])this.semver=lr;else{this.semver=new H(n[2],this.loose);if(this.operator==="<"&&!this.semver.prerelease.length){this.semver.prerelease=["0"];this.semver.format()}}};cr.prototype.inspect=function(){return''};cr.prototype.toString=function(){return this.value};cr.prototype.test=function(e){return this.semver===lr?true:ur(e,this.operator,this.semver,this.loose)};e.Range=pr;function pr(e,r){if(e instanceof pr&&e.loose===r)return e;if(!(this instanceof pr))return new pr(e,r);this.loose=r;this.raw=e;this.set=e.split(/\s*\|\|\s*/).map(function(e){return this.parseRange(e.trim())},this).filter(function(e){return e.length});if(!this.set.length){throw new TypeError("Invalid SemVer Range: "+e)}this.format()}pr.prototype.inspect=function(){return''};pr.prototype.format=function(){this.range=this.set.map(function(e){return e.join(" ").trim()}).join("||").trim();return this.range};pr.prototype.toString=function(){return this.range};pr.prototype.parseRange=function(e){var t=this.loose;e=e.trim();var n=t?r[N]:r[_];e=e.replace(n,kr);e=e.replace(r[L],X);e=e.replace(r[S],V);e=e.replace(r[C],M);e=e.split(/\s+/).join(" ");var i=t?r[Z]:r[q];var s=e.split(" ").map(function(e){return vr(e,t)}).join(" ").split(/\s+/);if(this.loose){s=s.filter(function(e){return!!e.match(i)})}s=s.map(function(e){return new cr(e,t)});return s};e.toComparators=hr;function hr(e,r){return new pr(e,r).set.map(function(e){return e.map(function(e){return e.value}).join(" ").trim().split(" ")})}function vr(e,r){e=dr(e,r);e=gr(e,r);e=br(e,r);e=jr(e,r);return e}function mr(e){return!e||e.toLowerCase()==="x"||e==="*"}function gr(e,r){return e.trim().split(/\s+/).map(function(e){return wr(e,r)}).join(" ")}function wr(e,t){var n=t?r[T]:r[I];return e.replace(n,function(e,r,t,n,i){var s;if(mr(r))s="";else if(mr(t))s=">="+r+".0.0-0 <"+(+r+1)+".0.0-0";else if(mr(n))s=">="+r+"."+t+".0-0 <"+r+"."+(+t+1)+".0-0";else if(i){if(i.charAt(0)!=="-")i="-"+i;s=">="+r+"."+t+"."+n+i+" <"+r+"."+(+t+1)+".0-0"}else s=">="+r+"."+t+"."+n+"-0"+" <"+r+"."+(+t+1)+".0-0";return s})}function dr(e,r){return e.trim().split(/\s+/).map(function(e){return yr(e,r)}).join(" ")}function yr(e,t){var n=t?r[P]:r[z];return e.replace(n,function(e,r,t,n,i){var s;if(mr(r))s="";else if(mr(t))s=">="+r+".0.0-0 <"+(+r+1)+".0.0-0";else if(mr(n)){if(r==="0")s=">="+r+"."+t+".0-0 <"+r+"."+(+t+1)+".0-0";else s=">="+r+"."+t+".0-0 <"+(+r+1)+".0.0-0"}else if(i){if(i.charAt(0)!=="-")i="-"+i;if(r==="0"){if(t==="0")s="="+r+"."+t+"."+n+i;else s=">="+r+"."+t+"."+n+i+" <"+r+"."+(+t+1)+".0-0"}else s=">="+r+"."+t+"."+n+i+" <"+(+r+1)+".0.0-0"}else{if(r==="0"){if(t==="0")s="="+r+"."+t+"."+n;else s=">="+r+"."+t+"."+n+"-0"+" <"+r+"."+(+t+1)+".0-0"}else s=">="+r+"."+t+"."+n+"-0"+" <"+(+r+1)+".0.0-0"}return s})}function br(e,r){return e.split(/\s+/).map(function(e){return $r(e,r)}).join(" ")}function $r(e,t){e=e.trim();var n=t?r[x]:r[E];return e.replace(n,function(e,r,t,n,i,s){var a=mr(t);var o=a||mr(n);var f=o||mr(i);var u=f;if(r==="="&&u)r="";if(r&&u){if(a)t=0;if(o)n=0;if(f)i=0;if(r===">"){r=">=";if(a){}else if(o){t=+t+1;n=0;i=0}else if(f){n=+n+1;i=0}}e=r+t+"."+n+"."+i+"-0"}else if(a){e="*"}else if(o){e=">="+t+".0.0-0 <"+(+t+1)+".0.0-0"}else if(f){e=">="+t+"."+n+".0-0 <"+t+"."+(+n+1)+".0-0"}return e})}function jr(e,t){return e.trim().replace(r[O],"")}function kr(e,r,t,n,i,s,a,o,f,u,c,l,p){if(mr(t))r="";else if(mr(n))r=">="+t+".0.0-0";else if(mr(i))r=">="+t+"."+n+".0-0";else r=">="+r;if(mr(f))o="";else if(mr(u))o="<"+(+f+1)+".0.0-0";else if(mr(c))o="<"+f+"."+(+u+1)+".0-0";else if(l)o="<="+f+"."+u+"."+c+"-"+l;else o="<="+o;return(r+" "+o).trim()}pr.prototype.test=function(e){if(!e)return false;for(var r=0;r",t)}e.outside=Tr;function Tr(e,r,t,n){e=new H(e,n);r=new pr(r,n);var i,s,a,o,f;switch(t){case">":i=nr;s=fr;a=ir;o=">";f=">=";break;case"<":i=ir;s=or;a=nr;o="<";f="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(xr(e,r,n)){return false}for(var u=0;u)?=?)";var b=n++;t[b]=t[s]+"|x|X|\\*";var j=n++;t[j]=t[i]+"|x|X|\\*";var $=n++;t[$]="[v=\\s]*("+t[j]+")"+"(?:\\.("+t[j]+")"+"(?:\\.("+t[j]+")"+"(?:"+t[c]+")?"+t[v]+"?"+")?)?";var k=n++;t[k]="[v=\\s]*("+t[b]+")"+"(?:\\.("+t[b]+")"+"(?:\\.("+t[b]+")"+"(?:"+t[p]+")?"+t[v]+"?"+")?)?";var E=n++;t[E]="^"+t[d]+"\\s*"+t[$]+"$";var x=n++;t[x]="^"+t[d]+"\\s*"+t[k]+"$";var R=n++;t[R]="(?:~>?)";var S=n++;t[S]="(\\s*)"+t[R]+"\\s+";r[S]=new RegExp(t[S],"g");var V="$1~";var I=n++;t[I]="^"+t[R]+t[$]+"$";var T=n++;t[T]="^"+t[R]+t[k]+"$";var A=n++;t[A]="(?:\\^)";var C=n++;t[C]="(\\s*)"+t[A]+"\\s+";r[C]=new RegExp(t[C],"g");var M="$1^";var z=n++;t[z]="^"+t[A]+t[$]+"$";var P=n++;t[P]="^"+t[A]+t[k]+"$";var Z=n++;t[Z]="^"+t[d]+"\\s*("+w+")$|^$";var q=n++;t[q]="^"+t[d]+"\\s*("+g+")$|^$";var L=n++;t[L]="(\\s*)"+t[d]+"\\s*("+w+"|"+t[$]+")";r[L]=new RegExp(t[L],"g");var X="$1$2$3";var _=n++;t[_]="^\\s*("+t[$]+")"+"\\s+-\\s+"+"("+t[$]+")"+"\\s*$";var N=n++;t[N]="^\\s*("+t[k]+")"+"\\s+-\\s+"+"("+t[k]+")"+"\\s*$";var O=n++;t[O]="(<|>)?=?\\s*\\*";for(var B=0;B'};H.prototype.toString=function(){return this.version};H.prototype.compare=function(e){if(!(e instanceof H))e=new H(e,this.loose);return this.compareMain(e)||this.comparePre(e)};H.prototype.compareMain=function(e){if(!(e instanceof H))e=new H(e,this.loose);return Q(this.major,e.major)||Q(this.minor,e.minor)||Q(this.patch,e.patch)};H.prototype.comparePre=function(e){if(!(e instanceof H))e=new H(e,this.loose);if(this.prerelease.length&&!e.prerelease.length)return-1;else if(!this.prerelease.length&&e.prerelease.length)return 1;else if(!this.prerelease.length&&!e.prerelease.length)return 0;var r=0;do{var t=this.prerelease[r];var n=e.prerelease[r];if(t===undefined&&n===undefined)return 0;else if(n===undefined)return 1;else if(t===undefined)return-1;else if(t===n)continue;else return Q(t,n)}while(++r)};H.prototype.inc=function(e){switch(e){case"premajor":this.prerelease.length=0;this.patch=0;this.minor=0;this.major++;this.inc("pre");break;case"preminor":this.prerelease.length=0;this.patch=0;this.minor++;this.inc("pre");break;case"prepatch":this.prerelease.length=0;this.inc("patch");this.inc("pre");break;case"prerelease":if(this.prerelease.length===0)this.inc("patch");this.inc("pre");break;case"major":if(this.minor!==0||this.patch!==0||this.prerelease.length===0)this.major++;this.minor=0;this.patch=0;this.prerelease=[];break;case"minor":if(this.patch!==0||this.prerelease.length===0)this.minor++;this.patch=0;this.prerelease=[];break;case"patch":if(this.prerelease.length===0)this.patch++;this.prerelease=[];break;case"pre":if(this.prerelease.length===0)this.prerelease=[0];else{var r=this.prerelease.length;while(--r>=0){if(typeof this.prerelease[r]==="number"){this.prerelease[r]++;r=-2}}if(r===-1)this.prerelease.push(0)}break;default:throw new Error("invalid increment argument: "+e)}this.format();return this};e.inc=J;function J(e,r,t){try{return new H(e,t).inc(r).version}catch(n){return null}}e.compareIdentifiers=Q;var K=/^[0-9]+$/;function Q(e,r){var t=K.test(e);var n=K.test(r);if(t&&n){e=+e;r=+r}return t&&!n?-1:n&&!t?1:er?1:0}e.rcompareIdentifiers=U;function U(e,r){return Q(r,e)}e.compare=W;function W(e,r,t){return new H(e,t).compare(r)}e.compareLoose=Y;function Y(e,r){return W(e,r,true)}e.rcompare=er;function er(e,r,t){return W(r,e,t)}e.sort=rr;function rr(r,t){return r.sort(function(r,n){return e.compare(r,n,t)})}e.rsort=tr;function tr(r,t){return r.sort(function(r,n){return e.rcompare(r,n,t)})}e.gt=nr;function nr(e,r,t){return W(e,r,t)>0}e.lt=ir;function ir(e,r,t){return W(e,r,t)<0}e.eq=sr;function sr(e,r,t){return W(e,r,t)===0}e.neq=or;function or(e,r,t){return W(e,r,t)!==0}e.gte=ar;function ar(e,r,t){return W(e,r,t)>=0}e.lte=fr;function fr(e,r,t){return W(e,r,t)<=0}e.cmp=ur;function ur(e,r,t,n){var i;switch(r){case"===":if(typeof e==="object")e=e.version;if(typeof t==="object")t=t.version;i=e===t;break;case"!==":if(typeof e==="object")e=e.version;if(typeof t==="object")t=t.version;i=e!==t;break;case"":case"=":case"==":i=sr(e,t,n);break;case"!=":i=or(e,t,n);break;case">":i=nr(e,t,n);break;case">=":i=ar(e,t,n);break;case"<":i=ir(e,t,n);break;case"<=":i=fr(e,t,n);break;default:throw new TypeError("Invalid operator: "+r)}return i}e.Comparator=lr;function lr(e,r){if(e instanceof lr){if(e.loose===r)return e;else e=e.value}if(!(this instanceof lr))return new lr(e,r);this.loose=r;this.parse(e);if(this.semver===cr)this.value="";else this.value=this.operator+this.semver.version}var cr={};lr.prototype.parse=function(e){var t=this.loose?r[Z]:r[q];var n=e.match(t);if(!n)throw new TypeError("Invalid comparator: "+e);this.operator=n[1];if(this.operator==="=")this.operator="";if(!n[2])this.semver=cr;else this.semver=new H(n[2],this.loose)};lr.prototype.inspect=function(){return''};lr.prototype.toString=function(){return this.value};lr.prototype.test=function(e){if(this.semver===cr)return true;if(typeof e==="string")e=new H(e,this.loose);return ur(e,this.operator,this.semver,this.loose)};e.Range=pr;function pr(e,r){if(e instanceof pr&&e.loose===r)return e;if(!(this instanceof pr))return new pr(e,r);this.loose=r;this.raw=e;this.set=e.split(/\s*\|\|\s*/).map(function(e){return this.parseRange(e.trim())},this).filter(function(e){return e.length});if(!this.set.length){throw new TypeError("Invalid SemVer Range: "+e)}this.format()}pr.prototype.inspect=function(){return''};pr.prototype.format=function(){this.range=this.set.map(function(e){return e.join(" ").trim()}).join("||").trim();return this.range};pr.prototype.toString=function(){return this.range};pr.prototype.parseRange=function(e){var t=this.loose;e=e.trim();var n=t?r[N]:r[_];e=e.replace(n,kr);e=e.replace(r[L],X);e=e.replace(r[S],V);e=e.replace(r[C],M);e=e.split(/\s+/).join(" ");var i=t?r[Z]:r[q];var s=e.split(" ").map(function(e){return vr(e,t)}).join(" ").split(/\s+/);if(this.loose){s=s.filter(function(e){return!!e.match(i)})}s=s.map(function(e){return new lr(e,t)});return s};e.toComparators=hr;function hr(e,r){return new pr(e,r).set.map(function(e){return e.map(function(e){return e.value}).join(" ").trim().split(" ")})}function vr(e,r){e=yr(e,r);e=gr(e,r);e=br(e,r);e=$r(e,r);return e}function mr(e){return!e||e.toLowerCase()==="x"||e==="*"}function gr(e,r){return e.trim().split(/\s+/).map(function(e){return wr(e,r)}).join(" ")}function wr(e,t){var n=t?r[T]:r[I];return e.replace(n,function(e,r,t,n,i){var s;if(mr(r))s="";else if(mr(t))s=">="+r+".0.0 <"+(+r+1)+".0.0";else if(mr(n))s=">="+r+"."+t+".0 <"+r+"."+(+t+1)+".0";else if(i){if(i.charAt(0)!=="-")i="-"+i;s=">="+r+"."+t+"."+n+i+" <"+r+"."+(+t+1)+".0"}else s=">="+r+"."+t+"."+n+" <"+r+"."+(+t+1)+".0";return s})}function yr(e,r){return e.trim().split(/\s+/).map(function(e){return dr(e,r)}).join(" ")}function dr(e,t){var n=t?r[P]:r[z];return e.replace(n,function(e,r,t,n,i){var s;if(mr(r))s="";else if(mr(t))s=">="+r+".0.0 <"+(+r+1)+".0.0";else if(mr(n)){if(r==="0")s=">="+r+"."+t+".0 <"+r+"."+(+t+1)+".0";else s=">="+r+"."+t+".0 <"+(+r+1)+".0.0"}else if(i){if(i.charAt(0)!=="-")i="-"+i;if(r==="0"){if(t==="0")s=">="+r+"."+t+"."+n+i+" <"+r+"."+t+"."+(+n+1);else s=">="+r+"."+t+"."+n+i+" <"+r+"."+(+t+1)+".0"}else s=">="+r+"."+t+"."+n+i+" <"+(+r+1)+".0.0"}else{if(r==="0"){if(t==="0")s=">="+r+"."+t+"."+n+" <"+r+"."+t+"."+(+n+1);else s=">="+r+"."+t+"."+n+" <"+r+"."+(+t+1)+".0"}else s=">="+r+"."+t+"."+n+" <"+(+r+1)+".0.0"}return s})}function br(e,r){return e.split(/\s+/).map(function(e){return jr(e,r)}).join(" ")}function jr(e,t){e=e.trim();var n=t?r[x]:r[E];return e.replace(n,function(e,r,t,n,i,s){var o=mr(t);var a=o||mr(n);var f=a||mr(i);var u=f;if(r==="="&&u)r="";if(r&&u){if(o)t=0;if(a)n=0;if(f)i=0;if(r===">"){r=">=";if(o){}else if(a){t=+t+1;n=0;i=0}else if(f){n=+n+1;i=0}}e=r+t+"."+n+"."+i}else if(o){e="*"}else if(a){e=">="+t+".0.0 <"+(+t+1)+".0.0"}else if(f){e=">="+t+"."+n+".0 <"+t+"."+(+n+1)+".0"}return e})}function $r(e,t){return e.trim().replace(r[O],"")}function kr(e,r,t,n,i,s,o,a,f,u,l,c,p){if(mr(t))r="";else if(mr(n))r=">="+t+".0.0";else if(mr(i))r=">="+t+"."+n+".0";else r=">="+r;if(mr(f))a="";else if(mr(u))a="<"+(+f+1)+".0.0";else if(mr(l))a="<"+f+"."+(+u+1)+".0";else if(c)a="<="+f+"."+u+"."+l+"-"+c;else a="<="+a;return(r+" "+a).trim()}pr.prototype.test=function(e){if(!e)return false;if(typeof e==="string")e=new H(e,this.loose);for(var r=0;r0){var n=e[t].semver;if(n.major===r.major&&n.minor===r.minor&&n.patch===r.patch)return true}}return false}return true}e.satisfies=xr;function xr(e,r,t){try{r=new pr(r,t)}catch(n){return false}return r.test(e)}e.maxSatisfying=Rr;function Rr(e,r,t){return e.filter(function(e){return xr(e,r,t)}).sort(function(e,r){return er(e,r,t)})[0]||null}e.validRange=Sr;function Sr(e,r){try{return new pr(e,r).range||"*"}catch(t){return null}}e.ltr=Vr;function Vr(e,r,t){return Tr(e,r,"<",t)}e.gtr=Ir;function Ir(e,r,t){return Tr(e,r,">",t)}e.outside=Tr;function Tr(e,r,t,n){e=new H(e,n);r=new pr(r,n);var i,s,o,a,f;switch(t){case">":i=nr;s=fr;o=ir;a=">";f=">=";break;case"<":i=ir;s=ar;o=nr;a="<";f="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(xr(e,r,n)){return false}for(var u=0;uG{ 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 bE=~0xM|5|#=u^a;f$shbtmpE5zbya&;d_Mw literal 3295 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 dNMvoIZUaUrRsk8v!{SUD&#K$8m001@&S!e(N diff --git a/deps/npm/node_modules/semver/test/clean.js b/deps/npm/node_modules/semver/test/clean.js new file mode 100644 index 00000000000..1ab13e416f1 --- /dev/null +++ b/deps/npm/node_modules/semver/test/clean.js @@ -0,0 +1,25 @@ +var tap = require('tap'); +var test = tap.test; +var semver = require('../semver.js'); +var clean = semver.clean; + +test('\nclean tests', function(t) { + // [range, version] + // Version should be detectable despite extra characters + [ + ['1.2.3', '1.2.3'], + [' 1.2.3 ', '1.2.3'], + [' 1.2.3-4 ', '1.2.3-4'], + [' 1.2.3-pre ', '1.2.3-pre'], + [' =v1.2.3 ', '1.2.3'], + ['v1.2.3', '1.2.3'], + [' v1.2.3 ', '1.2.3'], + ['\t1.2.3', '1.2.3'] + ].forEach(function(tuple) { + var range = tuple[0]; + var version = tuple[1]; + var msg = 'clean(' + range + ') = ' + version; + t.equal(clean(range), version, msg); + }); + t.end(); +}); diff --git a/deps/npm/node_modules/semver/test/gtr.js b/deps/npm/node_modules/semver/test/gtr.js index cb6199efcf8..8537fac0bef 100644 --- a/deps/npm/node_modules/semver/test/gtr.js +++ b/deps/npm/node_modules/semver/test/gtr.js @@ -39,7 +39,7 @@ test('\ngtr tests', function(t) { ['~v0.5.4-pre', '0.6.1-pre'], ['=0.7.x', '0.8.0'], ['=0.7.x', '0.8.0-asdf'], - ['<=0.7.x', '0.7.0'], + ['<0.7.x', '0.7.0'], ['~1.2.2', '1.3.0'], ['1.0.0 - 2.0.0', '2.2.3'], ['1.0.0', '1.0.1'], diff --git a/deps/npm/node_modules/semver/test/index.js b/deps/npm/node_modules/semver/test/index.js index 6285b693f9a..9f9a36d98f3 100644 --- a/deps/npm/node_modules/semver/test/index.js +++ b/deps/npm/node_modules/semver/test/index.js @@ -1,3 +1,5 @@ +'use strict'; + var tap = require('tap'); var test = tap.test; var semver = require('../semver.js'); @@ -130,6 +132,15 @@ test('\nrange tests', function(t) { // [range, version] // version should be included by range [['1.0.0 - 2.0.0', '1.2.3'], + ['^1.2.3+build', '1.2.3'], + ['^1.2.3+build', '1.3.0'], + ['1.2.3-pre+asdf - 2.4.3-pre+asdf', '1.2.3'], + ['1.2.3pre+asdf - 2.4.3-pre+asdf', '1.2.3', true], + ['1.2.3-pre+asdf - 2.4.3pre+asdf', '1.2.3', true], + ['1.2.3pre+asdf - 2.4.3pre+asdf', '1.2.3', true], + ['1.2.3-pre+asdf - 2.4.3-pre+asdf', '1.2.3-pre.2'], + ['1.2.3-pre+asdf - 2.4.3-pre+asdf', '2.4.3-alpha'], + ['1.2.3+asdf - 2.4.3+asdf', '1.2.3'], ['1.0.0', '1.0.0'], ['>=*', '0.2.4'], ['', '1.0.0'], @@ -187,13 +198,10 @@ test('\nrange tests', function(t) { ['>= 1', '1.0.0'], ['<1.2', '1.1.1'], ['< 1.2', '1.1.1'], - ['1', '1.0.0beta', true], ['~v0.5.4-pre', '0.5.5'], ['~v0.5.4-pre', '0.5.4'], ['=0.7.x', '0.7.2'], ['>=0.7.x', '0.7.2'], - ['=0.7.x', '0.7.0-asdf'], - ['>=0.7.x', '0.7.0-asdf'], ['<=0.7.x', '0.6.2'], ['~1.2.1 >=1.2.3', '1.2.3'], ['~1.2.1 =1.2.3', '1.2.3'], @@ -205,17 +213,15 @@ test('\nrange tests', function(t) { ['1.2.3 >=1.2.1', '1.2.3'], ['>=1.2.3 >=1.2.1', '1.2.3'], ['>=1.2.1 >=1.2.3', '1.2.3'], - ['<=1.2.3', '1.2.3-beta'], - ['>1.2', '1.3.0-beta'], ['>=1.2', '1.2.8'], ['^1.2.3', '1.8.1'], - ['^1.2.3', '1.2.3-beta'], ['^0.1.2', '0.1.2'], ['^0.1', '0.1.2'], ['^1.2', '1.4.2'], ['^1.2 ^1', '1.4.2'], - ['^1.2', '1.2.0-pre'], - ['^1.2.3', '1.2.3-pre'] + ['^1.2.3-alpha', '1.2.3-pre'], + ['^1.2.0-alpha', '1.2.0-pre'], + ['^0.0.1-alpha', '0.0.1-beta'] ].forEach(function(v) { var range = v[0]; var ver = v[1]; @@ -229,6 +235,20 @@ test('\nnegative range tests', function(t) { // [range, version] // version should not be included by range [['1.0.0 - 2.0.0', '2.2.3'], + ['1.2.3+asdf - 2.4.3+asdf', '1.2.3-pre.2'], + ['1.2.3+asdf - 2.4.3+asdf', '2.4.3-alpha'], + ['^1.2.3+build', '2.0.0'], + ['^1.2.3+build', '1.2.0'], + ['^1.2.3', '1.2.3-pre'], + ['^1.2', '1.2.0-pre'], + ['>1.2', '1.3.0-beta'], + ['<=1.2.3', '1.2.3-beta'], + ['^1.2.3', '1.2.3-beta'], + ['=0.7.x', '0.7.0-asdf'], + ['>=0.7.x', '0.7.0-asdf'], + ['1', '1.0.0beta', true], + ['<1', '1.0.0beta', true], + ['< 1', '1.0.0beta', true], ['1.0.0', '1.0.1'], ['>=1.0.0', '0.0.0'], ['>=1.0.0', '0.0.1'], @@ -268,8 +288,6 @@ test('\nnegative range tests', function(t) { ['>=1.2', '1.1.1'], ['1', '2.0.0beta', true], ['~v0.5.4-beta', '0.5.4-alpha'], - ['<1', '1.0.0beta', true], - ['< 1', '1.0.0beta', true], ['=0.7.x', '0.8.2'], ['>=0.7.x', '0.6.2'], ['<=0.7.x', '0.7.2'], @@ -327,12 +345,14 @@ test('\nincrement versions test', function(t) { ['1.2.3-alpha.9.beta', 'prerelease', '1.2.3-alpha.10.beta'], ['1.2.3-alpha.10.beta', 'prerelease', '1.2.3-alpha.11.beta'], ['1.2.3-alpha.11.beta', 'prerelease', '1.2.3-alpha.12.beta'], + ['1.2.0', 'prepatch', '1.2.1-0'], + ['1.2.0-1', 'prepatch', '1.2.1-0'], ['1.2.0', 'preminor', '1.3.0-0'], + ['1.2.3-1', 'preminor', '1.3.0-0'], ['1.2.0', 'premajor', '2.0.0-0'], - ['1.2.0', 'preminor', '1.3.0-0'], - ['1.2.0', 'premajor', '2.0.0-0'] - - + ['1.2.3-1', 'premajor', '2.0.0-0'], + ['1.2.0-1', 'minor', '1.2.0'], + ['1.0.0-1', 'major', '1.0.0'] ].forEach(function(v) { var pre = v[0]; var what = v[1]; @@ -351,18 +371,18 @@ test('\nvalid range test', function(t) { // translate ranges into their canonical form [['1.0.0 - 2.0.0', '>=1.0.0 <=2.0.0'], ['1.0.0', '1.0.0'], - ['>=*', '>=0.0.0-0'], + ['>=*', '>=0.0.0'], ['', '*'], ['*', '*'], ['*', '*'], ['>=1.0.0', '>=1.0.0'], ['>1.0.0', '>1.0.0'], ['<=2.0.0', '<=2.0.0'], - ['1', '>=1.0.0-0 <2.0.0-0'], + ['1', '>=1.0.0 <2.0.0'], ['<=2.0.0', '<=2.0.0'], ['<=2.0.0', '<=2.0.0'], - ['<2.0.0', '<2.0.0-0'], - ['<2.0.0', '<2.0.0-0'], + ['<2.0.0', '<2.0.0'], + ['<2.0.0', '<2.0.0'], ['>= 1.0.0', '>=1.0.0'], ['>= 1.0.0', '>=1.0.0'], ['>= 1.0.0', '>=1.0.0'], @@ -371,56 +391,56 @@ test('\nvalid range test', function(t) { ['<= 2.0.0', '<=2.0.0'], ['<= 2.0.0', '<=2.0.0'], ['<= 2.0.0', '<=2.0.0'], - ['< 2.0.0', '<2.0.0-0'], - ['< 2.0.0', '<2.0.0-0'], + ['< 2.0.0', '<2.0.0'], + ['< 2.0.0', '<2.0.0'], ['>=0.1.97', '>=0.1.97'], ['>=0.1.97', '>=0.1.97'], ['0.1.20 || 1.2.4', '0.1.20||1.2.4'], - ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1-0'], - ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1-0'], - ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1-0'], + ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1'], + ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1'], + ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1'], ['||', '||'], - ['2.x.x', '>=2.0.0-0 <3.0.0-0'], - ['1.2.x', '>=1.2.0-0 <1.3.0-0'], - ['1.2.x || 2.x', '>=1.2.0-0 <1.3.0-0||>=2.0.0-0 <3.0.0-0'], - ['1.2.x || 2.x', '>=1.2.0-0 <1.3.0-0||>=2.0.0-0 <3.0.0-0'], + ['2.x.x', '>=2.0.0 <3.0.0'], + ['1.2.x', '>=1.2.0 <1.3.0'], + ['1.2.x || 2.x', '>=1.2.0 <1.3.0||>=2.0.0 <3.0.0'], + ['1.2.x || 2.x', '>=1.2.0 <1.3.0||>=2.0.0 <3.0.0'], ['x', '*'], - ['2.*.*', '>=2.0.0-0 <3.0.0-0'], - ['1.2.*', '>=1.2.0-0 <1.3.0-0'], - ['1.2.* || 2.*', '>=1.2.0-0 <1.3.0-0||>=2.0.0-0 <3.0.0-0'], + ['2.*.*', '>=2.0.0 <3.0.0'], + ['1.2.*', '>=1.2.0 <1.3.0'], + ['1.2.* || 2.*', '>=1.2.0 <1.3.0||>=2.0.0 <3.0.0'], ['*', '*'], - ['2', '>=2.0.0-0 <3.0.0-0'], - ['2.3', '>=2.3.0-0 <2.4.0-0'], - ['~2.4', '>=2.4.0-0 <2.5.0-0'], - ['~2.4', '>=2.4.0-0 <2.5.0-0'], - ['~>3.2.1', '>=3.2.1-0 <3.3.0-0'], - ['~1', '>=1.0.0-0 <2.0.0-0'], - ['~>1', '>=1.0.0-0 <2.0.0-0'], - ['~> 1', '>=1.0.0-0 <2.0.0-0'], - ['~1.0', '>=1.0.0-0 <1.1.0-0'], - ['~ 1.0', '>=1.0.0-0 <1.1.0-0'], - ['^0', '>=0.0.0-0 <1.0.0-0'], - ['^ 1', '>=1.0.0-0 <2.0.0-0'], - ['^0.1', '>=0.1.0-0 <0.2.0-0'], - ['^1.0', '>=1.0.0-0 <2.0.0-0'], - ['^1.2', '>=1.2.0-0 <2.0.0-0'], - ['^0.0.1', '=0.0.1'], - ['^0.0.1-beta', '=0.0.1-beta'], - ['^0.1.2', '>=0.1.2-0 <0.2.0-0'], - ['^1.2.3', '>=1.2.3-0 <2.0.0-0'], - ['^1.2.3-beta.4', '>=1.2.3-beta.4 <2.0.0-0'], - ['<1', '<1.0.0-0'], - ['< 1', '<1.0.0-0'], - ['>=1', '>=1.0.0-0'], - ['>= 1', '>=1.0.0-0'], - ['<1.2', '<1.2.0-0'], - ['< 1.2', '<1.2.0-0'], - ['1', '>=1.0.0-0 <2.0.0-0'], + ['2', '>=2.0.0 <3.0.0'], + ['2.3', '>=2.3.0 <2.4.0'], + ['~2.4', '>=2.4.0 <2.5.0'], + ['~2.4', '>=2.4.0 <2.5.0'], + ['~>3.2.1', '>=3.2.1 <3.3.0'], + ['~1', '>=1.0.0 <2.0.0'], + ['~>1', '>=1.0.0 <2.0.0'], + ['~> 1', '>=1.0.0 <2.0.0'], + ['~1.0', '>=1.0.0 <1.1.0'], + ['~ 1.0', '>=1.0.0 <1.1.0'], + ['^0', '>=0.0.0 <1.0.0'], + ['^ 1', '>=1.0.0 <2.0.0'], + ['^0.1', '>=0.1.0 <0.2.0'], + ['^1.0', '>=1.0.0 <2.0.0'], + ['^1.2', '>=1.2.0 <2.0.0'], + ['^0.0.1', '>=0.0.1 <0.0.2'], + ['^0.0.1-beta', '>=0.0.1-beta <0.0.2'], + ['^0.1.2', '>=0.1.2 <0.2.0'], + ['^1.2.3', '>=1.2.3 <2.0.0'], + ['^1.2.3-beta.4', '>=1.2.3-beta.4 <2.0.0'], + ['<1', '<1.0.0'], + ['< 1', '<1.0.0'], + ['>=1', '>=1.0.0'], + ['>= 1', '>=1.0.0'], + ['<1.2', '<1.2.0'], + ['< 1.2', '<1.2.0'], + ['1', '>=1.0.0 <2.0.0'], ['>01.02.03', '>1.2.3', true], ['>01.02.03', null], - ['~1.2.3beta', '>=1.2.3-beta <1.3.0-0', true], + ['~1.2.3beta', '>=1.2.3-beta <1.3.0', true], ['~1.2.3beta', null], - ['^ 1.2 ^ 1', '>=1.2.0-0 <2.0.0-0 >=1.0.0-0 <2.0.0-0'] + ['^ 1.2 ^ 1', '>=1.2.0 <2.0.0 >=1.0.0 <2.0.0'] ].forEach(function(v) { var pre = v[0]; var wanted = v[1]; @@ -438,7 +458,7 @@ test('\ncomparators test', function(t) { // turn range into a set of individual comparators [['1.0.0 - 2.0.0', [['>=1.0.0', '<=2.0.0']]], ['1.0.0', [['1.0.0']]], - ['>=*', [['>=0.0.0-0']]], + ['>=*', [['>=0.0.0']]], ['', [['']]], ['*', [['']]], ['*', [['']]], @@ -448,11 +468,11 @@ test('\ncomparators test', function(t) { ['>1.0.0', [['>1.0.0']]], ['>1.0.0', [['>1.0.0']]], ['<=2.0.0', [['<=2.0.0']]], - ['1', [['>=1.0.0-0', '<2.0.0-0']]], + ['1', [['>=1.0.0', '<2.0.0']]], ['<=2.0.0', [['<=2.0.0']]], ['<=2.0.0', [['<=2.0.0']]], - ['<2.0.0', [['<2.0.0-0']]], - ['<2.0.0', [['<2.0.0-0']]], + ['<2.0.0', [['<2.0.0']]], + ['<2.0.0', [['<2.0.0']]], ['>= 1.0.0', [['>=1.0.0']]], ['>= 1.0.0', [['>=1.0.0']]], ['>= 1.0.0', [['>=1.0.0']]], @@ -461,47 +481,48 @@ test('\ncomparators test', function(t) { ['<= 2.0.0', [['<=2.0.0']]], ['<= 2.0.0', [['<=2.0.0']]], ['<= 2.0.0', [['<=2.0.0']]], - ['< 2.0.0', [['<2.0.0-0']]], - ['<\t2.0.0', [['<2.0.0-0']]], + ['< 2.0.0', [['<2.0.0']]], + ['<\t2.0.0', [['<2.0.0']]], ['>=0.1.97', [['>=0.1.97']]], ['>=0.1.97', [['>=0.1.97']]], ['0.1.20 || 1.2.4', [['0.1.20'], ['1.2.4']]], - ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1-0']]], - ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1-0']]], - ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1-0']]], + ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1']]], + ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1']]], + ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1']]], ['||', [[''], ['']]], - ['2.x.x', [['>=2.0.0-0', '<3.0.0-0']]], - ['1.2.x', [['>=1.2.0-0', '<1.3.0-0']]], - ['1.2.x || 2.x', [['>=1.2.0-0', '<1.3.0-0'], ['>=2.0.0-0', '<3.0.0-0']]], - ['1.2.x || 2.x', [['>=1.2.0-0', '<1.3.0-0'], ['>=2.0.0-0', '<3.0.0-0']]], + ['2.x.x', [['>=2.0.0', '<3.0.0']]], + ['1.2.x', [['>=1.2.0', '<1.3.0']]], + ['1.2.x || 2.x', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]], + ['1.2.x || 2.x', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]], ['x', [['']]], - ['2.*.*', [['>=2.0.0-0', '<3.0.0-0']]], - ['1.2.*', [['>=1.2.0-0', '<1.3.0-0']]], - ['1.2.* || 2.*', [['>=1.2.0-0', '<1.3.0-0'], ['>=2.0.0-0', '<3.0.0-0']]], - ['1.2.* || 2.*', [['>=1.2.0-0', '<1.3.0-0'], ['>=2.0.0-0', '<3.0.0-0']]], + ['2.*.*', [['>=2.0.0', '<3.0.0']]], + ['1.2.*', [['>=1.2.0', '<1.3.0']]], + ['1.2.* || 2.*', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]], + ['1.2.* || 2.*', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]], ['*', [['']]], - ['2', [['>=2.0.0-0', '<3.0.0-0']]], - ['2.3', [['>=2.3.0-0', '<2.4.0-0']]], - ['~2.4', [['>=2.4.0-0', '<2.5.0-0']]], - ['~2.4', [['>=2.4.0-0', '<2.5.0-0']]], - ['~>3.2.1', [['>=3.2.1-0', '<3.3.0-0']]], - ['~1', [['>=1.0.0-0', '<2.0.0-0']]], - ['~>1', [['>=1.0.0-0', '<2.0.0-0']]], - ['~> 1', [['>=1.0.0-0', '<2.0.0-0']]], - ['~1.0', [['>=1.0.0-0', '<1.1.0-0']]], - ['~ 1.0', [['>=1.0.0-0', '<1.1.0-0']]], - ['~ 1.0.3', [['>=1.0.3-0', '<1.1.0-0']]], - ['~> 1.0.3', [['>=1.0.3-0', '<1.1.0-0']]], - ['<1', [['<1.0.0-0']]], - ['< 1', [['<1.0.0-0']]], - ['>=1', [['>=1.0.0-0']]], - ['>= 1', [['>=1.0.0-0']]], - ['<1.2', [['<1.2.0-0']]], - ['< 1.2', [['<1.2.0-0']]], - ['1', [['>=1.0.0-0', '<2.0.0-0']]], - ['1 2', [['>=1.0.0-0', '<2.0.0-0', '>=2.0.0-0', '<3.0.0-0']]], - ['1.2 - 3.4.5', [['>=1.2.0-0', '<=3.4.5']]], - ['1.2.3 - 3.4', [['>=1.2.3', '<3.5.0-0']]] + ['2', [['>=2.0.0', '<3.0.0']]], + ['2.3', [['>=2.3.0', '<2.4.0']]], + ['~2.4', [['>=2.4.0', '<2.5.0']]], + ['~2.4', [['>=2.4.0', '<2.5.0']]], + ['~>3.2.1', [['>=3.2.1', '<3.3.0']]], + ['~1', [['>=1.0.0', '<2.0.0']]], + ['~>1', [['>=1.0.0', '<2.0.0']]], + ['~> 1', [['>=1.0.0', '<2.0.0']]], + ['~1.0', [['>=1.0.0', '<1.1.0']]], + ['~ 1.0', [['>=1.0.0', '<1.1.0']]], + ['~ 1.0.3', [['>=1.0.3', '<1.1.0']]], + ['~> 1.0.3', [['>=1.0.3', '<1.1.0']]], + ['<1', [['<1.0.0']]], + ['< 1', [['<1.0.0']]], + ['>=1', [['>=1.0.0']]], + ['>= 1', [['>=1.0.0']]], + ['<1.2', [['<1.2.0']]], + ['< 1.2', [['<1.2.0']]], + ['1', [['>=1.0.0', '<2.0.0']]], + ['1 2', [['>=1.0.0', '<2.0.0', '>=2.0.0', '<3.0.0']]], + ['1.2 - 3.4.5', [['>=1.2.0', '<=3.4.5']]], + ['1.2.3 - 3.4', [['>=1.2.3', '<3.5.0']]], + ['1.2.3 - 3', [['>=1.2.3', '<4.0.0']]] ].forEach(function(v) { var pre = v[0]; var wanted = v[1]; @@ -555,7 +576,7 @@ test('\nstrict vs loose version numbers', function(t) { test('\nstrict vs loose ranges', function(t) { [['>=01.02.03', '>=1.2.3'], - ['~1.02.03beta', '>=1.2.3-beta <1.3.0-0'] + ['~1.02.03beta', '>=1.2.3-beta <1.3.0'] ].forEach(function(v) { var loose = v[0]; var comps = v[1]; diff --git a/deps/npm/node_modules/semver/test/ltr.js b/deps/npm/node_modules/semver/test/ltr.js index a4f503a3c42..ecd1387ddfe 100644 --- a/deps/npm/node_modules/semver/test/ltr.js +++ b/deps/npm/node_modules/semver/test/ltr.js @@ -66,6 +66,10 @@ test('\nltr tests', function(t) { ['>1', '1.0.0beta', true], ['> 1', '1.0.0beta', true], ['=0.7.x', '0.6.2'], + ['=0.7.x', '0.7.0-asdf'], + ['^1', '1.0.0-0'], + ['>=0.7.x', '0.7.0-asdf'], + ['1', '1.0.0beta', true], ['>=0.7.x', '0.6.2'] ].forEach(function(tuple) { var range = tuple[0]; @@ -145,24 +149,27 @@ test('\nnegative ltr tests', function(t) { ['>= 1', '1.0.0'], ['<1.2', '1.1.1'], ['< 1.2', '1.1.1'], - ['1', '1.0.0beta', true], ['~v0.5.4-pre', '0.5.5'], ['~v0.5.4-pre', '0.5.4'], ['=0.7.x', '0.7.2'], ['>=0.7.x', '0.7.2'], - ['=0.7.x', '0.7.0-asdf'], - ['>=0.7.x', '0.7.0-asdf'], ['<=0.7.x', '0.6.2'], ['>0.2.3 >0.2.4 <=0.2.5', '0.2.5'], ['>=0.2.3 <=0.2.4', '0.2.4'], ['1.0.0 - 2.0.0', '2.0.0'], - ['^1', '1.0.0-0'], ['^3.0.0', '4.0.0'], ['^1.0.0 || ~2.0.1', '2.0.0'], ['^0.1.0 || ~3.0.1 || 5.0.0', '3.2.0'], ['^0.1.0 || ~3.0.1 || 5.0.0', '1.0.0beta', true], ['^0.1.0 || ~3.0.1 || 5.0.0', '5.0.0-0', true], - ['^0.1.0 || ~3.0.1 || >4 <=5.0.0', '3.5.0'] + ['^0.1.0 || ~3.0.1 || >4 <=5.0.0', '3.5.0'], + ['^1.0.0alpha', '1.0.0beta', true], + ['~1.0.0alpha', '1.0.0beta', true], + ['^1.0.0-alpha', '1.0.0beta', true], + ['~1.0.0-alpha', '1.0.0beta', true], + ['^1.0.0-alpha', '1.0.0-beta'], + ['~1.0.0-alpha', '1.0.0-beta'], + ['=0.1.0', '1.0.0'] ].forEach(function(tuple) { var range = tuple[0]; var version = tuple[1]; diff --git a/deps/npm/node_modules/semver/test/no-module.js b/deps/npm/node_modules/semver/test/no-module.js index 96d1cd1fc52..8b50873f138 100644 --- a/deps/npm/node_modules/semver/test/no-module.js +++ b/deps/npm/node_modules/semver/test/no-module.js @@ -4,9 +4,9 @@ var test = tap.test; test('no module system', function(t) { var fs = require('fs'); var vm = require('vm'); - var head = fs.readFileSync(require.resolve('../head.js'), 'utf8'); + var head = fs.readFileSync(require.resolve('../head.js.txt'), 'utf8'); var src = fs.readFileSync(require.resolve('../'), 'utf8'); - var foot = fs.readFileSync(require.resolve('../foot.js'), 'utf8'); + var foot = fs.readFileSync(require.resolve('../foot.js.txt'), 'utf8'); vm.runInThisContext(head + src + foot, 'semver.js'); // just some basic poking to see if it did some stuff diff --git a/deps/npm/node_modules/sha/node_modules/readable-stream/lib/_stream_readable.js b/deps/npm/node_modules/sha/node_modules/readable-stream/lib/_stream_readable.js index 0ca77052840..630722099e9 100644 --- a/deps/npm/node_modules/sha/node_modules/readable-stream/lib/_stream_readable.js +++ b/deps/npm/node_modules/sha/node_modules/readable-stream/lib/_stream_readable.js @@ -240,7 +240,7 @@ function howMuchToRead(n, state) { if (state.objectMode) return n === 0 ? 0 : 1; - if (isNaN(n) || n === null) { + if (n === null || isNaN(n)) { // only flow one buffer at a time if (state.flowing && state.buffer.length) return state.buffer[0].length; @@ -275,6 +275,7 @@ Readable.prototype.read = function(n) { var state = this._readableState; state.calledRead = true; var nOrig = n; + var ret; if (typeof n !== 'number' || n > 0) state.emittedReadable = false; @@ -293,9 +294,28 @@ Readable.prototype.read = function(n) { // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { + ret = null; + + // In cases where the decoder did not receive enough data + // to produce a full chunk, then immediately received an + // EOF, state.buffer will contain [, ]. + // howMuchToRead will see this and coerce the amount to + // read to zero (because it's looking at the length of the + // first in state.buffer), and we'll end up here. + // + // This can only happen via state.decoder -- no other venue + // exists for pushing a zero-length chunk into state.buffer + // and triggering this behavior. In this case, we return our + // remaining data and end the stream, if appropriate. + if (state.length > 0 && state.decoder) { + ret = fromList(n, state); + state.length -= ret.length; + } + if (state.length === 0) endReadable(this); - return null; + + return ret; } // All the actual chunk generation logic needs to be @@ -349,7 +369,6 @@ Readable.prototype.read = function(n) { if (doRead && !state.reading) n = howMuchToRead(nOrig, state); - var ret; if (n > 0) ret = fromList(n, state); else @@ -382,8 +401,7 @@ function chunkInvalid(state, chunk) { 'string' !== typeof chunk && chunk !== null && chunk !== undefined && - !state.objectMode && - !er) { + !state.objectMode) { er = new TypeError('Invalid non-string/buffer chunk'); } return er; @@ -814,7 +832,12 @@ Readable.prototype.wrap = function(stream) { stream.on('data', function(chunk) { if (state.decoder) chunk = state.decoder.write(chunk); - if (!chunk || !state.objectMode && !chunk.length) + + // don't skip over falsy values in objectMode + //if (state.objectMode && util.isNullOrUndefined(chunk)) + if (state.objectMode && (chunk === null || chunk === undefined)) + return; + else if (!state.objectMode && (!chunk || !chunk.length)) return; var ret = self.push(chunk); diff --git a/deps/npm/node_modules/sha/node_modules/readable-stream/lib/_stream_writable.js b/deps/npm/node_modules/sha/node_modules/readable-stream/lib/_stream_writable.js index d0254d5a714..4bdaa4fa491 100644 --- a/deps/npm/node_modules/sha/node_modules/readable-stream/lib/_stream_writable.js +++ b/deps/npm/node_modules/sha/node_modules/readable-stream/lib/_stream_writable.js @@ -37,7 +37,6 @@ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ - var Stream = require('stream'); util.inherits(Writable, Stream); diff --git a/deps/npm/node_modules/sha/node_modules/readable-stream/node_modules/core-util-is/package.json b/deps/npm/node_modules/sha/node_modules/readable-stream/node_modules/core-util-is/package.json index 2b7593c1939..2155d11c625 100644 --- a/deps/npm/node_modules/sha/node_modules/readable-stream/node_modules/core-util-is/package.json +++ b/deps/npm/node_modules/sha/node_modules/readable-stream/node_modules/core-util-is/package.json @@ -35,7 +35,7 @@ "shasum": "6b07085aef9a3ccac6ee53bf9d3df0c1521a5538", "tarball": "http://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" }, - "_from": "core-util-is@~1.0.0", + "_from": "core-util-is@>=1.0.0 <1.1.0", "_npmVersion": "1.3.23", "_npmUser": { "name": "isaacs", @@ -49,6 +49,5 @@ ], "directories": {}, "_shasum": "6b07085aef9a3ccac6ee53bf9d3df0c1521a5538", - "_resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz", - "scripts": {} + "_resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" } diff --git a/deps/npm/node_modules/sha/node_modules/readable-stream/node_modules/isarray/package.json b/deps/npm/node_modules/sha/node_modules/readable-stream/node_modules/isarray/package.json index fc7904b67b9..04d6a3fd310 100644 --- a/deps/npm/node_modules/sha/node_modules/readable-stream/node_modules/isarray/package.json +++ b/deps/npm/node_modules/sha/node_modules/readable-stream/node_modules/isarray/package.json @@ -47,8 +47,5 @@ ], "directories": {}, "_shasum": "8a18acfca9a8f4177e09abfc6038939b05d1eedf", - "_resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "bugs": { - "url": "https://github.com/juliangruber/isarray/issues" - } + "_resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" } diff --git a/deps/npm/node_modules/sha/node_modules/readable-stream/node_modules/string_decoder/index.js b/deps/npm/node_modules/sha/node_modules/readable-stream/node_modules/string_decoder/index.js index 2e44a03e15d..b00e54fb790 100644 --- a/deps/npm/node_modules/sha/node_modules/readable-stream/node_modules/string_decoder/index.js +++ b/deps/npm/node_modules/sha/node_modules/readable-stream/node_modules/string_decoder/index.js @@ -36,6 +36,14 @@ function assertEncoding(encoding) { } } +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. CESU-8 is handled as part of the UTF-8 encoding. +// +// @TODO Handling all encodings inside a single object makes it very difficult +// to reason about this code, so it should be split up in the future. +// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code +// points as used by CESU-8. var StringDecoder = exports.StringDecoder = function(encoding) { this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); assertEncoding(encoding); @@ -60,37 +68,50 @@ var StringDecoder = exports.StringDecoder = function(encoding) { return; } + // Enough space to store all bytes of a single character. UTF-8 needs 4 + // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). this.charBuffer = new Buffer(6); + // Number of bytes received for the current incomplete multi-byte character. this.charReceived = 0; + // Number of bytes expected for the current incomplete multi-byte character. this.charLength = 0; }; +// write decodes the given buffer and returns it as JS string that is +// guaranteed to not contain any partial multi-byte characters. Any partial +// character found at the end of the buffer is buffered up, and will be +// returned when calling write again with the remaining bytes. +// +// Note: Converting a Buffer containing an orphan surrogate to a String +// currently works, but converting a String to a Buffer (via `new Buffer`, or +// Buffer#write) will replace incomplete surrogates with the unicode +// replacement character. See https://codereview.chromium.org/121173009/ . StringDecoder.prototype.write = function(buffer) { var charStr = ''; - var offset = 0; - // if our last write ended with an incomplete multibyte character while (this.charLength) { // determine how many remaining bytes this buffer has to offer for this char - var i = (buffer.length >= this.charLength - this.charReceived) ? - this.charLength - this.charReceived : - buffer.length; + var available = (buffer.length >= this.charLength - this.charReceived) ? + this.charLength - this.charReceived : + buffer.length; // add the new bytes to the char buffer - buffer.copy(this.charBuffer, this.charReceived, offset, i); - this.charReceived += (i - offset); - offset = i; + buffer.copy(this.charBuffer, this.charReceived, 0, available); + this.charReceived += available; if (this.charReceived < this.charLength) { // still not enough chars in this buffer? wait for more ... return ''; } + // remove bytes belonging to the current character from the buffer + buffer = buffer.slice(available, buffer.length); + // get the character that was split charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); - // lead surrogate (D800-DBFF) is also the incomplete character + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character var charCode = charStr.charCodeAt(charStr.length - 1); if (charCode >= 0xD800 && charCode <= 0xDBFF) { this.charLength += this.surrogateSize; @@ -100,34 +121,33 @@ StringDecoder.prototype.write = function(buffer) { this.charReceived = this.charLength = 0; // if there are no more bytes in this buffer, just emit our char - if (i == buffer.length) return charStr; - - // otherwise cut off the characters end from the beginning of this buffer - buffer = buffer.slice(i, buffer.length); + if (buffer.length === 0) { + return charStr; + } break; } - var lenIncomplete = this.detectIncompleteChar(buffer); + // determine and set charLength / charReceived + this.detectIncompleteChar(buffer); var end = buffer.length; if (this.charLength) { // buffer the incomplete character bytes we got - buffer.copy(this.charBuffer, 0, buffer.length - lenIncomplete, end); - this.charReceived = lenIncomplete; - end -= lenIncomplete; + buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); + end -= this.charReceived; } charStr += buffer.toString(this.encoding, 0, end); var end = charStr.length - 1; var charCode = charStr.charCodeAt(end); - // lead surrogate (D800-DBFF) is also the incomplete character + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character if (charCode >= 0xD800 && charCode <= 0xDBFF) { var size = this.surrogateSize; this.charLength += size; this.charReceived += size; this.charBuffer.copy(this.charBuffer, size, 0, size); - this.charBuffer.write(charStr.charAt(charStr.length - 1), this.encoding); + buffer.copy(this.charBuffer, 0, 0, size); return charStr.substring(0, end); } @@ -135,6 +155,10 @@ StringDecoder.prototype.write = function(buffer) { return charStr; }; +// detectIncompleteChar determines if there is an incomplete UTF-8 character at +// the end of the given buffer. If so, it sets this.charLength to the byte +// length that character, and sets this.charReceived to the number of bytes +// that are available for this character. StringDecoder.prototype.detectIncompleteChar = function(buffer) { // determine how many bytes we have to check at the end of this buffer var i = (buffer.length >= 3) ? 3 : buffer.length; @@ -164,8 +188,7 @@ StringDecoder.prototype.detectIncompleteChar = function(buffer) { break; } } - - return i; + this.charReceived = i; }; StringDecoder.prototype.end = function(buffer) { @@ -188,13 +211,11 @@ function passThroughWrite(buffer) { } function utf16DetectIncompleteChar(buffer) { - var incomplete = this.charReceived = buffer.length % 2; - this.charLength = incomplete ? 2 : 0; - return incomplete; + this.charReceived = buffer.length % 2; + this.charLength = this.charReceived ? 2 : 0; } function base64DetectIncompleteChar(buffer) { - var incomplete = this.charReceived = buffer.length % 3; - this.charLength = incomplete ? 3 : 0; - return incomplete; + this.charReceived = buffer.length % 3; + this.charLength = this.charReceived ? 3 : 0; } diff --git a/deps/npm/node_modules/sha/node_modules/readable-stream/node_modules/string_decoder/package.json b/deps/npm/node_modules/sha/node_modules/readable-stream/node_modules/string_decoder/package.json index 2e827f5921f..21c9cd535cb 100644 --- a/deps/npm/node_modules/sha/node_modules/readable-stream/node_modules/string_decoder/package.json +++ b/deps/npm/node_modules/sha/node_modules/readable-stream/node_modules/string_decoder/package.json @@ -1,6 +1,6 @@ { "name": "string_decoder", - "version": "0.10.25-1", + "version": "0.10.31", "description": "The string_decoder module from Node core", "main": "index.js", "dependencies": {}, @@ -22,16 +22,14 @@ "browserify" ], "license": "MIT", + "gitHead": "d46d4fd87cf1d06e031c23f1ba170ca7d4ade9a0", "bugs": { "url": "https://github.com/rvagg/string_decoder/issues" }, - "_id": "string_decoder@0.10.25-1", - "dist": { - "shasum": "f387babd95d23a2bb73b1fbf2cb3efab6f78baab", - "tarball": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" - }, - "_from": "string_decoder@~0.10.x", - "_npmVersion": "1.3.24", + "_id": "string_decoder@0.10.31", + "_shasum": "62e203bc41766c6c28c9fc84301dab1c5310fa94", + "_from": "string_decoder@>=0.10.0 <0.11.0", + "_npmVersion": "1.4.23", "_npmUser": { "name": "rvagg", "email": "rod@vagg.org" @@ -46,8 +44,10 @@ "email": "rod@vagg.org" } ], + "dist": { + "shasum": "62e203bc41766c6c28c9fc84301dab1c5310fa94", + "tarball": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + }, "directories": {}, - "_shasum": "f387babd95d23a2bb73b1fbf2cb3efab6f78baab", - "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" } diff --git a/deps/npm/node_modules/sha/node_modules/readable-stream/package.json b/deps/npm/node_modules/sha/node_modules/readable-stream/package.json index 8d8961b95aa..7483ebbecf9 100644 --- a/deps/npm/node_modules/sha/node_modules/readable-stream/package.json +++ b/deps/npm/node_modules/sha/node_modules/readable-stream/package.json @@ -1,6 +1,6 @@ { "name": "readable-stream", - "version": "1.0.27-1", + "version": "1.0.31", "description": "Streams2, a user-land copy of the stream library from Node.js v0.10.x", "main": "readable.js", "dependencies": { @@ -37,13 +37,10 @@ "url": "https://github.com/isaacs/readable-stream/issues" }, "homepage": "https://github.com/isaacs/readable-stream", - "_id": "readable-stream@1.0.27-1", - "dist": { - "shasum": "6b67983c20357cefd07f0165001a16d710d91078", - "tarball": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.27-1.tgz" - }, - "_from": "readable-stream@1.0", - "_npmVersion": "1.4.3", + "_id": "readable-stream@1.0.31", + "_shasum": "8f2502e0bc9e3b0da1b94520aabb4e2603ecafae", + "_from": "readable-stream@>=1.0.0 <1.1.0", + "_npmVersion": "1.4.9", "_npmUser": { "name": "rvagg", "email": "rod@vagg.org" @@ -62,8 +59,10 @@ "email": "rod@vagg.org" } ], + "dist": { + "shasum": "8f2502e0bc9e3b0da1b94520aabb4e2603ecafae", + "tarball": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.31.tgz" + }, "directories": {}, - "_shasum": "6b67983c20357cefd07f0165001a16d710d91078", - "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.27-1.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.31.tgz" } diff --git a/deps/npm/node_modules/sha/package.json b/deps/npm/node_modules/sha/package.json index 091919964a9..1b8b2aa7fff 100644 --- a/deps/npm/node_modules/sha/package.json +++ b/deps/npm/node_modules/sha/package.json @@ -30,7 +30,7 @@ "shasum": "1f9a377f27b6fdee409b9b858e43da702be48a4d", "tarball": "http://registry.npmjs.org/sha/-/sha-1.2.4.tgz" }, - "_from": "sha@latest", + "_from": "sha@>=1.2.1 <1.3.0", "_npmVersion": "1.4.3", "_npmUser": { "name": "forbeslindesay", diff --git a/deps/npm/node_modules/slide/package.json b/deps/npm/node_modules/slide/package.json index 481ff526567..1c0b30bf2a9 100644 --- a/deps/npm/node_modules/slide/package.json +++ b/deps/npm/node_modules/slide/package.json @@ -33,7 +33,7 @@ "_id": "slide@1.1.6", "scripts": {}, "_shasum": "56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707", - "_from": "slide@~1.1.6", + "_from": "slide@>=1.1.6 <1.2.0", "_npmVersion": "2.0.0-beta.3", "_npmUser": { "name": "isaacs", @@ -50,6 +50,5 @@ "tarball": "http://registry.npmjs.org/slide/-/slide-1.1.6.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" } diff --git a/deps/npm/node_modules/tar/package.json b/deps/npm/node_modules/tar/package.json index 4f660303506..207eaa1fdd2 100644 --- a/deps/npm/node_modules/tar/package.json +++ b/deps/npm/node_modules/tar/package.json @@ -26,8 +26,6 @@ "tap": "0.x" }, "license": "BSD", - "readme": "# node-tar\n\nTar for Node.js.\n\n[![NPM](https://nodei.co/npm/tar.png)](https://nodei.co/npm/tar/)\n\n## API\n\nSee `examples/` for usage examples.\n\n### var tar = require('tar')\n\nReturns an object with `.Pack`, `.Extract` and `.Parse` methods.\n\n### tar.Pack([properties])\n\nReturns a through stream. Use\n[fstream](https://npmjs.org/package/fstream) to write files into the\npack stream and you will receive tar archive data from the pack\nstream.\n\nThis only works with directories, it does not work with individual files.\n\nThe optional `properties` object are used to set properties in the tar\n'Global Extended Header'.\n\n### tar.Extract([options])\n\nReturns a through stream. Write tar data to the stream and the files\nin the tarball will be extracted onto the filesystem.\n\n`options` can be:\n\n```js\n{\n path: '/path/to/extract/tar/into',\n strip: 0, // how many path segments to strip from the root when extracting\n}\n```\n\n`options` also get passed to the `fstream.Writer` instance that `tar`\nuses internally.\n\n### tar.Parse()\n\nReturns a writable stream. Write tar data to it and it will emit\n`entry` events for each entry parsed from the tarball. This is used by\n`tar.Extract`.\n", - "readmeFilename": "README.md", "gitHead": "476bf6f5882b9c33d1cbf66f175d0f25e3981044", "bugs": { "url": "https://github.com/isaacs/node-tar/issues" @@ -35,5 +33,23 @@ "homepage": "https://github.com/isaacs/node-tar", "_id": "tar@1.0.1", "_shasum": "6075b5a1f236defe0c7e3756d3d9b3ebdad0f19a", - "_from": "tar@latest" + "_from": "tar@1.0.1", + "_npmVersion": "1.4.23", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "6075b5a1f236defe0c7e3756d3d9b3ebdad0f19a", + "tarball": "http://registry.npmjs.org/tar/-/tar-1.0.1.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/tar/-/tar-1.0.1.tgz", + "readme": "ERROR: No README data found!" } diff --git a/deps/npm/package.json b/deps/npm/package.json index a2961a3606b..f371e5789d3 100644 --- a/deps/npm/package.json +++ b/deps/npm/package.json @@ -1,5 +1,5 @@ { - "version": "1.4.28", + "version": "2.0.0", "name": "npm", "description": "A package manager for node", "keywords": [ @@ -36,18 +36,20 @@ "ansicolors": "~0.3.2", "ansistyles": "~0.1.3", "archy": "0", + "async-some": "~1.0.1", "block-stream": "0.0.7", "char-spinner": "~1.0.1", "child-process-close": "~0.1.1", "chmodr": "~0.1.0", "chownr": "0", - "cmd-shim": "2.0.0", + "cmd-shim": "~2.0.1", "columnify": "~1.2.1", "editor": "~0.1.0", + "fs-vacuum": "~1.2.1", "fstream": "~1.0.2", "fstream-npm": "~1.0.0", "github-url-from-git": "~1.4.0", - "github-url-from-username-repo": "~1.0.0", + "github-url-from-username-repo": "~1.0.2", "glob": "~4.0.5", "graceful-fs": "~3.0.0", "inflight": "~1.0.1", @@ -59,23 +61,25 @@ "mkdirp": "~0.5.0", "node-gyp": "~1.0.1", "nopt": "~3.0.1", + "normalize-package-data": "~1.0.1", "npm-cache-filename": "~1.0.1", "npm-install-checks": "~1.0.2", - "npm-registry-client": "~2.0.7", + "npm-package-arg": "~2.1.2", + "npm-registry-client": "~3.2.1", "npm-user-validate": "~0.1.0", - "npmconf": "~1.1.8", + "npmconf": "~2.0.8", "npmlog": "~0.1.1", "once": "~1.3.0", "opener": "~1.3.0", "osenv": "~0.1.0", "path-is-inside": "~1.0.0", "read": "~1.0.4", - "read-installed": "~2.0.5", + "read-installed": "~3.1.2", "read-package-json": "~1.2.7", "request": "~2.42.0", "retry": "~0.6.0", "rimraf": "~2.2.8", - "semver": "~2.3.0", + "semver": "~4.0.0", "sha": "~1.2.1", "slide": "~1.1.6", "sorted-object": "~1.0.0", @@ -90,6 +94,7 @@ "ansicolors", "ansistyles", "archy", + "async-some", "block-stream", "char-spinner", "child-process-close", @@ -97,7 +102,9 @@ "chownr", "cmd-shim", "columnify", + "dezalgo", "editor", + "fs-vacuum", "fstream", "fstream-npm", "github-url-from-git", @@ -114,8 +121,10 @@ "mkdirp", "node-gyp", "nopt", + "normalize-package-data", "npm-cache-filename", "npm-install-checks", + "npm-package-arg", "npm-registry-client", "npm-user-validate", "npmconf", @@ -141,14 +150,12 @@ ], "devDependencies": { "marked": "~0.3.2", - "npm-registry-couchapp": "~2.3.6", + "marked-man": "~0.1.3", + "nock": "~0.34.1", + "npm-registry-couchapp": "~2.5.3", "npm-registry-mock": "~0.6.3", - "ronn": "~0.3.6", - "tap": "~0.4.9" - }, - "engines": { - "node": ">=0.8", - "npm": "1" + "require-inject": "~1.0.0", + "tap": "~0.4.12" }, "scripts": { "test-legacy": "node ./test/run.js", diff --git a/deps/npm/scripts/doc-build.sh b/deps/npm/scripts/doc-build.sh index 9afab0782b7..3728259ac02 100755 --- a/deps/npm/scripts/doc-build.sh +++ b/deps/npm/scripts/doc-build.sh @@ -6,26 +6,26 @@ fi set -o errexit set -o pipefail -if ! [ -x node_modules/.bin/ronn ]; then +if ! [ -x node_modules/.bin/marked-man ]; then ps=0 - if [ -f .building_ronn ]; then - pid=$(cat .building_ronn) + if [ -f .building_marked-man ]; then + pid=$(cat .building_marked-man) ps=$(ps -p $pid | grep $pid | wc -l) || true fi - if [ -f .building_ronn ] && [ $ps != 0 ]; then - while [ -f .building_ronn ]; do + if [ -f .building_marked-man ] && [ $ps != 0 ]; then + while [ -f .building_marked-man ]; do sleep 1 done else - # a race to see which make process will be the one to install ronn - echo $$ > .building_ronn + # a race to see which make process will be the one to install marked-man + echo $$ > .building_marked-man sleep 1 - if [ $(cat .building_ronn) == $$ ]; then - make node_modules/.bin/ronn - rm .building_ronn + if [ $(cat .building_marked-man) == $$ ]; then + make node_modules/.bin/marked-man + rm .building_marked-man else - while [ -f .building_ronn ]; do + while [ -f .building_marked-man ]; do sleep 1 done fi @@ -68,7 +68,7 @@ mkdir -p $(dirname $dest) case $dest in *.[1357]) - ./node_modules/.bin/ronn --roff $src \ + ./node_modules/.bin/marked-man --roff $src \ | sed "s|@VERSION@|$version|g" \ | perl -pi -e 's/(npm\\-)?([a-zA-Z\\\.\-]*)\(1\)/npm help \2/g' \ | perl -pi -e 's/(npm\\-)?([a-zA-Z\\\.\-]*)\(([57])\)/npm help \3 \2/g' \ diff --git a/deps/npm/test/common-tap.js b/deps/npm/test/common-tap.js index d6d09ed9bca..3a1f584a73c 100644 --- a/deps/npm/test/common-tap.js +++ b/deps/npm/test/common-tap.js @@ -26,7 +26,7 @@ exports.npm = function (cmd, opts, cb) { child.on("error", cb) - child.on("close", function (code, signal) { + child.on("close", function (code) { cb(null, code, stdout, stderr) }) } diff --git a/deps/npm/test/packages/npm-test-optional-deps/package.json b/deps/npm/test/packages/npm-test-optional-deps/package.json index 56c6f09ed01..67545ca9da1 100644 --- a/deps/npm/test/packages/npm-test-optional-deps/package.json +++ b/deps/npm/test/packages/npm-test-optional-deps/package.json @@ -5,7 +5,6 @@ { "npm-test-foobarzaaakakaka": "http://example.com/" , "dnode": "10.999.14234" , "sax": "0.3.5" - , "999 invalid name": "1.2.3" , "glob": "some invalid version 99 #! $$ x y z" , "npm-test-failer":"*" } diff --git a/deps/npm/test/run.js b/deps/npm/test/run.js index 008cfbac45a..904df5b8e46 100644 --- a/deps/npm/test/run.js +++ b/deps/npm/test/run.js @@ -7,7 +7,7 @@ var path = require("path") , testdir = __dirname , fs = require("graceful-fs") , npmpkg = path.dirname(testdir) - , npmcli = path.join(__dirname, "bin", "npm-cli.js") + , npmcli = path.resolve(npmpkg, "bin", "npm-cli.js") var temp = process.env.TMPDIR || process.env.TMP @@ -63,7 +63,7 @@ function prefix (content, pref) { } var execCount = 0 -function exec (cmd, shouldFail, cb) { +function exec (cmd, cwd, shouldFail, cb) { if (typeof shouldFail === "function") { cb = shouldFail, shouldFail = false } @@ -81,7 +81,10 @@ function exec (cmd, shouldFail, cb) { cmd = cmd.replace(/^npm /, npmReplace + " ") cmd = cmd.replace(/^node /, nodeReplace + " ") - child_process.exec(cmd, {env: env}, function (er, stdout, stderr) { + console.error("$$$$$$ cd %s; PATH=%s %s", cwd, env.PATH, cmd) + + child_process.exec(cmd, {cwd: cwd, env: env}, function (er, stdout, stderr) { + console.error("$$$$$$ after command", cmd, cwd) if (stdout) { console.error(prefix(stdout, " 1> ")) } @@ -102,10 +105,8 @@ function exec (cmd, shouldFail, cb) { } function execChain (cmds, cb) { - chain(cmds.reduce(function (l, r) { - return l.concat(r) - }, []).map(function (cmd) { - return [exec, cmd] + chain(cmds.map(function (args) { + return [exec].concat(args) }), cb) } @@ -118,9 +119,8 @@ function flatten (arr) { function setup (cb) { cleanup(function (er) { if (er) return cb(er) - execChain([ "node \""+path.resolve(npmpkg, "bin", "npm-cli.js") - + "\" install \""+npmpkg+"\"" - , "npm config set package-config:foo boo" + execChain([ [ "node \""+npmcli+"\" install \""+npmpkg+"\"", root ], + [ "npm config set package-config:foo boo", root ] ], cb) }) } @@ -134,6 +134,7 @@ function main (cb) { failures = 0 process.chdir(testdir) + var base = path.resolve(root, path.join("lib", "node_modules")) // get the list of packages var packages = fs.readdirSync(path.resolve(testdir, "packages")) @@ -150,17 +151,17 @@ function main (cb) { packagesToRm.push("npm") } - chain - ( [ setup - , [ exec, "npm install "+npmpkg ] + chain( + [ setup + , [ exec, "npm install "+npmpkg, testdir ] , [ execChain, packages.map(function (p) { - return "npm install packages/"+p + return [ "npm install packages/"+p, testdir ] }) ] , [ execChain, packages.map(function (p) { - return "npm test "+p + return [ "npm test -ddd", path.resolve(base, p) ] }) ] , [ execChain, packagesToRm.map(function (p) { - return "npm rm " + p + return [ "npm rm "+p, root ] }) ] , installAndTestEach ] @@ -171,15 +172,15 @@ function main (cb) { function installAndTestEach (cb) { var thingsToChain = [ setup - , [ execChain, packages.map(function (p) { - return [ "npm install packages/"+p - , "npm test "+p - , "npm rm "+p ] - }) ] + , [ execChain, flatten(packages.map(function (p) { + return [ [ "npm install packages/"+p, testdir ] + , [ "npm test", path.resolve(base, p) ] + , [ "npm rm "+p, root ] ] + })) ] ] if (process.platform !== "win32") { // Windows can't handle npm rm npm due to file-in-use issues. - thingsToChain.push([exec, "npm rm npm"]) + thingsToChain.push([exec, "npm rm npm", testdir]) } chain(thingsToChain, cb) diff --git a/deps/npm/test/tap/00-verify-ls-ok.js b/deps/npm/test/tap/00-verify-ls-ok.js new file mode 100644 index 00000000000..7209e7db7e8 --- /dev/null +++ b/deps/npm/test/tap/00-verify-ls-ok.js @@ -0,0 +1,15 @@ +var test = require("tap").test +var node = process.execPath +var path = require("path") +var cwd = path.resolve(__dirname, "..", "..") +var npm = path.resolve(cwd, "cli.js") +var spawn = require("child_process").spawn + +test("npm ls in npm", function (t) { + var opt = { cwd: cwd, stdio: [ "ignore", "ignore", 2 ] } + var child = spawn(node, [npm, "ls"], opt) + child.on("close", function (code) { + t.notOk(code) + t.end() + }) +}) diff --git a/deps/npm/test/tap/cache-add-localdir-fallback.js b/deps/npm/test/tap/cache-add-localdir-fallback.js new file mode 100644 index 00000000000..6b036c3809e --- /dev/null +++ b/deps/npm/test/tap/cache-add-localdir-fallback.js @@ -0,0 +1,76 @@ +var path = require("path") +var test = require("tap").test +var npm = require("../../lib/npm.js") +var requireInject = require("require-inject") + +npm.load({loglevel : "silent"}, function () { + var resolved = path.resolve(__dirname, "dir-with-package") + var resolvedPackage = path.join(resolved, "package.json") + + var cache = requireInject("../../lib/cache.js", { + "graceful-fs": { + stat: function (file, cb) { + process.nextTick(function () { + switch (file) { + case "named": + cb(new Error("ENOENT")) + break + case "file.tgz": + cb(null, { isDirectory: function () { return false } }) + break + case "dir-no-package": + cb(null, { isDirectory: function () { return true } }) + break + case "dir-no-package/package.json": + cb(new Error("ENOENT")) + break + case "dir-with-package": + cb(null, { isDirectory: function () { return true } }) + break + case "dir-with-package/package.json": + cb(null, {}) + break + case resolved: + cb(null, { isDirectory: function () { return true } }) + break + case resolvedPackage: + cb(null, {}) + break + default: + throw new Error("Unknown test file passed to stat: " + file) + } + }) + } + }, + "../../lib/cache/add-named.js": function addNamed (name, version, data, cb) { + cb(null, "addNamed") + }, + "../../lib/cache/add-local.js": function addLocal (name, data, cb) { + cb(null, "addLocal") + } + }) + + test("npm install localdir fallback", function (t) { + t.plan(10) + cache.add("named", null, null, false, function (er, which) { + t.ifError(er, "named was cached") + t.is(which, "addNamed", "registry package name") + }) + cache.add("file.tgz", null, null, false, function (er, which) { + t.ifError(er, "file.tgz was cached") + t.is(which, "addLocal", "local file") + }) + cache.add("dir-no-package", null, null, false, function (er, which) { + t.ifError(er, "local directory was cached") + t.is(which, "addNamed", "local directory w/o package.json") + }) + cache.add("dir-with-package", null, null, false, function (er, which) { + t.ifError(er, "local directory with package was cached") + t.is(which,"addLocal", "local directory with package.json") + }) + cache.add("file:./dir-with-package", null, __dirname, false, function (er, which) { + t.ifError(er, "local directory (as URI) with package was cached") + t.is(which, "addLocal", "file: URI to local directory with package.json") + }) + }) +}) diff --git a/deps/npm/test/tap/cache-shasum.js b/deps/npm/test/tap/cache-shasum.js index 2139d8fb79c..7450d3e6086 100644 --- a/deps/npm/test/tap/cache-shasum.js +++ b/deps/npm/test/tap/cache-shasum.js @@ -1,7 +1,6 @@ var npm = require.resolve("../../") var test = require("tap").test var path = require("path") -var fs = require("fs") var rimraf = require("rimraf") var mkdirp = require("mkdirp") var mr = require("npm-registry-mock") @@ -44,7 +43,7 @@ test("compare", function(t) { var d = path.resolve(__dirname, "cache-shasum/request") var p = path.resolve(d, "2.27.0/package.tgz") var r = require("./cache-shasum/localhost_1337/request/.cache.json") - var rshasum = r.versions['2.27.0'].dist.shasum + var rshasum = r.versions["2.27.0"].dist.shasum sha.get(p, function (er, pshasum) { if (er) throw er diff --git a/deps/npm/test/tap/config-meta.js b/deps/npm/test/tap/config-meta.js index 75a66604cf6..26ca6f2b057 100644 --- a/deps/npm/test/tap/config-meta.js +++ b/deps/npm/test/tap/config-meta.js @@ -16,8 +16,13 @@ var CONFS = {} var DOC = {} var exceptions = [ + path.resolve(lib, "adduser.js"), path.resolve(lib, "config.js"), - path.resolve(lib, "utils", "lifecycle.js") + path.resolve(lib, "publish.js"), + path.resolve(lib, "utils", "lifecycle.js"), + path.resolve(lib, "utils", "map-to-registry.js"), + path.resolve(nm, "npm-registry-client", "lib", "publish.js"), + path.resolve(nm, "npm-registry-client", "lib", "request.js") ] test("get files", function (t) { @@ -46,7 +51,7 @@ test("get files", function (t) { test("get lines", function (t) { FILES.forEach(function (f) { - var lines = fs.readFileSync(f, 'utf8').split('\n') + var lines = fs.readFileSync(f, 'utf8').split(/\r|\n/) lines.forEach(function (l, i) { var matches = l.split(/conf(?:ig)?\.get\(/g) matches.shift() @@ -71,7 +76,7 @@ test("get lines", function (t) { }) test("get docs", function (t) { - var d = fs.readFileSync(doc, "utf8").split("\n") + var d = fs.readFileSync(doc, "utf8").split(/\r|\n/) // walk down until the "## Config Settings" section for (var i = 0; i < d.length && d[i] !== "## Config Settings"; i++); i++ @@ -100,7 +105,7 @@ test("check configs", function (t) { } for (var c in DOC) { - if (c !== "versions" && c !== "version") { + if (c !== "versions" && c !== "version" && c !== "init.version") { t.ok(CONFS[c], "config in doc should be used somewhere " + c) t.ok(types.indexOf(c) !== -1, "should be defined in npmconf " + c) t.ok(defaults.indexOf(c) !== -1, "should have default in npmconf " + c) diff --git a/deps/npm/test/tap/git-cache-permissions.js b/deps/npm/test/tap/git-cache-permissions.js new file mode 100644 index 00000000000..27905fba5e6 --- /dev/null +++ b/deps/npm/test/tap/git-cache-permissions.js @@ -0,0 +1,80 @@ +var test = require("tap").test + , fs = require("fs") + , path = require("path") + , rimraf = require("rimraf") + , mkdirp = require("mkdirp") + , spawn = require("child_process").spawn + , npm = require("../../lib/npm") + , npmCli = require.resolve("../../bin/npm-cli.js") + , node = process.execPath + , pkg = path.resolve(__dirname, "git-cache-permissions") + , tmp = path.join(pkg, "tmp") + , cache = path.join(pkg, "cache") + + +test("setup", function (t) { + rimraf.sync(pkg) + mkdirp.sync(pkg) + mkdirp.sync(cache) + mkdirp.sync(tmp) + mkdirp.sync(path.resolve(pkg, 'node_modules')) + t.end() +}) + +test("git-cache-permissions: install a git dependency", function (t) { + + // disable git integration tests on Travis. + if (process.env.TRAVIS) return t.end() + + var command = [ npmCli + , "install" + , "git://github.com/nigelzor/npm-4503-a.git" + ] + var child = spawn(node, command, { + cwd: pkg, + env: { + npm_config_cache: cache, + npm_config_tmp: tmp, + npm_config_prefix: pkg, + npm_config_global: "false", + npm_config_umask: "00", + HOME: process.env.HOME, + Path: process.env.PATH, + PATH: process.env.PATH + }, + stdio: "inherit" + }) + + child.on("close", function (code) { + t.equal(code, 0, "npm install should succeed") + + // verify permissions on git hooks + var repoDir = "git-github-com-nigelzor-npm-4503-a-git-40c5cb24" + var hooksPath = path.join(cache, "_git-remotes", repoDir, "hooks") + fs.readdir(hooksPath, function (err, files) { + if (err) { + t.ok(false, "error reading hooks: " + err) + t.end() + } + + files.forEach(function (file) { + var stats = fs.statSync(path.join(hooksPath, file)) + var message = "hook [" + file + "] should have correct permissions" + + // Possible error conditions and the resulting file modes on hooks + // npm.modes.file is used directly -> "100666" + // permissions are left untouched -> "100755" + // we do not want permissions left untouched because of + // https://github.com/npm/npm/issues/3117 + t.equal(stats.mode.toString(8), "100777", message) + }) + + t.end() + }) + }) +}) + +test('cleanup', function(t) { + rimraf.sync(pkg) + t.end() +}) diff --git a/deps/npm/test/tap/ignore-install-link.js b/deps/npm/test/tap/ignore-install-link.js index 2c90b9a6d42..44ae541538b 100644 --- a/deps/npm/test/tap/ignore-install-link.js +++ b/deps/npm/test/tap/ignore-install-link.js @@ -4,20 +4,17 @@ if (process.platform === "win32") { } var common = require("../common-tap.js") var test = require("tap").test -var npm = require.resolve("../../bin/npm-cli.js") -var node = process.execPath var path = require("path") var fs = require("fs") var rimraf = require("rimraf") var mkdirp = require("mkdirp") -var spawn = require("child_process").spawn var root = path.resolve(__dirname, "ignore-install-link") var pkg = path.resolve(root, "pkg") var dep = path.resolve(root, "dep") var target = path.resolve(pkg, "node_modules", "dep") var cache = path.resolve(root, "cache") -var global = path.resolve(root, "global") +var globalPath = path.resolve(root, "global") var pkgj = { "name":"pkg", "version": "1.2.3" , "dependencies": { "dep": "1.2.3" } } @@ -34,7 +31,7 @@ test("setup", function (t) { mkdirp.sync(path.resolve(pkg, "node_modules")) mkdirp.sync(dep) mkdirp.sync(cache) - mkdirp.sync(global) + mkdirp.sync(globalPath) fs.writeFileSync(path.resolve(pkg, "package.json"), JSON.stringify(pkgj)) fs.writeFileSync(path.resolve(dep, "package.json"), JSON.stringify(depj)) fs.symlinkSync(dep, target, "dir") @@ -47,13 +44,13 @@ test("ignore install if package is linked", function (t) { env: { PATH: process.env.PATH || process.env.Path, HOME: process.env.HOME, - npm_config_prefix: global, - npm_config_cache: cache, - npm_config_registry: common.registry, - npm_config_loglevel: "silent" + "npm_config_prefix": globalPath, + "npm_config_cache": cache, + "npm_config_registry": common.registry, + "npm_config_loglevel": "silent" }, stdio: "inherit" - }, function (er, code, stdout, stderr) { + }, function (er, code) { if (er) throw er t.equal(code, 0) t.end() diff --git a/deps/npm/test/tap/install-at-locally.js b/deps/npm/test/tap/install-at-locally.js index 18ea6c3a60e..f6290e1089e 100644 --- a/deps/npm/test/tap/install-at-locally.js +++ b/deps/npm/test/tap/install-at-locally.js @@ -1,7 +1,6 @@ var common = require('../common-tap.js') var test = require('tap').test var npm = require('../../') -var osenv = require('osenv') var path = require('path') var fs = require('fs') var rimraf = require('rimraf') diff --git a/deps/npm/test/tap/install-from-local.js b/deps/npm/test/tap/install-from-local.js new file mode 100644 index 00000000000..2dc3b57721b --- /dev/null +++ b/deps/npm/test/tap/install-from-local.js @@ -0,0 +1,38 @@ +var test = require("tap").test +var npm = require("../../") +var path = require("path") +var fs = require("fs") +var rimraf = require("rimraf") +var pkg = path.join(__dirname, "install-from-local", "package-with-local-paths") + +test("setup", function (t) { + process.chdir(pkg) + t.end() +}) + +test('"npm install" should install local packages', function (t) { + npm.load({loglevel : "silent"}, function () { + npm.commands.install(["."], function (err) { + t.ifError(err, "local packages installed") + var dependencyPackageJson = path.resolve(pkg, "node_modules/package-local-dependency/package.json") + t.ok( + JSON.parse(fs.readFileSync(dependencyPackageJson, "utf8")), + "package with local dependency installed" + ) + + var devDependencyPackageJson = path.resolve(pkg, "node_modules/package-local-dev-dependency/package.json") + t.ok( + JSON.parse(fs.readFileSync(devDependencyPackageJson, "utf8")), + "package with local dev dependency installed" + ) + + t.end() + }) + }) +}) + +test("cleanup", function (t) { + process.chdir(__dirname) + rimraf.sync(path.resolve(pkg, "node_modules")) + t.end() +}) diff --git a/deps/npm/test/tap/install-from-local/package-local-dependency/package.json b/deps/npm/test/tap/install-from-local/package-local-dependency/package.json new file mode 100644 index 00000000000..a524d826245 --- /dev/null +++ b/deps/npm/test/tap/install-from-local/package-local-dependency/package.json @@ -0,0 +1,5 @@ +{ + "name": "package-local-dependency", + "version": "0.0.0", + "description": "Test for local installs" +} diff --git a/deps/npm/test/tap/install-from-local/package-local-dev-dependency/package.json b/deps/npm/test/tap/install-from-local/package-local-dev-dependency/package.json new file mode 100644 index 00000000000..23f3ad68240 --- /dev/null +++ b/deps/npm/test/tap/install-from-local/package-local-dev-dependency/package.json @@ -0,0 +1,5 @@ +{ + "name": "package-local-dev-dependency", + "version": "0.0.0", + "description": "Test for local installs" +} diff --git a/deps/npm/test/tap/install-from-local/package-with-local-paths/package.json b/deps/npm/test/tap/install-from-local/package-with-local-paths/package.json new file mode 100644 index 00000000000..bf4a3e946c6 --- /dev/null +++ b/deps/npm/test/tap/install-from-local/package-with-local-paths/package.json @@ -0,0 +1,10 @@ +{ + "name": "package-with-local-paths", + "version": "0.0.0", + "dependencies": { + "package-local-dependency": "file:../package-local-dependency" + }, + "devDependencies": { + "package-local-dev-dependency": "file:../package-local-dev-dependency" + } +} diff --git a/deps/npm/test/tap/install-save-exact.js b/deps/npm/test/tap/install-save-exact.js index cf25b779bc2..c9f48666012 100644 --- a/deps/npm/test/tap/install-save-exact.js +++ b/deps/npm/test/tap/install-save-exact.js @@ -1,7 +1,6 @@ var common = require('../common-tap.js') var test = require('tap').test var npm = require('../../') -var osenv = require('osenv') var path = require('path') var fs = require('fs') var rimraf = require('rimraf') diff --git a/deps/npm/test/tap/install-save-local.js b/deps/npm/test/tap/install-save-local.js new file mode 100644 index 00000000000..52396f4bed2 --- /dev/null +++ b/deps/npm/test/tap/install-save-local.js @@ -0,0 +1,68 @@ +var test = require("tap").test +var npm = require("../../") +var path = require("path") +var fs = require("fs") +var rimraf = require("rimraf") +var pkg = path.join(__dirname, "install-save-local", "package") + +test("setup", function (t) { + resetPackageJSON(pkg) + process.chdir(pkg) + t.end() +}) +test('"npm install --save ../local/path" should install local package and save to package.json', function(t) { + resetPackageJSON(pkg) + npm.load({loglevel : "silent"}, function() { + npm.config.set("save", true) + npm.commands.install(["../package-local-dependency"], function(err) { + t.ifError(err) + + var dependencyPackageJson = path.resolve(pkg, "node_modules/package-local-dependency/package.json") + t.ok(JSON.parse(fs.readFileSync(dependencyPackageJson, "utf8"))) + + var pkgJson = JSON.parse(fs.readFileSync(pkg + "/package.json", "utf8")) + t.deepEqual(pkgJson.dependencies, { + "package-local-dependency": "file:../package-local-dependency" + }) + npm.config.set("save", undefined) + + t.end() + }) + }) +}) + +test('"npm install --save-dev ../local/path" should install local package and save to package.json', function(t) { + resetPackageJSON(pkg) + npm.load({loglevel : "silent"}, function() { + npm.config.set("save-dev", true) + npm.commands.install(["../package-local-dev-dependency"], function(err) { + t.ifError(err) + + var dependencyPackageJson = path.resolve(pkg, "node_modules/package-local-dev-dependency/package.json") + t.ok(JSON.parse(fs.readFileSync(dependencyPackageJson, "utf8"))) + + var pkgJson = JSON.parse(fs.readFileSync(pkg + "/package.json", "utf8")) + t.deepEqual(pkgJson.devDependencies, { + "package-local-dev-dependency": "file:../package-local-dev-dependency" + }) + npm.config.set("save", undefined) + + t.end() + }) + }) +}) + +test("cleanup", function(t) { + resetPackageJSON(pkg) + process.chdir(__dirname) + rimraf.sync(path.resolve(pkg, "node_modules")) + t.end() +}) + +function resetPackageJSON(pkg) { + var pkgJson = JSON.parse(fs.readFileSync(pkg + "/package.json", "utf8")) + delete pkgJson.dependencies + delete pkgJson.devDependencies + var json = JSON.stringify(pkgJson, null, 2) + "\n" + fs.writeFileSync(pkg + "/package.json", json, "ascii") +} diff --git a/deps/npm/test/tap/install-save-local/package-local-dependency/package.json b/deps/npm/test/tap/install-save-local/package-local-dependency/package.json new file mode 100644 index 00000000000..a524d826245 --- /dev/null +++ b/deps/npm/test/tap/install-save-local/package-local-dependency/package.json @@ -0,0 +1,5 @@ +{ + "name": "package-local-dependency", + "version": "0.0.0", + "description": "Test for local installs" +} diff --git a/deps/npm/test/tap/install-save-local/package-local-dev-dependency/package.json b/deps/npm/test/tap/install-save-local/package-local-dev-dependency/package.json new file mode 100644 index 00000000000..23f3ad68240 --- /dev/null +++ b/deps/npm/test/tap/install-save-local/package-local-dev-dependency/package.json @@ -0,0 +1,5 @@ +{ + "name": "package-local-dev-dependency", + "version": "0.0.0", + "description": "Test for local installs" +} diff --git a/deps/npm/test/tap/install-save-local/package/package.json b/deps/npm/test/tap/install-save-local/package/package.json new file mode 100644 index 00000000000..c6a5cb99d58 --- /dev/null +++ b/deps/npm/test/tap/install-save-local/package/package.json @@ -0,0 +1,4 @@ +{ + "name": "package", + "version": "0.0.0" +} diff --git a/deps/npm/test/tap/install-save-prefix.js b/deps/npm/test/tap/install-save-prefix.js index bbdeddf3fec..0e78005b6ec 100644 --- a/deps/npm/test/tap/install-save-prefix.js +++ b/deps/npm/test/tap/install-save-prefix.js @@ -1,7 +1,6 @@ var common = require('../common-tap.js') var test = require('tap').test var npm = require('../../') -var osenv = require('osenv') var path = require('path') var fs = require('fs') var rimraf = require('rimraf') diff --git a/deps/npm/test/tap/install-scoped-link.js b/deps/npm/test/tap/install-scoped-link.js new file mode 100644 index 00000000000..c411b664d78 --- /dev/null +++ b/deps/npm/test/tap/install-scoped-link.js @@ -0,0 +1,52 @@ +var exec = require("child_process").exec +var existsSync = require("fs").existsSync +var join = require("path").join +// var resolve = require("path").resolve + +var test = require("tap").test +var rimraf = require("rimraf") +var mkdirp = require("mkdirp") + +var npm = require("../../") + +var pkg = join(__dirname, "install-scoped") +var work = join(__dirname, "install-scoped-TEST") +var modules = join(work, "node_modules") + +test("setup", function (t) { + mkdirp.sync(modules) + process.chdir(work) + + t.end() +}) + +test("installing package with links", function (t) { + npm.load(function() { + npm.commands.install([pkg], function (err) { + t.ifError(err, "install ran to completion without error") + + t.ok( + existsSync(join(modules, "@scoped", "package", "package.json")), + "package installed" + ) + t.ok(existsSync(join(modules, ".bin")), "binary link directory exists") + + var hello = join(modules, ".bin", "hello") + t.ok(existsSync(hello), "binary link exists") + + exec("node " + hello, function (err, stdout, stderr) { + t.ifError(err, "command ran fine") + t.notOk(stderr, "got no error output back") + t.equal(stdout, "hello blrbld\n", "output was as expected") + + t.end() + }) + }) + }) +}) + +test("cleanup", function(t) { + process.chdir(__dirname) + rimraf.sync(work) + t.end() +}) diff --git a/deps/npm/test/tap/install-scoped/package.json b/deps/npm/test/tap/install-scoped/package.json new file mode 100644 index 00000000000..32700cf6af9 --- /dev/null +++ b/deps/npm/test/tap/install-scoped/package.json @@ -0,0 +1,7 @@ +{ + "name": "@scoped/package", + "version": "0.0.0", + "bin": { + "hello": "./world.js" + } +} diff --git a/deps/npm/test/tap/install-scoped/world.js b/deps/npm/test/tap/install-scoped/world.js new file mode 100644 index 00000000000..f6333ba5b13 --- /dev/null +++ b/deps/npm/test/tap/install-scoped/world.js @@ -0,0 +1 @@ +console.log("hello blrbld") diff --git a/deps/npm/test/tap/lifecycle-path.js b/deps/npm/test/tap/lifecycle-path.js new file mode 100644 index 00000000000..34684a0c391 --- /dev/null +++ b/deps/npm/test/tap/lifecycle-path.js @@ -0,0 +1,61 @@ +var test = require("tap").test +var common = require("../common-tap.js") +var path = require("path") +var rimraf = require("rimraf") +var mkdirp = require("mkdirp") +var pkg = path.resolve(__dirname, "lifecycle-path") +var fs = require("fs") +var link = path.resolve(pkg, "node-bin") + +// Without the path to the shell, nothing works usually. +var PATH +if (process.platform === "win32") { + PATH = "C:\\Windows\\system32;C:\\Windows" +} else { + PATH = "/bin:/usr/bin" +} + +test("setup", function (t) { + rimraf.sync(link) + fs.symlinkSync(path.dirname(process.execPath), link, "dir") + t.end() +}) + +test("make sure the path is correct", function (t) { + common.npm(["run-script", "path"], { + cwd: pkg, + env: { + PATH: PATH, + stdio: [ 0, "pipe", 2 ] + } + }, function (er, code, stdout, stderr) { + if (er) throw er + t.equal(code, 0, "exit code") + // remove the banner, we just care about the last line + stdout = stdout.trim().split(/\r|\n/).pop() + var pathSplit = process.platform === "win32" ? ";" : ":" + var root = path.resolve(__dirname, "../..") + var actual = stdout.split(pathSplit).map(function (p) { + if (p.indexOf(root) === 0) { + p = "{{ROOT}}" + p.substr(root.length) + } + return p.replace(/\\/g, "/") + }) + + // get the ones we tacked on, then the system-specific requirements + var expect = [ + "{{ROOT}}/bin/node-gyp-bin", + "{{ROOT}}/test/tap/lifecycle-path/node_modules/.bin" + ].concat(PATH.split(pathSplit).map(function (p) { + return p.replace(/\\/g, "/") + })) + t.same(actual, expect) + t.end() + }) +}) + +test("clean", function (t) { + rimraf.sync(link) + t.end() +}) + diff --git a/deps/npm/test/tap/lifecycle-path/package.json b/deps/npm/test/tap/lifecycle-path/package.json new file mode 100644 index 00000000000..42e792e4676 --- /dev/null +++ b/deps/npm/test/tap/lifecycle-path/package.json @@ -0,0 +1 @@ +{"name":"glorb","version":"1.2.3","scripts":{"path":"./node-bin/node print-path.js"}} diff --git a/deps/npm/test/tap/lifecycle-path/print-path.js b/deps/npm/test/tap/lifecycle-path/print-path.js new file mode 100644 index 00000000000..c7ad00b3d39 --- /dev/null +++ b/deps/npm/test/tap/lifecycle-path/print-path.js @@ -0,0 +1 @@ +console.log(process.env.PATH) diff --git a/deps/npm/test/tap/maybe-github.js b/deps/npm/test/tap/maybe-github.js index 8b7105e6ea1..52a62e11bb2 100644 --- a/deps/npm/test/tap/maybe-github.js +++ b/deps/npm/test/tap/maybe-github.js @@ -4,15 +4,15 @@ var npm = require("../../lib/npm.js") // this is the narrowest way to replace a function in the module cache var found = true -var remoteGitPath = require.resolve('../../lib/cache/add-remote-git.js') +var remoteGitPath = require.resolve("../../lib/cache/add-remote-git.js") require("module")._cache[remoteGitPath] = { id: remoteGitPath, - exports: function stub(_, error, __, cb) { + exports: function stub(_, __, cb) { if (found) { cb(null, {}) } else { - cb(error) + cb(new Error("not on filesystem")) } } } @@ -24,23 +24,19 @@ test("should throw with no parameters", function (t) { t.plan(1) t.throws(function () { - maybeGithub(); + maybeGithub() }, "throws when called without parameters") }) test("should throw with wrong parameter types", function (t) { - t.plan(3) + t.plan(2) t.throws(function () { - maybeGithub({}, new Error(), function () {}) + maybeGithub({}, function () {}) }, "expects only a package name") t.throws(function () { - maybeGithub("npm/xxx-noexist", null, function () {}) - }, "expects to be called after a previous check already failed") - - t.throws(function () { - maybeGithub("npm/xxx-noexist", new Error(), "ham") + maybeGithub("npm/xxx-noexist", "ham") }, "is always async") }) @@ -49,7 +45,7 @@ test("should find an existing package on Github", function (t) { npm.load({}, function (error) { t.notOk(error, "bootstrapping succeeds") t.doesNotThrow(function () { - maybeGithub("npm/npm", new Error("not on filesystem"), function (error, data) { + maybeGithub("npm/npm", function (error, data) { t.notOk(error, "no issues in looking things up") t.ok(data, "received metadata from Github") t.end() @@ -62,7 +58,7 @@ test("shouldn't find a nonexistent package on Github", function (t) { found = false npm.load({}, function () { t.doesNotThrow(function () { - maybeGithub("npm/xxx-noexist", new Error("not on filesystem"), function (error, data) { + maybeGithub("npm/xxx-noexist", function (error, data) { t.equal( error.message, "not on filesystem", diff --git a/deps/npm/test/tap/nested-extraneous.js b/deps/npm/test/tap/nested-extraneous.js new file mode 100644 index 00000000000..fcba0418e68 --- /dev/null +++ b/deps/npm/test/tap/nested-extraneous.js @@ -0,0 +1,53 @@ +var common = require("../common-tap.js") +var test = require("tap").test +var mkdirp = require("mkdirp") +var fs = require("fs") +var rimraf = require("rimraf") +var path = require("path") + +var pkg = path.resolve(__dirname, "nested-extraneous") +var pj = { + name: "nested-extraneous", + version: "1.2.3" +} + +var dep = path.resolve(pkg, "node_modules", "dep") +var deppj = { + name: "nested-extraneous-dep", + version: "1.2.3", + dependencies: { + "nested-extra-depdep": "*" + } +} + +var depdep = path.resolve(dep, "node_modules", "depdep") +var depdeppj = { + name: "nested-extra-depdep", + version: "1.2.3" +} + +test("setup", function (t) { + rimraf.sync(pkg) + mkdirp.sync(depdep) + fs.writeFileSync(path.resolve(pkg, "package.json"), JSON.stringify(pj)) + fs.writeFileSync(path.resolve(dep, "package.json"), JSON.stringify(deppj)) + fs.writeFileSync(path.resolve(depdep, "package.json"), JSON.stringify(depdeppj)) + t.end() +}) + +test("test", function (t) { + common.npm(["ls"], { + cwd: pkg + }, function (er, code, sto, ste) { + if (er) throw er + t.notEqual(code, 0) + t.notSimilar(ste, /depdep/) + t.notSimilar(sto, /depdep/) + t.end() + }) +}) + +test("clean", function (t) { + rimraf.sync(pkg) + t.end() +}) diff --git a/deps/npm/test/tap/optional-metadep-rollback-collision.js b/deps/npm/test/tap/optional-metadep-rollback-collision.js new file mode 100644 index 00000000000..29db793bc45 --- /dev/null +++ b/deps/npm/test/tap/optional-metadep-rollback-collision.js @@ -0,0 +1,56 @@ +var test = require("tap").test +var rimraf = require("rimraf") +var common = require("../common-tap.js") +var path = require("path") +var fs = require("fs") + +var pkg = path.resolve(__dirname, "optional-metadep-rollback-collision") +var nm = path.resolve(pkg, "node_modules") +var cache = path.resolve(pkg, "cache") +var pidfile = path.resolve(pkg, "child.pid") + +test("setup", function (t) { + cleanup() + t.end() +}) + +test("go go test racer", function (t) { + common.npm(["install", "--prefix=" + pkg, "--fetch-retries=0", "--cache=" + cache], { + cwd: pkg, + env: { + PATH: process.env.PATH, + Path: process.env.Path, + "npm_config_loglevel": "silent" + }, + stdio: [ 0, "pipe", 2 ] + }, function (er, code, sout) { + if (er) throw er + t.equal(code, 0) + t.equal(sout, "ok\nok\n") + t.notOk(/not ok/.test(sout), "should not contain the string 'not ok'") + t.end() + }) +}) + +test("verify results", function (t) { + t.throws(function () { + fs.statSync(nm) + }) + t.end() +}) + +test("cleanup", function (t) { + cleanup() + t.end() +}) + +function cleanup () { + try { + var pid = +fs.readFileSync(pidfile) + process.kill(pid, "SIGKILL") + } catch (er) {} + + rimraf.sync(cache) + rimraf.sync(nm) + rimraf.sync(pidfile) +} diff --git a/deps/npm/test/tap/optional-metadep-rollback-collision/deps/d1/package.json b/deps/npm/test/tap/optional-metadep-rollback-collision/deps/d1/package.json new file mode 100644 index 00000000000..26cd1dea32a --- /dev/null +++ b/deps/npm/test/tap/optional-metadep-rollback-collision/deps/d1/package.json @@ -0,0 +1,13 @@ +{ + "name": "d1", + "version": "1.0.0", + "description": "I FAIL CONSTANTLY", + "scripts": { + "preinstall": "sleep 1" + }, + "dependencies": { + "foo": "http://localhost:8080/" + }, + "author": "Forrest L Norvell ", + "license": "ISC" +} diff --git a/deps/npm/test/tap/optional-metadep-rollback-collision/deps/d2/blart.js b/deps/npm/test/tap/optional-metadep-rollback-collision/deps/d2/blart.js new file mode 100644 index 00000000000..c69b8a5d084 --- /dev/null +++ b/deps/npm/test/tap/optional-metadep-rollback-collision/deps/d2/blart.js @@ -0,0 +1,52 @@ +var rando = require("crypto").randomBytes +var resolve = require("path").resolve + +var mkdirp = require("mkdirp") +var rimraf = require("rimraf") +var writeFile = require("graceful-fs").writeFile + +var BASEDIR = resolve(__dirname, "arena") + +var keepItGoingLouder = {} +var writers = 0 +var errors = 0 + +function gensym() { return rando(16).toString("hex") } + +function writeAlmostForever(filename) { + if (!keepItGoingLouder[filename]) { + writers-- + if (writers < 1) return done() + } + else { + writeFile(filename, keepItGoingLouder[filename], function (err) { + if (err) errors++ + + writeAlmostForever(filename) + }) + } +} + +function done() { + rimraf(BASEDIR, function () { + if (errors > 0) console.log("not ok - %d errors", errors) + else console.log("ok") + }) +} + +mkdirp(BASEDIR, function go() { + for (var i = 0; i < 16; i++) { + var filename = resolve(BASEDIR, gensym() + ".txt") + + keepItGoingLouder[filename] = "" + for (var j = 0; j < 512; j++) keepItGoingLouder[filename] += filename + + writers++ + writeAlmostForever(filename) + } + + setTimeout(function viktor() { + // kill all the writers + keepItGoingLouder = {} + }, 3 * 1000) +}) diff --git a/deps/npm/test/tap/optional-metadep-rollback-collision/deps/d2/package.json b/deps/npm/test/tap/optional-metadep-rollback-collision/deps/d2/package.json new file mode 100644 index 00000000000..08eeba4f7ee --- /dev/null +++ b/deps/npm/test/tap/optional-metadep-rollback-collision/deps/d2/package.json @@ -0,0 +1,15 @@ +{ + "name": "d2", + "version": "1.0.0", + "description": "how do you *really* know you exist?", + "scripts": { + "postinstall": "node blart.js" + }, + "dependencies": { + "graceful-fs": "^3.0.2", + "mkdirp": "^0.5.0", + "rimraf": "^2.2.8" + }, + "author": "Forrest L Norvell ", + "license": "ISC" +} diff --git a/deps/npm/test/tap/optional-metadep-rollback-collision/deps/opdep/bad-server.js b/deps/npm/test/tap/optional-metadep-rollback-collision/deps/opdep/bad-server.js new file mode 100644 index 00000000000..4818884c496 --- /dev/null +++ b/deps/npm/test/tap/optional-metadep-rollback-collision/deps/opdep/bad-server.js @@ -0,0 +1,35 @@ +var createServer = require("http").createServer +var spawn = require("child_process").spawn +var fs = require("fs") +var path = require("path") +var pidfile = path.resolve(__dirname, "..", "..", "child.pid") + +if (process.argv[2]) { + console.log("ok") + createServer(function (req, res) { + setTimeout(function () { + res.writeHead(404) + res.end() + }, 1000) + this.close() + }).listen(8080) +} +else { + var child = spawn( + process.execPath, + [__filename, "whatever"], + { + stdio: [0, 1, 2], + detached: true + } + ) + child.unref() + + // kill any prior children, if existing. + try { + var pid = +fs.readFileSync(pidfile) + process.kill(pid, "SIGKILL") + } catch (er) {} + + fs.writeFileSync(pidfile, child.pid + "\n") +} diff --git a/deps/npm/test/tap/optional-metadep-rollback-collision/deps/opdep/package.json b/deps/npm/test/tap/optional-metadep-rollback-collision/deps/opdep/package.json new file mode 100644 index 00000000000..3289c123e82 --- /dev/null +++ b/deps/npm/test/tap/optional-metadep-rollback-collision/deps/opdep/package.json @@ -0,0 +1,15 @@ +{ + "name": "opdep", + "version": "1.0.0", + "description": "To explode, of course!", + "main": "index.js", + "scripts": { + "preinstall": "node bad-server.js" + }, + "dependencies": { + "d1": "file:../d1", + "d2": "file:../d2" + }, + "author": "Forrest L Norvell ", + "license": "ISC" +} diff --git a/deps/npm/test/tap/optional-metadep-rollback-collision/package.json b/deps/npm/test/tap/optional-metadep-rollback-collision/package.json new file mode 100644 index 00000000000..0d812a6e002 --- /dev/null +++ b/deps/npm/test/tap/optional-metadep-rollback-collision/package.json @@ -0,0 +1,10 @@ +{ + "name": "optional-metadep-rollback-collision", + "version": "1.0.0", + "description": "let's just see about that race condition", + "optionalDependencies": { + "opdep": "file:./deps/opdep" + }, + "author": "Forrest L Norvell ", + "license": "ISC" +} diff --git a/deps/npm/test/tap/outdated-notarget.js b/deps/npm/test/tap/outdated-notarget.js index 79fb88c67cc..782f6f7d59a 100644 --- a/deps/npm/test/tap/outdated-notarget.js +++ b/deps/npm/test/tap/outdated-notarget.js @@ -1,23 +1,23 @@ // Fixes Issue #1770 -var common = require('../common-tap.js') -var test = require('tap').test -var npm = require('../../') -var osenv = require('osenv') -var path = require('path') -var fs = require('fs') -var rimraf = require('rimraf') -var mkdirp = require('mkdirp') -var pkg = path.resolve(__dirname, 'outdated-notarget') -var cache = path.resolve(pkg, 'cache') -var mr = require('npm-registry-mock') +var common = require("../common-tap.js") +var test = require("tap").test +var npm = require("../../") +var osenv = require("osenv") +var path = require("path") +var fs = require("fs") +var rimraf = require("rimraf") +var mkdirp = require("mkdirp") +var pkg = path.resolve(__dirname, "outdated-notarget") +var cache = path.resolve(pkg, "cache") +var mr = require("npm-registry-mock") -test('outdated-target: if no viable version is found, show error', function(t) { +test("outdated-target: if no viable version is found, show error", function(t) { t.plan(1) setup() mr({port: common.port}, function(s) { npm.load({ cache: cache, registry: common.registry}, function() { - npm.commands.update(function(er, d) { - t.equal(er.code, 'ETARGET') + npm.commands.update(function(er) { + t.equal(er.code, "ETARGET") s.close() t.end() }) @@ -25,7 +25,7 @@ test('outdated-target: if no viable version is found, show error', function(t) { }) }) -test('cleanup', function(t) { +test("cleanup", function(t) { process.chdir(osenv.tmpdir()) rimraf.sync(pkg) t.end() @@ -34,14 +34,14 @@ test('cleanup', function(t) { function setup() { mkdirp.sync(pkg) mkdirp.sync(cache) - fs.writeFileSync(path.resolve(pkg, 'package.json'), JSON.stringify({ - author: 'Evan Lucas', - name: 'outdated-notarget', - version: '0.0.0', - description: 'Test for outdated-target', + fs.writeFileSync(path.resolve(pkg, "package.json"), JSON.stringify({ + author: "Evan Lucas", + name: "outdated-notarget", + version: "0.0.0", + description: "Test for outdated-target", dependencies: { - underscore: '~199.7.1' + underscore: "~199.7.1" } - }), 'utf8') + }), "utf8") process.chdir(pkg) } diff --git a/deps/npm/test/tap/pack-scoped.js b/deps/npm/test/tap/pack-scoped.js new file mode 100644 index 00000000000..05a77a0f0fc --- /dev/null +++ b/deps/npm/test/tap/pack-scoped.js @@ -0,0 +1,91 @@ +// verify that prepublish runs on pack and publish +var test = require("tap").test +var fs = require("graceful-fs") +var join = require("path").join +var mkdirp = require("mkdirp") +var rimraf = require("rimraf") +var path = require("path") + +var pkg = join(__dirname, "scoped_package") +var manifest = join(pkg, "package.json") +var tmp = join(pkg, "tmp") +var cache = join(pkg, "cache") + +var data = { + name : "@scope/generic-package", + version : "90000.100001.5" +} + +test("setup", function (t) { + var n = 0 + + mkdirp(pkg, then()) + mkdirp(cache, then()) + mkdirp(tmp, then()) + + function then () { + n++ + return function (er) { + if (er) throw er + if (--n === 0) next() + } + } + + function next () { + fs.writeFile(manifest, JSON.stringify(data), "ascii", done) + } + + function done (er) { + if (er) throw er + + t.pass("setup done") + t.end() + } +}) + +test("test", function (t) { + var spawn = require("child_process").spawn + var node = process.execPath + var npm = path.resolve(__dirname, "../../cli.js") + var env = { + "npm_config_cache" : cache, + "npm_config_tmp" : tmp, + "npm_config_prefix" : pkg, + "npm_config_global" : "false" + } + + for (var i in process.env) { + if (!/^npm_config_/.test(i)) env[i] = process.env[i] + } + + var child = spawn(node, [npm, "pack"], {cwd : pkg, env : env}) + + child.stdout.setEncoding("utf8") + child.stderr.on("data", onerr) + child.stdout.on("data", ondata) + child.on("close", onend) + + var c = "", e = "" + function ondata (chunk) { c += chunk } + function onerr (chunk) { e += chunk } + + function onend () { + if (e) { + throw new Error("got stderr data: " + JSON.stringify("" + e)) + } + c = c.trim() + var regex = new RegExp("scope-generic-package-90000.100001.5.tgz", "ig") + + t.ok(c.match(regex), "found package") + t.end() + } +}) + +test("cleanup", function (t) { + rimraf(pkg, function (er) { + if (er) throw er + + t.pass("cleaned up") + t.end() + }) +}) diff --git a/deps/npm/test/tap/prepublish.js b/deps/npm/test/tap/prepublish.js index f80085d92c6..ad71eab5cd2 100644 --- a/deps/npm/test/tap/prepublish.js +++ b/deps/npm/test/tap/prepublish.js @@ -1,68 +1,66 @@ // verify that prepublish runs on pack and publish -var test = require('tap').test -var npm = require('../../') -var fs = require('fs') -var pkg = __dirname + '/prepublish_package' -var tmp = pkg + '/tmp' -var cache = pkg + '/cache' -var mkdirp = require('mkdirp') -var rimraf = require('rimraf') -var path = require('path') -var os = require('os') +var test = require("tap").test +var fs = require("graceful-fs") +var join = require("path").join +var mkdirp = require("mkdirp") +var rimraf = require("rimraf") +var path = require("path") -test('setup', function (t) { +var pkg = join(__dirname, "prepublish_package") +var tmp = join(pkg, "tmp") +var cache = join(pkg, "cache") + +test("setup", function (t) { var n = 0 mkdirp(pkg, then()) mkdirp(cache, then()) mkdirp(tmp, then()) - function then (er) { - n ++ + function then () { + n++ return function (er) { - if (er) - throw er - if (--n === 0) - next() + if (er) throw er + if (--n === 0) next() } } function next () { - fs.writeFile(pkg + '/package.json', JSON.stringify({ - name: 'npm-test-prepublish', - version: '1.2.5', - scripts: { prepublish: 'echo ok' } - }), 'ascii', function (er) { - if (er) - throw er - t.pass('setup done') + fs.writeFile(join(pkg, "package.json"), JSON.stringify({ + name: "npm-test-prepublish", + version: "1.2.5", + scripts: { prepublish: "echo ok" } + }), "ascii", function (er) { + if (er) throw er + + t.pass("setup done") t.end() }) } }) -test('test', function (t) { - var spawn = require('child_process').spawn +test("test", function (t) { + var spawn = require("child_process").spawn var node = process.execPath - var npm = path.resolve(__dirname, '../../cli.js') + var npm = path.resolve(__dirname, "../../cli.js") var env = { - npm_config_cache: cache, - npm_config_tmp: tmp, - npm_config_prefix: pkg, - npm_config_global: 'false' + "npm_config_cache" : cache, + "npm_config_tmp" : tmp, + "npm_config_prefix" : pkg, + "npm_config_global" : "false" } for (var i in process.env) { if (!/^npm_config_/.test(i)) env[i] = process.env[i] } - var child = spawn(node, [npm, 'pack'], { + var child = spawn(node, [npm, "pack"], { cwd: pkg, env: env }) - child.stdout.setEncoding('utf8') - child.stderr.on('data', onerr) - child.stdout.on('data', ondata) - child.on('close', onend) - var c = '' - , e = '' + child.stdout.setEncoding("utf8") + child.stderr.on("data", onerr) + child.stdout.on("data", ondata) + child.on("close", onend) + var c = "" + , e = "" function ondata (chunk) { c += chunk } @@ -71,7 +69,7 @@ test('test', function (t) { } function onend () { if (e) { - throw new Error('got stderr data: ' + JSON.stringify('' + e)) + throw new Error("got stderr data: " + JSON.stringify("" + e)) } c = c.trim() var regex = new RegExp("" + @@ -86,12 +84,11 @@ test('test', function (t) { } }) -test('cleanup', function (t) { - rimraf(pkg, function(er) { - if (er) - throw er - t.pass('cleaned up') +test("cleanup", function (t) { + rimraf(pkg, function (er) { + if (er) throw er + + t.pass("cleaned up") t.end() }) }) - diff --git a/deps/npm/test/tap/publish-config.js b/deps/npm/test/tap/publish-config.js index 3c4624eeaf7..39d6e831136 100644 --- a/deps/npm/test/tap/publish-config.js +++ b/deps/npm/test/tap/publish-config.js @@ -7,11 +7,17 @@ pkg += '/npm-test-publish-config' require('mkdirp').sync(pkg) -fs.writeFileSync(pkg + '/package.json', JSON.stringify({ - name: 'npm-test-publish-config', - version: '1.2.3', +fs.writeFileSync(pkg + "/package.json", JSON.stringify({ + name: "npm-test-publish-config", + version: "1.2.3", publishConfig: { registry: common.registry } -}), 'utf8') +}), "utf8") + +fs.writeFileSync(pkg + "/fixture_npmrc", + "//localhost:1337/:email = fancy@feast.net\n" + + "//localhost:1337/:username = fancy\n" + + "//localhost:1337/:_password = " + new Buffer("feast").toString("base64") + "\n" + + "registry = http://localhost:1337/") var spawn = require('child_process').spawn var npm = require.resolve('../../bin/npm-cli.js') @@ -36,8 +42,9 @@ test(function (t) { // itself functions normally. // // Make sure that we don't sit around waiting for lock files - child = spawn(node, [npm, 'publish', '--email=fancy', '--_auth=feast'], { + child = spawn(node, [npm, "publish", "--userconfig=" + pkg + "/fixture_npmrc"], { cwd: pkg, + stdio: "inherit", env: { npm_config_cache_lock_stale: 1000, npm_config_cache_lock_wait: 1000, diff --git a/deps/npm/test/tap/publish-scoped.js b/deps/npm/test/tap/publish-scoped.js new file mode 100644 index 00000000000..7547c91f1ba --- /dev/null +++ b/deps/npm/test/tap/publish-scoped.js @@ -0,0 +1,71 @@ +var fs = require("fs") +var path = require("path") + +var test = require("tap").test +var mkdirp = require("mkdirp") +var rimraf = require("rimraf") +var nock = require("nock") + +var npm = require("../../") +var common = require("../common-tap.js") + +var pkg = path.join(__dirname, "prepublish_package") + +test("setup", function (t) { + mkdirp(path.join(pkg, "cache"), next) + + function next () { + process.chdir(pkg) + fs.writeFile( + path.join(pkg, "package.json"), + JSON.stringify({ + name: "@bigco/publish-organized", + version: "1.2.5" + }), + "ascii", + function (er) { + t.ifError(er) + + t.pass("setup done") + t.end() + } + ) + } +}) + +test("npm publish should honor scoping", function (t) { + var put = nock(common.registry).put("/@bigco%2fpublish-organized").reply(201, {ok: true}) + + var configuration = { + cache : path.join(pkg, "cache"), + loglevel : "silent", + registry : "http://nonexistent.lvh.me", + "//localhost:1337/:username" : "username", + "//localhost:1337/:_password" : new Buffer("password").toString("base64"), + "//localhost:1337/:email" : "ogd@aoaioxxysz.net" + } + + npm.load(configuration, onload) + + function onload (er) { + t.ifError(er, "npm bootstrapped successfully") + + npm.config.set("@bigco:registry", common.registry) + npm.commands.publish([], false, function (er) { + t.ifError(er, "published without error") + + put.done() + + t.end() + }) + } +}) + +test("cleanup", function(t) { + process.chdir(__dirname) + rimraf(pkg, function (er) { + t.ifError(er) + + t.end() + }) +}) diff --git a/deps/npm/test/tap/pwd-prefix.js b/deps/npm/test/tap/pwd-prefix.js new file mode 100644 index 00000000000..e041552e7dc --- /dev/null +++ b/deps/npm/test/tap/pwd-prefix.js @@ -0,0 +1,35 @@ +// This test ensures that a few commands do the same +// thing when the cwd is where package.json is, and when +// the package.json is one level up. + +var test = require("tap").test +var common = require("../common-tap.js") +var path = require("path") +var root = path.resolve(__dirname, "../..") +var lib = path.resolve(root, "lib") +var commands = ["run", "version"] + +commands.forEach(function (cmd) { + // Should get the same stdout and stderr each time + var stdout, stderr + + test(cmd + " in root", function (t) { + common.npm([cmd], {cwd: root}, function(er, code, so, se) { + if (er) throw er + t.equal(code, 0) + stdout = so + stderr = se + t.end() + }) + }) + + test(cmd + " in lib", function (t) { + common.npm([cmd], {cwd: lib}, function(er, code, so, se) { + if (er) throw er + t.equal(code, 0) + t.equal(so, stdout) + t.equal(se, stderr) + t.end() + }) + }) +}) diff --git a/deps/npm/test/tap/registry.js b/deps/npm/test/tap/registry.js index 8ea1c2f2daf..adcb8f48b1d 100644 --- a/deps/npm/test/tap/registry.js +++ b/deps/npm/test/tap/registry.js @@ -9,7 +9,6 @@ var path = require("path") var ca = path.resolve(__dirname, "../../node_modules/npm-registry-couchapp") var which = require("which") -var hasCouch = false which("couchdb", function(er, couch) { if (er) { @@ -23,6 +22,10 @@ which("couchdb", function(er, couch) { }) function runTests () { + var env = {} + for (var i in process.env) env[i] = process.env[i] + env.npm = npmExec + spawn(process.execPath, [ npmExec, "install" ], { @@ -31,14 +34,11 @@ function runTests () { }).on("close", function (code, sig) { if (code || sig) { return test("need install to work", function (t) { - t.fail("install failed with: " (code || sig)) + t.fail("install failed with: " + (code || sig)) t.end() }) } else { - var env = {} - for (var i in process.env) env[i] = process.env[i] - env.npm = npmExec spawn(process.execPath, [ npmExec, "test" @@ -47,7 +47,15 @@ function runTests () { env: env, stdio: "inherit" }).on("close", function (code, sig) { - process.exit(code || sig) + spawn(process.execPath, [ + npmExec, "prune", "--production" + ], { + cwd: ca, + env: env, + stdio: "inherit" + }).on("close", function (code2, sig2) { + process.exit(code || code2 || 0) + }) }) } diff --git a/deps/npm/test/tap/run-script.js b/deps/npm/test/tap/run-script.js new file mode 100644 index 00000000000..a308b5ffe9c --- /dev/null +++ b/deps/npm/test/tap/run-script.js @@ -0,0 +1,62 @@ +var common = require('../common-tap') + , test = require('tap').test + , path = require('path') + , spawn = require('child_process').spawn + , rimraf = require('rimraf') + , mkdirp = require('mkdirp') + , pkg = __dirname + '/run-script' + , cache = pkg + '/cache' + , tmp = pkg + '/tmp' + , node = process.execPath + , npm = path.resolve(__dirname, '../../cli.js') + , opts = { cwd: pkg } + +function testOutput (t, command, er, code, stdout, stderr) { + if (er) + throw er + + if (stderr) + throw new Error('npm ' + command + ' stderr: ' + stderr.toString()) + + stdout = stdout.trim().split('\n') + stdout = stdout[stdout.length - 1] + t.equal(stdout, command) + t.end() +} + +function cleanup () { + rimraf.sync(pkg + '/cache') + rimraf.sync(pkg + '/tmp') +} + +test('setup', function (t) { + cleanup() + mkdirp.sync(pkg + '/cache') + mkdirp.sync(pkg + '/tmp') + t.end() +}) + +test('npm run-script', 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 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 double quotes', function(t) { + common.npm(["run-script", "start", "--", "what's \"up\"?"], opts, testOutput.bind(null, t, "what's \"up\"?")) +}) + +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 new file mode 100644 index 00000000000..49b86366834 --- /dev/null +++ b/deps/npm/test/tap/run-script/package.json @@ -0,0 +1,6 @@ +{"name":"runscript" +,"version":"1.2.3" +,"scripts":{ + "start":"node -e 'console.log(process.argv[1] || \"start\")'" + } +} diff --git a/deps/npm/test/tap/semver-tag.js b/deps/npm/test/tap/semver-tag.js new file mode 100644 index 00000000000..7633e554260 --- /dev/null +++ b/deps/npm/test/tap/semver-tag.js @@ -0,0 +1,15 @@ +// should not allow tagging with a valid semver range +var common = require("../common-tap.js") +var test = require("tap").test + +test("try to tag with semver range as tag name", function (t) { + var cmd = ["tag", "zzzz@1.2.3", "v2.x", "--registry=http://localhost"] + common.npm(cmd, { + stdio: "pipe", + }, function (er, code, so, se) { + if (er) throw er + t.similar(se, /Tag name must not be a valid SemVer range: v2.x\n/) + t.equal(code, 1) + t.end() + }) +}) diff --git a/deps/npm/test/tap/url-dependencies.js b/deps/npm/test/tap/url-dependencies.js index 7f8cc78644e..34a77f4bca0 100644 --- a/deps/npm/test/tap/url-dependencies.js +++ b/deps/npm/test/tap/url-dependencies.js @@ -7,7 +7,7 @@ var spawn = require("child_process").spawn var npm = require.resolve("../../bin/npm-cli.js") var node = process.execPath var pkg = path.resolve(__dirname, "url-dependencies") -var common = require('../common-tap') +var common = require("../common-tap") var mockRoutes = { "get": { @@ -19,9 +19,9 @@ test("url-dependencies: download first time", function(t) { cleanup() performInstall(function(output){ - if(!tarballWasFetched(output)){ + if (!tarballWasFetched(output)){ t.fail("Tarball was not fetched") - }else{ + } else { t.pass("Tarball was fetched") } t.end() @@ -33,9 +33,9 @@ test("url-dependencies: do not download subsequent times", function(t) { performInstall(function(){ performInstall(function(output){ - if(tarballWasFetched(output)){ + if (tarballWasFetched(output)){ t.fail("Tarball was fetched second time around") - }else{ + } else { t.pass("Tarball was not fetched") } t.end() @@ -44,7 +44,7 @@ test("url-dependencies: do not download subsequent times", function(t) { }) function tarballWasFetched(output){ - return output.indexOf("http GET " + common.registry + "/underscore/-/underscore-1.3.1.tgz") > -1 + return output.indexOf("http fetch GET " + common.registry + "/underscore/-/underscore-1.3.1.tgz") > -1 } function performInstall (cb) { @@ -53,10 +53,10 @@ function performInstall (cb) { , child = spawn(node, [npm, "install"], { cwd: pkg, env: { - npm_config_registry: common.registry, - npm_config_cache_lock_stale: 1000, - npm_config_cache_lock_wait: 1000, - npm_config_loglevel: "http", + "npm_config_registry": common.registry, + "npm_config_cache_lock_stale": 1000, + "npm_config_cache_lock_wait": 1000, + "npm_config_loglevel": "http", HOME: process.env.HOME, Path: process.env.PATH, PATH: process.env.PATH diff --git a/deps/npm/test/tap/whoami.js b/deps/npm/test/tap/whoami.js new file mode 100644 index 00000000000..e4ed30df773 --- /dev/null +++ b/deps/npm/test/tap/whoami.js @@ -0,0 +1,77 @@ +var common = require("../common-tap.js") + +var fs = require("fs") +var path = require("path") +var createServer = require("http").createServer + +var test = require("tap").test +var rimraf = require("rimraf") + +var opts = { cwd: __dirname } + +var FIXTURE_PATH = path.resolve(__dirname, "fixture_npmrc") + +test("npm whoami with basic auth", function (t) { + var s = "//registry.lvh.me/:username = wombat\n" + + "//registry.lvh.me/:_password = YmFkIHBhc3N3b3Jk\n" + + "//registry.lvh.me/:email = lindsay@wdu.org.au\n" + fs.writeFileSync(FIXTURE_PATH, s, "ascii") + fs.chmodSync(FIXTURE_PATH, "0444") + + common.npm( + [ + "whoami", + "--userconfig=" + FIXTURE_PATH, + "--registry=http://registry.lvh.me/" + ], + opts, + function (err, code, stdout, stderr) { + t.ifError(err) + + t.equal(stderr, "", "got nothing on stderr") + t.equal(code, 0, "exit ok") + t.equal(stdout, "wombat\n", "got username") + rimraf.sync(FIXTURE_PATH) + t.end() + } + ) +}) + +test("npm whoami with bearer auth", {timeout : 2 * 1000}, function (t) { + var s = "//localhost:" + common.port + + "/:_authToken = wombat-developers-union\n" + fs.writeFileSync(FIXTURE_PATH, s, "ascii") + fs.chmodSync(FIXTURE_PATH, "0444") + + function verify(req, res) { + t.equal(req.method, "GET") + t.equal(req.url, "/whoami") + + res.setHeader("content-type", "application/json") + res.writeHeader(200) + res.end(JSON.stringify({username : "wombat"}), "utf8") + } + + var server = createServer(verify) + + server.listen(common.port, function () { + common.npm( + [ + "whoami", + "--userconfig=" + FIXTURE_PATH, + "--registry=http://localhost:" + common.port + "/" + ], + opts, + function (err, code, stdout, stderr) { + t.ifError(err) + + t.equal(stderr, "", "got nothing on stderr") + t.equal(code, 0, "exit ok") + t.equal(stdout, "wombat\n", "got username") + rimraf.sync(FIXTURE_PATH) + server.close() + t.end() + } + ) + }) +}) diff --git a/tools/upgrade-npm.sh b/tools/upgrade-npm.sh new file mode 100755 index 00000000000..02700324c93 --- /dev/null +++ b/tools/upgrade-npm.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +set -xe + +rm -rf deps/npm + +(cd deps && curl https://registry.npmjs.org/npm/-/npm-$1.tgz | tar xz && mv package npm) From fd896d5acfe0832cfb211d861f78845bcad4f301 Mon Sep 17 00:00:00 2001 From: Timothy J Fontaine Date: Wed, 24 Sep 2014 14:46:41 -0700 Subject: [PATCH 021/144] 2014.09.24, Version 0.11.14 (Unstable) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * uv: Upgrade to v1.0.0-rc1 * http_parser: Upgrade to v2.3.0 * npm: Upgrade to v2.0.0 * openssl: Upgrade to v1.0.1i * v8: Upgrade to 3.26.33 * Add fast path for simple URL parsing (Gabriel Wicke) * Added support for options parameter in console.dir() (Xavi Magrinyà) * Cluster: fix shared handles on Windows (Alexis Campailla) * buffer: Fix incorrect Buffer.compare behavior (Feross Aboukhadijeh) * buffer: construct new buffer from buffer toJSON() output (cjihrig) * buffer: improve Buffer constructor (Kang-Hao Kenny) * build: linking CoreFoundation framework for OSX (Thorsten Lorenz) * child_process: accept uid/gid everywhere (Fedor Indutny) * child_process: add path to spawn ENOENT Error (Ryan Cole) * child_process: copy spawnSync() cwd option to proper buffer (cjihrig) * child_process: do not access stderr when stdio set to 'ignore' (cjihrig) * child_process: don't throw on EAGAIN (Charles) * child_process: don't throw on EMFILE/ENFILE (Ben Noordhuis) * child_process: use full path for cmd.exe on Win32 (Ed Morley) * cluster: allow multiple calls to setupMaster() (Ryan Graham) * cluster: centralize removal from workers list. (Julien Gilli) * cluster: enable error/message events using .worker (cjihrig) * cluster: include settings object in 'setup' event (Ryan Graham) * cluster: restore v0.10.x setupMaster() behaviour (Ryan Graham) * cluster: support options in Worker constructor (cjihrig) * cluster: test events emit on cluster.worker (Sam Roberts) * console: console.dir() accepts options object (Xavi Magrinyà) * crypto: add `honorCipherOrder` argument (Fedor Indutny) * crypto: allow padding in RSA methods (Fedor Indutny) * crypto: clarify RandomBytes() error msg (Mickael van der Beek) * crypto: never store pointer to conn in SSL_CTX (Fedor Indutny) * crypto: unsigned value can't be negative (Brian White) * dgram: remove new keyword from errnoException (Jackson Tian) * dns: always set variable family in lookup() (cjihrig) * dns: include host name in error message if available (Maciej Małecki) * dns: introduce lookupService function (Saúl Ibarra Corretgé) * dns: send lookup c-ares errors to callback (Chris Dickinson) * dns: throw if hostname is not string or falsey (cjihrig) * events: Output the event that is leaking (Arnout Kazemier) * fs: close file if fstat() fails in readFile() (cjihrig) * fs: fs.readFile should not throw uncaughtException (Jackson Tian) * http: add 308 status_code, see RFC7238 (Yazhong Liu) * http: don't default OPTIONS to chunked encoding (Nick Muerdter) * http: fix bailout for writeHead (Alex Kocharin) * http: remove unused code block (Fedor Indutny) * http: write() after end() emits an error. (Julien Gilli) * lib, src: add vm.runInDebugContext() (Ben Noordhuis) * lib: noisy deprecation of child_process customFds (Ryan Graham) * module: don't require fs several times (Robert Kowalski) * net,dgram: workers can listen on exclusive ports (cjihrig) * net,stream: add isPaused, don't read() when paused (Chris Dickinson) * net: Ensure consistent binding to IPV6 if address is absent (Raymond Feng) * net: add remoteFamily for socket (Jackson Tian) * net: don't emit listening if handle is closed (Eli Skeggs) * net: don't prefer IPv4 addresses during resolution (cjihrig) * net: don't throw on net.Server.close() (cjihrig) * net: reset `errorEmitted` on reconnect (Ed Umansky) * node: set names for prototype methods (Trevor Norris) * node: support v8 microtask queue (Vladimir Kurchatkin) * path: fix slice OOB in trim (Lucio M. Tato) * path: isAbsolute() should always return boolean (Herman Lee) * process: throw TypeError if kill pid not a number (Sam Roberts) * querystring: custom encode and decode (fengmk2) * querystring: do not add sep for empty array (cjihrig) * querystring: remove prepended ? from query field (Ezequiel Rabinovich) * readline: fix close event of readline.Interface() (Yazhong Liu) * readline: fixes scoping bug (Dan Kaplun) * readline: implements keypress buffering (Dan Kaplun) * repl: fix multi-line input (Fedor Indutny) * repl: fix overwrite for this._prompt (Yazhong Liu) * repl: proper `setPrompt()` and `multiline` support (Fedor Indutny) * stream: don't try to finish if buffer is not empty (Vladimir Kurchatkin) * stream: only end reading on null, not undefined (Jonathan Reem) * streams: set default hwm properly for Duplex (Andrew Oppenlander) * string_bytes: ucs2 support big endian (Andrew Low) * tls, crypto: add DHE support (Shigeki Ohtsu) * tls: `checkServerIdentity` option (Trevor Livingston) * tls: add DHE-RSA-AES128-SHA256 to the def ciphers (Shigeki Ohtsu) * tls: better error reporting at cert validation (Fedor Indutny) * tls: support multiple keys/certs (Fedor Indutny) * tls: throw an error, not string (Jackson Tian) * udp: make it possible to receive empty udp packets (Andrius Bentkus) * url: treat the same as / (isaacs) --- ChangeLog | 169 +++++++++++++++++++++++++++++++++++++++++++++ src/node_version.h | 2 +- 2 files changed, 170 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 00cc51d4d0f..ef860651fc8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,172 @@ +2014.09.24, Version 0.11.14 (Unstable) + +* uv: Upgrade to v1.0.0-rc1 + +* http_parser: Upgrade to v2.3.0 + +* npm: Upgrade to v2.0.0 + +* openssl: Upgrade to v1.0.1i + +* v8: Upgrade to 3.26.33 + +* Add fast path for simple URL parsing (Gabriel Wicke) + +* Added support for options parameter in console.dir() (Xavi Magrinyà) + +* Cluster: fix shared handles on Windows (Alexis Campailla) + +* buffer: Fix incorrect Buffer.compare behavior (Feross Aboukhadijeh) + +* buffer: construct new buffer from buffer toJSON() output (cjihrig) + +* buffer: improve Buffer constructor (Kang-Hao Kenny) + +* build: linking CoreFoundation framework for OSX (Thorsten Lorenz) + +* child_process: accept uid/gid everywhere (Fedor Indutny) + +* child_process: add path to spawn ENOENT Error (Ryan Cole) + +* child_process: copy spawnSync() cwd option to proper buffer (cjihrig) + +* child_process: do not access stderr when stdio set to 'ignore' (cjihrig) + +* child_process: don't throw on EAGAIN (Charles) + +* child_process: don't throw on EMFILE/ENFILE (Ben Noordhuis) + +* child_process: use full path for cmd.exe on Win32 (Ed Morley) + +* cluster: allow multiple calls to setupMaster() (Ryan Graham) + +* cluster: centralize removal from workers list. (Julien Gilli) + +* cluster: enable error/message events using .worker (cjihrig) + +* cluster: include settings object in 'setup' event (Ryan Graham) + +* cluster: restore v0.10.x setupMaster() behaviour (Ryan Graham) + +* cluster: support options in Worker constructor (cjihrig) + +* cluster: test events emit on cluster.worker (Sam Roberts) + +* console: console.dir() accepts options object (Xavi Magrinyà) + +* crypto: add `honorCipherOrder` argument (Fedor Indutny) + +* crypto: allow padding in RSA methods (Fedor Indutny) + +* crypto: clarify RandomBytes() error msg (Mickael van der Beek) + +* crypto: never store pointer to conn in SSL_CTX (Fedor Indutny) + +* crypto: unsigned value can't be negative (Brian White) + +* dgram: remove new keyword from errnoException (Jackson Tian) + +* dns: always set variable family in lookup() (cjihrig) + +* dns: include host name in error message if available (Maciej Małecki) + +* dns: introduce lookupService function (Saúl Ibarra Corretgé) + +* dns: send lookup c-ares errors to callback (Chris Dickinson) + +* dns: throw if hostname is not string or falsey (cjihrig) + +* events: Output the event that is leaking (Arnout Kazemier) + +* fs: close file if fstat() fails in readFile() (cjihrig) + +* fs: fs.readFile should not throw uncaughtException (Jackson Tian) + +* http: add 308 status_code, see RFC7238 (Yazhong Liu) + +* http: don't default OPTIONS to chunked encoding (Nick Muerdter) + +* http: fix bailout for writeHead (Alex Kocharin) + +* http: remove unused code block (Fedor Indutny) + +* http: write() after end() emits an error. (Julien Gilli) + +* lib, src: add vm.runInDebugContext() (Ben Noordhuis) + +* lib: noisy deprecation of child_process customFds (Ryan Graham) + +* module: don't require fs several times (Robert Kowalski) + +* net,dgram: workers can listen on exclusive ports (cjihrig) + +* net,stream: add isPaused, don't read() when paused (Chris Dickinson) + +* net: Ensure consistent binding to IPV6 if address is absent (Raymond Feng) + +* net: add remoteFamily for socket (Jackson Tian) + +* net: don't emit listening if handle is closed (Eli Skeggs) + +* net: don't prefer IPv4 addresses during resolution (cjihrig) + +* net: don't throw on net.Server.close() (cjihrig) + +* net: reset `errorEmitted` on reconnect (Ed Umansky) + +* node: set names for prototype methods (Trevor Norris) + +* node: support v8 microtask queue (Vladimir Kurchatkin) + +* path: fix slice OOB in trim (Lucio M. Tato) + +* path: isAbsolute() should always return boolean (Herman Lee) + +* process: throw TypeError if kill pid not a number (Sam Roberts) + +* querystring: custom encode and decode (fengmk2) + +* querystring: do not add sep for empty array (cjihrig) + +* querystring: remove prepended ? from query field (Ezequiel Rabinovich) + +* readline: fix close event of readline.Interface() (Yazhong Liu) + +* readline: fixes scoping bug (Dan Kaplun) + +* readline: implements keypress buffering (Dan Kaplun) + +* repl: fix multi-line input (Fedor Indutny) + +* repl: fix overwrite for this._prompt (Yazhong Liu) + +* repl: proper `setPrompt()` and `multiline` support (Fedor Indutny) + +* stream: don't try to finish if buffer is not empty (Vladimir Kurchatkin) + +* stream: only end reading on null, not undefined (Jonathan Reem) + +* streams: set default hwm properly for Duplex (Andrew Oppenlander) + +* string_bytes: ucs2 support big endian (Andrew Low) + +* tls, crypto: add DHE support (Shigeki Ohtsu) + +* tls: `checkServerIdentity` option (Trevor Livingston) + +* tls: add DHE-RSA-AES128-SHA256 to the def ciphers (Shigeki Ohtsu) + +* tls: better error reporting at cert validation (Fedor Indutny) + +* tls: support multiple keys/certs (Fedor Indutny) + +* tls: throw an error, not string (Jackson Tian) + +* udp: make it possible to receive empty udp packets (Andrius Bentkus) + +* url: treat \ the same as / (isaacs) + + 2014.05.01, Version 0.11.13 (Unstable), 99c9930ad626e2796af23def7cac19b65c608d18 * v8: upgrade to 3.24.35.22 diff --git a/src/node_version.h b/src/node_version.h index ab3d2176337..fa673709c27 100644 --- a/src/node_version.h +++ b/src/node_version.h @@ -26,7 +26,7 @@ #define NODE_MINOR_VERSION 11 #define NODE_PATCH_VERSION 14 -#define NODE_VERSION_IS_RELEASE 0 +#define NODE_VERSION_IS_RELEASE 1 #ifndef NODE_TAG # define NODE_TAG "" From 8e4fc88c797857c55c84558708fa7e72bb7e4eca Mon Sep 17 00:00:00 2001 From: Timothy J Fontaine Date: Wed, 24 Sep 2014 17:14:23 -0700 Subject: [PATCH 022/144] Now working on 0.11.15 --- 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 fa673709c27..ca154026c7f 100644 --- a/src/node_version.h +++ b/src/node_version.h @@ -24,9 +24,9 @@ #define NODE_MAJOR_VERSION 0 #define NODE_MINOR_VERSION 11 -#define NODE_PATCH_VERSION 14 +#define NODE_PATCH_VERSION 15 -#define NODE_VERSION_IS_RELEASE 1 +#define NODE_VERSION_IS_RELEASE 0 #ifndef NODE_TAG # define NODE_TAG "" From 51b6b6844e9156ab84ae9d0f4592e09f994060b2 Mon Sep 17 00:00:00 2001 From: Trevor Norris Date: Wed, 24 Sep 2014 15:41:31 -0700 Subject: [PATCH 023/144] doc: fix brackets for optional parameters Documentation incorrectly used bracket notation for optional parameters. This caused inconsistencies in usage because of examples like the following: fs.write(fd, data[, position[, encoding]], callback) This simply fixes all uses of bracket notation in documentation. Signed-off-by: Trevor Norris Reviewed-by: Fedor Indutny --- doc/api/assert.markdown | 18 ++++----- doc/api/buffer.markdown | 72 +++++++++++++++++----------------- doc/api/child_process.markdown | 16 ++++---- doc/api/cluster.markdown | 2 +- doc/api/console.markdown | 14 +++---- doc/api/crypto.markdown | 36 ++++++++--------- doc/api/dgram.markdown | 14 +++---- doc/api/dns.markdown | 4 +- doc/api/events.markdown | 2 +- doc/api/fs.markdown | 38 +++++++++--------- doc/api/http.markdown | 26 ++++++------ doc/api/https.markdown | 8 ++-- doc/api/net.markdown | 34 ++++++++-------- doc/api/path.markdown | 4 +- doc/api/process.markdown | 2 +- doc/api/querystring.markdown | 4 +- doc/api/readline.markdown | 2 +- doc/api/stream.markdown | 8 ++-- doc/api/timers.markdown | 6 +-- doc/api/tls.markdown | 10 ++--- doc/api/url.markdown | 2 +- doc/api/util.markdown | 6 +-- doc/api/vm.markdown | 10 ++--- doc/api/zlib.markdown | 28 ++++++------- 24 files changed, 183 insertions(+), 183 deletions(-) diff --git a/doc/api/assert.markdown b/doc/api/assert.markdown index 1a66022219d..dec971eba10 100644 --- a/doc/api/assert.markdown +++ b/doc/api/assert.markdown @@ -9,35 +9,35 @@ access it with `require('assert')`. Throws an exception that displays the values for `actual` and `expected` separated by the provided operator. -## assert(value, message), assert.ok(value, [message]) +## assert(value, message), assert.ok(value[, message]) Tests if value is truthy, it is equivalent to `assert.equal(true, !!value, message);` -## assert.equal(actual, expected, [message]) +## assert.equal(actual, expected[, message]) Tests shallow, coercive equality with the equal comparison operator ( `==` ). -## assert.notEqual(actual, expected, [message]) +## assert.notEqual(actual, expected[, message]) Tests shallow, coercive non-equality with the not equal comparison operator ( `!=` ). -## assert.deepEqual(actual, expected, [message]) +## assert.deepEqual(actual, expected[, message]) Tests for deep equality. -## assert.notDeepEqual(actual, expected, [message]) +## assert.notDeepEqual(actual, expected[, message]) Tests for any deep inequality. -## assert.strictEqual(actual, expected, [message]) +## assert.strictEqual(actual, expected[, message]) Tests strict equality, as determined by the strict equality operator ( `===` ) -## assert.notStrictEqual(actual, expected, [message]) +## assert.notStrictEqual(actual, expected[, message]) Tests strict non-equality, as determined by the strict not equal operator ( `!==` ) -## assert.throws(block, [error], [message]) +## assert.throws(block[, error]\[, message]) Expects `block` to throw an error. `error` can be constructor, `RegExp` or validation function. @@ -74,7 +74,7 @@ Custom error validation: "unexpected error" ); -## assert.doesNotThrow(block, [message]) +## assert.doesNotThrow(block[, message]) Expects `block` not to throw an error, see `assert.throws` for details. diff --git a/doc/api/buffer.markdown b/doc/api/buffer.markdown index b384b05f43d..49205339733 100644 --- a/doc/api/buffer.markdown +++ b/doc/api/buffer.markdown @@ -72,7 +72,7 @@ will be thrown here. Allocates a new buffer using an `array` of octets. -### new Buffer(str, [encoding]) +### new Buffer(str[, encoding]) * `str` String - string to encode. * `encoding` String - encoding to use, Optional. @@ -94,7 +94,7 @@ otherwise. Tests if `obj` is a `Buffer`. -### Class Method: Buffer.byteLength(string, [encoding]) +### Class Method: Buffer.byteLength(string[, encoding]) * `string` String * `encoding` String, Optional, Default: 'utf8' @@ -113,7 +113,7 @@ Example: // ½ + ¼ = ¾: 9 characters, 12 bytes -### Class Method: Buffer.concat(list, [totalLength]) +### Class Method: Buffer.concat(list[, totalLength]) * `list` {Array} List of Buffer objects to concat * `totalLength` {Number} Total length of the buffers when concatenated @@ -162,7 +162,7 @@ buffer object. It does not change when the contents of the buffer are changed. // 1234 // 1234 -### buf.write(string, [offset], [length], [encoding]) +### buf.write(string[, offset]\[, length]\[, encoding]) * `string` String - data to be written to buffer * `offset` Number, Optional, Default: 0 @@ -181,7 +181,7 @@ The method will not write partial characters. console.log(len + " bytes: " + buf.toString('utf8', 0, len)); -### buf.toString([encoding], [start], [end]) +### buf.toString([encoding]\[, start]\[, end]) * `encoding` String, Optional, Default: 'utf8' * `start` Number, Optional, Default: 0 @@ -252,7 +252,7 @@ Returns a number indicating whether `this` comes before or after or is the same as the `otherBuffer` in sort order. -### buf.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd]) +### buf.copy(targetBuffer[, targetStart]\[, sourceStart]\[, sourceEnd]) * `targetBuffer` Buffer object - Buffer to copy into * `targetStart` Number, Optional, Default: 0 @@ -283,7 +283,7 @@ into `buf2`, starting at the 8th byte in `buf2`. // !!!!!!!!qrst!!!!!!!!!!!!! -### buf.slice([start], [end]) +### buf.slice([start]\[, end]) * `start` Number, Optional, Default: 0 * `end` Number, Optional, Default: `buffer.length` @@ -311,7 +311,7 @@ byte from the original Buffer. // abc // !bc -### buf.readUInt8(offset, [noAssert]) +### buf.readUInt8(offset[, noAssert]) * `offset` Number * `noAssert` Boolean, Optional, Default: false @@ -340,8 +340,8 @@ Example: // 0x23 // 0x42 -### buf.readUInt16LE(offset, [noAssert]) -### buf.readUInt16BE(offset, [noAssert]) +### buf.readUInt16LE(offset[, noAssert]) +### buf.readUInt16BE(offset[, noAssert]) * `offset` Number * `noAssert` Boolean, Optional, Default: false @@ -376,8 +376,8 @@ Example: // 0x2342 // 0x4223 -### buf.readUInt32LE(offset, [noAssert]) -### buf.readUInt32BE(offset, [noAssert]) +### buf.readUInt32LE(offset[, noAssert]) +### buf.readUInt32BE(offset[, noAssert]) * `offset` Number * `noAssert` Boolean, Optional, Default: false @@ -404,7 +404,7 @@ Example: // 0x03042342 // 0x42230403 -### buf.readInt8(offset, [noAssert]) +### buf.readInt8(offset[, noAssert]) * `offset` Number * `noAssert` Boolean, Optional, Default: false @@ -418,8 +418,8 @@ may be beyond the end of the buffer. Defaults to `false`. Works as `buffer.readUInt8`, except buffer contents are treated as two's complement signed values. -### buf.readInt16LE(offset, [noAssert]) -### buf.readInt16BE(offset, [noAssert]) +### buf.readInt16LE(offset[, noAssert]) +### buf.readInt16BE(offset[, noAssert]) * `offset` Number * `noAssert` Boolean, Optional, Default: false @@ -434,8 +434,8 @@ may be beyond the end of the buffer. Defaults to `false`. Works as `buffer.readUInt16*`, except buffer contents are treated as two's complement signed values. -### buf.readInt32LE(offset, [noAssert]) -### buf.readInt32BE(offset, [noAssert]) +### buf.readInt32LE(offset[, noAssert]) +### buf.readInt32BE(offset[, noAssert]) * `offset` Number * `noAssert` Boolean, Optional, Default: false @@ -450,8 +450,8 @@ may be beyond the end of the buffer. Defaults to `false`. Works as `buffer.readUInt32*`, except buffer contents are treated as two's complement signed values. -### buf.readFloatLE(offset, [noAssert]) -### buf.readFloatBE(offset, [noAssert]) +### buf.readFloatLE(offset[, noAssert]) +### buf.readFloatBE(offset[, noAssert]) * `offset` Number * `noAssert` Boolean, Optional, Default: false @@ -476,8 +476,8 @@ Example: // 0x01 -### buf.readDoubleLE(offset, [noAssert]) -### buf.readDoubleBE(offset, [noAssert]) +### buf.readDoubleLE(offset[, noAssert]) +### buf.readDoubleBE(offset[, noAssert]) * `offset` Number * `noAssert` Boolean, Optional, Default: false @@ -506,7 +506,7 @@ Example: // 0.3333333333333333 -### buf.writeUInt8(value, offset, [noAssert]) +### buf.writeUInt8(value, offset[, noAssert]) * `value` Number * `offset` Number @@ -532,8 +532,8 @@ Example: // -### buf.writeUInt16LE(value, offset, [noAssert]) -### buf.writeUInt16BE(value, offset, [noAssert]) +### buf.writeUInt16LE(value, offset[, noAssert]) +### buf.writeUInt16BE(value, offset[, noAssert]) * `value` Number * `offset` Number @@ -563,8 +563,8 @@ Example: // // -### buf.writeUInt32LE(value, offset, [noAssert]) -### buf.writeUInt32BE(value, offset, [noAssert]) +### buf.writeUInt32LE(value, offset[, noAssert]) +### buf.writeUInt32BE(value, offset[, noAssert]) * `value` Number * `offset` Number @@ -592,7 +592,7 @@ Example: // // -### buf.writeInt8(value, offset, [noAssert]) +### buf.writeInt8(value, offset[, noAssert]) * `value` Number * `offset` Number @@ -609,8 +609,8 @@ should not be used unless you are certain of correctness. Defaults to `false`. Works as `buffer.writeUInt8`, except value is written out as a two's complement signed integer into `buffer`. -### buf.writeInt16LE(value, offset, [noAssert]) -### buf.writeInt16BE(value, offset, [noAssert]) +### buf.writeInt16LE(value, offset[, noAssert]) +### buf.writeInt16BE(value, offset[, noAssert]) * `value` Number * `offset` Number @@ -627,8 +627,8 @@ should not be used unless you are certain of correctness. Defaults to `false`. Works as `buffer.writeUInt16*`, except value is written out as a two's complement signed integer into `buffer`. -### buf.writeInt32LE(value, offset, [noAssert]) -### buf.writeInt32BE(value, offset, [noAssert]) +### buf.writeInt32LE(value, offset[, noAssert]) +### buf.writeInt32BE(value, offset[, noAssert]) * `value` Number * `offset` Number @@ -645,8 +645,8 @@ should not be used unless you are certain of correctness. Defaults to `false`. Works as `buffer.writeUInt32*`, except value is written out as a two's complement signed integer into `buffer`. -### buf.writeFloatLE(value, offset, [noAssert]) -### buf.writeFloatBE(value, offset, [noAssert]) +### buf.writeFloatLE(value, offset[, noAssert]) +### buf.writeFloatBE(value, offset[, noAssert]) * `value` Number * `offset` Number @@ -674,8 +674,8 @@ Example: // // -### buf.writeDoubleLE(value, offset, [noAssert]) -### buf.writeDoubleBE(value, offset, [noAssert]) +### buf.writeDoubleLE(value, offset[, noAssert]) +### buf.writeDoubleBE(value, offset[, noAssert]) * `value` Number * `offset` Number @@ -703,7 +703,7 @@ Example: // // -### buf.fill(value, [offset], [end]) +### buf.fill(value[, offset]\[, end]) * `value` * `offset` Number, Optional diff --git a/doc/api/child_process.markdown b/doc/api/child_process.markdown index 5e6ecfb9c92..4cfad5588ca 100644 --- a/doc/api/child_process.markdown +++ b/doc/api/child_process.markdown @@ -167,7 +167,7 @@ to a process. See `kill(2)` -### child.send(message, [sendHandle]) +### child.send(message[, sendHandle]) * `message` {Object} * `sendHandle` {Handle object} @@ -303,7 +303,7 @@ child process has any open IPC channels with the parent (i.e `fork()`). These methods follow the common async programming patterns (accepting a callback or returning an EventEmitter). -### child_process.spawn(command, [args], [options]) +### child_process.spawn(command[, args]\[, options]) * `command` {String} The command to run * `args` {Array} List of string arguments @@ -473,7 +473,7 @@ inherited, the child will remain attached to the controlling terminal. See also: `child_process.exec()` and `child_process.fork()` -### child_process.exec(command, [options], callback) +### child_process.exec(command[, options], callback) * `command` {String} The command to run, with space-separated arguments * `options` {Object} @@ -531,7 +531,7 @@ amount of data allowed on stdout or stderr - if this value is exceeded then the child process is killed. -### child_process.execFile(file, [args], [options], [callback]) +### child_process.execFile(file[, args]\[, options]\[, callback]) * `file` {String} The filename of the program to run * `args` {Array} List of string arguments @@ -555,7 +555,7 @@ subshell but rather the specified file directly. This makes it slightly leaner than `child_process.exec`. It has the same options. -### child_process.fork(modulePath, [args], [options]) +### child_process.fork(modulePath[, args]\[, options]) * `modulePath` {String} The module to run in the child * `args` {Array} List of string arguments @@ -598,7 +598,7 @@ Blocking calls like these are mostly useful for simplifying general purpose scripting tasks and for simplifying the loading/processing of application configuration at startup. -### child_process.spawnSync(command, [args], [options]) +### child_process.spawnSync(command[, args]\[, options]) * `command` {String} The command to run * `args` {Array} List of string arguments @@ -629,7 +629,7 @@ until the process has completely exited. That is to say, if the process handles the `SIGTERM` signal and doesn't exit, your process will wait until the child process has exited. -### child_process.execFileSync(command, [args], [options]) +### child_process.execFileSync(command[, args]\[, options]) * `command` {String} The command to run * `args` {Array} List of string arguments @@ -660,7 +660,7 @@ throw. The `Error` object will contain the entire result from [`child_process.spawnSync`](#child_process_child_process_spawnsync_command_args_options) -### child_process.execSync(command, [options]) +### child_process.execSync(command[, options]) * `command` {String} The command to run * `options` {Object} diff --git a/doc/api/cluster.markdown b/doc/api/cluster.markdown index 8228e34c1ee..f65e11c3592 100644 --- a/doc/api/cluster.markdown +++ b/doc/api/cluster.markdown @@ -415,7 +415,7 @@ exit, the master may choose not to respawn a worker based on this value. // kill worker worker.kill(); -### worker.send(message, [sendHandle]) +### worker.send(message[, sendHandle]) * `message` {Object} * `sendHandle` {Handle object} diff --git a/doc/api/console.markdown b/doc/api/console.markdown index 1517304d2e3..82860c16c75 100644 --- a/doc/api/console.markdown +++ b/doc/api/console.markdown @@ -22,7 +22,7 @@ In daily use, the blocking/non-blocking dichotomy is not something you should worry about unless you log huge amounts of data. -## console.log([data], [...]) +## console.log([data]\[, ...]) Prints to stdout with newline. This function can take multiple arguments in a `printf()`-like way. Example: @@ -34,19 +34,19 @@ Prints to stdout with newline. This function can take multiple arguments in a If formatting elements are not found in the first string then `util.inspect` is used on each argument. See [util.format()][] for more information. -## console.info([data], [...]) +## console.info([data]\[, ...]) Same as `console.log`. -## console.error([data], [...]) +## console.error([data]\[, ...]) Same as `console.log` but prints to stderr. -## console.warn([data], [...]) +## console.warn([data]\[, ...]) Same as `console.error`. -## console.dir(obj, [options]) +## console.dir(obj[, options]) Uses `util.inspect` on `obj` and prints resulting string to stdout. This function bypasses any custom `inspect()` function on `obj`. An optional *options* object @@ -77,12 +77,12 @@ Finish timer, record output. Example: console.timeEnd('100-elements'); // prints 100-elements: 262ms -## console.trace(message, [...]) +## console.trace(message[, ...]) Print to stderr `'Trace :'`, followed by the formatted message and stack trace to the current position. -## console.assert(value, [message], [...]) +## console.assert(value[, message]\[, ...]) Similar to [assert.ok()][], but the error message is formatted as `util.format(message...)`. diff --git a/doc/api/crypto.markdown b/doc/api/crypto.markdown index a414d9b9221..0359d9ab2ab 100644 --- a/doc/api/crypto.markdown +++ b/doc/api/crypto.markdown @@ -12,7 +12,7 @@ It also offers a set of wrappers for OpenSSL's hash, hmac, cipher, decipher, sign and verify methods. -## crypto.setEngine(engine, [flags]) +## crypto.setEngine(engine[, flags]) Load and set engine for some/all OpenSSL functions (selected by flags). @@ -122,7 +122,7 @@ digest. The legacy `update` and `digest` methods are also supported. Returned by `crypto.createHash`. -### hash.update(data, [input_encoding]) +### hash.update(data[, input_encoding]) Updates the hash content with the given `data`, the encoding of which is given in `input_encoding` and can be `'utf8'`, `'ascii'` or @@ -214,7 +214,7 @@ writable. The written plain text data is used to produce the encrypted data on the readable side. The legacy `update` and `final` methods are also supported. -### cipher.update(data, [input_encoding], [output_encoding]) +### cipher.update(data[, input_encoding]\[, output_encoding]) Updates the cipher with `data`, the encoding of which is given in `input_encoding` and can be `'utf8'`, `'ascii'` or `'binary'`. If no @@ -280,7 +280,7 @@ writable. The written enciphered data is used to produce the plain-text data on the the readable side. The legacy `update` and `final` methods are also supported. -### decipher.update(data, [input_encoding], [output_encoding]) +### decipher.update(data[, input_encoding]\[, output_encoding]) Updates the decipher with `data`, which is encoded in `'binary'`, `'base64'` or `'hex'`. If no encoding is provided, then a buffer is @@ -345,7 +345,7 @@ written, the `sign` method will return the signature. The legacy Updates the sign object with data. This can be called many times with new data as it is streamed. -### sign.sign(private_key, [output_format]) +### sign.sign(private_key[, output_format]) Calculates the signature on all the updated data passed through the sign. @@ -387,7 +387,7 @@ supported. Updates the verifier object with data. This can be called many times with new data as it is streamed. -### verifier.verify(object, signature, [signature_format]) +### verifier.verify(object, signature[, signature_format]) Verifies the signed data by using the `object` and `signature`. `object` is a string containing a PEM encoded object, which can be @@ -402,13 +402,13 @@ the data and public key. Note: `verifier` object can not be used after `verify()` method has been called. -## crypto.createDiffieHellman(prime_length, [generator]) +## crypto.createDiffieHellman(prime_length[, generator]) Creates a Diffie-Hellman key exchange object and generates a prime of `prime_length` bits and using an optional specific numeric `generator`. If no `generator` is specified, then `2` is used. -## crypto.createDiffieHellman(prime, [prime_encoding], [generator], [generator_encoding]) +## crypto.createDiffieHellman(prime[, prime_encoding]\[, generator]\[, generator_encoding]) Creates a Diffie-Hellman key exchange object using the supplied `prime` and an optional specific `generator`. @@ -442,7 +442,7 @@ the public key in the specified encoding. This key should be transferred to the other party. Encoding can be `'binary'`, `'hex'`, or `'base64'`. If no encoding is provided, then a buffer is returned. -### diffieHellman.computeSecret(other_public_key, [input_encoding], [output_encoding]) +### diffieHellman.computeSecret(other_public_key[, input_encoding]\[, output_encoding]) Computes the shared secret using `other_public_key` as the other party's public key and returns the computed shared secret. Supplied @@ -477,13 +477,13 @@ Returns the Diffie-Hellman private key in the specified encoding, which can be `'binary'`, `'hex'`, or `'base64'`. If no encoding is provided, then a buffer is returned. -### diffieHellman.setPublicKey(public_key, [encoding]) +### diffieHellman.setPublicKey(public_key[, encoding]) Sets the Diffie-Hellman public key. Key encoding can be `'binary'`, `'hex'` or `'base64'`. If no encoding is provided, then a buffer is expected. -### diffieHellman.setPrivateKey(private_key, [encoding]) +### diffieHellman.setPrivateKey(private_key[, encoding]) Sets the Diffie-Hellman private key. Key encoding can be `'binary'`, `'hex'` or `'base64'`. If no encoding is provided, then a buffer is @@ -541,7 +541,7 @@ Format specifies point encoding and can be `'compressed'`, `'uncompressed'`, or Encoding can be `'binary'`, `'hex'`, or `'base64'`. If no encoding is provided, then a buffer is returned. -### ECDH.computeSecret(other_public_key, [input_encoding], [output_encoding]) +### ECDH.computeSecret(other_public_key[, input_encoding]\[, output_encoding]) Computes the shared secret using `other_public_key` as the other party's public key and returns the computed shared secret. Supplied @@ -569,13 +569,13 @@ Returns the EC Diffie-Hellman private key in the specified encoding, which can be `'binary'`, `'hex'`, or `'base64'`. If no encoding is provided, then a buffer is returned. -### ECDH.setPublicKey(public_key, [encoding]) +### ECDH.setPublicKey(public_key[, encoding]) Sets the EC Diffie-Hellman public key. Key encoding can be `'binary'`, `'hex'` or `'base64'`. If no encoding is provided, then a buffer is expected. -### ECDH.setPrivateKey(private_key, [encoding]) +### ECDH.setPrivateKey(private_key[, encoding]) Sets the EC Diffie-Hellman private key. Key encoding can be `'binary'`, `'hex'` or `'base64'`. If no encoding is provided, then a buffer is @@ -596,7 +596,7 @@ Example (obtaining a shared secret): /* alice_secret and bob_secret should be the same */ console.log(alice_secret == bob_secret); -## crypto.pbkdf2(password, salt, iterations, keylen, [digest], callback) +## crypto.pbkdf2(password, salt, iterations, keylen[, digest], callback) Asynchronous PBKDF2 function. Applies the selected HMAC digest function (default: SHA1) to derive a key of the requested length from the password, @@ -614,11 +614,11 @@ Example: You can get a list of supported digest functions with [crypto.getHashes()](#crypto_crypto_gethashes). -## crypto.pbkdf2Sync(password, salt, iterations, keylen, [digest]) +## crypto.pbkdf2Sync(password, salt, iterations, keylen[, digest]) Synchronous PBKDF2 function. Returns derivedKey or throws error. -## crypto.randomBytes(size, [callback]) +## crypto.randomBytes(size[, callback]) Generates cryptographically strong pseudo-random data. Usage: @@ -642,7 +642,7 @@ accumulated entropy to generate cryptographically strong data. In other words, `crypto.randomBytes` without callback will not block even if all entropy sources are drained. -## crypto.pseudoRandomBytes(size, [callback]) +## crypto.pseudoRandomBytes(size[, callback]) Generates *non*-cryptographically strong pseudo-random data. The data returned will be unique if it is sufficiently long, but is not diff --git a/doc/api/dgram.markdown b/doc/api/dgram.markdown index 891c0c70300..33541e47373 100644 --- a/doc/api/dgram.markdown +++ b/doc/api/dgram.markdown @@ -21,8 +21,8 @@ You have to change it to this: }); -## dgram.createSocket(type, [callback]) -## dgram.createSocket(options, [callback]) +## dgram.createSocket(type[, callback]) +## dgram.createSocket(options[, callback]) * `type` String. Either 'udp4' or 'udp6' * `options` Object. Should contain a `type` property and could contain @@ -77,7 +77,7 @@ on this socket. Emitted when an error occurs. -### socket.send(buf, offset, length, port, address, [callback]) +### socket.send(buf, offset, length, port, address[, callback]) * `buf` Buffer object or string. Message to be sent * `offset` Integer. Offset in the buffer where the message starts. @@ -142,7 +142,7 @@ a packet might travel, and that generally sending a datagram greater than the (receiver) `MTU` won't work (the packet gets silently dropped, without informing the source that the data did not reach its intended recipient). -### socket.bind(port, [address], [callback]) +### socket.bind(port[, address]\[, callback]) * `port` Integer * `address` String, Optional @@ -188,7 +188,7 @@ Example of a UDP server listening on port 41234: // server listening 0.0.0.0:41234 -### socket.bind(options, [callback]) +### socket.bind(options[, callback]) * `options` {Object} - Required. Supports the following properties: * `port` {Number} - Required. @@ -262,7 +262,7 @@ systems is 1. Sets or clears the `IP_MULTICAST_LOOP` socket option. When this option is set, multicast packets will also be received on the local interface. -### socket.addMembership(multicastAddress, [multicastInterface]) +### socket.addMembership(multicastAddress[, multicastInterface]) * `multicastAddress` String * `multicastInterface` String, Optional @@ -272,7 +272,7 @@ Tells the kernel to join a multicast group with `IP_ADD_MEMBERSHIP` socket optio If `multicastInterface` is not specified, the OS will try to add membership to all valid interfaces. -### socket.dropMembership(multicastAddress, [multicastInterface]) +### socket.dropMembership(multicastAddress[, multicastInterface]) * `multicastAddress` String * `multicastInterface` String, Optional diff --git a/doc/api/dns.markdown b/doc/api/dns.markdown index 5b8477fcb48..d080d666186 100644 --- a/doc/api/dns.markdown +++ b/doc/api/dns.markdown @@ -31,7 +31,7 @@ resolves the IP addresses which are returned. }); }); -## dns.lookup(hostname, [options], callback) +## dns.lookup(hostname[, options], callback) Resolves a hostname (e.g. `'google.com'`) into the first found A (IPv4) or AAAA (IPv6) record. `options` can be an object or integer. If `options` is @@ -79,7 +79,7 @@ The callback has arguments `(err, hostname, service)`. The `hostname` and On error, `err` is an `Error` object, where `err.code` is the error code. -## dns.resolve(hostname, [rrtype], callback) +## dns.resolve(hostname[, rrtype], callback) Resolves a hostname (e.g. `'google.com'`) into an array of the record types specified by rrtype. diff --git a/doc/api/events.markdown b/doc/api/events.markdown index 1625f748a17..82e736da5dd 100644 --- a/doc/api/events.markdown +++ b/doc/api/events.markdown @@ -104,7 +104,7 @@ Returns an array of listeners for the specified event. console.log(util.inspect(server.listeners('connection'))); // [ [Function] ] -### emitter.emit(event, [arg1], [arg2], [...]) +### emitter.emit(event[, arg1]\[, arg2]\[, ...]) Execute each of the listeners in order with the supplied arguments. diff --git a/doc/api/fs.markdown b/doc/api/fs.markdown index dca35674cd3..af3a3422e9c 100644 --- a/doc/api/fs.markdown +++ b/doc/api/fs.markdown @@ -208,7 +208,7 @@ the completion callback. Synchronous link(2). -## fs.symlink(srcpath, dstpath, [type], callback) +## fs.symlink(srcpath, dstpath[, type], callback) Asynchronous symlink(2). No arguments other than a possible exception are given to the completion callback. @@ -217,7 +217,7 @@ is `'file'`) and is only available on Windows (ignored on other platforms). Note that Windows junction points require the destination path to be absolute. When using `'junction'`, the `destination` argument will automatically be normalized to absolute path. -## fs.symlinkSync(srcpath, dstpath, [type]) +## fs.symlinkSync(srcpath, dstpath[, type]) Synchronous symlink(2). @@ -230,7 +230,7 @@ linkString)`. Synchronous readlink(2). Returns the symbolic link's string value. -## fs.realpath(path, [cache], callback) +## fs.realpath(path[, cache], callback) Asynchronous realpath(2). The `callback` gets two arguments `(err, resolvedPath)`. May use `process.cwd` to resolve relative paths. `cache` is an @@ -245,7 +245,7 @@ Example: console.log(resolvedPath); }); -## fs.realpathSync(path, [cache]) +## fs.realpathSync(path[, cache]) Synchronous realpath(2). Returns the resolved path. @@ -267,12 +267,12 @@ to the completion callback. Synchronous rmdir(2). -## fs.mkdir(path, [mode], callback) +## fs.mkdir(path[, mode], callback) Asynchronous mkdir(2). No arguments other than a possible exception are given to the completion callback. `mode` defaults to `0777`. -## fs.mkdirSync(path, [mode]) +## fs.mkdirSync(path[, mode]) Synchronous mkdir(2). @@ -296,7 +296,7 @@ to the completion callback. Synchronous close(2). -## fs.open(path, flags, [mode], callback) +## fs.open(path, flags[, mode], callback) Asynchronous file open. See open(2). `flags` can be: @@ -353,7 +353,7 @@ On Linux, positional writes don't work when the file is opened in append mode. The kernel ignores the position argument and always appends the data to the end of the file. -## fs.openSync(path, flags, [mode]) +## fs.openSync(path, flags[, mode]) Synchronous version of `fs.open()`. @@ -451,7 +451,7 @@ The callback is given the three arguments, `(err, bytesRead, buffer)`. Synchronous version of `fs.read`. Returns the number of `bytesRead`. -## fs.readFile(filename, [options], callback) +## fs.readFile(filename[, options], callback) * `filename` {String} * `options` {Object} @@ -472,7 +472,7 @@ contents of the file. If no encoding is specified, then the raw buffer is returned. -## fs.readFileSync(filename, [options]) +## fs.readFileSync(filename[, options]) Synchronous version of `fs.readFile`. Returns the contents of the `filename`. @@ -480,7 +480,7 @@ If the `encoding` option is specified then this function returns a string. Otherwise it returns a buffer. -## fs.writeFile(filename, data, [options], callback) +## fs.writeFile(filename, data[, options], callback) * `filename` {String} * `data` {String | Buffer} @@ -503,11 +503,11 @@ Example: console.log('It\'s saved!'); }); -## fs.writeFileSync(filename, data, [options]) +## fs.writeFileSync(filename, data[, options]) The synchronous version of `fs.writeFile`. -## fs.appendFile(filename, data, [options], callback) +## fs.appendFile(filename, data[, options], callback) * `filename` {String} * `data` {String | Buffer} @@ -527,11 +527,11 @@ Example: console.log('The "data to append" was appended to file!'); }); -## fs.appendFileSync(filename, data, [options]) +## fs.appendFileSync(filename, data[, options]) The synchronous version of `fs.appendFile`. -## fs.watchFile(filename, [options], listener) +## fs.watchFile(filename[, options], listener) Stability: 2 - Unstable. Use fs.watch instead, if possible. @@ -557,7 +557,7 @@ These stat objects are instances of `fs.Stat`. If you want to be notified when the file was modified, not just accessed you need to compare `curr.mtime` and `prev.mtime`. -## fs.unwatchFile(filename, [listener]) +## fs.unwatchFile(filename[, listener]) Stability: 2 - Unstable. Use fs.watch instead, if possible. @@ -568,7 +568,7 @@ have effectively stopped watching `filename`. Calling `fs.unwatchFile()` with a filename that is not being watched is a no-op, not an error. -## fs.watch(filename, [options], [listener]) +## fs.watch(filename[, options]\[, listener]) Stability: 2 - Unstable. @@ -728,7 +728,7 @@ Prior to Node v0.12, the `ctime` held the `birthtime` on Windows systems. Note that as of v0.12, `ctime` is not "creation time", and on Unix systems, it never was. -## fs.createReadStream(path, [options]) +## fs.createReadStream(path[, options]) Returns a new ReadStream object (See `Readable Stream`). @@ -767,7 +767,7 @@ An example to read the last 10 bytes of a file which is 100 bytes long: Emitted when the ReadStream's file is opened. -## fs.createWriteStream(path, [options]) +## fs.createWriteStream(path[, options]) Returns a new WriteStream object (See `Writable Stream`). diff --git a/doc/api/http.markdown b/doc/api/http.markdown index b0499707c1e..e94f631ad6c 100644 --- a/doc/api/http.markdown +++ b/doc/api/http.markdown @@ -64,7 +64,7 @@ Returns a new web server object. The `requestListener` is a function which is automatically added to the `'request'` event. -## http.createClient([port], [host]) +## http.createClient([port]\[, host]) This function is **deprecated**; please use [http.request()][] instead. Constructs a new HTTP client. `port` and `host` refer to the server to be @@ -160,7 +160,7 @@ If a client connection emits an 'error' event - it will forwarded here. `socket` is the `net.Socket` object that the error originated from. -### server.listen(port, [hostname], [backlog], [callback]) +### server.listen(port[, hostname]\[, backlog]\[, callback]) Begin accepting connections on the specified port and hostname. If the hostname is omitted, the server will accept connections directed to any @@ -177,7 +177,7 @@ This function is asynchronous. The last parameter `callback` will be added as a listener for the ['listening'][] event. See also [net.Server.listen(port)][]. -### server.listen(path, [callback]) +### server.listen(path[, callback]) Start a UNIX socket server listening for connections on the given `path`. @@ -185,7 +185,7 @@ This function is asynchronous. The last parameter `callback` will be added as a listener for the ['listening'][] event. See also [net.Server.listen(path)][]. -### server.listen(handle, [callback]) +### server.listen(handle[, callback]) * `handle` {Object} * `callback` {Function} @@ -275,7 +275,7 @@ After this event, no more events will be emitted on the response object. Sends a HTTP/1.1 100 Continue message to the client, indicating that the request body should be sent. See the ['checkContinue'][] event on `Server`. -### response.writeHead(statusCode, [statusMessage], [headers]) +### response.writeHead(statusCode[, statusMessage]\[, headers]) Sends a response header to the request. The status code is a 3-digit HTTP status code, like `404`. The last argument, `headers`, are the response headers. @@ -389,7 +389,7 @@ Example: response.removeHeader("Content-Encoding"); -### response.write(chunk, [encoding]) +### response.write(chunk[, encoding]) If this method is called and [response.writeHead()][] has not been called, it will switch to implicit header mode and flush the implicit headers. @@ -433,7 +433,7 @@ emit trailers, with a list of the header fields in its value. E.g., response.end(); -### response.end([data], [encoding]) +### response.end([data]\[, encoding]) This method signals to the server that all of the response headers and body have been sent; that server should consider this message complete. @@ -444,7 +444,7 @@ If `data` is specified, it is equivalent to calling `response.write(data, encodi followed by `response.end()`. -## http.request(options, [callback]) +## http.request(options[, callback]) Node maintains several connections per server to make HTTP requests. This function allows one to transparently issue requests. @@ -544,7 +544,7 @@ There are a few special headers that should be noted. * Sending an Authorization header will override using the `auth` option to compute basic authentication. -## http.get(options, [callback]) +## http.get(options[, callback]) Since most requests are GET requests without bodies, Node provides this convenience method. The only difference between this method and `http.request()` @@ -864,7 +864,7 @@ That's usually what you want (it saves a TCP round-trip) but not when the first data isn't sent until possibly much later. `request.flush()` lets you bypass the optimization and kickstart the request. -### request.write(chunk, [encoding]) +### request.write(chunk[, encoding]) Sends a chunk of the body. By calling this method many times, the user can stream a request body to a @@ -878,7 +878,7 @@ The `encoding` argument is optional and only applies when `chunk` is a string. Defaults to `'utf8'`. -### request.end([data], [encoding]) +### request.end([data]\[, encoding]) Finishes sending the request. If any parts of the body are unsent, it will flush them to the stream. If the request is @@ -891,7 +891,7 @@ If `data` is specified, it is equivalent to calling Aborts a request. (New since v0.3.8.) -### request.setTimeout(timeout, [callback]) +### request.setTimeout(timeout[, callback]) Once a socket is assigned to this request and is connected [socket.setTimeout()][] will be called. @@ -901,7 +901,7 @@ Once a socket is assigned to this request and is connected Once a socket is assigned to this request and is connected [socket.setNoDelay()][] will be called. -### request.setSocketKeepAlive([enable], [initialDelay]) +### request.setSocketKeepAlive([enable]\[, initialDelay]) Once a socket is assigned to this request and is connected [socket.setKeepAlive()][] will be called. diff --git a/doc/api/https.markdown b/doc/api/https.markdown index 9371db0a88d..e95097ca510 100644 --- a/doc/api/https.markdown +++ b/doc/api/https.markdown @@ -18,7 +18,7 @@ See [http.Server#setTimeout()][]. See [http.Server#timeout][]. -## https.createServer(options, [requestListener]) +## https.createServer(options[, requestListener]) Returns a new HTTPS web server object. The `options` is similar to [tls.createServer()][]. The `requestListener` is a function which is @@ -55,9 +55,9 @@ Or }).listen(8000); -### server.listen(port, [host], [backlog], [callback]) -### server.listen(path, [callback]) -### server.listen(handle, [callback]) +### server.listen(port[, host]\[, backlog]\[, callback]) +### server.listen(path[, callback]) +### server.listen(handle[, callback]) See [http.listen()][] for details. diff --git a/doc/api/net.markdown b/doc/api/net.markdown index eb4988a7069..36864f26992 100644 --- a/doc/api/net.markdown +++ b/doc/api/net.markdown @@ -6,7 +6,7 @@ The `net` module provides you with an asynchronous network wrapper. It contains methods for creating both servers and clients (called streams). You can include this module with `require('net');` -## net.createServer([options], [connectionListener]) +## net.createServer([options]\[, connectionListener]) Creates a new TCP server. The `connectionListener` argument is automatically set as a listener for the ['connection'][] event. @@ -50,8 +50,8 @@ Use `nc` to connect to a UNIX domain socket server: nc -U /tmp/echo.sock -## net.connect(options, [connectionListener]) -## net.createConnection(options, [connectionListener]) +## net.connect(options[, connectionListener]) +## net.createConnection(options[, connectionListener]) A factory method, which returns a new ['net.Socket'](#net_class_net_socket) and connects to the supplied address and port. @@ -107,8 +107,8 @@ changed to var client = net.connect({path: '/tmp/echo.sock'}); -## net.connect(port, [host], [connectListener]) -## net.createConnection(port, [host], [connectListener]) +## net.connect(port[, host]\[, connectListener]) +## net.createConnection(port[, host]\[, connectListener]) Creates a TCP connection to `port` on `host`. If `host` is omitted, `'localhost'` will be assumed. @@ -117,8 +117,8 @@ The `connectListener` parameter will be added as an listener for the Is a factory method which returns a new ['net.Socket'](#net_class_net_socket). -## net.connect(path, [connectListener]) -## net.createConnection(path, [connectListener]) +## net.connect(path[, connectListener]) +## net.createConnection(path[, connectListener]) Creates unix socket connection to `path`. The `connectListener` parameter will be added as an listener for the @@ -130,7 +130,7 @@ A factory method which returns a new ['net.Socket'](#net_class_net_socket). This class is used to create a TCP or local server. -### server.listen(port, [host], [backlog], [callback]) +### server.listen(port[, host]\[, backlog]\[, callback]) Begin accepting connections on the specified `port` and `host`. If the `host` is omitted, the server will accept connections directed to any @@ -162,7 +162,7 @@ would be to wait a second and then try again. This can be done with (Note: All sockets in Node set `SO_REUSEADDR` already) -### server.listen(path, [callback]) +### server.listen(path[, callback]) * `path` {String} * `callback` {Function} @@ -189,7 +189,7 @@ double-backslashes, such as: net.createServer().listen( path.join('\\\\?\\pipe', process.cwd(), 'myctl')) -### server.listen(handle, [callback]) +### server.listen(handle[, callback]) * `handle` {Object} * `callback` {Function} @@ -208,7 +208,7 @@ This function is asynchronous. When the server has been bound, the last parameter `callback` will be added as an listener for the ['listening'][] event. -### server.listen(options, [callback]) +### server.listen(options[, callback]) * `options` {Object} - Required. Supports the following properties: * `port` {Number} - Optional. @@ -352,8 +352,8 @@ Set `readable` and/or `writable` to `true` to allow reads and/or writes on this socket (NOTE: Works only when `fd` is passed). About `allowHalfOpen`, refer to `createServer()` and `'end'` event. -### socket.connect(port, [host], [connectListener]) -### socket.connect(path, [connectListener]) +### socket.connect(port[, host]\[, connectListener]) +### socket.connect(path[, connectListener]) Opens the connection for a given socket. If `port` and `host` are given, then the socket will be opened as a TCP socket, if `host` is omitted, @@ -395,7 +395,7 @@ Users who experience large or growing `bufferSize` should attempt to Set the encoding for the socket as a Readable Stream. See [stream.setEncoding()][] for more information. -### socket.write(data, [encoding], [callback]) +### socket.write(data[, encoding]\[, callback]) Sends data on the socket. The second parameter specifies the encoding in the case of a string--it defaults to UTF8 encoding. @@ -407,7 +407,7 @@ buffer. Returns `false` if all or part of the data was queued in user memory. The optional `callback` parameter will be executed when the data is finally written out - this may not be immediately. -### socket.end([data], [encoding]) +### socket.end([data]\[, encoding]) Half-closes the socket. i.e., it sends a FIN packet. It is possible the server will still send some data. @@ -429,7 +429,7 @@ Useful to throttle back an upload. Resumes reading after a call to `pause()`. -### socket.setTimeout(timeout, [callback]) +### socket.setTimeout(timeout[, callback]) Sets the socket to timeout after `timeout` milliseconds of inactivity on the socket. By default `net.Socket` do not have a timeout. @@ -450,7 +450,7 @@ algorithm, they buffer data before sending it off. Setting `true` for `noDelay` will immediately fire off data each time `socket.write()` is called. `noDelay` defaults to `true`. -### socket.setKeepAlive([enable], [initialDelay]) +### socket.setKeepAlive([enable]\[, initialDelay]) Enable/disable keep-alive functionality, and optionally set the initial delay before the first keepalive probe is sent on an idle socket. diff --git a/doc/api/path.markdown b/doc/api/path.markdown index 9446a4043aa..b9fb242c970 100644 --- a/doc/api/path.markdown +++ b/doc/api/path.markdown @@ -22,7 +22,7 @@ Example: // returns '/foo/bar/baz/asdf' -## path.join([path1], [path2], [...]) +## path.join([path1]\[, path2]\[, ...]) Join all arguments together and normalize the resulting path. @@ -127,7 +127,7 @@ Example: // returns '/foo/bar/baz/asdf' -## path.basename(p, [ext]) +## path.basename(p[, ext]) Return the last portion of a path. Similar to the Unix `basename` command. diff --git a/doc/api/process.markdown b/doc/api/process.markdown index 66e95129c61..68bb2a66539 100644 --- a/doc/api/process.markdown +++ b/doc/api/process.markdown @@ -539,7 +539,7 @@ An example of the possible output looks like: target_arch: 'x64', v8_use_snapshot: 'true' } } -## process.kill(pid, [signal]) +## process.kill(pid[, signal]) Send a signal to a process. `pid` is the process id and `signal` is the string describing the signal to send. Signal names are strings like diff --git a/doc/api/querystring.markdown b/doc/api/querystring.markdown index 67f7e451f7c..884b287220f 100644 --- a/doc/api/querystring.markdown +++ b/doc/api/querystring.markdown @@ -7,7 +7,7 @@ This module provides utilities for dealing with query strings. It provides the following methods: -## querystring.stringify(obj, [sep], [eq], [options]) +## querystring.stringify(obj[, sep]\[, eq]\[, options]) Serialize an object to a query string. Optionally override the default separator (`'&'`) and assignment (`'='`) @@ -33,7 +33,7 @@ Example: // returns 'w=%D6%D0%CE%C4&foo=bar' -## querystring.parse(str, [sep], [eq], [options]) +## querystring.parse(str[, sep]\[, eq]\[, options]) Deserialize a query string to an object. Optionally override the default separator (`'&'`) and assignment (`'='`) diff --git a/doc/api/readline.markdown b/doc/api/readline.markdown index 43655bc89ef..16bbd3c0cdf 100644 --- a/doc/api/readline.markdown +++ b/doc/api/readline.markdown @@ -128,7 +128,7 @@ Resumes the readline `input` stream. Closes the `Interface` instance, relinquishing control on the `input` and `output` streams. The "close" event will also be emitted. -### rl.write(data, [key]) +### rl.write(data[, key]) Writes `data` to `output` stream. `key` is an object literal to represent a key sequence; available if the terminal is a TTY. diff --git a/doc/api/stream.markdown b/doc/api/stream.markdown index bdd709f7e27..e79c2a2aace 100644 --- a/doc/api/stream.markdown +++ b/doc/api/stream.markdown @@ -328,7 +328,7 @@ readable.resume() readable.isPaused() // === false ``` -#### readable.pipe(destination, [options]) +#### readable.pipe(destination[, options]) * `destination` {[Writable][] Stream} The destination for writing data * `options` {Object} Pipe options @@ -501,7 +501,7 @@ Examples of writable streams include: * [child process stdin](child_process.html#child_process_child_stdin) * [process.stdout][], [process.stderr][] -#### writable.write(chunk, [encoding], [callback]) +#### writable.write(chunk[, encoding]\[, callback]) * `chunk` {String | Buffer} The data to write * `encoding` {String} The encoding, if `chunk` is a String @@ -564,7 +564,7 @@ Buffered data will be flushed either at `.uncork()` or at `.end()` call. Flush all data, buffered since `.cork()` call. -#### writable.end([chunk], [encoding], [callback]) +#### writable.end([chunk]\[, encoding]\[, callback]) * `chunk` {String | Buffer} Optional data to write * `encoding` {String} The encoding, if `chunk` is a String @@ -943,7 +943,7 @@ TLS, may ignore this argument, and simply provide data whenever it becomes available. There is no need, for example to "wait" until `size` bytes are available before calling [`stream.push(chunk)`][]. -#### readable.push(chunk, [encoding]) +#### readable.push(chunk[, encoding]) * `chunk` {Buffer | null | String} Chunk of data to push into the read queue * `encoding` {String} Encoding of String chunks. Must be a valid diff --git a/doc/api/timers.markdown b/doc/api/timers.markdown index 7ba209e5ee9..0c484c2c695 100644 --- a/doc/api/timers.markdown +++ b/doc/api/timers.markdown @@ -5,7 +5,7 @@ All of the timer functions are globals. You do not need to `require()` this module in order to use them. -## setTimeout(callback, delay, [arg], [...]) +## setTimeout(callback, delay[, arg]\[, ...]) To schedule execution of a one-time `callback` after `delay` milliseconds. Returns a `timeoutObject` for possible use with `clearTimeout()`. Optionally you can @@ -20,7 +20,7 @@ be called as close as possible to the time specified. Prevents a timeout from triggering. -## setInterval(callback, delay, [arg], [...]) +## setInterval(callback, delay[, arg]\[, ...]) To schedule the repeated execution of `callback` every `delay` milliseconds. Returns a `intervalObject` for possible use with `clearInterval()`. Optionally @@ -47,7 +47,7 @@ If you had previously `unref()`d a timer you can call `ref()` to explicitly request the timer hold the program open. If the timer is already `ref`d calling `ref` again will have no effect. -## setImmediate(callback, [arg], [...]) +## setImmediate(callback[, arg]\[, ...]) To schedule the "immediate" execution of `callback` after I/O events callbacks and before `setTimeout` and `setInterval` . Returns an diff --git a/doc/api/tls.markdown b/doc/api/tls.markdown index daa169c1083..945b99ebfa4 100644 --- a/doc/api/tls.markdown +++ b/doc/api/tls.markdown @@ -111,7 +111,7 @@ Example: console.log(ciphers); // ['AES128-SHA', 'AES256-SHA', ...] -## tls.createServer(options, [secureConnectionListener]) +## tls.createServer(options[, secureConnectionListener]) Creates a new [tls.Server][]. The `connectionListener` argument is automatically set as a listener for the [secureConnection][] event. The @@ -285,8 +285,8 @@ You can test this server by connecting to it with `openssl s_client`: openssl s_client -connect 127.0.0.1:8000 -## tls.connect(options, [callback]) -## tls.connect(port, [host], [options], [callback]) +## tls.connect(options[, callback]) +## tls.connect(port[, host]\[, options]\[, callback]) Creates a new client connection to the given `port` and `host` (old API) or `options.port` and `options.host`. (If `host` is omitted, it defaults to @@ -455,7 +455,7 @@ publicly trusted list of CAs as given in . -## tls.createSecurePair([context], [isServer], [requestCert], [rejectUnauthorized]) +## tls.createSecurePair([context]\[, isServer]\[, requestCert]\[, rejectUnauthorized]) Stability: 0 - Deprecated. Use tls.TLSSocket instead. @@ -594,7 +594,7 @@ NOTE: you may want to use some npm module like [asn1.js] to parse the certificates. -### server.listen(port, [host], [callback]) +### server.listen(port[, host]\[, callback]) Begin accepting connections on the specified `port` and `host`. If the `host` is omitted, the server will accept connections directed to any diff --git a/doc/api/url.markdown b/doc/api/url.markdown index 6aa6863ecdd..fc92bb7e8e8 100644 --- a/doc/api/url.markdown +++ b/doc/api/url.markdown @@ -65,7 +65,7 @@ string will not be in the parsed object. Examples are shown for the URL The following methods are provided by the URL module: -## url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) +## url.parse(urlStr[, parseQueryString]\[, slashesDenoteHost]) Take a URL string, and return an object. diff --git a/doc/api/util.markdown b/doc/api/util.markdown index dc6c0f64eed..cc639ddb494 100644 --- a/doc/api/util.markdown +++ b/doc/api/util.markdown @@ -43,7 +43,7 @@ environment variable set, then it will not print anything. You may separate multiple `NODE_DEBUG` environment variables with a comma. For example, `NODE_DEBUG=fs,net,tls`. -## util.format(format, [...]) +## util.format(format[, ...]) Returns a formatted string using the first argument as a `printf`-like format. @@ -81,7 +81,7 @@ Output with timestamp on `stdout`. require('util').log('Timestamped message.'); -## util.inspect(object, [options]) +## util.inspect(object[, options]) Return a string representation of `object`, which is useful for debugging. @@ -297,7 +297,7 @@ Deprecated predecessor of `console.log`. Deprecated predecessor of `console.log`. -## util.pump(readableStream, writableStream, [callback]) +## util.pump(readableStream, writableStream[, callback]) Stability: 0 - Deprecated: Use readableStream.pipe(writableStream) diff --git a/doc/api/vm.markdown b/doc/api/vm.markdown index c73a86da62c..31f0f249c32 100644 --- a/doc/api/vm.markdown +++ b/doc/api/vm.markdown @@ -11,7 +11,7 @@ You can access this module with: JavaScript code can be compiled and run immediately or compiled, saved, and run later. -## vm.runInThisContext(code, [options]) +## vm.runInThisContext(code[, options]) `vm.runInThisContext()` compiles `code`, runs it and returns the result. Running code does not have access to local scope, but does have access to the current @@ -76,7 +76,7 @@ Returns whether or not a sandbox object has been contextified by calling `vm.createContext` on it. -## vm.runInContext(code, contextifiedSandbox, [options]) +## vm.runInContext(code, contextifiedSandbox[, options]) `vm.runInContext` compiles `code`, then runs it in `contextifiedSandbox` and returns the result. Running code does not have access to local scope. The @@ -105,7 +105,7 @@ Note that running untrusted code is a tricky business requiring great care. separate process. -## vm.runInNewContext(code, [sandbox], [options]) +## vm.runInNewContext(code[, sandbox]\[, options]) `vm.runInNewContext` compiles `code`, contextifies `sandbox` if passed or creates a new contextified sandbox if it's omitted, and then runs the code with @@ -204,7 +204,7 @@ The options for running a script are: execution. If execution is terminated, an `Error` will be thrown. -### script.runInContext(contextifiedSandbox, [options]) +### script.runInContext(contextifiedSandbox[, options]) Similar to `vm.runInContext` but a method of a precompiled `Script` object. `script.runInContext` runs `script`'s compiled code in `contextifiedSandbox` @@ -238,7 +238,7 @@ Note that running untrusted code is a tricky business requiring great care. requires a separate process. -### script.runInNewContext([sandbox], [options]) +### script.runInNewContext([sandbox]\[, options]) Similar to `vm.runInNewContext` but a method of a precompiled `Script` object. `script.runInNewContext` contextifies `sandbox` if passed or creates a new diff --git a/doc/api/zlib.markdown b/doc/api/zlib.markdown index 68087ead666..3ccd2638e1e 100644 --- a/doc/api/zlib.markdown +++ b/doc/api/zlib.markdown @@ -201,38 +201,38 @@ callback with `callback(error, result)`. Every method has a `*Sync` counterpart, which accept the same arguments, but without a callback. -## zlib.deflate(buf, [options], callback) -## zlib.deflateSync(buf, [options]) +## zlib.deflate(buf[, options], callback) +## zlib.deflateSync(buf[, options]) Compress a string with Deflate. -## zlib.deflateRaw(buf, [options], callback) -## zlib.deflateRawSync(buf, [options]) +## zlib.deflateRaw(buf[, options], callback) +## zlib.deflateRawSync(buf[, options]) Compress a string with DeflateRaw. -## zlib.gzip(buf, [options], callback) -## zlib.gzipSync(buf, [options]) +## zlib.gzip(buf[, options], callback) +## zlib.gzipSync(buf[, options]) Compress a string with Gzip. -## zlib.gunzip(buf, [options], callback) -## zlib.gunzipSync(buf, [options]) +## zlib.gunzip(buf[, options], callback) +## zlib.gunzipSync(buf[, options]) Decompress a raw Buffer with Gunzip. -## zlib.inflate(buf, [options], callback) -## zlib.inflateSync(buf, [options]) +## zlib.inflate(buf[, options], callback) +## zlib.inflateSync(buf[, options]) Decompress a raw Buffer with Inflate. -## zlib.inflateRaw(buf, [options], callback) -## zlib.inflateRawSync(buf, [options]) +## zlib.inflateRaw(buf[, options], callback) +## zlib.inflateRawSync(buf[, options]) Decompress a raw Buffer with InflateRaw. -## zlib.unzip(buf, [options], callback) -## zlib.unzipSync(buf, [options]) +## zlib.unzip(buf[, options], callback) +## zlib.unzipSync(buf[, options]) Decompress a raw Buffer with Unzip. From f3473d7db696f78b284c7a874ba33ec5e2b91309 Mon Sep 17 00:00:00 2001 From: Jicheng Li Date: Sun, 14 Sep 2014 23:40:49 +0800 Subject: [PATCH 024/144] readline: fix performance issue when large line Only run lineEnding.test() on the newly acquired chunk of string instead of on the entire line buffer. Reviewed-by: Trevor Norris --- lib/readline.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/readline.js b/lib/readline.js index add3a6a4bd9..a3f1b9d5801 100644 --- a/lib/readline.js +++ b/lib/readline.js @@ -310,11 +310,14 @@ Interface.prototype._normalWrite = function(b) { this._sawReturn = false; } + // Run test() on the new string chunk, not on the entire line buffer. + var newPartContainsEnding = lineEnding.test(string); + if (this._line_buffer) { string = this._line_buffer + string; this._line_buffer = null; } - if (lineEnding.test(string)) { + if (newPartContainsEnding) { this._sawReturn = /\r$/.test(string); // got one or more newlines; process into "line" events From 9d957747222da95e7c55142d25f59466c07857dc Mon Sep 17 00:00:00 2001 From: cjihrig Date: Sat, 20 Sep 2014 00:07:33 -0400 Subject: [PATCH 025/144] child_process: improve spawn() argument handling Add stricter argument type checking to normalizeSpawnArguments(). Removes a number of extraneous checks in spawn(). Fix regression in handling of the optional args argument. Add more thorough testing of spawn() arguments. Reviewed-by: Trevor Norris --- lib/child_process.js | 40 ++++++++--------- .../test-child-process-spawn-typeerror.js | 45 ++++++++++++++++++- 2 files changed, 61 insertions(+), 24 deletions(-) diff --git a/lib/child_process.js b/lib/child_process.js index 23963828c0c..4840c9e2bac 100644 --- a/lib/child_process.js +++ b/lib/child_process.js @@ -930,28 +930,29 @@ function _validateStdio(stdio, sync) { } -function normalizeSpawnArguments(/*file, args, options*/) { +function normalizeSpawnArguments(file /*, args, options*/) { var args, options; - var file = arguments[0]; - if (Array.isArray(arguments[1])) { args = arguments[1].slice(0); options = arguments[2]; - } else if (arguments[1] && !Array.isArray(arguments[1])) { + } else if (arguments[1] !== undefined && !util.isObject(arguments[1])) { throw new TypeError('Incorrect value of args option'); } else { args = []; options = arguments[1]; } - if (!options) + if (options === undefined) options = {}; + else if (!util.isObject(options)) + throw new TypeError('options argument must be an object'); args.unshift(file); - var env = (options && options.env ? options.env : null) || process.env; + var env = options.env || process.env; var envPairs = []; + for (var key in env) { envPairs.push(key + '=' + env[key]); } @@ -969,24 +970,19 @@ function normalizeSpawnArguments(/*file, args, options*/) { var spawn = exports.spawn = function(/*file, args, options*/) { var opts = normalizeSpawnArguments.apply(null, arguments); - - var file = opts.file; - var args = opts.args; var options = opts.options; - var envPairs = opts.envPairs; - var child = new ChildProcess(); child.spawn({ - file: file, - args: args, - cwd: options ? options.cwd : null, - windowsVerbatimArguments: !!(options && options.windowsVerbatimArguments), - detached: !!(options && options.detached), - envPairs: envPairs, - stdio: options ? options.stdio : null, - uid: options ? options.uid : null, - gid: options ? options.gid : null + file: opts.file, + args: opts.args, + cwd: options.cwd, + windowsVerbatimArguments: !!options.windowsVerbatimArguments, + detached: !!options.detached, + envPairs: opts.envPairs, + stdio: options.stdio, + uid: options.uid, + gid: options.gid }); return child; @@ -1340,7 +1336,7 @@ function checkExecSyncError(ret) { function execFileSync(/*command, options*/) { var opts = normalizeSpawnArguments.apply(null, arguments); - var inheritStderr = !!!opts.options.stdio; + var inheritStderr = !opts.options.stdio; var ret = spawnSync(opts.file, opts.args.slice(1), opts.options); @@ -1359,7 +1355,7 @@ exports.execFileSync = execFileSync; function execSync(/*comand, options*/) { var opts = normalizeExecArgs.apply(null, arguments); - var inheritStderr = opts.options ? !!!opts.options.stdio : true; + var inheritStderr = opts.options ? !opts.options.stdio : true; var ret = spawnSync(opts.file, opts.args, opts.options); ret.cmd = opts.cmd; diff --git a/test/simple/test-child-process-spawn-typeerror.js b/test/simple/test-child-process-spawn-typeerror.js index 791adcbc208..49bc74d1a0a 100644 --- a/test/simple/test-child-process-spawn-typeerror.js +++ b/test/simple/test-child-process-spawn-typeerror.js @@ -22,12 +22,15 @@ var spawn = require('child_process').spawn, assert = require('assert'), windows = (process.platform === 'win32'), - cmd = (windows) ? 'ls' : 'dir', + cmd = (windows) ? 'dir' : 'ls', + invalidcmd = (windows) ? 'ls' : 'dir', + invalidArgsMsg = /Incorrect value of args option/, + invalidOptionsMsg = /options argument must be an object/, errors = 0; try { // Ensure this throws a TypeError - var child = spawn(cmd, 'this is not an array'); + var child = spawn(invalidcmd, 'this is not an array'); child.on('error', function (err) { errors++; @@ -37,6 +40,44 @@ try { assert.equal(e instanceof TypeError, true); } +// verify that valid argument combinations do not throw +assert.doesNotThrow(function() { + spawn(cmd); +}); + +assert.doesNotThrow(function() { + spawn(cmd, []); +}); + +assert.doesNotThrow(function() { + spawn(cmd, {}); +}); + +assert.doesNotThrow(function() { + spawn(cmd, [], {}); +}); + +// verify that invalid argument combinations throw +assert.throws(function() { + spawn(); +}, /Bad argument/); + +assert.throws(function() { + spawn(cmd, null); +}, invalidArgsMsg); + +assert.throws(function() { + spawn(cmd, true); +}, invalidArgsMsg); + +assert.throws(function() { + spawn(cmd, [], null); +}, invalidOptionsMsg); + +assert.throws(function() { + spawn(cmd, [], 1); +}, invalidOptionsMsg); + process.on('exit', function() { assert.equal(errors, 0); }); From 2122a77f5177a039b80403a3772fdd14323e158a Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Wed, 24 Sep 2014 13:42:33 +0400 Subject: [PATCH 026/144] crypto: lower RSS usage for TLSCallbacks Don't allocate any BIO buffers initially, do this on a first read from the TCP connection. Allocate different amount of data for initial read and for consequent reads: small buffer for hello+certificate, big buffer for better throughput. see #8416 --- src/node_crypto_bio.cc | 75 ++++++++++++++++++++++++++---------------- src/node_crypto_bio.h | 38 ++++++++++++++------- src/tls_wrap.cc | 9 +++-- src/tls_wrap.h | 6 ++++ 4 files changed, 87 insertions(+), 41 deletions(-) diff --git a/src/node_crypto_bio.cc b/src/node_crypto_bio.cc index 22f0f6e8c71..441e9b17f78 100644 --- a/src/node_crypto_bio.cc +++ b/src/node_crypto_bio.cc @@ -272,6 +272,8 @@ size_t NodeBIO::Read(char* out, size_t size) { void NodeBIO::FreeEmpty() { + if (write_head_ == NULL) + return; Buffer* child = write_head_->next_; if (child == write_head_ || child == read_head_) return; @@ -281,13 +283,6 @@ void NodeBIO::FreeEmpty() { Buffer* prev = child; while (cur != read_head_) { - // Skip embedded buffer, and continue deallocating again starting from it - if (cur == &head_) { - prev->next_ = cur; - prev = cur; - cur = head_.next_; - continue; - } assert(cur != write_head_); assert(cur->write_pos_ == cur->read_pos_); @@ -295,7 +290,6 @@ void NodeBIO::FreeEmpty() { delete cur; cur = next; } - assert(prev == child || prev == &head_); prev->next_ = cur; } @@ -330,7 +324,7 @@ size_t NodeBIO::IndexOf(char delim, size_t limit) { } // Move to next buffer - if (current->read_pos_ + avail == kBufferLength) { + if (current->read_pos_ + avail == current->len_) { current = current->next_; } } @@ -343,10 +337,14 @@ size_t NodeBIO::IndexOf(char delim, size_t limit) { void NodeBIO::Write(const char* data, size_t size) { size_t offset = 0; size_t left = size; + + // Allocate initial buffer if the ring is empty + TryAllocateForWrite(left); + while (left > 0) { size_t to_write = left; - assert(write_head_->write_pos_ <= kBufferLength); - size_t avail = kBufferLength - write_head_->write_pos_; + assert(write_head_->write_pos_ <= write_head_->len_); + size_t avail = write_head_->len_ - write_head_->write_pos_; if (to_write > avail) to_write = avail; @@ -361,12 +359,12 @@ void NodeBIO::Write(const char* data, size_t size) { offset += to_write; length_ += to_write; write_head_->write_pos_ += to_write; - assert(write_head_->write_pos_ <= kBufferLength); + assert(write_head_->write_pos_ <= write_head_->len_); // Go to next buffer if there still are some bytes to write if (left != 0) { - assert(write_head_->write_pos_ == kBufferLength); - TryAllocateForWrite(); + assert(write_head_->write_pos_ == write_head_->len_); + TryAllocateForWrite(left); write_head_ = write_head_->next_; // Additionally, since we're moved to the next buffer, read head @@ -379,7 +377,9 @@ void NodeBIO::Write(const char* data, size_t size) { char* NodeBIO::PeekWritable(size_t* size) { - size_t available = kBufferLength - write_head_->write_pos_; + TryAllocateForWrite(*size); + + size_t available = write_head_->len_ - write_head_->write_pos_; if (*size != 0 && available > *size) available = *size; else @@ -392,12 +392,12 @@ char* NodeBIO::PeekWritable(size_t* size) { void NodeBIO::Commit(size_t size) { write_head_->write_pos_ += size; length_ += size; - assert(write_head_->write_pos_ <= kBufferLength); + assert(write_head_->write_pos_ <= write_head_->len_); // Allocate new buffer if write head is full, // and there're no other place to go - TryAllocateForWrite(); - if (write_head_->write_pos_ == kBufferLength) { + TryAllocateForWrite(0); + if (write_head_->write_pos_ == write_head_->len_) { write_head_ = write_head_->next_; // Additionally, since we're moved to the next buffer, read head @@ -407,19 +407,35 @@ void NodeBIO::Commit(size_t size) { } -void NodeBIO::TryAllocateForWrite() { +void NodeBIO::TryAllocateForWrite(size_t hint) { + Buffer* w = write_head_; + Buffer* r = read_head_; // If write head is full, next buffer is either read head or not empty. - if (write_head_->write_pos_ == kBufferLength && - (write_head_->next_ == read_head_ || - write_head_->next_->write_pos_ != 0)) { - Buffer* next = new Buffer(); - next->next_ = write_head_->next_; - write_head_->next_ = next; + if (w == NULL || + (w->write_pos_ == w->len_ && + (w->next_ == r || w->next_->write_pos_ != 0))) { + size_t len = w == NULL ? initial_ : + kThroughputBufferLength; + if (len < hint) + len = hint; + Buffer* next = new Buffer(len); + + if (w == NULL) { + next->next_ = next; + write_head_ = next; + read_head_ = next; + } else { + next->next_ = w->next_; + w->next_ = next; + } } } void NodeBIO::Reset() { + if (read_head_ == NULL) + return; + while (read_head_->read_pos_ != read_head_->write_pos_) { assert(read_head_->write_pos_ > read_head_->read_pos_); @@ -435,12 +451,15 @@ void NodeBIO::Reset() { NodeBIO::~NodeBIO() { - Buffer* current = head_.next_; - while (current != &head_) { + if (read_head_ == NULL) + return; + + Buffer* current = read_head_; + do { Buffer* next = current->next_; delete current; current = next; - } + } while (current != read_head_); read_head_ = NULL; write_head_ = NULL; diff --git a/src/node_crypto_bio.h b/src/node_crypto_bio.h index 0b9b3440c5e..163a82124f6 100644 --- a/src/node_crypto_bio.h +++ b/src/node_crypto_bio.h @@ -29,9 +29,10 @@ namespace node { class NodeBIO { public: - NodeBIO() : length_(0), read_head_(&head_), write_head_(&head_) { - // Loop head - head_.next_ = &head_; + NodeBIO() : initial_(kInitialBufferLength), + length_(0), + read_head_(NULL), + write_head_(NULL) { } ~NodeBIO(); @@ -42,7 +43,7 @@ class NodeBIO { void TryMoveReadHead(); // Allocate new buffer for write if needed - void TryAllocateForWrite(); + void TryAllocateForWrite(size_t hint); // Read `len` bytes maximum into `out`, return actual number of read bytes size_t Read(char* out, size_t size); @@ -76,11 +77,16 @@ class NodeBIO { // Commit reserved data void Commit(size_t size); + // Return size of buffer in bytes - size_t inline Length() { + inline size_t Length() const { return length_; } + inline void set_initial(size_t initial) { + initial_ = initial; + } + static inline NodeBIO* FromBIO(BIO* bio) { assert(bio->ptr != NULL); return static_cast(bio->ptr); @@ -95,24 +101,34 @@ class NodeBIO { static int Gets(BIO* bio, char* out, int size); static long Ctrl(BIO* bio, int cmd, long num, void* ptr); - // NOTE: Size is maximum TLS frame length, this is required if we want - // to fit whole ClientHello into one Buffer of NodeBIO. - static const size_t kBufferLength = 16 * 1024 + 5; + // Enough to handle the most of the client hellos + static const size_t kInitialBufferLength = 1024; + static const size_t kThroughputBufferLength = 16384; + static const BIO_METHOD method; class Buffer { public: - Buffer() : read_pos_(0), write_pos_(0), next_(NULL) { + explicit Buffer(size_t len) : read_pos_(0), + write_pos_(0), + len_(len), + next_(NULL) { + data_ = new char[len]; + } + + ~Buffer() { + delete[] data_; } size_t read_pos_; size_t write_pos_; + size_t len_; Buffer* next_; - char data_[kBufferLength]; + char* data_; }; + size_t initial_; size_t length_; - Buffer head_; Buffer* read_head_; Buffer* write_head_; }; diff --git a/src/tls_wrap.cc b/src/tls_wrap.cc index c65492cf315..84bc87e0cc4 100644 --- a/src/tls_wrap.cc +++ b/src/tls_wrap.cc @@ -192,6 +192,8 @@ void TLSCallbacks::InitSSL() { if (is_server()) { SSL_set_accept_state(ssl_); } else if (is_client()) { + // Enough space for server response (hello, cert) + NodeBIO::FromBIO(enc_in_)->set_initial(kInitialClientBufferLength); SSL_set_connect_state(ssl_); } else { // Unexpected @@ -254,6 +256,7 @@ void TLSCallbacks::Receive(const FunctionCallbackInfo& args) { wrap->DoAlloc(reinterpret_cast(stream), len, &buf); size_t copy = buf.len > len ? len : buf.len; memcpy(buf.base, data, copy); + buf.len = copy; wrap->DoRead(stream, buf.len, &buf, UV_UNKNOWN_HANDLE); data += copy; @@ -615,8 +618,9 @@ void TLSCallbacks::AfterWrite(WriteWrap* w) { void TLSCallbacks::DoAlloc(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { - buf->base = NodeBIO::FromBIO(enc_in_)->PeekWritable(&suggested_size); - buf->len = suggested_size; + size_t size = 0; + buf->base = NodeBIO::FromBIO(enc_in_)->PeekWritable(&size); + buf->len = size; } @@ -720,6 +724,7 @@ void TLSCallbacks::EnableHelloParser(const FunctionCallbackInfo& args) { TLSCallbacks* wrap = Unwrap(args.Holder()); + NodeBIO::FromBIO(wrap->enc_in_)->set_initial(kMaxHelloLength); wrap->hello_parser_.Start(SSLWrap::OnClientHello, OnClientHelloParseEnd, wrap); diff --git a/src/tls_wrap.h b/src/tls_wrap.h index 34ae3ccbf65..b12a6b66122 100644 --- a/src/tls_wrap.h +++ b/src/tls_wrap.h @@ -74,6 +74,12 @@ class TLSCallbacks : public crypto::SSLWrap, protected: static const int kClearOutChunkSize = 1024; + // Maximum number of bytes for hello parser + static const int kMaxHelloLength = 16384; + + // Usual ServerHello + Certificate size + static const int kInitialClientBufferLength = 4096; + // Maximum number of buffers passed to uv_write() static const int kSimultaneousBufferCount = 10; From de312cfd7c21c551d497af49aa981e07ed2f5ba3 Mon Sep 17 00:00:00 2001 From: Trevor Norris Date: Mon, 29 Sep 2014 10:13:35 -0700 Subject: [PATCH 027/144] timer_wrap: remove HandleScopes, check return size Calls from JS to C++ have an implicit HandleScope. So there is no need to instantiate a new HandleScope in these basic cases. Check if the returned int64_t is an SMI and cast the return value to uint32_t instead of a double. Prevents needing to box the return value, and saves a small amount of execution time. Signed-off-by: Trevor Norris --- src/timer_wrap.cc | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/timer_wrap.cc b/src/timer_wrap.cc index 099a54ec95d..71e6a613431 100644 --- a/src/timer_wrap.cc +++ b/src/timer_wrap.cc @@ -97,8 +97,6 @@ class TimerWrap : public HandleWrap { } static void Start(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args.GetIsolate()); - HandleScope scope(env->isolate()); TimerWrap* wrap = Unwrap(args.Holder()); int64_t timeout = args[0]->IntegerValue(); @@ -108,8 +106,6 @@ class TimerWrap : public HandleWrap { } static void Stop(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args.GetIsolate()); - HandleScope scope(env->isolate()); TimerWrap* wrap = Unwrap(args.Holder()); int err = uv_timer_stop(&wrap->handle_); @@ -117,8 +113,6 @@ class TimerWrap : public HandleWrap { } static void Again(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args.GetIsolate()); - HandleScope scope(env->isolate()); TimerWrap* wrap = Unwrap(args.Holder()); int err = uv_timer_again(&wrap->handle_); @@ -126,8 +120,6 @@ class TimerWrap : public HandleWrap { } static void SetRepeat(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args.GetIsolate()); - HandleScope scope(env->isolate()); TimerWrap* wrap = Unwrap(args.Holder()); int64_t repeat = args[0]->IntegerValue(); @@ -136,12 +128,13 @@ class TimerWrap : public HandleWrap { } static void GetRepeat(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args.GetIsolate()); - HandleScope scope(env->isolate()); TimerWrap* wrap = Unwrap(args.Holder()); int64_t repeat = uv_timer_get_repeat(&wrap->handle_); - args.GetReturnValue().Set(static_cast(repeat)); + if (repeat <= 0xfffffff) + args.GetReturnValue().Set(static_cast(repeat)); + else + args.GetReturnValue().Set(static_cast(repeat)); } static void OnTimeout(uv_timer_t* handle) { @@ -153,11 +146,13 @@ class TimerWrap : public HandleWrap { } static void Now(const FunctionCallbackInfo& args) { - HandleScope handle_scope(args.GetIsolate()); Environment* env = Environment::GetCurrent(args.GetIsolate()); uv_update_time(env->event_loop()); - double now = static_cast(uv_now(env->event_loop())); - args.GetReturnValue().Set(now); + uint64_t now = uv_now(env->event_loop()); + if (now <= 0xfffffff) + args.GetReturnValue().Set(static_cast(now)); + else + args.GetReturnValue().Set(static_cast(now)); } uv_timer_t handle_; From 979d0ca874df0383311ca06f154f6965074196ee Mon Sep 17 00:00:00 2001 From: Trevor Norris Date: Mon, 29 Sep 2014 12:32:42 -0700 Subject: [PATCH 028/144] http: cleanup setHeader() Several fields on OutgoingMessage were set after instantiation. These have been included in the constructor to prevent mutation of the object map after instantiation. "name" is now explicitly checked to be a string. Where before if a non-string was passed the following cryptic error was thrown: _http_outgoing.js:334 var key = name.toLowerCase(); ^ TypeError: undefined is not a function Signed-off-by: Trevor Norris --- lib/_http_outgoing.js | 24 ++++++++++++++---------- test/simple/test-http-write-head.js | 11 +++++++++++ 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index bec9a3c0155..20aa3654018 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -82,9 +82,13 @@ function OutgoingMessage() { this.finished = false; this._hangupClose = false; + this._headerSent = false; this.socket = null; this.connection = null; + this._header = null; + this._headers = null; + this._headerNames = {}; } util.inherits(OutgoingMessage, Stream); @@ -323,23 +327,22 @@ function storeHeader(self, state, field, value) { OutgoingMessage.prototype.setHeader = function(name, value) { - if (arguments.length < 2) { - throw new Error('`name` and `value` are required for setHeader().'); - } - - if (this._header) { + if (typeof name !== 'string') + throw new TypeError('"name" should be a string'); + if (value === undefined) + throw new Error('"name" and "value" are required for setHeader().'); + if (this._header) throw new Error('Can\'t set headers after they are sent.'); - } + + if (this._headers === null) + this._headers = {}; var key = name.toLowerCase(); - this._headers = this._headers || {}; - this._headerNames = this._headerNames || {}; this._headers[key] = value; this._headerNames[key] = name; - if (automaticHeaders[key]) { + if (automaticHeaders[key]) this._removedHeader[key] = false; - } }; @@ -387,6 +390,7 @@ OutgoingMessage.prototype._renderHeaders = function() { var headers = {}; var keys = Object.keys(this._headers); + for (var i = 0, l = keys.length; i < l; i++) { var key = keys[i]; headers[this._headerNames[key]] = this._headers[key]; diff --git a/test/simple/test-http-write-head.js b/test/simple/test-http-write-head.js index 2de59fe2eda..88923ef27ac 100644 --- a/test/simple/test-http-write-head.js +++ b/test/simple/test-http-write-head.js @@ -28,6 +28,17 @@ var http = require('http'); var s = http.createServer(function(req, res) { res.setHeader('test', '1'); + + // toLowerCase() is used on the name argument, so it must be a string. + var threw = false; + try { + res.setHeader(0xf00, 'bar'); + } catch (e) { + assert.ok(e instanceof TypeError); + threw = true; + } + assert.ok(threw, 'Non-string names should throw'); + res.writeHead(200, { Test: '2' }); res.end(); }); From f4df80584d57904edf72c2f71f7df644ba91d2f5 Mon Sep 17 00:00:00 2001 From: James Ferguson Date: Wed, 24 Sep 2014 20:19:22 -0700 Subject: [PATCH 029/144] readme: grammer fix Reviewed-by: Trevor Norris --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 086590a6bb4..f1301a0df76 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Windows: You can download pre-built binaries for various operating systems from [http://nodejs.org/download/](http://nodejs.org/download/). The Windows -and OS X installers will prompt you for the location to install to. +and OS X installers will prompt you for the location in which to install. The tarballs are self-contained; you can extract them to a local directory with: From 734fb49a2af580f2d9c97a0bdd82ad3e6a1f64a2 Mon Sep 17 00:00:00 2001 From: Rasmus Christian Pedersen Date: Thu, 18 Sep 2014 14:10:53 +0200 Subject: [PATCH 030/144] src: fix VC++ warning C4244 Reviewed-by: Trevor Norris --- src/node.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/node.cc b/src/node.cc index 2223c369831..cf8f4ccbb5a 100644 --- a/src/node.cc +++ b/src/node.cc @@ -1941,7 +1941,7 @@ static void InitGroups(const FunctionCallbackInfo& args) { void Exit(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args.GetIsolate()); HandleScope scope(env->isolate()); - exit(args[0]->IntegerValue()); + exit(args[0]->Int32Value()); } @@ -1993,7 +1993,7 @@ void Kill(const FunctionCallbackInfo& args) { return env->ThrowError("Bad argument."); } - int pid = args[0]->IntegerValue(); + int pid = args[0]->Int32Value(); int sig = args[1]->Int32Value(); int err = uv_kill(pid, sig); args.GetReturnValue().Set(err); @@ -2502,7 +2502,7 @@ static void DebugPortSetter(Local property, const PropertyCallbackInfo& info) { Environment* env = Environment::GetCurrent(info.GetIsolate()); HandleScope scope(env->isolate()); - debug_port = value->NumberValue(); + debug_port = value->Int32Value(); } @@ -3375,7 +3375,7 @@ void Init(int* argc, int* exec_argc, const char*** exec_argv) { // Initialize prog_start_time to get relative uptime. - prog_start_time = uv_now(uv_default_loop()); + prog_start_time = static_cast(uv_now(uv_default_loop())); // Make inherited handles noninheritable. uv_disable_stdio_inheritance(); @@ -3530,7 +3530,7 @@ int EmitExit(Environment* env) { process_object->Set(env->exiting_string(), True(env->isolate())); Handle exitCode = env->exit_code_string(); - int code = process_object->Get(exitCode)->IntegerValue(); + int code = process_object->Get(exitCode)->Int32Value(); Local args[] = { env->exit_string(), @@ -3540,7 +3540,7 @@ int EmitExit(Environment* env) { MakeCallback(env, process_object, "emit", ARRAY_SIZE(args), args); // Reload exit code, it may be changed by `emit('exit')` - return process_object->Get(exitCode)->IntegerValue(); + return process_object->Get(exitCode)->Int32Value(); } From f2a78de6ec134f4050531ba6a52dee47e0aee165 Mon Sep 17 00:00:00 2001 From: Trevor Norris Date: Mon, 29 Sep 2014 16:32:34 -0700 Subject: [PATCH 031/144] doc: fix optional parameter parsing The parameter parser specifically looked for the old bracket syntax. This generated a lot of warnings when building the docs. Those warnings have been fixed by changing the parsing logic. Signed-off-by: Trevor Norris --- doc/api/assert.markdown | 2 +- doc/api/buffer.markdown | 10 +++++----- doc/api/child_process.markdown | 10 +++++----- doc/api/console.markdown | 10 +++++----- doc/api/crypto.markdown | 10 +++++----- doc/api/dgram.markdown | 32 +++++++++++++++++++++++--------- doc/api/events.markdown | 2 +- doc/api/fs.markdown | 2 +- doc/api/http.markdown | 12 ++++++------ doc/api/https.markdown | 2 +- doc/api/net.markdown | 16 ++++++++-------- doc/api/path.markdown | 2 +- doc/api/querystring.markdown | 4 ++-- doc/api/smalloc.markdown | 34 ++++++++++++++++++---------------- doc/api/stream.markdown | 4 ++-- doc/api/timers.markdown | 6 +++--- doc/api/tls.markdown | 6 +++--- doc/api/url.markdown | 2 +- doc/api/vm.markdown | 4 ++-- tools/doc/json.js | 11 ++++++----- 20 files changed, 99 insertions(+), 82 deletions(-) diff --git a/doc/api/assert.markdown b/doc/api/assert.markdown index dec971eba10..0fb7f0b8d42 100644 --- a/doc/api/assert.markdown +++ b/doc/api/assert.markdown @@ -37,7 +37,7 @@ Tests strict equality, as determined by the strict equality operator ( `===` ) Tests strict non-equality, as determined by the strict not equal operator ( `!==` ) -## assert.throws(block[, error]\[, message]) +## assert.throws(block[, error][, message]) Expects `block` to throw an error. `error` can be constructor, `RegExp` or validation function. diff --git a/doc/api/buffer.markdown b/doc/api/buffer.markdown index 49205339733..fb86accebbb 100644 --- a/doc/api/buffer.markdown +++ b/doc/api/buffer.markdown @@ -162,7 +162,7 @@ buffer object. It does not change when the contents of the buffer are changed. // 1234 // 1234 -### buf.write(string[, offset]\[, length]\[, encoding]) +### buf.write(string[, offset][, length][, encoding]) * `string` String - data to be written to buffer * `offset` Number, Optional, Default: 0 @@ -181,7 +181,7 @@ The method will not write partial characters. console.log(len + " bytes: " + buf.toString('utf8', 0, len)); -### buf.toString([encoding]\[, start]\[, end]) +### buf.toString([encoding][, start][, end]) * `encoding` String, Optional, Default: 'utf8' * `start` Number, Optional, Default: 0 @@ -252,7 +252,7 @@ Returns a number indicating whether `this` comes before or after or is the same as the `otherBuffer` in sort order. -### buf.copy(targetBuffer[, targetStart]\[, sourceStart]\[, sourceEnd]) +### buf.copy(targetBuffer[, targetStart][, sourceStart][, sourceEnd]) * `targetBuffer` Buffer object - Buffer to copy into * `targetStart` Number, Optional, Default: 0 @@ -283,7 +283,7 @@ into `buf2`, starting at the 8th byte in `buf2`. // !!!!!!!!qrst!!!!!!!!!!!!! -### buf.slice([start]\[, end]) +### buf.slice([start][, end]) * `start` Number, Optional, Default: 0 * `end` Number, Optional, Default: `buffer.length` @@ -703,7 +703,7 @@ Example: // // -### buf.fill(value[, offset]\[, end]) +### buf.fill(value[, offset][, end]) * `value` * `offset` Number, Optional diff --git a/doc/api/child_process.markdown b/doc/api/child_process.markdown index 4cfad5588ca..7db48829237 100644 --- a/doc/api/child_process.markdown +++ b/doc/api/child_process.markdown @@ -303,7 +303,7 @@ child process has any open IPC channels with the parent (i.e `fork()`). These methods follow the common async programming patterns (accepting a callback or returning an EventEmitter). -### child_process.spawn(command[, args]\[, options]) +### child_process.spawn(command[, args][, options]) * `command` {String} The command to run * `args` {Array} List of string arguments @@ -531,7 +531,7 @@ amount of data allowed on stdout or stderr - if this value is exceeded then the child process is killed. -### child_process.execFile(file[, args]\[, options]\[, callback]) +### child_process.execFile(file[, args][, options][, callback]) * `file` {String} The filename of the program to run * `args` {Array} List of string arguments @@ -555,7 +555,7 @@ subshell but rather the specified file directly. This makes it slightly leaner than `child_process.exec`. It has the same options. -### child_process.fork(modulePath[, args]\[, options]) +### child_process.fork(modulePath[, args][, options]) * `modulePath` {String} The module to run in the child * `args` {Array} List of string arguments @@ -598,7 +598,7 @@ Blocking calls like these are mostly useful for simplifying general purpose scripting tasks and for simplifying the loading/processing of application configuration at startup. -### child_process.spawnSync(command[, args]\[, options]) +### child_process.spawnSync(command[, args][, options]) * `command` {String} The command to run * `args` {Array} List of string arguments @@ -629,7 +629,7 @@ until the process has completely exited. That is to say, if the process handles the `SIGTERM` signal and doesn't exit, your process will wait until the child process has exited. -### child_process.execFileSync(command[, args]\[, options]) +### child_process.execFileSync(command[, args][, options]) * `command` {String} The command to run * `args` {Array} List of string arguments diff --git a/doc/api/console.markdown b/doc/api/console.markdown index 82860c16c75..46ab65fad36 100644 --- a/doc/api/console.markdown +++ b/doc/api/console.markdown @@ -22,7 +22,7 @@ In daily use, the blocking/non-blocking dichotomy is not something you should worry about unless you log huge amounts of data. -## console.log([data]\[, ...]) +## console.log([data][, ...]) Prints to stdout with newline. This function can take multiple arguments in a `printf()`-like way. Example: @@ -34,15 +34,15 @@ Prints to stdout with newline. This function can take multiple arguments in a If formatting elements are not found in the first string then `util.inspect` is used on each argument. See [util.format()][] for more information. -## console.info([data]\[, ...]) +## console.info([data][, ...]) Same as `console.log`. -## console.error([data]\[, ...]) +## console.error([data][, ...]) Same as `console.log` but prints to stderr. -## console.warn([data]\[, ...]) +## console.warn([data][, ...]) Same as `console.error`. @@ -82,7 +82,7 @@ Finish timer, record output. Example: Print to stderr `'Trace :'`, followed by the formatted message and stack trace to the current position. -## console.assert(value[, message]\[, ...]) +## console.assert(value[, message][, ...]) Similar to [assert.ok()][], but the error message is formatted as `util.format(message...)`. diff --git a/doc/api/crypto.markdown b/doc/api/crypto.markdown index 0359d9ab2ab..4e465d6f550 100644 --- a/doc/api/crypto.markdown +++ b/doc/api/crypto.markdown @@ -214,7 +214,7 @@ writable. The written plain text data is used to produce the encrypted data on the readable side. The legacy `update` and `final` methods are also supported. -### cipher.update(data[, input_encoding]\[, output_encoding]) +### cipher.update(data[, input_encoding][, output_encoding]) Updates the cipher with `data`, the encoding of which is given in `input_encoding` and can be `'utf8'`, `'ascii'` or `'binary'`. If no @@ -280,7 +280,7 @@ writable. The written enciphered data is used to produce the plain-text data on the the readable side. The legacy `update` and `final` methods are also supported. -### decipher.update(data[, input_encoding]\[, output_encoding]) +### decipher.update(data[, input_encoding][, output_encoding]) Updates the decipher with `data`, which is encoded in `'binary'`, `'base64'` or `'hex'`. If no encoding is provided, then a buffer is @@ -408,7 +408,7 @@ Creates a Diffie-Hellman key exchange object and generates a prime of `prime_length` bits and using an optional specific numeric `generator`. If no `generator` is specified, then `2` is used. -## crypto.createDiffieHellman(prime[, prime_encoding]\[, generator]\[, generator_encoding]) +## crypto.createDiffieHellman(prime[, prime_encoding][, generator][, generator_encoding]) Creates a Diffie-Hellman key exchange object using the supplied `prime` and an optional specific `generator`. @@ -442,7 +442,7 @@ the public key in the specified encoding. This key should be transferred to the other party. Encoding can be `'binary'`, `'hex'`, or `'base64'`. If no encoding is provided, then a buffer is returned. -### diffieHellman.computeSecret(other_public_key[, input_encoding]\[, output_encoding]) +### diffieHellman.computeSecret(other_public_key[, input_encoding][, output_encoding]) Computes the shared secret using `other_public_key` as the other party's public key and returns the computed shared secret. Supplied @@ -541,7 +541,7 @@ Format specifies point encoding and can be `'compressed'`, `'uncompressed'`, or Encoding can be `'binary'`, `'hex'`, or `'base64'`. If no encoding is provided, then a buffer is returned. -### ECDH.computeSecret(other_public_key[, input_encoding]\[, output_encoding]) +### ECDH.computeSecret(other_public_key[, input_encoding][, output_encoding]) Computes the shared secret using `other_public_key` as the other party's public key and returns the computed shared secret. Supplied diff --git a/doc/api/dgram.markdown b/doc/api/dgram.markdown index 33541e47373..09bacaf098c 100644 --- a/doc/api/dgram.markdown +++ b/doc/api/dgram.markdown @@ -22,13 +22,8 @@ You have to change it to this: ## dgram.createSocket(type[, callback]) -## dgram.createSocket(options[, callback]) * `type` String. Either 'udp4' or 'udp6' -* `options` Object. Should contain a `type` property and could contain - `reuseAddr` property. `false` by default. - When `reuseAddr` is `true` - `socket.bind()` will reuse address, even if the - other process has already bound a socket on it. * `callback` Function. Attached as a listener to `message` events. Optional * Returns: Socket object @@ -38,9 +33,28 @@ and `udp6`. Takes an optional callback which is added as a listener for `message` events. -Call `socket.bind` if you want to receive datagrams. `socket.bind()` will bind -to the "all interfaces" address on a random port (it does the right thing for -both `udp4` and `udp6` sockets). You can then retrieve the address and port +Call `socket.bind()` if you want to receive datagrams. `socket.bind()` will +bind to the "all interfaces" address on a random port (it does the right thing +for both `udp4` and `udp6` sockets). You can then retrieve the address and port +with `socket.address().address` and `socket.address().port`. + +## dgram.createSocket(options[, callback]) +* `options` Object +* `callback` Function. Attached as a listener to `message` events. +* Returns: Socket object + +The `options` object should contain a `type` field of either `udp4` or `udp6` +and an optional boolean `reuseAddr` field. + +When `reuseAddr` is true `socket.bind()` will reuse the address, even if +another process has already bound a socket on it. `reuseAddr` defaults to +`false`. + +Takes an optional callback which is added as a listener for `message` events. + +Call `socket.bind()` if you want to receive datagrams. `socket.bind()` will +bind to the "all interfaces" address on a random port (it does the right thing +for both `udp4` and `udp6` sockets). You can then retrieve the address and port with `socket.address().address` and `socket.address().port`. ## Class: dgram.Socket @@ -142,7 +156,7 @@ a packet might travel, and that generally sending a datagram greater than the (receiver) `MTU` won't work (the packet gets silently dropped, without informing the source that the data did not reach its intended recipient). -### socket.bind(port[, address]\[, callback]) +### socket.bind(port[, address][, callback]) * `port` Integer * `address` String, Optional diff --git a/doc/api/events.markdown b/doc/api/events.markdown index 82e736da5dd..895debba026 100644 --- a/doc/api/events.markdown +++ b/doc/api/events.markdown @@ -104,7 +104,7 @@ Returns an array of listeners for the specified event. console.log(util.inspect(server.listeners('connection'))); // [ [Function] ] -### emitter.emit(event[, arg1]\[, arg2]\[, ...]) +### emitter.emit(event[, arg1][, arg2][, ...]) Execute each of the listeners in order with the supplied arguments. diff --git a/doc/api/fs.markdown b/doc/api/fs.markdown index af3a3422e9c..c6bfa2456bc 100644 --- a/doc/api/fs.markdown +++ b/doc/api/fs.markdown @@ -568,7 +568,7 @@ have effectively stopped watching `filename`. Calling `fs.unwatchFile()` with a filename that is not being watched is a no-op, not an error. -## fs.watch(filename[, options]\[, listener]) +## fs.watch(filename[, options][, listener]) Stability: 2 - Unstable. diff --git a/doc/api/http.markdown b/doc/api/http.markdown index e94f631ad6c..827bba62631 100644 --- a/doc/api/http.markdown +++ b/doc/api/http.markdown @@ -64,7 +64,7 @@ Returns a new web server object. The `requestListener` is a function which is automatically added to the `'request'` event. -## http.createClient([port]\[, host]) +## http.createClient([port][, host]) This function is **deprecated**; please use [http.request()][] instead. Constructs a new HTTP client. `port` and `host` refer to the server to be @@ -160,7 +160,7 @@ If a client connection emits an 'error' event - it will forwarded here. `socket` is the `net.Socket` object that the error originated from. -### server.listen(port[, hostname]\[, backlog]\[, callback]) +### server.listen(port[, hostname][, backlog][, callback]) Begin accepting connections on the specified port and hostname. If the hostname is omitted, the server will accept connections directed to any @@ -275,7 +275,7 @@ After this event, no more events will be emitted on the response object. Sends a HTTP/1.1 100 Continue message to the client, indicating that the request body should be sent. See the ['checkContinue'][] event on `Server`. -### response.writeHead(statusCode[, statusMessage]\[, headers]) +### response.writeHead(statusCode[, statusMessage][, headers]) Sends a response header to the request. The status code is a 3-digit HTTP status code, like `404`. The last argument, `headers`, are the response headers. @@ -433,7 +433,7 @@ emit trailers, with a list of the header fields in its value. E.g., response.end(); -### response.end([data]\[, encoding]) +### response.end([data][, encoding]) This method signals to the server that all of the response headers and body have been sent; that server should consider this message complete. @@ -878,7 +878,7 @@ The `encoding` argument is optional and only applies when `chunk` is a string. Defaults to `'utf8'`. -### request.end([data]\[, encoding]) +### request.end([data][, encoding]) Finishes sending the request. If any parts of the body are unsent, it will flush them to the stream. If the request is @@ -901,7 +901,7 @@ Once a socket is assigned to this request and is connected Once a socket is assigned to this request and is connected [socket.setNoDelay()][] will be called. -### request.setSocketKeepAlive([enable]\[, initialDelay]) +### request.setSocketKeepAlive([enable][, initialDelay]) Once a socket is assigned to this request and is connected [socket.setKeepAlive()][] will be called. diff --git a/doc/api/https.markdown b/doc/api/https.markdown index e95097ca510..464677e014c 100644 --- a/doc/api/https.markdown +++ b/doc/api/https.markdown @@ -55,7 +55,7 @@ Or }).listen(8000); -### server.listen(port[, host]\[, backlog]\[, callback]) +### server.listen(port[, host][, backlog][, callback]) ### server.listen(path[, callback]) ### server.listen(handle[, callback]) diff --git a/doc/api/net.markdown b/doc/api/net.markdown index 36864f26992..2881d440765 100644 --- a/doc/api/net.markdown +++ b/doc/api/net.markdown @@ -6,7 +6,7 @@ The `net` module provides you with an asynchronous network wrapper. It contains methods for creating both servers and clients (called streams). You can include this module with `require('net');` -## net.createServer([options]\[, connectionListener]) +## net.createServer([options][, connectionListener]) Creates a new TCP server. The `connectionListener` argument is automatically set as a listener for the ['connection'][] event. @@ -107,8 +107,8 @@ changed to var client = net.connect({path: '/tmp/echo.sock'}); -## net.connect(port[, host]\[, connectListener]) -## net.createConnection(port[, host]\[, connectListener]) +## net.connect(port[, host][, connectListener]) +## net.createConnection(port[, host][, connectListener]) Creates a TCP connection to `port` on `host`. If `host` is omitted, `'localhost'` will be assumed. @@ -130,7 +130,7 @@ A factory method which returns a new ['net.Socket'](#net_class_net_socket). This class is used to create a TCP or local server. -### server.listen(port[, host]\[, backlog]\[, callback]) +### server.listen(port[, host][, backlog][, callback]) Begin accepting connections on the specified `port` and `host`. If the `host` is omitted, the server will accept connections directed to any @@ -352,7 +352,7 @@ Set `readable` and/or `writable` to `true` to allow reads and/or writes on this socket (NOTE: Works only when `fd` is passed). About `allowHalfOpen`, refer to `createServer()` and `'end'` event. -### socket.connect(port[, host]\[, connectListener]) +### socket.connect(port[, host][, connectListener]) ### socket.connect(path[, connectListener]) Opens the connection for a given socket. If `port` and `host` are given, @@ -395,7 +395,7 @@ Users who experience large or growing `bufferSize` should attempt to Set the encoding for the socket as a Readable Stream. See [stream.setEncoding()][] for more information. -### socket.write(data[, encoding]\[, callback]) +### socket.write(data[, encoding][, callback]) Sends data on the socket. The second parameter specifies the encoding in the case of a string--it defaults to UTF8 encoding. @@ -407,7 +407,7 @@ buffer. Returns `false` if all or part of the data was queued in user memory. The optional `callback` parameter will be executed when the data is finally written out - this may not be immediately. -### socket.end([data]\[, encoding]) +### socket.end([data][, encoding]) Half-closes the socket. i.e., it sends a FIN packet. It is possible the server will still send some data. @@ -450,7 +450,7 @@ algorithm, they buffer data before sending it off. Setting `true` for `noDelay` will immediately fire off data each time `socket.write()` is called. `noDelay` defaults to `true`. -### socket.setKeepAlive([enable]\[, initialDelay]) +### socket.setKeepAlive([enable][, initialDelay]) Enable/disable keep-alive functionality, and optionally set the initial delay before the first keepalive probe is sent on an idle socket. diff --git a/doc/api/path.markdown b/doc/api/path.markdown index b9fb242c970..0e9a78b15b0 100644 --- a/doc/api/path.markdown +++ b/doc/api/path.markdown @@ -22,7 +22,7 @@ Example: // returns '/foo/bar/baz/asdf' -## path.join([path1]\[, path2]\[, ...]) +## path.join([path1][, path2][, ...]) Join all arguments together and normalize the resulting path. diff --git a/doc/api/querystring.markdown b/doc/api/querystring.markdown index 884b287220f..e907c4e7d5a 100644 --- a/doc/api/querystring.markdown +++ b/doc/api/querystring.markdown @@ -7,7 +7,7 @@ This module provides utilities for dealing with query strings. It provides the following methods: -## querystring.stringify(obj[, sep]\[, eq]\[, options]) +## querystring.stringify(obj[, sep][, eq][, options]) Serialize an object to a query string. Optionally override the default separator (`'&'`) and assignment (`'='`) @@ -33,7 +33,7 @@ Example: // returns 'w=%D6%D0%CE%C4&foo=bar' -## querystring.parse(str[, sep]\[, eq]\[, options]) +## querystring.parse(str[, sep][, eq][, options]) Deserialize a query string to an object. Optionally override the default separator (`'&'`) and assignment (`'='`) diff --git a/doc/api/smalloc.markdown b/doc/api/smalloc.markdown index 72e46ea5874..e407bb19c20 100644 --- a/doc/api/smalloc.markdown +++ b/doc/api/smalloc.markdown @@ -2,18 +2,20 @@ Stability: 1 - Experimental -## smalloc.alloc(length[, receiver][, type]) +## Class: smalloc + +Buffers are backed by a simple allocator that only handles the assignation of +external raw memory. Smalloc exposes that functionality. + +### smalloc.alloc(length[, receiver][, type]) * `length` {Number} `<= smalloc.kMaxLength` -* `receiver` {Object}, Optional, Default: `new Object` -* `type` {Enum}, Optional, Default: `Uint8` +* `receiver` {Object} Default: `new Object` +* `type` {Enum} Default: `Uint8` Returns `receiver` with allocated external array data. If no `receiver` is passed then a new Object will be created and returned. -Buffers are backed by a simple allocator that only handles the assignation of -external raw memory. Smalloc exposes that functionality. - This can be used to create your own Buffer-like classes. No other properties are set, so the user will need to keep track of other necessary information (e.g. `length` of the allocation). @@ -46,13 +48,13 @@ possible options are listed in `smalloc.Types`. Example usage: // { '0': 0, '1': 0.1, '2': 0.2 } -## smalloc.copyOnto(source, sourceStart, dest, destStart, copyLength); +### smalloc.copyOnto(source, sourceStart, dest, destStart, copyLength); -* `source` Object with external array allocation -* `sourceStart` Position to begin copying from -* `dest` Object with external array allocation -* `destStart` Position to begin copying onto -* `copyLength` Length of copy +* `source` {Object} with external array allocation +* `sourceStart` {Number} Position to begin copying from +* `dest` {Object} with external array allocation +* `destStart` {Number} Position to begin copying onto +* `copyLength` {Number} Length of copy Copy memory from one external array allocation to another. No arguments are optional, and any violation will throw. @@ -75,7 +77,7 @@ optional, and any violation will throw. `copyOnto` automatically detects the length of the allocation internally, so no need to set any additional properties for this to work. -## smalloc.dispose(obj) +### smalloc.dispose(obj) * `obj` Object @@ -107,17 +109,17 @@ careful. Cryptic errors may arise in applications that are difficult to trace. `dispose()` does not support Buffers, and will throw if passed. -## smalloc.hasExternalData(obj) +### smalloc.hasExternalData(obj) * `obj` {Object} Returns `true` if the `obj` has externally allocated memory. -## smalloc.kMaxLength +### smalloc.kMaxLength Size of maximum allocation. This is also applicable to Buffer creation. -## smalloc.Types +### smalloc.Types Enum of possible external array types. Contains: diff --git a/doc/api/stream.markdown b/doc/api/stream.markdown index e79c2a2aace..ec8aabb7d89 100644 --- a/doc/api/stream.markdown +++ b/doc/api/stream.markdown @@ -501,7 +501,7 @@ Examples of writable streams include: * [child process stdin](child_process.html#child_process_child_stdin) * [process.stdout][], [process.stderr][] -#### writable.write(chunk[, encoding]\[, callback]) +#### writable.write(chunk[, encoding][, callback]) * `chunk` {String | Buffer} The data to write * `encoding` {String} The encoding, if `chunk` is a String @@ -564,7 +564,7 @@ Buffered data will be flushed either at `.uncork()` or at `.end()` call. Flush all data, buffered since `.cork()` call. -#### writable.end([chunk]\[, encoding]\[, callback]) +#### writable.end([chunk][, encoding][, callback]) * `chunk` {String | Buffer} Optional data to write * `encoding` {String} The encoding, if `chunk` is a String diff --git a/doc/api/timers.markdown b/doc/api/timers.markdown index 0c484c2c695..92af0b64b4e 100644 --- a/doc/api/timers.markdown +++ b/doc/api/timers.markdown @@ -5,7 +5,7 @@ All of the timer functions are globals. You do not need to `require()` this module in order to use them. -## setTimeout(callback, delay[, arg]\[, ...]) +## setTimeout(callback, delay[, arg][, ...]) To schedule execution of a one-time `callback` after `delay` milliseconds. Returns a `timeoutObject` for possible use with `clearTimeout()`. Optionally you can @@ -20,7 +20,7 @@ be called as close as possible to the time specified. Prevents a timeout from triggering. -## setInterval(callback, delay[, arg]\[, ...]) +## setInterval(callback, delay[, arg][, ...]) To schedule the repeated execution of `callback` every `delay` milliseconds. Returns a `intervalObject` for possible use with `clearInterval()`. Optionally @@ -47,7 +47,7 @@ If you had previously `unref()`d a timer you can call `ref()` to explicitly request the timer hold the program open. If the timer is already `ref`d calling `ref` again will have no effect. -## setImmediate(callback[, arg]\[, ...]) +## setImmediate(callback[, arg][, ...]) To schedule the "immediate" execution of `callback` after I/O events callbacks and before `setTimeout` and `setInterval` . Returns an diff --git a/doc/api/tls.markdown b/doc/api/tls.markdown index 945b99ebfa4..7d9aada8f8d 100644 --- a/doc/api/tls.markdown +++ b/doc/api/tls.markdown @@ -286,7 +286,7 @@ You can test this server by connecting to it with `openssl s_client`: ## tls.connect(options[, callback]) -## tls.connect(port[, host]\[, options]\[, callback]) +## tls.connect(port[, host][, options][, callback]) Creates a new client connection to the given `port` and `host` (old API) or `options.port` and `options.host`. (If `host` is omitted, it defaults to @@ -455,7 +455,7 @@ publicly trusted list of CAs as given in . -## tls.createSecurePair([context]\[, isServer]\[, requestCert]\[, rejectUnauthorized]) +## tls.createSecurePair([context][, isServer][, requestCert][, rejectUnauthorized]) Stability: 0 - Deprecated. Use tls.TLSSocket instead. @@ -594,7 +594,7 @@ NOTE: you may want to use some npm module like [asn1.js] to parse the certificates. -### server.listen(port[, host]\[, callback]) +### server.listen(port[, host][, callback]) Begin accepting connections on the specified `port` and `host`. If the `host` is omitted, the server will accept connections directed to any diff --git a/doc/api/url.markdown b/doc/api/url.markdown index fc92bb7e8e8..e6a43f72bcf 100644 --- a/doc/api/url.markdown +++ b/doc/api/url.markdown @@ -65,7 +65,7 @@ string will not be in the parsed object. Examples are shown for the URL The following methods are provided by the URL module: -## url.parse(urlStr[, parseQueryString]\[, slashesDenoteHost]) +## url.parse(urlStr[, parseQueryString][, slashesDenoteHost]) Take a URL string, and return an object. diff --git a/doc/api/vm.markdown b/doc/api/vm.markdown index 31f0f249c32..b1453249ec0 100644 --- a/doc/api/vm.markdown +++ b/doc/api/vm.markdown @@ -105,7 +105,7 @@ Note that running untrusted code is a tricky business requiring great care. separate process. -## vm.runInNewContext(code[, sandbox]\[, options]) +## vm.runInNewContext(code[, sandbox][, options]) `vm.runInNewContext` compiles `code`, contextifies `sandbox` if passed or creates a new contextified sandbox if it's omitted, and then runs the code with @@ -238,7 +238,7 @@ Note that running untrusted code is a tricky business requiring great care. requires a separate process. -### script.runInNewContext([sandbox]\[, options]) +### script.runInNewContext([sandbox][, options]) Similar to `vm.runInNewContext` but a method of a precompiled `Script` object. `script.runInNewContext` contextifies `sandbox` if passed or creates a new diff --git a/tools/doc/json.js b/tools/doc/json.js index 2459bc26aed..9fdc3bc1b4a 100644 --- a/tools/doc/json.js +++ b/tools/doc/json.js @@ -287,13 +287,13 @@ function processList(section) { } -// textRaw = "someobject.someMethod(a, [b=100], [c])" +// textRaw = "someobject.someMethod(a[, b=100][, c])" function parseSignature(text, sig) { var params = text.match(paramExpr); if (!params) return; params = params[1]; - // the ] is irrelevant. [ indicates optionalness. - params = params.replace(/\]/g, ''); + // the [ is irrelevant. ] indicates optionalness. + params = params.replace(/\[/g, ''); params = params.split(/,/) params.forEach(function(p, i, _) { p = p.trim(); @@ -302,9 +302,10 @@ function parseSignature(text, sig) { var optional = false; var def; // [foo] -> optional - if (p.charAt(0) === '[') { + if (p.charAt(p.length - 1) === ']') { optional = true; - p = p.substr(1); + p = p.substr(0, p.length - 1); + p = p.trim(); } var eq = p.indexOf('='); if (eq !== -1) { From 57ed3daebfe4700b14cd551f50240f1a634dbd64 Mon Sep 17 00:00:00 2001 From: Trevor Norris Date: Mon, 29 Sep 2014 17:29:59 -0700 Subject: [PATCH 032/144] buffer: fix and cleanup fill() Running fill() with an empty string would cause Node to hang indefinitely. Now it will return without having operated on the buffer. User facing function has been pulled into JS to perform all initial value checks and coercions. The C++ method has been placed on the "internal" object. Coerced non-string values to numbers to match v0.10 support. Simplified logic and changed a couple variable names. Added tests for fill() and moved them all to the beginning of buffer-test.js since many other tests depend on fill() working properly. Fixes: https://github.com/joyent/node/issues/8469 Signed-off-by: Trevor Norris --- lib/buffer.js | 23 ++++++++++++ src/env.h | 1 - src/node_buffer.cc | 48 ++++++++++--------------- test/simple/test-buffer.js | 72 ++++++++++++++++++++++++++------------ 4 files changed, 91 insertions(+), 53 deletions(-) diff --git a/lib/buffer.js b/lib/buffer.js index ed159158415..7fd297559bd 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -295,6 +295,29 @@ Buffer.prototype.compare = function compare(b) { }; +Buffer.prototype.fill = function fill(val, start, end) { + start = start >> 0; + end = (end === undefined) ? this.length : end >> 0; + + if (start < 0 || end > this.length) + throw new RangeError('out of range index'); + if (end <= start) + return this; + + if (typeof val !== 'string') { + val = val >>> 0; + } else if (val.length === 1) { + var code = val.charCodeAt(0); + if (code < 256) + val = code; + } + + internal.fill(this, val, start, end); + + return this; +}; + + // XXX remove in v0.13 Buffer.prototype.get = util.deprecate(function get(offset) { offset = ~~offset; diff --git a/src/env.h b/src/env.h index 7fe132ce69b..015dcd26e83 100644 --- a/src/env.h +++ b/src/env.h @@ -72,7 +72,6 @@ namespace node { V(buffer_string, "buffer") \ V(bytes_string, "bytes") \ V(bytes_parsed_string, "bytesParsed") \ - V(byte_length_string, "byteLength") \ V(callback_string, "callback") \ V(change_string, "change") \ V(close_string, "close") \ diff --git a/src/node_buffer.cc b/src/node_buffer.cc index dada1002baf..8be551d9b0e 100644 --- a/src/node_buffer.cc +++ b/src/node_buffer.cc @@ -338,37 +338,31 @@ void Copy(const FunctionCallbackInfo &args) { } -// buffer.fill(value[, start][, end]); void Fill(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args.GetIsolate()); - HandleScope scope(env->isolate()); + ARGS_THIS(args[0].As()) - ARGS_THIS(args.This()) - SLICE_START_END(args[1], args[2], obj_length) - args.GetReturnValue().Set(args.This()); + size_t start = args[2]->Uint32Value(); + size_t end = args[3]->Uint32Value(); + size_t length = end - start; + CHECK(length + start <= obj_length); - if (args[0]->IsNumber()) { - int value = args[0]->Uint32Value() & 255; + if (args[1]->IsNumber()) { + int value = args[1]->Uint32Value() & 255; memset(obj_data + start, value, length); return; } - node::Utf8Value at(args[0]); - size_t at_length = at.length(); + node::Utf8Value str(args[1]); + size_t str_length = str.length(); + size_t in_there = str_length; + char* ptr = obj_data + start + str_length; - // optimize single ascii character case - if (at_length == 1) { - int value = static_cast((*at)[0]); - memset(obj_data + start, value, length); + if (str_length == 0) return; - } - size_t in_there = at_length; - char* ptr = obj_data + start + at_length; + memcpy(obj_data + start, *str, MIN(str_length, length)); - memcpy(obj_data + start, *at, MIN(at_length, length)); - - if (at_length >= length) + if (str_length >= length) return; while (in_there < length - in_there) { @@ -660,7 +654,6 @@ void SetupBufferJS(const FunctionCallbackInfo& args) { NODE_SET_METHOD(proto, "writeFloatLE", WriteFloatLE); NODE_SET_METHOD(proto, "copy", Copy); - NODE_SET_METHOD(proto, "fill", Fill); // for backwards compatibility proto->Set(env->offset_string(), @@ -670,16 +663,11 @@ void SetupBufferJS(const FunctionCallbackInfo& args) { assert(args[1]->IsObject()); Local internal = args[1].As(); + ASSERT(internal->IsObject()); - Local byte_length = FunctionTemplate::New( - env->isolate(), ByteLength)->GetFunction(); - byte_length->SetName(env->byte_length_string()); - internal->Set(env->byte_length_string(), byte_length); - - Local compare = FunctionTemplate::New( - env->isolate(), Compare)->GetFunction(); - compare->SetName(env->compare_string()); - internal->Set(env->compare_string(), compare); + NODE_SET_METHOD(internal, "byteLength", ByteLength); + NODE_SET_METHOD(internal, "compare", Compare); + NODE_SET_METHOD(internal, "fill", Fill); } diff --git a/test/simple/test-buffer.js b/test/simple/test-buffer.js index 70cc5908af4..4219a15be54 100644 --- a/test/simple/test-buffer.js +++ b/test/simple/test-buffer.js @@ -49,6 +49,56 @@ var c = new Buffer(512); console.log('c.length == %d', c.length); assert.strictEqual(512, c.length); +// First check Buffer#fill() works as expected. + +assert.throws(function() { + Buffer(8).fill('a', -1); +}); + +assert.throws(function() { + Buffer(8).fill('a', 0, 9); +}); + +// Make sure this doesn't hang indefinitely. +Buffer(8).fill(''); + +var buf = new Buffer(64); +buf.fill(10); +for (var i = 0; i < buf.length; i++) + assert.equal(buf[i], 10); + +buf.fill(11, 0, buf.length >> 1); +for (var i = 0; i < buf.length >> 1; i++) + assert.equal(buf[i], 11); +for (var i = (buf.length >> 1) + 1; i < buf.length; i++) + assert.equal(buf[i], 10); + +buf.fill('h'); +for (var i = 0; i < buf.length; i++) + assert.equal('h'.charCodeAt(0), buf[i]); + +buf.fill(0); +for (var i = 0; i < buf.length; i++) + assert.equal(0, buf[i]); + +buf.fill(null); +for (var i = 0; i < buf.length; i++) + assert.equal(0, buf[i]); + +buf.fill(1, 16, 32); +for (var i = 0; i < 16; i++) + assert.equal(0, buf[i]); +for (; i < 32; i++) + assert.equal(1, buf[i]); +for (; i < buf.length; i++) + assert.equal(0, buf[i]); + +var buf = new Buffer(10); +buf.fill('abc'); +assert.equal(buf.toString(), 'abcabcabca'); +buf.fill('է'); +assert.equal(buf.toString(), 'էէէէէ'); + // copy 512 bytes, from 0 to 512. b.fill(++cntr); c.fill(++cntr); @@ -642,28 +692,6 @@ assert.equal(0x6f, z[1]); assert.equal(0, Buffer('hello').slice(0, 0).length); -b = new Buffer(50); -b.fill('h'); -for (var i = 0; i < b.length; i++) { - assert.equal('h'.charCodeAt(0), b[i]); -} - -b.fill(0); -for (var i = 0; i < b.length; i++) { - assert.equal(0, b[i]); -} - -b.fill(1, 16, 32); -for (var i = 0; i < 16; i++) assert.equal(0, b[i]); -for (; i < 32; i++) assert.equal(1, b[i]); -for (; i < b.length; i++) assert.equal(0, b[i]); - -var buf = new Buffer(10); -buf.fill('abc'); -assert.equal(buf.toString(), 'abcabcabca'); -buf.fill('է'); -assert.equal(buf.toString(), 'էէէէէ'); - ['ucs2', 'ucs-2', 'utf16le', 'utf-16le'].forEach(function(encoding) { var b = new Buffer(10); b.write('あいうえお', encoding); From 1781c8b85bbabc4c5c1e054bd5c50903cc0eb47b Mon Sep 17 00:00:00 2001 From: Jackson Tian Date: Wed, 24 Sep 2014 13:14:48 +0800 Subject: [PATCH 033/144] http: Improve _addHeaderLines method Reviewed-By: Chris Dickinson Reviewed-By: Trevor Norris --- lib/_http_incoming.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/_http_incoming.js b/lib/_http_incoming.js index b31754d95b1..69d3d86ec6a 100644 --- a/lib/_http_incoming.js +++ b/lib/_http_incoming.js @@ -125,11 +125,12 @@ IncomingMessage.prototype._addHeaderLines = function(headers, n) { raw = this.rawHeaders; dest = this.headers; } - raw.push.apply(raw, headers); for (var i = 0; i < n; i += 2) { var k = headers[i]; var v = headers[i + 1]; + raw.push(k); + raw.push(v); this._addHeaderLine(k, v, dest); } } From 95726b0fce0ae1ae60591f0a535515e8dabfd6df Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Tue, 23 Sep 2014 16:51:33 +0200 Subject: [PATCH 034/144] doc: note stdout and stderr special behaviors. Reviewed-By: Trevor Norris Reviewed-By: Chris Dickinson --- doc/api/process.markdown | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/api/process.markdown b/doc/api/process.markdown index 68bb2a66539..614f5cf07aa 100644 --- a/doc/api/process.markdown +++ b/doc/api/process.markdown @@ -181,7 +181,8 @@ Example: the definition of `console.log` }; `process.stderr` and `process.stdout` are unlike other streams in Node in -that writes to them are usually blocking. +that they cannot be closed (`end()` will throw), they never emit the `finish` +event and that writes are usually blocking. - They are blocking in the case that they refer to regular files or TTY file descriptors. @@ -209,7 +210,8 @@ See [the tty docs](tty.html#tty_tty) for more information. A writable stream to stderr. `process.stderr` and `process.stdout` are unlike other streams in Node in -that writes to them are usually blocking. +that they cannot be closed (`end()` will throw), they never emit the `finish` +event and that writes are usually blocking. - They are blocking in the case that they refer to regular files or TTY file descriptors. From ac2857b12cd819b68405b15c3f8e95e48bcc32d8 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 4 Sep 2014 22:03:24 -0700 Subject: [PATCH 035/144] build, i18n: improve Intl build, add "--with-intl" The two main goals of this change are: - To make it easier to build the Intl option using ICU (particularly, using a newer ICU than v8/Chromium's version) - To enable a much smaller ICU build with only English support The goal here is to get node.js binaries built this way by default so that the Intl API can be used. Additional data can be added at execution time (see Readme and wiki) More details are at https://github.com/joyent/node/pull/7719 In particular, this change adds the "--with-intl=" configure option to provide more ways of building "Intl": - "full-icu" picks up an ICU from deps/icu - "small-icu" is similar, but builds only English - "system-icu" uses pkg-config to find an installed ICU - "none" does nothing (no Intl) For Windows builds, the "full-icu" or "small-icu" options are added to vcbuild.bat. Note that the existing "--with-icu-path" option is not removed from configure, but may not be used alongside the new option. Wiki changes have already been made on https://github.com/joyent/node/wiki/Installation and a new page created at https://github.com/joyent/node/wiki/Intl (marked as provisional until this change lands.) Summary of changes: * README.md : doc updates * .gitignore : added "deps/icu" as this is the location where ICU is unpacked to. * Makefile : added the tools/icu/* files to cpplint, but excluded a problematic file. * configure : added the "--with-intl" option mentioned above. Calculate at config time the list of ICU source files to use and data packaging options. * node.gyp : add the new files src/node_i18n.cc/.h as well as ICU linkage. * src/node.cc : add call into node::i18n::InitializeICUDirectory(icu_data_dir) as well as new --icu-data-dir option and NODE_ICU_DATA env variable to configure ICU data loading. This loading is only relevant in the "small" configuration. * src/node_i18n.cc : new source file for the above Initialize.. function, to setup ICU as needed. * tools/icu : new directory with some tools needed for this build. * tools/icu/icu-generic.gyp : new .gyp file that builds ICU in some new ways, both on unix/mac and windows. * tools/icu/icu-system.gyp : new .gyp file to build node against a pkg-config detected ICU. * tools/icu/icu_small.json : new config file for the "English-only" small build. * tools/icu/icutrim.py : new tool for trimming down ICU data. Reads the above .json file. * tools/icu/iculslocs.cc : new tool for repairing ICU data manifests after trim operation. * tools/icu/no-op.cc : dummy file to force .gyp into using a C++ linker. * vcbuild.bat : added small-icu and full-icu options, to call into configure. * Fixed toolset dependencies, see https://github.com/joyent/node/pull/7719#issuecomment-54641687 Note that because of a bug in gyp {CC,CXX}_host must also be set. Otherwise gcc/g++ will be used by default for part of the build. Reviewed-by: Trevor Norris Reviewed-by: Fedor Indutny --- .gitignore | 1 + Makefile | 2 +- README.md | 44 ++-- configure | 142 ++++++++++++- node.gyp | 13 ++ src/node.cc | 39 ++++ src/node_i18n.cc | 88 ++++++++ src/node_i18n.h | 39 ++++ tools/icu/README.md | 26 +++ tools/icu/icu-generic.gyp | 414 ++++++++++++++++++++++++++++++++++++++ tools/icu/icu-system.gyp | 18 ++ tools/icu/icu_small.json | 47 +++++ tools/icu/iculslocs.cc | 388 +++++++++++++++++++++++++++++++++++ tools/icu/icutrim.py | 338 +++++++++++++++++++++++++++++++ tools/icu/no-op.cc | 18 ++ vcbuild.bat | 8 +- 16 files changed, 1605 insertions(+), 20 deletions(-) create mode 100644 src/node_i18n.cc create mode 100644 src/node_i18n.h create mode 100644 tools/icu/README.md create mode 100644 tools/icu/icu-generic.gyp create mode 100644 tools/icu/icu-system.gyp create mode 100644 tools/icu/icu_small.json create mode 100644 tools/icu/iculslocs.cc create mode 100755 tools/icu/icutrim.py create mode 100644 tools/icu/no-op.cc diff --git a/.gitignore b/.gitignore index e00450690da..f5b0105840e 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,7 @@ ipch/ /test/addons/doc-*/ email.md deps/v8-* +deps/icu ./node_modules .svn/ diff --git a/Makefile b/Makefile index 11304e118f3..fb854603d8b 100644 --- a/Makefile +++ b/Makefile @@ -406,7 +406,7 @@ CPPLINT_EXCLUDE += src/queue.h CPPLINT_EXCLUDE += src/tree.h CPPLINT_EXCLUDE += src/v8abbr.h -CPPLINT_FILES = $(filter-out $(CPPLINT_EXCLUDE), $(wildcard src/*.cc src/*.h src/*.c)) +CPPLINT_FILES = $(filter-out $(CPPLINT_EXCLUDE), $(wildcard src/*.cc src/*.h src/*.c tools/icu/*.h tools/icu/*.cc)) cpplint: @$(PYTHON) tools/cpplint.py $(CPPLINT_FILES) diff --git a/README.md b/README.md index f1301a0df76..0032c63c073 100644 --- a/README.md +++ b/README.md @@ -19,17 +19,6 @@ make make install ``` -With libicu i18n support: - -```sh -svn checkout --force --revision 214189 \ - http://src.chromium.org/svn/trunk/deps/third_party/icu46 \ - deps/v8/third_party/icu46 -./configure --with-icu-path=deps/v8/third_party/icu46/icu.gyp -make -make install -``` - If your python binary is in a non-standard location or has a non-standard name, run the following instead: @@ -47,7 +36,9 @@ Prerequisites (Windows only): Windows: - vcbuild nosign +```sh +vcbuild nosign +``` You can download pre-built binaries for various operating systems from [http://nodejs.org/download/](http://nodejs.org/download/). The Windows @@ -92,6 +83,35 @@ make doc man doc/node.1 ``` +### To build `Intl` (ECMA-402) support: + +*Note:* more docs, including how to reduce disk footprint, are on +[the wiki](https://github.com/joyent/node/wiki/Intl). + +#### Use existing installed ICU (Unix/Macintosh only): + +```sh +pkg-config --modversion icu-i18n && ./configure --with-intl=system-icu +``` + +#### Build ICU from source: + +First: Unpack latest ICU + [icu4c-**##.#**-src.tgz](http://icu-project.org/download) (or `.zip`) + as `deps/icu` (You'll have: `deps/icu/source/...`) + +Unix/Macintosh: + +```sh +./configure --with-intl=full-icu +``` + +Windows: + +```sh +vcbuild full-icu +``` + Resources for Newcomers --- - [The Wiki](https://github.com/joyent/node/wiki) diff --git a/configure b/configure index 2e085832546..6db8703201e 100755 --- a/configure +++ b/configure @@ -241,6 +241,11 @@ parser.add_option('--with-icu-path', dest='with_icu_path', help='Path to icu.gyp (ICU i18n, Chromium version only.)') +parser.add_option('--with-intl', + action='store', + dest='with_intl', + help='Intl mode: none, full-icu, small-icu (default is none)') + parser.add_option('--with-perfctr', action='store_true', dest='with_perfctr', @@ -686,13 +691,138 @@ def configure_winsdk(o): print('ctrpp not found in WinSDK path--using pre-gen files ' 'from tools/msvs/genfiles.') - -def configure_icu(o): +def glob_to_var(dir_base, dir_sub): + list = [] + dir_all = os.path.join(dir_base, dir_sub) + files = os.walk(dir_all) + for ent in files: + (path, dirs, files) = ent + for file in files: + if file.endswith('.cpp') or file.endswith('.c') or file.endswith('.h'): + list.append('%s/%s' % (dir_sub, file)) + break + return list + + +def configure_intl(o): + # small ICU is off by default. + # always set icu_small, node.gyp depends on it being defined. + o['variables']['icu_small'] = b(False) + + with_intl = options.with_intl have_icu_path = bool(options.with_icu_path) - o['variables']['v8_enable_i18n_support'] = int(have_icu_path) - if have_icu_path: + if have_icu_path and with_intl: + print 'Error: Cannot specify both --with-icu-path and --with-intl' + sys.exit(1) + elif have_icu_path: + # Chromium .gyp mode: --with-icu-path + o['variables']['v8_enable_i18n_support'] = 1 + # use the .gyp given o['variables']['icu_gyp_path'] = options.with_icu_path - + return + # --with-intl= + if with_intl == 'none' or with_intl is None: + o['variables']['v8_enable_i18n_support'] = 0 + return # no Intl + elif with_intl == 'small-icu': + # small ICU (English only) + o['variables']['v8_enable_i18n_support'] = 1 + o['variables']['icu_small'] = b(True) + elif with_intl == 'full-icu': + # full ICU + o['variables']['v8_enable_i18n_support'] = 1 + elif with_intl == 'system-icu': + # ICU from pkg-config. + o['variables']['v8_enable_i18n_support'] = 1 + pkgicu = pkg_config('icu-i18n') + if not pkgicu: + print 'Error: could not load pkg-config data for "icu-i18n".' + print 'See above errors or the README.md.' + sys.exit(1) + (libs, cflags) = pkgicu + o['libraries'] += libs.split() + o['cflags'] += cflags.split() + # use the "system" .gyp + o['variables']['icu_gyp_path'] = 'tools/icu/icu-system.gyp' + return + else: + print 'Error: unknown value --with-intl=%s' % with_intl + sys.exit(1) + # Note: non-ICU implementations could use other 'with_intl' + # values. + + # ICU mode. (icu-generic.gyp) + byteorder = sys.byteorder + o['variables']['icu_gyp_path'] = 'tools/icu/icu-generic.gyp' + # ICU source dir relative to root + icu_full_path = os.path.join(root_dir, 'deps/icu') + o['variables']['icu_path'] = icu_full_path + if not os.path.isdir(icu_full_path): + print 'Error: ICU path is not a directory: %s' % (icu_full_path) + sys.exit(1) + # Now, what version of ICU is it? We just need the "major", such as 54. + # uvernum.h contains it as a #define. + uvernum_h = os.path.join(icu_full_path, 'source/common/unicode/uvernum.h') + if not os.path.isfile(uvernum_h): + print 'Error: could not load %s - is ICU installed?' % uvernum_h + sys.exit(1) + icu_ver_major = None + matchVerExp = r'^\s*#define\s+U_ICU_VERSION_SHORT\s+"([^"]*)".*' + match_version = re.compile(matchVerExp) + for line in open(uvernum_h).readlines(): + m = match_version.match(line) + if m: + icu_ver_major = m.group(1) + if not icu_ver_major: + print 'Could not read U_ICU_VERSION_SHORT version from %s' % uvernum_h + sys.exit(1) + icu_endianness = sys.byteorder[0]; # TODO(srl295): EBCDIC should be 'e' + o['variables']['icu_ver_major'] = icu_ver_major + o['variables']['icu_endianness'] = icu_endianness + icu_data_file_l = 'icudt%s%s.dat' % (icu_ver_major, 'l') + icu_data_file = 'icudt%s%s.dat' % (icu_ver_major, icu_endianness) + # relative to configure + icu_data_path = os.path.join(icu_full_path, + 'source/data/in', + icu_data_file_l) + # relative to dep.. + icu_data_in = os.path.join('../../deps/icu/source/data/in', icu_data_file_l) + if not os.path.isfile(icu_data_path) and icu_endianness != 'l': + # use host endianness + icu_data_path = os.path.join(icu_full_path, + 'source/data/in', + icu_data_file) + # relative to dep.. + icu_data_in = os.path.join('icu/source/data/in', + icu_data_file) + # this is the input '.dat' file to use .. icudt*.dat + # may be little-endian if from a icu-project.org tarball + o['variables']['icu_data_in'] = icu_data_in + # this is the icudt*.dat file which node will be using (platform endianness) + o['variables']['icu_data_file'] = icu_data_file + if not os.path.isfile(icu_data_path): + print 'Error: ICU prebuilt data file %s does not exist.' % icu_data_path + print 'See the README.md.' + # .. and we're not about to build it from .gyp! + sys.exit(1) + # map from variable name to subdirs + icu_src = { + 'stubdata': 'stubdata', + 'common': 'common', + 'i18n': 'i18n', + 'io': 'io', + 'tools': 'tools/toolutil', + 'genccode': 'tools/genccode', + 'genrb': 'tools/genrb', + 'icupkg': 'tools/icupkg', + } + # this creates a variable icu_src_XXX for each of the subdirs + # with a list of the src files to use + for i in icu_src: + var = 'icu_src_%s' % i + path = '../../deps/icu/source/%s' % icu_src[i] + o['variables'][var] = glob_to_var('tools/icu', path) + return # end of configure_intl # determine the "flavor" (operating system) we're building for, # leveraging gyp's GetFlavor function @@ -717,7 +847,7 @@ configure_libuv(output) configure_v8(output) configure_openssl(output) configure_winsdk(output) -configure_icu(output) +configure_intl(output) configure_fullystatic(output) # variables should be a root level element, diff --git a/node.gyp b/node.gyp index 24c8860ac17..de48ae83785 100644 --- a/node.gyp +++ b/node.gyp @@ -103,6 +103,7 @@ 'src/node_stat_watcher.cc', 'src/node_watchdog.cc', 'src/node_zlib.cc', + 'src/node_i18n.cc', 'src/pipe_wrap.cc', 'src/signal_wrap.cc', 'src/smalloc.cc', @@ -134,6 +135,7 @@ 'src/node_version.h', 'src/node_watchdog.h', 'src/node_wrap.h', + 'src/node_i18n.h', 'src/pipe_wrap.h', 'src/queue.h', 'src/smalloc.h', @@ -164,6 +166,17 @@ ], 'conditions': [ + [ 'v8_enable_i18n_support==1', { + 'defines': [ 'NODE_HAVE_I18N_SUPPORT=1' ], + 'dependencies': [ + '<(icu_gyp_path):icui18n', + '<(icu_gyp_path):icuuc', + ], + 'conditions': [ + [ 'icu_small=="true"', { + 'defines': [ 'NODE_HAVE_SMALL_ICU=1' ], + }]], + }], [ 'node_use_openssl=="true"', { 'defines': [ 'HAVE_OPENSSL=1' ], 'sources': [ diff --git a/src/node.cc b/src/node.cc index cf8f4ccbb5a..23edf4d4e2c 100644 --- a/src/node.cc +++ b/src/node.cc @@ -35,6 +35,10 @@ #include "node_crypto.h" #endif +#if defined(NODE_HAVE_I18N_SUPPORT) +#include "node_i18n.h" +#endif + #if defined HAVE_DTRACE || defined HAVE_ETW #include "node_dtrace.h" #endif @@ -135,6 +139,11 @@ static node_module* modpending; static node_module* modlist_builtin; static node_module* modlist_addon; +#if defined(NODE_HAVE_I18N_SUPPORT) +// Path to ICU data (for i18n / Intl) +static const char* icu_data_dir = NULL; +#endif + // used by C++ modules as well bool no_deprecation = false; @@ -2953,6 +2962,14 @@ static void PrintHelp() { " --trace-deprecation show stack traces on deprecations\n" " --v8-options print v8 command line options\n" " --max-stack-size=val set max v8 stack size (bytes)\n" +#if defined(NODE_HAVE_I18N_SUPPORT) + " --icu-data-dir=dir set ICU data load path to dir\n" + " (overrides NODE_ICU_DATA)\n" +#if !defined(NODE_HAVE_SMALL_ICU) + " Note: linked-in ICU data is\n" + " present.\n" +#endif +#endif "\n" "Environment variables:\n" #ifdef _WIN32 @@ -2964,6 +2981,12 @@ static void PrintHelp() { "NODE_MODULE_CONTEXTS Set to 1 to load modules in their own\n" " global contexts.\n" "NODE_DISABLE_COLORS Set to 1 to disable colors in the REPL\n" +#if defined(NODE_HAVE_I18N_SUPPORT) + "NODE_ICU_DATA Data path for ICU (Intl object) data\n" +#if !defined(NODE_HAVE_SMALL_ICU) + " (will extend linked-in data)\n" +#endif +#endif "\n" "Documentation can be found at http://nodejs.org/\n"); } @@ -3054,6 +3077,10 @@ static void ParseArgs(int* argc, } else if (strcmp(arg, "--v8-options") == 0) { new_v8_argv[new_v8_argc] = "--help"; new_v8_argc += 1; +#if defined(NODE_HAVE_I18N_SUPPORT) + } else if (strncmp(arg, "--icu-data-dir=", 15) == 0) { + icu_data_dir = arg + 15; +#endif } else { // V8 option. Pass through as-is. new_v8_argv[new_v8_argc] = arg; @@ -3410,6 +3437,18 @@ void Init(int* argc, } } +#if defined(NODE_HAVE_I18N_SUPPORT) + if (icu_data_dir == NULL) { + // if the parameter isn't given, use the env variable. + icu_data_dir = getenv("NODE_ICU_DATA"); + } + // Initialize ICU. + // If icu_data_dir is NULL here, it will load the 'minimal' data. + if (!i18n::InitializeICUDirectory(icu_data_dir)) { + FatalError(NULL, "Could not initialize ICU " + "(check NODE_ICU_DATA or --icu-data-dir parameters)"); + } +#endif // The const_cast doesn't violate conceptual const-ness. V8 doesn't modify // the argv array or the elements it points to. V8::SetFlagsFromCommandLine(&v8_argc, const_cast(v8_argv), true); diff --git a/src/node_i18n.cc b/src/node_i18n.cc new file mode 100644 index 00000000000..6d6144dc782 --- /dev/null +++ b/src/node_i18n.cc @@ -0,0 +1,88 @@ +// 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. + + +/* + * notes: by srl295 + * - When in NODE_HAVE_SMALL_ICU mode, ICU is linked against "stub" (null) data + * ( stubdata/libicudata.a ) containing nothing, no data, and it's also + * linked against a "small" data file which the SMALL_ICUDATA_ENTRY_POINT + * macro names. That's the "english+root" data. + * + * If icu_data_path is non-null, the user has provided a path and we assume + * it goes somewhere useful. We set that path in ICU, and exit. + * If icu_data_path is null, they haven't set a path and we want the + * "english+root" data. We call + * udata_setCommonData(SMALL_ICUDATA_ENTRY_POINT,...) + * to load up the english+root data. + * + * - when NOT in NODE_HAVE_SMALL_ICU mode, ICU is linked directly with its full + * data. All of the variables and command line options for changing data at + * runtime are disabled, as they wouldn't fully override the internal data. + * See: http://bugs.icu-project.org/trac/ticket/10924 + */ + + +#include "node_i18n.h" + +#if defined(NODE_HAVE_I18N_SUPPORT) + +#include +#include + +#ifdef NODE_HAVE_SMALL_ICU +/* if this is defined, we have a 'secondary' entry point. + compare following to utypes.h defs for U_ICUDATA_ENTRY_POINT */ +#define SMALL_ICUDATA_ENTRY_POINT \ + SMALL_DEF2(U_ICU_VERSION_MAJOR_NUM, U_LIB_SUFFIX_C_NAME) +#define SMALL_DEF2(major, suff) SMALL_DEF(major, suff) +#ifndef U_LIB_SUFFIX_C_NAME +#define SMALL_DEF(major, suff) icusmdt##major##_dat +#else +#define SMALL_DEF(major, suff) icusmdt##suff##major##_dat +#endif + +extern "C" const char U_DATA_API SMALL_ICUDATA_ENTRY_POINT[]; +#endif + +namespace node { +namespace i18n { + +bool InitializeICUDirectory(const char* icu_data_path) { + if (icu_data_path != NULL) { + u_setDataDirectory(icu_data_path); + return true; // no error + } else { + UErrorCode status = U_ZERO_ERROR; +#ifdef NODE_HAVE_SMALL_ICU + // install the 'small' data. + udata_setCommonData(&SMALL_ICUDATA_ENTRY_POINT, &status); +#else // !NODE_HAVE_SMALL_ICU + // no small data, so nothing to do. +#endif // !NODE_HAVE_SMALL_ICU + return (status == U_ZERO_ERROR); + } +} + +} // namespace i18n +} // namespace node + +#endif // NODE_HAVE_I18N_SUPPORT diff --git a/src/node_i18n.h b/src/node_i18n.h new file mode 100644 index 00000000000..f6807a911ec --- /dev/null +++ b/src/node_i18n.h @@ -0,0 +1,39 @@ +// 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. + +#ifndef SRC_NODE_I18N_H_ +#define SRC_NODE_I18N_H_ + +#include "node.h" + +#if defined(NODE_HAVE_I18N_SUPPORT) + +namespace node { +namespace i18n { + +NODE_EXTERN bool InitializeICUDirectory(const char* icu_data_path); + +} // namespace i18n +} // namespace node + +#endif // NODE_HAVE_I18N_SUPPORT + +#endif // SRC_NODE_I18N_H_ diff --git a/tools/icu/README.md b/tools/icu/README.md new file mode 100644 index 00000000000..40d5287d9f1 --- /dev/null +++ b/tools/icu/README.md @@ -0,0 +1,26 @@ +Notes about the icu directory. +=== + +The files in this directory were written for the node.js effort. It's +the intent of their author (Steven R. Loomis / srl295) to merge them +upstream into ICU, pending much discussion within the ICU-PMC. + +`icu_small.json` is somewhat node-specific as it specifies a "small ICU" +configuration file for the `icutrim.py` script. `icutrim.py` and +`iculslocs.cpp` may themselves be superseded by components built into +ICU in the future. + +The following tickets were opened during this work, and their +resolution may inform the reader as to the current state of icu-trim +upstream: + + * [#10919](http://bugs.icu-project.org/trac/ticket/10919) + (experimental branch - may copy any source patches here) + * [#10922](http://bugs.icu-project.org/trac/ticket/10922) + (data packaging improvements) + * [#10923](http://bugs.icu-project.org/trac/ticket/10923) + (rewrite data building in python) + +When/if components (not including the `.json` file) are merged into +ICU, this code and `configure` will be updated to detect and use those +variants rather than the ones in this directory. diff --git a/tools/icu/icu-generic.gyp b/tools/icu/icu-generic.gyp new file mode 100644 index 00000000000..fa5e5773b2b --- /dev/null +++ b/tools/icu/icu-generic.gyp @@ -0,0 +1,414 @@ +# Copyright (c) IBM Corporation and Others. All Rights Reserved. +# very loosely based on icu.gyp from Chromium: +# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + + +{ + 'variables': { + 'icu_src_derb': [ '../../deps/icu/source/tools/genrb/derb.c' ], + }, + 'targets': [ + { + # a target to hold uconfig defines. + # for now these are hard coded, but could be defined. + 'target_name': 'icu_uconfig', + 'type': 'none', + 'toolsets': [ 'host', 'target' ], + 'direct_dependent_settings': { + 'defines': [ + 'UCONFIG_NO_LEGACY_CONVERSION=1', + 'UCONFIG_NO_IDNA=1', + 'UCONFIG_NO_TRANSLITERATION=1', + 'UCONFIG_NO_SERVICE=1', + 'UCONFIG_NO_REGULAR_EXPRESSIONS=1', + 'U_ENABLE_DYLOAD=0', + 'U_STATIC_IMPLEMENTATION=1', + # TODO(srl295): reenable following pending + # https://code.google.com/p/v8/issues/detail?id=3345 + # (saves some space) + 'UCONFIG_NO_BREAK_ITERATION=0', + ], + } + }, + { + # a target to hold common settings. + # make any target that is ICU implementation depend on this. + 'target_name': 'icu_implementation', + 'toolsets': [ 'host', 'target' ], + 'type': 'none', + 'direct_dependent_settings': { + 'conditions': [ + [ 'os_posix == 1 and OS != "mac" and OS != "ios"', { + 'cflags': [ '-Wno-deprecated-declarations' ], + 'cflags_cc': [ '-frtti' ], + }], + [ 'OS == "mac" or OS == "ios"', { + 'xcode_settings': {'GCC_ENABLE_CPP_RTTI': 'YES' }, + }], + [ 'OS == "win"', { + 'msvs_settings': { + 'VCCLCompilerTool': {'RuntimeTypeInfo': 'true'}, + } + }], + ], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeTypeInfo': 'true', + 'ExceptionHandling': '1', + }, + }, + 'configurations': { + # TODO: why does this need to be redefined for Release and Debug? + # Maybe this should be pushed into common.gypi with an "if v8 i18n"? + 'Release': { + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeTypeInfo': 'true', + 'ExceptionHandling': '1', + }, + }, + }, + 'Debug': { + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeTypeInfo': 'true', + 'ExceptionHandling': '1', + }, + }, + }, + }, + 'defines': [ + 'U_ATTRIBUTE_DEPRECATED=', + '_CRT_SECURE_NO_DEPRECATE=', + 'U_STATIC_IMPLEMENTATION=1', + ], + }, + }, + { + 'target_name': 'icui18n', + 'type': '<(library)', + 'toolsets': [ 'host', 'target' ], + 'sources': [ + '<@(icu_src_i18n)' + ], + 'include_dirs': [ + '../../deps/icu/source/i18n', + ], + 'defines': [ + 'U_I18N_IMPLEMENTATION=1', + ], + 'dependencies': [ 'icuucx', 'icu_implementation', 'icu_uconfig' ], + 'direct_dependent_settings': { + 'include_dirs': [ + '../../deps/icu/source/i18n', + ], + }, + 'export_dependent_settings': [ 'icuucx' ], + }, + # this library is only built for derb.. + { + 'target_name': 'icuio', + 'type': '<(library)', + 'toolsets': [ 'host' ], + 'sources': [ + '<@(icu_src_io)' + ], + 'include_dirs': [ + '../../deps/icu/source/io', + ], + 'defines': [ + 'U_IO_IMPLEMENTATION=1', + ], + 'dependencies': [ 'icuucx', 'icui18n', 'icu_implementation', 'icu_uconfig' ], + 'direct_dependent_settings': { + 'include_dirs': [ + '../../deps/icu/source/io', + ], + }, + 'export_dependent_settings': [ 'icuucx', 'icui18n' ], + }, + # This exports actual ICU data + { + 'target_name': 'icudata', + 'type': '<(library)', + 'toolsets': [ 'target' ], + 'conditions': [ + [ 'OS == "win"', { + 'conditions': [ + [ 'icu_small == "false"', { # and OS=win + # full data - just build the full data file, then we are done. + 'sources': [ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major)<(icu_endianness)_dat.obj' ], + 'dependencies': [ 'genccode#host' ], + 'actions': [ + { + 'action_name': 'icudata', + 'inputs': [ '<(icu_data_in)' ], + 'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major)<(icu_endianness)_dat.obj' ], + 'action': [ '<(PRODUCT_DIR)/genccode', + '-o', + '-d', '<(SHARED_INTERMEDIATE_DIR)', + '-n', 'icudata', + '-e', 'icudt<(icu_ver_major)', + '<@(_inputs)' ], + }, + ], + }, { # icu_small == TRUE and OS == win + # link against stub data primarily + # then, use icupkg and genccode to rebuild data + 'dependencies': [ 'icustubdata', 'genccode#host', 'icupkg#host', 'genrb#host', 'iculslocs#host' ], + 'export_dependent_settings': [ 'icustubdata' ], + 'actions': [ + { + # trim down ICU + 'action_name': 'icutrim', + 'inputs': [ '<(icu_data_in)', 'icu_small.json' ], + 'outputs': [ '../../out/icutmp/icudt<(icu_ver_major)<(icu_endianness).dat' ], + 'action': [ 'python', + 'icutrim.py', + '-P', '../../<(CONFIGURATION_NAME)', + '-D', '<(icu_data_in)', + '--delete-tmp', + '-T', '../../out/icutmp', + '-F', 'icu_small.json', + '-O', 'icudt<(icu_ver_major)<(icu_endianness).dat', + '-v' ], + }, + { + # build final .dat -> .obj + 'action_name': 'genccode', + 'inputs': [ '../../out/icutmp/icudt<(icu_ver_major)<(icu_endianness).dat' ], + 'outputs': [ '../../out/icudt<(icu_ver_major)<(icu_endianness)_dat.obj' ], + 'action': [ '../../<(CONFIGURATION_NAME)/genccode', + '-o', + '-d', '../../out/', + '-n', 'icudata', + '-e', 'icusmdt<(icu_ver_major)', + '<@(_inputs)' ], + }, + ], + # This file contains the small ICU data. + 'sources': [ '../../out/icudt<(icu_ver_major)<(icu_endianness)_dat.obj' ], + } ] ], #end of OS==win and icu_small == true + }, { # OS != win + 'conditions': [ + [ 'icu_small == "false"', { + # full data - just build the full data file, then we are done. + 'sources': [ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major)_dat.c' ], + 'dependencies': [ 'genccode#host', 'icupkg#host', 'icu_implementation#host', 'icu_uconfig' ], + 'include_dirs': [ + '../../deps/icu/source/common', + ], + 'actions': [ + { + # Swap endianness (if needed), or at least copy the file + 'action_name': 'icupkg', + 'inputs': [ '<(icu_data_in)' ], + 'outputs':[ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major)<(icu_endianness).dat' ], + 'action': [ '<(PRODUCT_DIR)/icupkg', + '-t<(icu_endianness)', + '<@(_inputs)', + '<@(_outputs)', + ], + }, + { + # Rename without the endianness marker + 'action_name': 'copy', + 'inputs': [ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major)<(icu_endianness).dat' ], + 'outputs':[ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major).dat' ], + 'action': [ 'cp', + '<@(_inputs)', + '<@(_outputs)', + ], + }, + { + 'action_name': 'icudata', + 'inputs': [ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major).dat' ], + 'outputs':[ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major)_dat.c' ], + 'action': [ '<(PRODUCT_DIR)/genccode', + '-e', 'icudt<(icu_ver_major)', + '-d', '<(SHARED_INTERMEDIATE_DIR)', + '-f', 'icudt<(icu_ver_major)_dat', + '<@(_inputs)' ], + }, + ], # end actions + }, { # icu_small == true ( and OS != win ) + # link against stub data (as primary data) + # then, use icupkg and genccode to rebuild small data + 'dependencies': [ 'icustubdata', 'genccode#host', 'icupkg#host', 'genrb#host', 'iculslocs#host', + 'icu_implementation', 'icu_uconfig' ], + 'export_dependent_settings': [ 'icustubdata' ], + 'actions': [ + { + # trim down ICU + 'action_name': 'icutrim', + 'inputs': [ '<(icu_data_in)', 'icu_small.json' ], + 'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/icutmp/icudt<(icu_ver_major)<(icu_endianness).dat' ], + 'action': [ 'python', + 'icutrim.py', + '-P', '<(PRODUCT_DIR)', + '-D', '<(icu_data_in)', + '--delete-tmp', + '-T', '<(SHARED_INTERMEDIATE_DIR)/icutmp', + '-F', 'icu_small.json', + '-O', 'icudt<(icu_ver_major)<(icu_endianness).dat', + '-v' ], + }, { + # rename to get the final entrypoint name right + 'action_name': 'rename', + 'inputs': [ '<(SHARED_INTERMEDIATE_DIR)/icutmp/icudt<(icu_ver_major)<(icu_endianness).dat' ], + 'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/icutmp/icusmdt<(icu_ver_major).dat' ], + 'action': [ 'cp', + '<@(_inputs)', + '<@(_outputs)', + ], + }, { + # build final .dat -> .obj + 'action_name': 'genccode', + 'inputs': [ '<(SHARED_INTERMEDIATE_DIR)/icutmp/icusmdt<(icu_ver_major).dat' ], + 'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/icusmdt<(icu_ver_major)_dat.c' ], + 'action': [ '<(PRODUCT_DIR)/genccode', + '-d', '<(SHARED_INTERMEDIATE_DIR)', + '<@(_inputs)' ], + }, + ], + # This file contains the small ICU data + 'sources': [ '<(SHARED_INTERMEDIATE_DIR)/icusmdt<(icu_ver_major)_dat.c' ], + # for umachine.h + 'include_dirs': [ + '../../deps/icu/source/common', + ], + }]], # end icu_small == true + }]], # end OS != win + }, # end icudata + # icustubdata is a tiny (~1k) symbol with no ICU data in it. + # tools must link against it as they are generating the full data. + { + 'target_name': 'icustubdata', + 'type': '<(library)', + 'toolsets': [ 'host', 'target' ], + 'dependencies': [ 'icu_implementation' ], + 'sources': [ + '<@(icu_src_stubdata)' + ], + 'include_dirs': [ + '../../deps/icu/source/common', + ], + }, + # this target is for v8 consumption. + # it is icuuc + stubdata + # it is only built for target + { + 'target_name': 'icuuc', + 'type': 'none', + 'toolsets': [ 'target' ], + 'dependencies': [ 'icuucx', 'icudata' ], + 'export_dependent_settings': [ 'icuucx', 'icudata' ], + }, + # This is the 'real' icuuc. + # tools can depend on 'icuuc + stubdata' + { + 'target_name': 'icuucx', + 'type': '<(library)', + 'dependencies': [ 'icu_implementation', 'icu_uconfig' ], + 'toolsets': [ 'host', 'target' ], + 'sources': [ + '<@(icu_src_common)' + ], + 'include_dirs': [ + '../../deps/icu/source/common', + ], + 'defines': [ + 'U_COMMON_IMPLEMENTATION=1', + ], + 'export_dependent_settings': [ 'icu_uconfig' ], + 'direct_dependent_settings': { + 'include_dirs': [ + '../../deps/icu/source/common', + ], + 'conditions': [ + [ 'OS=="win"', { + 'link_settings': { + 'libraries': [ '-lAdvAPI32.Lib', '-lUser32.lib' ], + }, + }], + ], + }, + }, + # tools library + { + 'target_name': 'icutools', + 'type': '<(library)', + 'toolsets': [ 'host' ], + 'dependencies': [ 'icuucx', 'icui18n', 'icustubdata' ], + 'sources': [ + '<@(icu_src_tools)' + ], + 'include_dirs': [ + '../../deps/icu/source/tools/toolutil', + ], + 'defines': [ + 'U_TOOLUTIL_IMPLEMENTATION=1', + #'DEBUG=0', # http://bugs.icu-project.org/trac/ticket/10977 + ], + 'direct_dependent_settings': { + 'include_dirs': [ + '../../deps/icu/source/tools/toolutil', + ], + }, + 'export_dependent_settings': [ 'icuucx', 'icui18n', 'icustubdata' ], + }, + # This tool is needed to rebuild .res files from .txt, + # or to build index (res_index.txt) files for small-icu + { + 'target_name': 'genrb', + 'type': 'executable', + 'toolsets': [ 'host' ], + 'dependencies': [ 'icutools', 'icuucx', 'icui18n' ], + 'sources': [ + '<@(icu_src_genrb)' + ], + # derb is a separate executable + # (which is not currently built) + 'sources!': [ + '<@(icu_src_derb)', + 'no-op.cc', + ], + }, + # This tool is used to rebuild res_index.res manifests + { + 'target_name': 'iculslocs', + 'toolsets': [ 'host' ], + 'type': 'executable', + 'dependencies': [ 'icutools', 'icuucx', 'icui18n', 'icuio' ], + 'sources': [ + 'iculslocs.cc', + 'no-op.cc', + ], + }, + # This tool is used to package, unpackage, repackage .dat files + # and convert endianesses + { + 'target_name': 'icupkg', + 'toolsets': [ 'host' ], + 'type': 'executable', + 'dependencies': [ 'icutools', 'icuucx', 'icui18n' ], + 'sources': [ + '<@(icu_src_icupkg)', + 'no-op.cc', + ], + }, + # this is used to convert .dat directly into .obj + { + 'target_name': 'genccode', + 'toolsets': [ 'host' ], + 'type': 'executable', + 'dependencies': [ 'icutools', 'icuucx', 'icui18n' ], + 'sources': [ + '<@(icu_src_genccode)', + 'no-op.cc', + ], + }, + ], +} diff --git a/tools/icu/icu-system.gyp b/tools/icu/icu-system.gyp new file mode 100644 index 00000000000..44d4f5feff4 --- /dev/null +++ b/tools/icu/icu-system.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2014 IBM Corporation and Others. All Rights Reserved. + +# This variant is used for the '--with-intl=system-icu' option. +# 'configure' has already set 'libs' and 'cflags' - so, +# there's nothing to do in these targets. + +{ + 'targets': [ + { + 'target_name': 'icuuc', + 'type': 'none', + }, + { + 'target_name': 'icui18n', + 'type': 'none', + }, + ], +} diff --git a/tools/icu/icu_small.json b/tools/icu/icu_small.json new file mode 100644 index 00000000000..ddf7d1204e8 --- /dev/null +++ b/tools/icu/icu_small.json @@ -0,0 +1,47 @@ +{ + "copyright": "Copyright (c) 2014 IBM Corporation and Others. All Rights Reserved.", + "comment": "icutrim.py config: Trim down ICU to just English, needed for node.js use.", + "variables": { + "none": { + "only": [] + }, + "en_only": { + "only": [ + "root", + "en" + ] + }, + "leavealone": { + } + }, + "trees": { + "ROOT": "en_only", + "brkitr": "none", + "coll": "en_only", + "curr": "en_only", + "lang": "none", + "rbnf": "none", + "region": "none", + "zone": "en_only", + "converters": "none", + "stringprep": "none", + "translit": "none", + "brkfiles": "none", + "brkdict": "none", + "confusables": "none" + }, + "remove": [ + "cnvalias.icu", + "postalCodeData.res", + "uts46.nrm", + "genderList.res", + "brkitr/root.res", + "unames.icu" + ], + "keep": [ + "pool.res", + "supplementalData.res", + "zoneinfo64.res", + "likelySubtags.res" + ] +} diff --git a/tools/icu/iculslocs.cc b/tools/icu/iculslocs.cc new file mode 100644 index 00000000000..66becace0a4 --- /dev/null +++ b/tools/icu/iculslocs.cc @@ -0,0 +1,388 @@ +/* +********************************************************************** +* Copyright (C) 2014, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* +* Created 2014-06-20 by Steven R. Loomis +* +* See: http://bugs.icu-project.org/trac/ticket/10922 +* +*/ + +/* +WHAT IS THIS? + +Here's the problem: It's difficult to reconfigure ICU from the command +line without using the full makefiles. You can do a lot, but not +everything. + +Consider: + + $ icupkg -r 'ja*' icudt53l.dat + +Great, you've now removed the (main) Japanese data. But something's +still wrong-- res_index (and thus, getAvailable* functions) still +claim the locale is present. + +You are reading the source to a tool (using only public API C code) +that can solve this problem. Use as follows: + + $ iculslocs -i . -N icudt53l -b res_index.txt + +.. Generates a NEW res_index.txt (by looking at the .dat file, and +figuring out which locales are actually available. Has commented out +the ones which are no longer available: + + ... + it_SM {""} +// ja {""} +// ja_JP {""} + jgo {""} + ... + +Then you can build and in-place patch it with existing ICU tools: + $ genrb res_index.txt + $ icupkg -a res_index.res icudt53l.dat + +.. Now you have a patched icudt539.dat that not only doesn't have +Japanese, it doesn't *claim* to have Japanese. + +*/ + +#include "string.h" +#include "charstr.h" // ICU internal header +#include +#include +#include + +const char* PROG = "iculslocs"; +const char* NAME = U_ICUDATA_NAME; // assume ICU data +const char* TREE = "ROOT"; +int VERBOSE = 0; + +#define RES_INDEX "res_index" +#define INSTALLEDLOCALES "InstalledLocales" + +CharString packageName; +const char* locale = RES_INDEX; // locale referring to our index + +void usage() { + u_printf("Usage: %s [options]\n", PROG); + u_printf( + "This program lists and optionally regenerates the locale " + "manifests\n" + " in ICU 'res_index.res' files.\n"); + u_printf( + " -i ICUDATA Set ICUDATA dir to ICUDATA.\n" + " NOTE: this must be the first option given.\n"); + u_printf(" -h This Help\n"); + u_printf(" -v Verbose Mode on\n"); + u_printf(" -l List locales to stdout\n"); + u_printf( + " if Verbose mode, then missing (unopenable)" + "locales\n" + " will be listed preceded by a '#'.\n"); + u_printf( + " -b res_index.txt Write 'corrected' bundle " + "to res_index.txt\n" + " missing bundles will be " + "OMITTED\n"); + u_printf( + " -T TREE Choose tree TREE\n" + " (TREE should be one of: \n" + " ROOT, brkitr, coll, curr, lang, rbnf, region, zone)\n"); + // see ureslocs.h and elsewhere + u_printf( + " -N NAME Choose name NAME\n" + " (default: '%s')\n", + U_ICUDATA_NAME); + u_printf( + "\nNOTE: for best results, this tool ought to be " + "linked against\n" + "stubdata. i.e. '%s -l' SHOULD return an error with " + " no data.\n", + PROG); +} + +#define ASSERT_SUCCESS(what) \ + if (U_FAILURE(status)) { \ + u_printf("%s:%d: %s: ERROR: %s %s\n", \ + __FILE__, \ + __LINE__, \ + PROG, \ + u_errorName(status), \ + what); \ + return 1; \ + } + +/** + * @param status changed from reference to pointer to match node.js style + */ +void calculatePackageName(UErrorCode* status) { + packageName.clear(); + if (strcmp(NAME, "NONE")) { + packageName.append(NAME, *status); + if (strcmp(TREE, "ROOT")) { + packageName.append(U_TREE_SEPARATOR_STRING, *status); + packageName.append(TREE, *status); + } + } + if (VERBOSE) { + u_printf("packageName: %s\n", packageName.data()); + } +} + +/** + * Does the locale exist? + * return zero for false, or nonzero if it was openable. + * Assumes calculatePackageName was called. + * @param exists set to TRUE if exists, FALSE otherwise. + * Changed from reference to pointer to match node.js style + * @return 0 on "OK" (success or resource-missing), + * 1 on "FAILURE" (unexpected error) + */ +int localeExists(const char* loc, UBool* exists) { + UErrorCode status = U_ZERO_ERROR; + if (VERBOSE > 1) { + u_printf("Trying to open %s:%s\n", packageName.data(), loc); + } + LocalUResourceBundlePointer aResource( + ures_openDirect(packageName.data(), loc, &status)); + *exists = FALSE; + if (U_SUCCESS(status)) { + *exists = true; + if (VERBOSE > 1) { + u_printf("%s:%s existed!\n", packageName.data(), loc); + } + return 0; + } else if (status == U_MISSING_RESOURCE_ERROR) { + *exists = false; + if (VERBOSE > 1) { + u_printf("%s:%s did NOT exist (%s)!\n", + packageName.data(), + loc, + u_errorName(status)); + } + return 0; // "good" failure + } else { + // some other failure.. + u_printf("%s:%d: %s: ERROR %s opening %s:%s for test.\n", + __FILE__, + __LINE__, + u_errorName(status), + packageName.data(), + loc); + return 1; // abort + } +} + +void printIndent(const LocalUFILEPointer& bf, int indent) { + for (int i = 0; i < indent + 1; i++) { + u_fprintf(bf.getAlias(), " "); + } +} + +/** + * Dumps a table resource contents + * if lev==0, skips INSTALLEDLOCALES + * @return 0 for OK, 1 for err + */ +int dumpAllButInstalledLocales(int lev, + LocalUResourceBundlePointer& bund, + LocalUFILEPointer& bf, + UErrorCode& status) { + ures_resetIterator(bund.getAlias()); + const UBool isTable = (UBool)(ures_getType(bund.getAlias()) == URES_TABLE); + LocalUResourceBundlePointer t; + while (U_SUCCESS(status) && ures_hasNext(bund.getAlias())) { + t.adoptInstead(ures_getNextResource(bund.getAlias(), t.orphan(), &status)); + ASSERT_SUCCESS("while processing table"); + const char* key = ures_getKey(t.getAlias()); + if (VERBOSE > 1) { + u_printf("dump@%d: got key %s\n", lev, key); + } + if (lev == 0 && !strcmp(key, INSTALLEDLOCALES)) { + if (VERBOSE > 1) { + u_printf("dump: skipping '%s' as it must be evaluated.\n", key); + } + } else { + printIndent(bf, lev); + u_fprintf(bf.getAlias(), "%s", key); + switch (ures_getType(t.getAlias())) { + case URES_STRING: { + int32_t len = 0; + const UChar* s = ures_getString(t.getAlias(), &len, &status); + ASSERT_SUCCESS("getting string"); + u_fprintf(bf.getAlias(), ":string {\""); + u_file_write(s, len, bf.getAlias()); + u_fprintf(bf.getAlias(), "\"}"); + } break; + default: { + u_printf("ERROR: unhandled type in dumpAllButInstalledLocales().\n"); + return 1; + } break; + } + u_fprintf(bf.getAlias(), "\n"); + } + } + return 0; +} + +int list(const char* toBundle) { + UErrorCode status = U_ZERO_ERROR; + + LocalUFILEPointer bf; + + if (toBundle != NULL) { + if (VERBOSE) { + u_printf("writing to bundle %s\n", toBundle); + } + // we write UTF-8 with BOM only. No exceptions. + bf.adoptInstead(u_fopen(toBundle, "w", "en_US_POSIX", "UTF-8")); + if (bf.isNull()) { + u_printf("ERROR: Could not open '%s' for writing.\n", toBundle); + return 1; + } + u_fputc(0xFEFF, bf.getAlias()); // write BOM + u_fprintf(bf.getAlias(), "// -*- Coding: utf-8; -*-\n//\n"); + } + + // first, calculate the bundle name. + calculatePackageName(&status); + ASSERT_SUCCESS("calculating package name"); + + if (VERBOSE) { + u_printf("\"locale\": %s\n", locale); + } + + LocalUResourceBundlePointer bund( + ures_openDirect(packageName.data(), locale, &status)); + ASSERT_SUCCESS("while opening the bundle"); + LocalUResourceBundlePointer installedLocales( + ures_getByKey(bund.getAlias(), INSTALLEDLOCALES, NULL, &status)); + ASSERT_SUCCESS("while fetching installed locales"); + + int32_t count = ures_getSize(installedLocales.getAlias()); + if (VERBOSE) { + u_printf("Locales: %d\n", count); + } + + if (bf.isValid()) { + // write the HEADER + u_fprintf(bf.getAlias(), + "// Warning this file is automatically generated\n" + "// Updated by %s based on %s:%s.txt\n", + PROG, + packageName.data(), + locale); + u_fprintf(bf.getAlias(), + "%s:table(nofallback) {\n" + " // First, everything besides InstalledLocales:\n", + locale); + if (dumpAllButInstalledLocales(0, bund, bf, status)) { + u_printf("Error dumping prolog for %s\n", toBundle); + return 1; + } + ASSERT_SUCCESS("while writing prolog"); // in case an error was missed + + u_fprintf(bf.getAlias(), + " %s:table { // %d locales in input %s.res\n", + INSTALLEDLOCALES, + count, + locale); + } + + // OK, now list them. + LocalUResourceBundlePointer subkey; + + int validCount = 0; + for (int32_t i = 0; i < count; i++) { + subkey.adoptInstead(ures_getByIndex( + installedLocales.getAlias(), i, subkey.orphan(), &status)); + ASSERT_SUCCESS("while fetching an installed locale's name"); + + const char* key = ures_getKey(subkey.getAlias()); + if (VERBOSE > 1) { + u_printf("@%d: %s\n", i, key); + } + // now, see if the locale is installed.. + + UBool exists; + if (localeExists(key, &exists)) { + return 1; // get out. + } + if (exists) { + validCount++; + u_printf("%s\n", key); + if (bf.isValid()) { + u_fprintf(bf.getAlias(), " %s {\"\"}\n", key); + } + } else { + if (bf.isValid()) { + u_fprintf(bf.getAlias(), "// %s {\"\"}\n", key); + } + if (VERBOSE) { + u_printf("#%s\n", key); // verbosity one - '' vs '#' + } + } + } + + if (bf.isValid()) { + u_fprintf(bf.getAlias(), " } // %d/%d valid\n", validCount, count); + // write the HEADER + u_fprintf(bf.getAlias(), "}\n"); + } + return 0; +} + +int main(int argc, const char* argv[]) { + PROG = argv[0]; + for (int i = 1; i < argc; i++) { + const char* arg = argv[i]; + int argsLeft = argc - i - 1; /* how many remain? */ + if (!strcmp(arg, "-v")) { + VERBOSE++; + } else if (!strcmp(arg, "-i") && (argsLeft >= 1)) { + if (i != 1) { + u_printf("ERROR: -i must be the first argument given.\n"); + usage(); + return 1; + } + const char* dir = argv[++i]; + u_setDataDirectory(dir); + if (VERBOSE) { + u_printf("ICUDATA is now %s\n", dir); + } + } else if (!strcmp(arg, "-T") && (argsLeft >= 1)) { + TREE = argv[++i]; + if (VERBOSE) { + u_printf("TREE is now %s\n", TREE); + } + } else if (!strcmp(arg, "-N") && (argsLeft >= 1)) { + NAME = argv[++i]; + if (VERBOSE) { + u_printf("NAME is now %s\n", NAME); + } + } else if (!strcmp(arg, "-?") || !strcmp(arg, "-h")) { + usage(); + return 0; + } else if (!strcmp(arg, "-l")) { + if (list(NULL)) { + return 1; + } + } else if (!strcmp(arg, "-b") && (argsLeft >= 1)) { + if (list(argv[++i])) { + return 1; + } + } else { + u_printf("Unknown or malformed option: %s\n", arg); + usage(); + return 1; + } + } +} + +// Local Variables: +// compile-command: "icurun iculslocs.cpp" +// End: diff --git a/tools/icu/icutrim.py b/tools/icu/icutrim.py new file mode 100755 index 00000000000..f6b54956c55 --- /dev/null +++ b/tools/icu/icutrim.py @@ -0,0 +1,338 @@ +#!/usr/bin/python +# +# Copyright (C) 2014 IBM Corporation and Others. All Rights Reserved. +# +# @author Steven R. Loomis +# +# This tool slims down an ICU data (.dat) file according to a config file. +# +# See: http://bugs.icu-project.org/trac/ticket/10922 +# +# Usage: +# Use "-h" to get help options. + +import sys +import shutil +# for utf-8 +reload(sys) +sys.setdefaultencoding("utf-8") + +import argparse +import os +import json +import re + +endian=sys.byteorder + +parser = argparse.ArgumentParser(description="ICU Datafile repackager. Example of use: \"mkdir tmp ; python icutrim.py -D ~/Downloads/icudt53l.dat -T tmp -F trim_en.json -O icudt53l.dat\" you will then find a smaller icudt53l.dat in 'tmp'. ", + epilog="ICU tool, http://icu-project.org - master copy at http://source.icu-project.org/repos/icu/tools/trunk/scripts/icutrim.py") + +parser.add_argument("-P","--tool-path", + action="store", + dest="toolpath", + help="set the prefix directory for ICU tools") + +parser.add_argument("-D","--input-file", + action="store", + dest="datfile", + help="input data file (icudt__.dat)", + required=True) + +parser.add_argument("-F","--filter-file", + action="store", + dest="filterfile", + help="filter file (JSON format)", + required=True) + +parser.add_argument("-T","--tmp-dir", + action="store", + dest="tmpdir", + help="working directory.", + required=True) + +parser.add_argument("--delete-tmp", + action="count", + dest="deltmpdir", + help="delete working directory.", + default=0) + +parser.add_argument("-O","--outfile", + action="store", + dest="outfile", + help="outfile (NOT a full path)", + required=True) + +parser.add_argument("-v","--verbose", + action="count", + default=0) + +parser.add_argument('-e', '--endian', action='store', dest='endian', help='endian, big, little or host, your default is "%s".' % endian, default=endian, metavar='endianness') + + +args = parser.parse_args() + +if args.verbose>0: + print "Options: "+str(args) + +if (os.path.isdir(args.tmpdir) and args.deltmpdir): + if args.verbose>1: + print "Deleting tmp dir %s.." % (args.tmpdir) + shutil.rmtree(args.tmpdir) + +if not (os.path.isdir(args.tmpdir)): + os.mkdir(args.tmpdir) +else: + print "Please delete tmpdir %s before beginning." % args.tmpdir + sys.exit(1) + +if args.endian not in ("big","little","host"): + print "Unknown endianness: %s" % args.endian + sys.exit(1) + +if args.endian is "host": + args.endian = endian + +if not os.path.isdir(args.tmpdir): + print "Error, tmpdir not a directory: %s" % (args.tmpdir) + sys.exit(1) + +if not os.path.isfile(args.filterfile): + print "Filterfile doesn't exist: %s" % (args.filterfile) + sys.exit(1) + +if not os.path.isfile(args.datfile): + print "Datfile doesn't exist: %s" % (args.datfile) + sys.exit(1) + +if not args.datfile.endswith(".dat"): + print "Datfile doesn't end with .dat: %s" % (args.datfile) + sys.exit(1) + +outfile = os.path.join(args.tmpdir, args.outfile) + +if os.path.isfile(outfile): + print "Error, output file does exist: %s" % (outfile) + sys.exit(1) + +if not args.outfile.endswith(".dat"): + print "Outfile doesn't end with .dat: %s" % (args.outfile) + sys.exit(1) + +dataname=args.outfile[0:-4] + + +## TODO: need to improve this. Quotes, etc. +def runcmd(tool, cmd, doContinue=False): + if(args.toolpath): + cmd = os.path.join(args.toolpath, tool) + " " + cmd + else: + cmd = tool + " " + cmd + + if(args.verbose>4): + print "# " + cmd + + rc = os.system(cmd) + if rc is not 0 and not doContinue: + print "FAILED: %s" % cmd + sys.exit(1) + return rc + +## STEP 0 - read in json config +fi= open(args.filterfile, "rb") +config=json.load(fi) +fi.close() + +if (args.verbose > 6): + print config + +if(config.has_key("comment")): + print "%s: %s" % (args.filterfile, config["comment"]) + +## STEP 1 - copy the data file, swapping endianness +endian_letter = "l" + + +runcmd("icupkg", "-t%s %s %s""" % (endian_letter, args.datfile, outfile)) + +## STEP 2 - get listing +listfile = os.path.join(args.tmpdir,"icudata.lst") +runcmd("icupkg", "-l %s > %s""" % (outfile, listfile)) + +fi = open(listfile, 'rb') +items = fi.readlines() +items = [items[i].strip() for i in range(len(items))] +fi.close() + +itemset = set(items) + +if (args.verbose>1): + print "input file: %d items" % (len(items)) + +# list of all trees +trees = {} +RES_INDX = "res_index.res" +remove = None +# remove - always remove these +if config.has_key("remove"): + remove = set(config["remove"]) +else: + remove = set() + +# keep - always keep these +if config.has_key("keep"): + keep = set(config["keep"]) +else: + keep = set() + +def queueForRemoval(tree): + global remove + if not config.has_key("trees"): + # no config + return + if not config["trees"].has_key(tree): + return + mytree = trees[tree] + if(args.verbose>0): + print "* %s: %d items" % (tree, len(mytree["locs"])) + # do varible substitution for this tree here + if type(config["trees"][tree]) == str or type(config["trees"][tree]) == unicode: + treeStr = config["trees"][tree] + if(args.verbose>5): + print " Substituting $%s for tree %s" % (treeStr, tree) + if(not config.has_key("variables") or not config["variables"].has_key(treeStr)): + print " ERROR: no variable: variables.%s for tree %s" % (treeStr, tree) + sys.exit(1) + config["trees"][tree] = config["variables"][treeStr] + myconfig = config["trees"][tree] + if(args.verbose>4): + print " Config: %s" % (myconfig) + # Process this tree + if(len(myconfig)==0 or len(mytree["locs"])==0): + if(args.verbose>2): + print " No processing for %s - skipping" % (tree) + else: + only = None + if myconfig.has_key("only"): + only = set(myconfig["only"]) + if (len(only)==0) and (mytree["treeprefix"] != ""): + thePool = "%spool.res" % (mytree["treeprefix"]) + if (thePool in itemset): + if(args.verbose>0): + print "Removing %s because tree %s is empty." % (thePool, tree) + remove.add(thePool) + else: + print "tree %s - no ONLY" + for l in range(len(mytree["locs"])): + loc = mytree["locs"][l] + if (only is not None) and not loc in only: + # REMOVE loc + toRemove = "%s%s%s" % (mytree["treeprefix"], loc, mytree["extension"]) + if(args.verbose>6): + print "Queueing for removal: %s" % toRemove + remove.add(toRemove) + +def addTreeByType(tree, mytree): + if(args.verbose>1): + print "(considering %s): %s" % (tree, mytree) + trees[tree] = mytree + mytree["locs"]=[] + for i in range(len(items)): + item = items[i] + if item.startswith(mytree["treeprefix"]) and item.endswith(mytree["extension"]): + mytree["locs"].append(item[len(mytree["treeprefix"]):-4]) + # now, process + queueForRemoval(tree) + +addTreeByType("converters",{"treeprefix":"", "extension":".cnv"}) +addTreeByType("stringprep",{"treeprefix":"", "extension":".spp"}) +addTreeByType("translit",{"treeprefix":"translit/", "extension":".res"}) +addTreeByType("brkfiles",{"treeprefix":"brkitr/", "extension":".brk"}) +addTreeByType("brkdict",{"treeprefix":"brkitr/", "extension":"dict"}) +addTreeByType("confusables",{"treeprefix":"", "extension":".cfu"}) + +for i in range(len(items)): + item = items[i] + if item.endswith(RES_INDX): + treeprefix = item[0:item.rindex(RES_INDX)] + tree = None + if treeprefix == "": + tree = "ROOT" + else: + tree = treeprefix[0:-1] + if(args.verbose>6): + print "procesing %s" % (tree) + trees[tree] = { "extension": ".res", "treeprefix": treeprefix, "hasIndex": True } + # read in the resource list for the tree + treelistfile = os.path.join(args.tmpdir,"%s.lst" % tree) + runcmd("iculslocs", "-i %s -N %s -T %s -l > %s" % (outfile, dataname, tree, treelistfile)) + fi = open(treelistfile, 'rb') + treeitems = fi.readlines() + trees[tree]["locs"] = [treeitems[i].strip() for i in range(len(treeitems))] + fi.close() + if(not config.has_key("trees") or not config["trees"].has_key(tree)): + print " Warning: filter file %s does not mention trees.%s - will be kept as-is" % (args.filterfile, tree) + else: + queueForRemoval(tree) + +def removeList(count=0): + # don't allow "keep" items to creep in here. + global remove + remove = remove - keep + if(count > 10): + print "Giving up - %dth attempt at removal." % count + sys.exit(1) + if(args.verbose>1): + print "%d items to remove - try #%d" % (len(remove),count) + if(len(remove)>0): + oldcount = len(remove) + hackerrfile=os.path.join(args.tmpdir, "REMOVE.err") + removefile = os.path.join(args.tmpdir, "REMOVE.lst") + fi = open(removefile, 'wb') + for i in remove: + print >>fi, i + fi.close() + rc = runcmd("icupkg","-r %s %s 2> %s" % (removefile,outfile,hackerrfile),True) + if rc is not 0: + if(args.verbose>5): + print "## Damage control, trying to parse stderr from icupkg.." + fi = open(hackerrfile, 'rb') + erritems = fi.readlines() + fi.close() + #Item zone/zh_Hant_TW.res depends on missing item zone/zh_Hant.res + pat = re.compile("""^Item ([^ ]+) depends on missing item ([^ ]+).*""") + for i in range(len(erritems)): + line = erritems[i].strip() + m = pat.match(line) + if m: + toDelete = m.group(1) + if(args.verbose > 5): + print "<< %s added to delete" % toDelete + remove.add(toDelete) + else: + print "ERROR: could not match errline: %s" % line + sys.exit(1) + if(args.verbose > 5): + print " now %d items to remove" % len(remove) + if(oldcount == len(remove)): + print " ERROR: could not add any mor eitems to remove. Fail." + sys.exit(1) + removeList(count+1) + +# fire it up +removeList(1) + +# now, fixup res_index, one at a time +for tree in trees: + # skip trees that don't have res_index + if not trees[tree].has_key("hasIndex"): + continue + treebunddir = args.tmpdir + if(trees[tree]["treeprefix"]): + treebunddir = os.path.join(treebunddir, trees[tree]["treeprefix"]) + if not (os.path.isdir(treebunddir)): + os.mkdir(treebunddir) + treebundres = os.path.join(treebunddir,RES_INDX) + treebundtxt = "%s.txt" % (treebundres[0:-4]) + runcmd("iculslocs", "-i %s -N %s -T %s -b %s" % (outfile, dataname, tree, treebundtxt)) + runcmd("genrb","-d %s -s %s res_index.txt" % (treebunddir, treebunddir)) + runcmd("icupkg","-s %s -a %s%s %s" % (args.tmpdir, trees[tree]["treeprefix"], RES_INDX, outfile)) diff --git a/tools/icu/no-op.cc b/tools/icu/no-op.cc new file mode 100644 index 00000000000..08d1599a264 --- /dev/null +++ b/tools/icu/no-op.cc @@ -0,0 +1,18 @@ +/* +********************************************************************** +* Copyright (C) 2014, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* +*/ + +// +// ICU needs the C++, not the C linker to be used, even if the main function +// is in C. +// +// This is a dummy function just to get gyp to compile some internal +// tools as C++. +// +// It should not appear in production node binaries. + +extern void icu_dummy_cxx() {} diff --git a/vcbuild.bat b/vcbuild.bat index 0c9b0b285a6..bd1afd77ec5 100644 --- a/vcbuild.bat +++ b/vcbuild.bat @@ -35,6 +35,7 @@ set noetw_msi_arg= set noperfctr= set noperfctr_arg= set noperfctr_msi_arg= +set i18n_arg= :next-arg if "%1"=="" goto args-done @@ -62,6 +63,8 @@ if /i "%1"=="test" set test=test&goto arg-ok if /i "%1"=="msi" set msi=1&set licensertf=1&goto arg-ok if /i "%1"=="upload" set upload=1&goto arg-ok if /i "%1"=="jslint" set jslint=1&goto arg-ok +if /i "%1"=="small-icu" set i18n_arg=%1&goto arg-ok +if /i "%1"=="full-icu" set i18n_arg=%1&goto arg-ok echo Warning: ignoring invalid command line option `%1`. @@ -80,6 +83,9 @@ if defined nosnapshot set nosnapshot_arg=--without-snapshot if defined noetw set noetw_arg=--without-etw& set noetw_msi_arg=/p:NoETW=1 if defined noperfctr set noperfctr_arg=--without-perfctr& set noperfctr_msi_arg=/p:NoPerfCtr=1 +if "%i18n_arg%"=="full-icu" set i18n_arg=--with-intl=full-icu +if "%i18n_arg%"=="small-icu" set i18n_arg=--with-intl=small-icu + :project-gen @rem Skip project generation if requested. if defined noprojgen goto msbuild @@ -89,7 +95,7 @@ if defined NIGHTLY set TAG=nightly-%NIGHTLY% @rem Generate the VS project. SETLOCAL if defined VS100COMNTOOLS call "%VS100COMNTOOLS%\VCVarsQueryRegistry.bat" - python configure %debug_arg% %nosnapshot_arg% %noetw_arg% %noperfctr_arg% --dest-cpu=%target_arch% --tag=%TAG% + python configure %i18n_arg% %debug_arg% %nosnapshot_arg% %noetw_arg% %noperfctr_arg% --dest-cpu=%target_arch% --tag=%TAG% if errorlevel 1 goto create-msvs-files-failed if not exist node.sln goto create-msvs-files-failed echo Project files generated. From b705b73e46193c7691be40b732330a49affacedb Mon Sep 17 00:00:00 2001 From: Gabriel Wicke Date: Thu, 25 Sep 2014 09:59:18 -0700 Subject: [PATCH 036/144] url: make query() consistent Match the behavior of the slow path by setting url.query to an empty object when the url contains no query, but query parsing is requested. Also add a test for this case, and update the documents to clearly reflect this behavior. Fixes: https://github.com/joyent/node/issues/8332 Reviewed-by: Trevor Norris --- doc/api/url.markdown | 7 ++++--- lib/url.js | 3 +++ test/simple/test-url.js | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/doc/api/url.markdown b/doc/api/url.markdown index e6a43f72bcf..6b8ff9d5076 100644 --- a/doc/api/url.markdown +++ b/doc/api/url.markdown @@ -69,9 +69,10 @@ The following methods are provided by the URL module: Take a URL string, and return an object. -Pass `true` as the second argument to also parse -the query string using the `querystring` module. -Defaults to `false`. +Pass `true` as the second argument to also parse the query string using the +`querystring` module. If `true` then the `query` property will always be +assigned an object, and the `search` property will always be a (possibly +empty) string. Defaults to `false`. Pass `true` as the third argument to treat `//foo/bar` as `{ host: 'foo', pathname: '/bar' }` rather than diff --git a/lib/url.js b/lib/url.js index 4c0ef0102fa..6463424207d 100644 --- a/lib/url.js +++ b/lib/url.js @@ -136,6 +136,9 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { } else { this.query = this.search.substr(1); } + } else if (parseQueryString) { + this.search = ''; + this.query = {}; } return this; } diff --git a/test/simple/test-url.js b/test/simple/test-url.js index 3271b0ba21a..e0a1b872d28 100644 --- a/test/simple/test-url.js +++ b/test/simple/test-url.js @@ -868,6 +868,20 @@ var parseTestsWithQueryString = { 'pathname': '/', 'path': '/' }, + '/example': { + protocol: null, + slashes: null, + auth: null, + host: null, + port: null, + hostname: null, + hash: null, + search: '', + query: {}, + pathname: '/example', + path: '/example', + href: '/example' + }, '/example?query=value':{ protocol: null, slashes: null, From 8dc6be1747d3a48af56f89e973ecb5665f89a2e1 Mon Sep 17 00:00:00 2001 From: Vladimir Kurchatkin Date: Mon, 22 Sep 2014 20:19:50 +0400 Subject: [PATCH 037/144] node: avoid automatic microtask runs Since we are taking control of the microtask queue it makes sense to disable autorun and only run microtasks when necessary. Just setting isolate->SetAutorunMicrotasks(false) would cause _tickCallback() not to be called. Automatically running the microtask queue will cause it to run: * After callback invocation * Inside _tickCallback() * After _tickCallback() invocation The third one is unnecessary as the microtask queue is guaranteed to be empty at this point. The first only needs to be run manually when _tickCallback() isn't going to be called by MakeCallback(). Reviewed-by: Trevor Norris --- src/async-wrap-inl.h | 8 +++ src/node.cc | 10 ++++ .../simple/test-microtask-queue-run-domain.js | 59 +++++++++++++++++++ ...st-microtask-queue-run-immediate-domain.js | 59 +++++++++++++++++++ .../test-microtask-queue-run-immediate.js | 58 ++++++++++++++++++ test/simple/test-microtask-queue-run.js | 58 ++++++++++++++++++ 6 files changed, 252 insertions(+) create mode 100644 test/simple/test-microtask-queue-run-domain.js create mode 100644 test/simple/test-microtask-queue-run-immediate-domain.js create mode 100644 test/simple/test-microtask-queue-run-immediate.js create mode 100644 test/simple/test-microtask-queue-run.js diff --git a/src/async-wrap-inl.h b/src/async-wrap-inl.h index 324c57b9aef..59157cc0f4c 100644 --- a/src/async-wrap-inl.h +++ b/src/async-wrap-inl.h @@ -138,6 +138,10 @@ inline v8::Handle AsyncWrap::MakeDomainCallback( return ret; } + if (tick_info->length() == 0) { + env()->isolate()->RunMicrotasks(); + } + if (tick_info->length() == 0) { tick_info->set_index(0); return ret; @@ -201,6 +205,10 @@ inline v8::Handle AsyncWrap::MakeCallback( return ret; } + if (tick_info->length() == 0) { + env()->isolate()->RunMicrotasks(); + } + if (tick_info->length() == 0) { tick_info->set_index(0); return ret; diff --git a/src/node.cc b/src/node.cc index 23edf4d4e2c..1767d255b28 100644 --- a/src/node.cc +++ b/src/node.cc @@ -1090,6 +1090,10 @@ Handle MakeDomainCallback(Environment* env, return ret; } + if (tick_info->length() == 0) { + env->isolate()->RunMicrotasks(); + } + if (tick_info->length() == 0) { tick_info->set_index(0); return ret; @@ -1154,6 +1158,10 @@ Handle MakeCallback(Environment* env, return ret; } + if (tick_info->length() == 0) { + env->isolate()->RunMicrotasks(); + } + if (tick_info->length() == 0) { tick_info->set_index(0); return ret; @@ -3594,6 +3602,8 @@ Environment* CreateEnvironment(Isolate* isolate, Context::Scope context_scope(context); Environment* env = Environment::New(context); + isolate->SetAutorunMicrotasks(false); + uv_check_init(env->event_loop(), env->immediate_check_handle()); uv_unref( reinterpret_cast(env->immediate_check_handle())); diff --git a/test/simple/test-microtask-queue-run-domain.js b/test/simple/test-microtask-queue-run-domain.js new file mode 100644 index 00000000000..2b3b76315ef --- /dev/null +++ b/test/simple/test-microtask-queue-run-domain.js @@ -0,0 +1,59 @@ +// 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 common = require('../common'); +var assert = require('assert'); +var domain = require('domain'); + +function enqueueMicrotask(fn) { + Promise.resolve().then(fn); +} + +var done = 0; + +process.on('exit', function() { + assert.equal(done, 2); +}); + +// no nextTick, microtask +setTimeout(function() { + enqueueMicrotask(function() { + done++; + }); +}, 0); + + +// no nextTick, microtask with nextTick +setTimeout(function() { + var called = false; + + enqueueMicrotask(function() { + process.nextTick(function() { + called = true; + }); + }); + + setTimeout(function() { + if (called) + done++; + }, 0); + +}, 0); diff --git a/test/simple/test-microtask-queue-run-immediate-domain.js b/test/simple/test-microtask-queue-run-immediate-domain.js new file mode 100644 index 00000000000..8f95fadd586 --- /dev/null +++ b/test/simple/test-microtask-queue-run-immediate-domain.js @@ -0,0 +1,59 @@ +// 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 common = require('../common'); +var assert = require('assert'); +var domain = require('domain'); + +function enqueueMicrotask(fn) { + Promise.resolve().then(fn); +} + +var done = 0; + +process.on('exit', function() { + assert.equal(done, 2); +}); + +// no nextTick, microtask +setImmediate(function() { + enqueueMicrotask(function() { + done++; + }); +}); + + +// no nextTick, microtask with nextTick +setImmediate(function() { + var called = false; + + enqueueMicrotask(function() { + process.nextTick(function() { + called = true; + }); + }); + + setImmediate(function() { + if (called) + done++; + }); + +}); diff --git a/test/simple/test-microtask-queue-run-immediate.js b/test/simple/test-microtask-queue-run-immediate.js new file mode 100644 index 00000000000..b5423eb6b4f --- /dev/null +++ b/test/simple/test-microtask-queue-run-immediate.js @@ -0,0 +1,58 @@ +// 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 common = require('../common'); +var assert = require('assert'); + +function enqueueMicrotask(fn) { + Promise.resolve().then(fn); +} + +var done = 0; + +process.on('exit', function() { + assert.equal(done, 2); +}); + +// no nextTick, microtask +setImmediate(function() { + enqueueMicrotask(function() { + done++; + }); +}); + + +// no nextTick, microtask with nextTick +setImmediate(function() { + var called = false; + + enqueueMicrotask(function() { + process.nextTick(function() { + called = true; + }); + }); + + setImmediate(function() { + if (called) + done++; + }); + +}); diff --git a/test/simple/test-microtask-queue-run.js b/test/simple/test-microtask-queue-run.js new file mode 100644 index 00000000000..c4138454f54 --- /dev/null +++ b/test/simple/test-microtask-queue-run.js @@ -0,0 +1,58 @@ +// 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 common = require('../common'); +var assert = require('assert'); + +function enqueueMicrotask(fn) { + Promise.resolve().then(fn); +} + +var done = 0; + +process.on('exit', function() { + assert.equal(done, 2); +}); + +// no nextTick, microtask +setTimeout(function() { + enqueueMicrotask(function() { + done++; + }); +}, 0); + + +// no nextTick, microtask with nextTick +setTimeout(function() { + var called = false; + + enqueueMicrotask(function() { + process.nextTick(function() { + called = true; + }); + }); + + setTimeout(function() { + if (called) + done++; + }, 0); + +}, 0); From 862cc28183b03f0e1a67b052b5c8250a3e2e8995 Mon Sep 17 00:00:00 2001 From: Julien Gilli Date: Mon, 22 Sep 2014 13:21:11 -0700 Subject: [PATCH 038/144] readline: should not require an output stream. Passing null as the output stream to readline.Interface()'s constructor is now supported. Any output written by readline is just discarded. It makes it easier to use readline just as a line parser. Fixes: https://github.com/joyent/node/issues/4408 Reviewed-by: Trevor Norris --- doc/api/readline.markdown | 13 +++++-- lib/readline.js | 54 +++++++++++++++++++------- test/simple/test-readline-interface.js | 31 +++++++++++++++ 3 files changed, 81 insertions(+), 17 deletions(-) diff --git a/doc/api/readline.markdown b/doc/api/readline.markdown index 16bbd3c0cdf..6aab28679ba 100644 --- a/doc/api/readline.markdown +++ b/doc/api/readline.markdown @@ -30,7 +30,7 @@ the following values: - `input` - the readable stream to listen to (Required). - - `output` - the writable stream to write readline data to (Required). + - `output` - the writable stream to write readline data to (Optional). - `completer` - an optional function that is used for Tab autocompletion. See below for an example of using this. @@ -100,6 +100,9 @@ to `true` to prevent the cursor placement being reset to `0`. This will also resume the `input` stream used with `createInterface` if it has been paused. +If `output` is set to `null` or `undefined` when calling `createInterface`, the +prompt is not written. + ### rl.question(query, callback) Prepends the prompt with `query` and invokes `callback` with the user's @@ -109,6 +112,9 @@ with the user's response after it has been typed. This will also resume the `input` stream used with `createInterface` if it has been paused. +If `output` is set to `null` or `undefined` when calling `createInterface`, +nothing is displayed. + Example usage: interface.question('What is your favorite food?', function(answer) { @@ -130,8 +136,9 @@ Closes the `Interface` instance, relinquishing control on the `input` and ### rl.write(data[, key]) -Writes `data` to `output` stream. `key` is an object literal to represent a key -sequence; available if the terminal is a TTY. +Writes `data` to `output` stream, unless `output` is set to `null` or +`undefined` when calling `createInterface`. `key` is an object literal to +represent a key sequence; available if the terminal is a TTY. This will also resume the `input` stream if it has been paused. diff --git a/lib/readline.js b/lib/readline.js index a3f1b9d5801..bafef00e0dd 100644 --- a/lib/readline.js +++ b/lib/readline.js @@ -68,7 +68,7 @@ function Interface(input, output, completer, terminal) { // backwards compat; check the isTTY prop of the output stream // when `terminal` was not specified - if (util.isUndefined(terminal)) { + if (util.isUndefined(terminal) && !util.isNullOrUndefined(output)) { terminal = !!output.isTTY; } @@ -142,11 +142,15 @@ function Interface(input, output, completer, terminal) { this.history = []; this.historyIndex = -1; - output.on('resize', onresize); + if (!util.isNullOrUndefined(output)) + output.on('resize', onresize); + self.once('close', function() { input.removeListener('keypress', onkeypress); input.removeListener('end', ontermend); - output.removeListener('resize', onresize); + if (!util.isNullOrUndefined(output)) { + output.removeListener('resize', onresize); + } }); } @@ -156,7 +160,10 @@ function Interface(input, output, completer, terminal) { inherits(Interface, EventEmitter); Interface.prototype.__defineGetter__('columns', function() { - return this.output.columns || Infinity; + var columns = Infinity; + if (this.output && this.output.columns) + columns = this.output.columns; + return columns; }); Interface.prototype.setPrompt = function(prompt) { @@ -177,7 +184,7 @@ Interface.prototype.prompt = function(preserveCursor) { if (!preserveCursor) this.cursor = 0; this._refreshLine(); } else { - this.output.write(this._prompt); + this._writeToOutput(this._prompt); } }; @@ -207,6 +214,13 @@ Interface.prototype._onLine = function(line) { } }; +Interface.prototype._writeToOutput = function _writeToOutput(stringToWrite) { + if (!util.isString(stringToWrite)) + throw new TypeError('stringToWrite must be a string'); + + if (!util.isNullOrUndefined(this.output)) + this.output.write(stringToWrite); +}; Interface.prototype._addHistory = function() { if (this.line.length === 0) return ''; @@ -245,11 +259,11 @@ Interface.prototype._refreshLine = function() { exports.clearScreenDown(this.output); // Write the prompt and the current buffer content. - this.output.write(line); + this._writeToOutput(line); // Force terminal to allocate a new line if (lineCols === 0) { - this.output.write(' '); + this._writeToOutput(' '); } // Move cursor to original position. @@ -351,7 +365,7 @@ Interface.prototype._insertString = function(c) { if (this._getCursorPos().cols === 0) { this._refreshLine(); } else { - this.output.write(c); + this._writeToOutput(c); } // a hack to get the line refreshed if it's needed @@ -378,7 +392,7 @@ Interface.prototype._tabComplete = function() { if (completions.length === 1) { self._insertString(completions[0].slice(completeOn.length)); } else { - self.output.write('\r\n'); + self._writeToOutput('\r\n'); var width = completions.reduce(function(a, b) { return a.length > b.length ? a : b; }).length + 2; // 2 space padding @@ -422,17 +436,17 @@ function handleGroup(self, group, width, maxColumns) { break; } var item = group[idx]; - self.output.write(item); + self._writeToOutput(item); if (col < maxColumns - 1) { for (var s = 0, itemLen = item.length; s < width - itemLen; s++) { - self.output.write(' '); + self._writeToOutput(' '); } } } - self.output.write('\r\n'); + self._writeToOutput('\r\n'); } - self.output.write('\r\n'); + self._writeToOutput('\r\n'); } function commonPrefix(strings) { @@ -525,7 +539,7 @@ Interface.prototype._deleteLineRight = function() { Interface.prototype.clearLine = function() { this._moveCursor(+Infinity); - this.output.write('\r\n'); + this._writeToOutput('\r\n'); this.line = ''; this.cursor = 0; this.prevRows = 0; @@ -1168,6 +1182,9 @@ function emitKeys(stream, s) { */ function cursorTo(stream, x, y) { + if (util.isNullOrUndefined(stream)) + return; + if (!util.isNumber(x) && !util.isNumber(y)) return; @@ -1188,6 +1205,9 @@ exports.cursorTo = cursorTo; */ function moveCursor(stream, dx, dy) { + if (util.isNullOrUndefined(stream)) + return; + if (dx < 0) { stream.write('\x1b[' + (-dx) + 'D'); } else if (dx > 0) { @@ -1211,6 +1231,9 @@ exports.moveCursor = moveCursor; */ function clearLine(stream, dir) { + if (util.isNullOrUndefined(stream)) + return; + if (dir < 0) { // to the beginning stream.write('\x1b[1K'); @@ -1230,6 +1253,9 @@ exports.clearLine = clearLine; */ function clearScreenDown(stream) { + if (util.isNullOrUndefined(stream)) + return; + stream.write('\x1b[0J'); } exports.clearScreenDown = clearScreenDown; diff --git a/test/simple/test-readline-interface.js b/test/simple/test-readline-interface.js index f91c10821a1..b86dd5a8a9b 100644 --- a/test/simple/test-readline-interface.js +++ b/test/simple/test-readline-interface.js @@ -307,5 +307,36 @@ function isWarned(emitter) { assert.equal(isWarned(process.stdout._events), false); } + //can create a new readline Interface with a null output arugument + fi = new FakeInput(); + rli = new readline.Interface({input: fi, output: null, terminal: terminal }); + + called = false; + rli.on('line', function(line) { + called = true; + assert.equal(line, 'asdf'); + }); + fi.emit('data', 'asdf\n'); + assert.ok(called); + + assert.doesNotThrow(function() { + rli.setPrompt("ddd> "); + }); + + assert.doesNotThrow(function() { + rli.prompt(); + }); + + assert.doesNotThrow(function() { + rli.write('really shouldnt be seeing this'); + }); + + assert.doesNotThrow(function() { + rli.question("What do you think of node.js? ", function(answer) { + console.log("Thank you for your valuable feedback:", answer); + rli.close(); + }) + }); + }); From e9ca7b9d8de68e13d40698f34145e2a0428aa9d7 Mon Sep 17 00:00:00 2001 From: Trevor Norris Date: Wed, 1 Oct 2014 15:42:02 -0700 Subject: [PATCH 039/144] buffer: mv floating point read/write checks to JS Performance improvement by moving checks for floating point operations to JS and doing the operation on a protected internal function that assumes all arguments are correct. Still abort if the operation overflows memory. This can only be caused if the Buffer's length property isn't the same as the actual internal length. Signed-off-by: Trevor Norris --- lib/buffer.js | 80 ++++++++++++++++++++++++++++++++++++++++++++++ src/node_buffer.cc | 60 +++++++++++----------------------- 2 files changed, 99 insertions(+), 41 deletions(-) diff --git a/lib/buffer.js b/lib/buffer.js index 7fd297559bd..80f6a4271fa 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -581,6 +581,38 @@ Buffer.prototype.readInt32BE = function(offset, noAssert) { }; +Buffer.prototype.readFloatLE = function readFloatLE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) + checkOffset(offset, 4, this.length); + return internal.readFloatLE(this, offset); +}; + + +Buffer.prototype.readFloatBE = function readFloatBE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) + checkOffset(offset, 4, this.length); + return internal.readFloatBE(this, offset); +}; + + +Buffer.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) + checkOffset(offset, 8, this.length); + return internal.readDoubleLE(this, offset); +}; + + +Buffer.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) + checkOffset(offset, 8, this.length); + return internal.readDoubleBE(this, offset); +}; + + function checkInt(buffer, value, offset, ext, max, min) { if (!(buffer instanceof Buffer)) throw new TypeError('buffer must be a Buffer instance'); @@ -705,3 +737,51 @@ Buffer.prototype.writeInt32BE = function(value, offset, noAssert) { this[offset + 3] = value; return offset + 4; }; + + +function checkFloat(buffer, value, offset, ext) { + if (!(buffer instanceof Buffer)) + throw new TypeError('buffer must be a Buffer instance'); + if (offset + ext > buffer.length) + throw new RangeError('index out of range'); +} + + +Buffer.prototype.writeFloatLE = function writeFloatLE(val, offset, noAssert) { + val = +val; + offset = offset >>> 0; + if (!noAssert) + checkFloat(this, val, offset, 4); + internal.writeFloatLE(this, val, offset); + return offset + 4; +}; + + +Buffer.prototype.writeFloatBE = function writeFloatBE(val, offset, noAssert) { + val = +val; + offset = offset >>> 0; + if (!noAssert) + checkFloat(this, val, offset, 4); + internal.writeFloatBE(this, val, offset); + return offset + 4; +}; + + +Buffer.prototype.writeDoubleLE = function writeDoubleLE(val, offset, noAssert) { + val = +val; + offset = offset >>> 0; + if (!noAssert) + checkFloat(this, val, offset, 8); + internal.writeDoubleLE(this, val, offset); + return offset + 8; +}; + + +Buffer.prototype.writeDoubleBE = function writeDoubleBE(val, offset, noAssert) { + val = +val; + offset = offset >>> 0; + if (!noAssert) + checkFloat(this, val, offset, 8); + internal.writeDoubleBE(this, val, offset); + return offset + 8; +}; diff --git a/src/node_buffer.cc b/src/node_buffer.cc index 8be551d9b0e..3f8de59b4f8 100644 --- a/src/node_buffer.cc +++ b/src/node_buffer.cc @@ -462,17 +462,10 @@ static inline void Swizzle(char* start, unsigned int len) { template void ReadFloatGeneric(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args.GetIsolate()); - bool doAssert = !args[1]->BooleanValue(); - size_t offset; + ARGS_THIS(args[0].As()); - CHECK_NOT_OOB(ParseArrayIndex(args[0], 0, &offset)); - - if (doAssert) { - size_t len = Length(args.This()); - if (offset + sizeof(T) > len || offset + sizeof(T) < offset) - return env->ThrowRangeError("Trying to read beyond buffer length"); - } + uint32_t offset = args[1]->Uint32Value(); + CHECK_LE(offset + sizeof(T), obj_length); union NoAlias { T val; @@ -480,8 +473,7 @@ void ReadFloatGeneric(const FunctionCallbackInfo& args) { }; union NoAlias na; - const void* data = args.This()->GetIndexedPropertiesExternalArrayData(); - const char* ptr = static_cast(data) + offset; + const char* ptr = static_cast(obj_data) + offset; memcpy(na.bytes, ptr, sizeof(na.bytes)); if (endianness != GetEndianness()) Swizzle(na.bytes, sizeof(na.bytes)); @@ -512,24 +504,11 @@ void ReadDoubleBE(const FunctionCallbackInfo& args) { template uint32_t WriteFloatGeneric(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args.GetIsolate()); - bool doAssert = !args[2]->BooleanValue(); - - T val = static_cast(args[0]->NumberValue()); - size_t offset; - - if (!ParseArrayIndex(args[1], 0, &offset)) { - env->ThrowRangeError("out of range index"); - return 0; - } + ARGS_THIS(args[0].As()) - if (doAssert) { - size_t len = Length(args.This()); - if (offset + sizeof(T) > len || offset + sizeof(T) < offset) { - env->ThrowRangeError("Trying to write beyond buffer length"); - return 0; - } - } + T val = args[1]->NumberValue(); + uint32_t offset = args[2]->Uint32Value(); + CHECK_LE(offset + sizeof(T), obj_length); union NoAlias { T val; @@ -537,8 +516,7 @@ uint32_t WriteFloatGeneric(const FunctionCallbackInfo& args) { }; union NoAlias na = { val }; - void* data = args.This()->GetIndexedPropertiesExternalArrayData(); - char* ptr = static_cast(data) + offset; + char* ptr = static_cast(obj_data) + offset; if (endianness != GetEndianness()) Swizzle(na.bytes, sizeof(na.bytes)); memcpy(ptr, na.bytes, sizeof(na.bytes)); @@ -643,16 +621,6 @@ void SetupBufferJS(const FunctionCallbackInfo& args) { NODE_SET_METHOD(proto, "ucs2Write", Ucs2Write); NODE_SET_METHOD(proto, "utf8Write", Utf8Write); - NODE_SET_METHOD(proto, "readDoubleBE", ReadDoubleBE); - NODE_SET_METHOD(proto, "readDoubleLE", ReadDoubleLE); - NODE_SET_METHOD(proto, "readFloatBE", ReadFloatBE); - NODE_SET_METHOD(proto, "readFloatLE", ReadFloatLE); - - NODE_SET_METHOD(proto, "writeDoubleBE", WriteDoubleBE); - NODE_SET_METHOD(proto, "writeDoubleLE", WriteDoubleLE); - NODE_SET_METHOD(proto, "writeFloatBE", WriteFloatBE); - NODE_SET_METHOD(proto, "writeFloatLE", WriteFloatLE); - NODE_SET_METHOD(proto, "copy", Copy); // for backwards compatibility @@ -668,6 +636,16 @@ void SetupBufferJS(const FunctionCallbackInfo& args) { NODE_SET_METHOD(internal, "byteLength", ByteLength); NODE_SET_METHOD(internal, "compare", Compare); NODE_SET_METHOD(internal, "fill", Fill); + + NODE_SET_METHOD(internal, "readDoubleBE", ReadDoubleBE); + NODE_SET_METHOD(internal, "readDoubleLE", ReadDoubleLE); + NODE_SET_METHOD(internal, "readFloatBE", ReadFloatBE); + NODE_SET_METHOD(internal, "readFloatLE", ReadFloatLE); + + NODE_SET_METHOD(internal, "writeDoubleBE", WriteDoubleBE); + NODE_SET_METHOD(internal, "writeDoubleLE", WriteDoubleLE); + NODE_SET_METHOD(internal, "writeFloatBE", WriteFloatBE); + NODE_SET_METHOD(internal, "writeFloatLE", WriteFloatLE); } From 83d7d9e6d81fc35764a9000b6d7b17a0e7d8cc92 Mon Sep 17 00:00:00 2001 From: Yazhong Liu Date: Thu, 2 Oct 2014 16:24:58 -0700 Subject: [PATCH 040/144] buffer: add generic functions for (u)int ops Add generic functions for (U)Int read/write operations on Buffers. These support up to and including 48 bit reads and writes. Include documentation and tests. Additional work done by Trevor Norris to include 40 and 48 bit write support. Because bitwise operations cannot be used on values greater than 32 bits, the operations have been replaced with mathematical calculations. Regardless, they are still faster than floating point operations. Reviewed-by: Trevor Norris --- doc/api/buffer.markdown | 42 +++++++++++ lib/buffer.js | 151 +++++++++++++++++++++++++++++++++++++ test/simple/test-buffer.js | 87 ++++++++++++++++++++- 3 files changed, 278 insertions(+), 2 deletions(-) diff --git a/doc/api/buffer.markdown b/doc/api/buffer.markdown index fb86accebbb..e4ba04ed7f5 100644 --- a/doc/api/buffer.markdown +++ b/doc/api/buffer.markdown @@ -180,6 +180,48 @@ The method will not write partial characters. len = buf.write('\u00bd + \u00bc = \u00be', 0); console.log(len + " bytes: " + buf.toString('utf8', 0, len)); +### buf.writeUIntLE(value, offset, byteLength[, noAssert]) +### buf.writeUIntBE(value, offset, byteLength[, noAssert]) +### buf.writeIntLE(value, offset, byteLength[, noAssert]) +### buf.writeIntBE(value, offset, byteLength[, noAssert]) + +* `value` {Number} Bytes to be written to buffer +* `offset` {Number} `0 <= offset <= buf.length` +* `byteLength` {Number} `0 < byteLength <= 6` +* `noAssert` {Boolean} Default: false +* Return: {Number} + +Writes `value` to the buffer at the specified `offset` and `byteLength`. +Supports up to 48 bits of accuracy. For example: + + var b = new Buffer(6); + b.writeUIntBE(0x1234567890ab, 0, 6); + // + +Set `noAssert` to `true` to skip validation of `value` and `offset`. Defaults +to `false`. + +### buf.readUIntLE(offset, byteLength[, noAssert]) +### buf.readUIntBE(offset, byteLength[, noAssert]) +### buf.readIntLE(offset, byteLength[, noAssert]) +### buf.readIntBE(offset, byteLength[, noAssert]) + +* `offset` {Number} `0 <= offset <= buf.length` +* `byteLength` {Number} `0 < byteLength <= 6` +* `noAssert` {Boolean} Default: false +* Return: {Number} + +A generalized version of all numeric read methods. Supports up to 48 bits of +accuracy. For example: + + var b = new Buffer(6); + b.writeUint16LE(0x90ab, 0); + b.writeUInt32LE(0x12345678, 2); + b.readUIntLE(0, 6).toString(16); // Specify 6 bytes (48 bits) + // output: '1234567890ab' + +Set `noAssert` to true to skip validation of `offset`. This means that `offset` +may be beyond the end of the buffer. Defaults to `false`. ### buf.toString([encoding][, start][, end]) diff --git a/lib/buffer.js b/lib/buffer.js index 80f6a4271fa..a674991988b 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -482,6 +482,37 @@ function checkOffset(offset, ext, length) { } +Buffer.prototype.readUIntLE = function(offset, byteLength, noAssert) { + offset = offset >>> 0; + byteLength = byteLength >>> 0; + if (!noAssert) + checkOffset(offset, byteLength, this.length); + + var val = this[offset]; + var mul = 1; + var i = 0; + while (++i < byteLength && (mul *= 0x100)) + val += this[offset + i] * mul; + + return val; +}; + + +Buffer.prototype.readUIntBE = function(offset, byteLength, noAssert) { + offset = offset >>> 0; + byteLength = byteLength >>> 0; + if (!noAssert) + checkOffset(offset, byteLength, this.length); + + var val = this[offset + --byteLength]; + var mul = 1; + while (byteLength > 0 && (mul *= 0x100)) + val += this[offset + --byteLength] * mul; + + return val; +}; + + Buffer.prototype.readUInt8 = function(offset, noAssert) { offset = offset >>> 0; if (!noAssert) @@ -530,6 +561,46 @@ Buffer.prototype.readUInt32BE = function(offset, noAssert) { }; +Buffer.prototype.readIntLE = function(offset, byteLength, noAssert) { + offset = offset >>> 0; + byteLength = byteLength >>> 0; + if (!noAssert) + checkOffset(offset, byteLength, this.length); + + var val = this[offset]; + var mul = 1; + var i = 0; + while (++i < byteLength && (mul *= 0x100)) + val += this[offset + i] * mul; + mul *= 0x80; + + if (val >= mul) + val -= Math.pow(2, 8 * byteLength); + + return val; +}; + + +Buffer.prototype.readIntBE = function(offset, byteLength, noAssert) { + offset = offset >>> 0; + byteLength = byteLength >>> 0; + if (!noAssert) + checkOffset(offset, byteLength, this.length); + + var i = byteLength; + var mul = 1; + var val = this[offset + --i]; + while (i > 0 && (mul *= 0x100)) + val += this[offset + --i] * mul; + mul *= 0x80; + + if (val >= mul) + val -= Math.pow(2, 8 * byteLength); + + return val; +}; + + Buffer.prototype.readInt8 = function(offset, noAssert) { offset = offset >>> 0; if (!noAssert) @@ -623,6 +694,40 @@ function checkInt(buffer, value, offset, ext, max, min) { } +Buffer.prototype.writeUIntLE = function(value, offset, byteLength, noAssert) { + value = +value; + offset = offset >>> 0; + byteLength = byteLength >>> 0; + if (!noAssert) + checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0); + + var mul = 1; + var i = 0; + this[offset] = value; + while (++i < byteLength && (mul *= 0x100)) + this[offset + i] = (value / mul) >>> 0; + + return offset + byteLength; +}; + + +Buffer.prototype.writeUIntBE = function(value, offset, byteLength, noAssert) { + value = +value; + offset = offset >>> 0; + byteLength = byteLength >>> 0; + if (!noAssert) + checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0); + + var i = byteLength - 1; + var mul = 1; + this[offset + i] = value; + while (--i >= 0 && (mul *= 0x100)) + this[offset + i] = (value / mul) >>> 0; + + return offset + byteLength; +}; + + Buffer.prototype.writeUInt8 = function(value, offset, noAssert) { value = +value; offset = offset >>> 0; @@ -681,6 +786,52 @@ Buffer.prototype.writeUInt32BE = function(value, offset, noAssert) { }; +Buffer.prototype.writeIntLE = function(value, offset, byteLength, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) { + checkInt(this, + value, + offset, + byteLength, + Math.pow(2, 8 * byteLength - 1) - 1, + -Math.pow(2, 8 * byteLength - 1)); + } + + var i = 0; + var mul = 1; + var sub = value < 0 ? 1 : 0; + this[offset] = value; + while (++i < byteLength && (mul *= 0x100)) + this[offset + i] = ((value / mul) >> 0) - sub; + + return offset + byteLength; +}; + + +Buffer.prototype.writeIntBE = function(value, offset, byteLength, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) { + checkInt(this, + value, + offset, + byteLength, + Math.pow(2, 8 * byteLength - 1) - 1, + -Math.pow(2, 8 * byteLength - 1)); + } + + var i = byteLength - 1; + var mul = 1; + var sub = value < 0 ? 1 : 0; + this[offset + i] = value; + while (--i >= 0 && (mul *= 0x100)) + this[offset + i] = ((value / mul) >> 0) - sub; + + return offset + byteLength; +}; + + Buffer.prototype.writeInt8 = function(value, offset, noAssert) { value = +value; offset = offset >>> 0; diff --git a/test/simple/test-buffer.js b/test/simple/test-buffer.js index 4219a15be54..bf742f93480 100644 --- a/test/simple/test-buffer.js +++ b/test/simple/test-buffer.js @@ -950,8 +950,6 @@ var buf = new Buffer([0xFF]); assert.equal(buf.readUInt8(0), 255); assert.equal(buf.readInt8(0), -1); - - [16, 32].forEach(function(bits) { var buf = new Buffer(bits / 8 - 1); @@ -988,6 +986,91 @@ assert.equal(buf.readInt8(0), -1); (0xFFFFFFFF >> (32 - bits))); }); +// test for common read(U)IntLE/BE +(function() { + var buf = new Buffer([0x01, 0x02, 0x03, 0x04, 0x05, 0x06]); + + assert.equal(buf.readUIntLE(0, 1), 0x01); + assert.equal(buf.readUIntBE(0, 1), 0x01); + assert.equal(buf.readUIntLE(0, 3), 0x030201); + assert.equal(buf.readUIntBE(0, 3), 0x010203); + assert.equal(buf.readUIntLE(0, 5), 0x0504030201); + assert.equal(buf.readUIntBE(0, 5), 0x0102030405); + assert.equal(buf.readUIntLE(0, 6), 0x060504030201); + assert.equal(buf.readUIntBE(0, 6), 0x010203040506); + assert.equal(buf.readIntLE(0, 1), 0x01); + assert.equal(buf.readIntBE(0, 1), 0x01); + assert.equal(buf.readIntLE(0, 3), 0x030201); + assert.equal(buf.readIntBE(0, 3), 0x010203); + assert.equal(buf.readIntLE(0, 5), 0x0504030201); + assert.equal(buf.readIntBE(0, 5), 0x0102030405); + assert.equal(buf.readIntLE(0, 6), 0x060504030201); + assert.equal(buf.readIntBE(0, 6), 0x010203040506); +})(); + +// test for common write(U)IntLE/BE +(function() { + var buf = new Buffer(3); + buf.writeUIntLE(0x123456, 0, 3); + assert.deepEqual(buf.toJSON().data, [0x56, 0x34, 0x12]); + assert.equal(buf.readUIntLE(0, 3), 0x123456); + + buf = new Buffer(3); + buf.writeUIntBE(0x123456, 0, 3); + assert.deepEqual(buf.toJSON().data, [0x12, 0x34, 0x56]); + assert.equal(buf.readUIntBE(0, 3), 0x123456); + + buf = new Buffer(3); + buf.writeIntLE(0x123456, 0, 3); + assert.deepEqual(buf.toJSON().data, [0x56, 0x34, 0x12]); + assert.equal(buf.readIntLE(0, 3), 0x123456); + + buf = new Buffer(3); + buf.writeIntBE(0x123456, 0, 3); + assert.deepEqual(buf.toJSON().data, [0x12, 0x34, 0x56]); + assert.equal(buf.readIntBE(0, 3), 0x123456); + + buf = new Buffer(3); + buf.writeIntLE(-0x123456, 0, 3); + assert.deepEqual(buf.toJSON().data, [0xaa, 0xcb, 0xed]); + assert.equal(buf.readIntLE(0, 3), -0x123456); + + buf = new Buffer(3); + buf.writeIntBE(-0x123456, 0, 3); + assert.deepEqual(buf.toJSON().data, [0xed, 0xcb, 0xaa]); + assert.equal(buf.readIntBE(0, 3), -0x123456); + + buf = new Buffer(5); + buf.writeUIntLE(0x1234567890, 0, 5); + assert.deepEqual(buf.toJSON().data, [0x90, 0x78, 0x56, 0x34, 0x12]); + assert.equal(buf.readUIntLE(0, 5), 0x1234567890); + + buf = new Buffer(5); + buf.writeUIntBE(0x1234567890, 0, 5); + assert.deepEqual(buf.toJSON().data, [0x12, 0x34, 0x56, 0x78, 0x90]); + assert.equal(buf.readUIntBE(0, 5), 0x1234567890); + + buf = new Buffer(5); + buf.writeIntLE(0x1234567890, 0, 5); + assert.deepEqual(buf.toJSON().data, [0x90, 0x78, 0x56, 0x34, 0x12]); + assert.equal(buf.readIntLE(0, 5), 0x1234567890); + + buf = new Buffer(5); + buf.writeIntBE(0x1234567890, 0, 5); + assert.deepEqual(buf.toJSON().data, [0x12, 0x34, 0x56, 0x78, 0x90]); + assert.equal(buf.readIntBE(0, 5), 0x1234567890); + + buf = new Buffer(5); + buf.writeIntLE(-0x1234567890, 0, 5); + assert.deepEqual(buf.toJSON().data, [0x70, 0x87, 0xa9, 0xcb, 0xed]); + assert.equal(buf.readIntLE(0, 5), -0x1234567890); + + buf = new Buffer(5); + buf.writeIntBE(-0x1234567890, 0, 5); + assert.deepEqual(buf.toJSON().data, [0xed, 0xcb, 0xa9, 0x87, 0x70]); + assert.equal(buf.readIntBE(0, 5), -0x1234567890); +})(); + // test Buffer slice (function() { var buf = new Buffer('0123456789'); From cb97bcd6f982b35a6fe4d41d884354f72905365d Mon Sep 17 00:00:00 2001 From: gyson Date: Wed, 1 Oct 2014 10:44:39 +0800 Subject: [PATCH 041/144] util: add es6 Symbol support for `util.inspect` * `util.inspect` cannot accept es6 symbol primitive * It will throw exception if do `util.inspect(Symbol())` * This also affects repl, console.log, etc. Reviewed-by: Trevor Norris Reviewed-by: Chris Dickinson --- lib/util.js | 4 ++++ test/simple/test-util-inspect.js | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/lib/util.js b/lib/util.js index 2de944586fe..e97820c9af3 100644 --- a/lib/util.js +++ b/lib/util.js @@ -174,6 +174,7 @@ inspect.styles = { 'undefined': 'grey', 'null': 'bold', 'string': 'green', + 'symbol': 'green', 'date': 'magenta', // "name": intentionally not styling 'regexp': 'red' @@ -388,6 +389,9 @@ function formatPrimitive(ctx, value) { // For some reason typeof null is "object", so special case here. if (isNull(value)) return ctx.stylize('null', 'null'); + // es6 symbol primitive + if (isSymbol(value)) + return ctx.stylize(value.toString(), 'symbol'); } diff --git a/test/simple/test-util-inspect.js b/test/simple/test-util-inspect.js index 8651a2df019..2a7c2c4fcb5 100644 --- a/test/simple/test-util-inspect.js +++ b/test/simple/test-util-inspect.js @@ -235,3 +235,12 @@ assert.equal(util.inspect(bool), '{ [Boolean: true] foo: \'bar\' }'); var num = new Number(13.37); num.foo = 'bar'; assert.equal(util.inspect(num), '{ [Number: 13.37] foo: \'bar\' }'); + +// test es6 Symbol +if (typeof Symbol !== 'undefined') { + assert.equal(util.inspect(Symbol()), 'Symbol()'); + assert.equal(util.inspect(Symbol(123)), 'Symbol(123)'); + assert.equal(util.inspect(Symbol('hi')), 'Symbol(hi)'); + assert.equal(util.inspect([Symbol()]), '[ Symbol() ]'); + assert.equal(util.inspect({ foo: Symbol() }), '{ foo: Symbol() }'); +} From 87ce067636a6ea52cd978c68f9e837d5d115b4f0 Mon Sep 17 00:00:00 2001 From: Steve Sharp Date: Sun, 28 Sep 2014 16:03:25 -0700 Subject: [PATCH 042/144] doc: Update net.markdown Associates link to dns.lookup() with proper URL. Fixes: https://github.com/joyent/node/issues/8018 Reviewed-by: Trevor Norris Reviewed-by: Chris Dickinson --- doc/api/net.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/api/net.markdown b/doc/api/net.markdown index 2881d440765..0afcffc753b 100644 --- a/doc/api/net.markdown +++ b/doc/api/net.markdown @@ -603,3 +603,4 @@ Returns true if input is a version 6 IP address, otherwise returns false. [server.getConnections()]: #net_server_getconnections_callback [Readable Stream]: stream.html#stream_readable_stream [stream.setEncoding()]: stream.html#stream_stream_setencoding_encoding +[dns.lookup()]: dns.html#dns_dns_lookup_domain_family_callback From 8392e8cdfb71e8cc03e110f7b30ed104b3b136bd Mon Sep 17 00:00:00 2001 From: Victor Widell Date: Sun, 30 Mar 2014 12:34:45 +0200 Subject: [PATCH 043/144] doc: improve readLine.pause() The docs for readLine.pause are misleading. I seriously spent hours on this. If it isn't a bug, at least it should be well documented. Someone else stumbled on this too: http://stackoverflow.com/questions/21341050/pausing-readline-in-node-js Reviewed-by: Trevor Norris Reviewed-by: Chris Dickinson --- doc/api/readline.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/api/readline.markdown b/doc/api/readline.markdown index 6aab28679ba..055bc39bdf9 100644 --- a/doc/api/readline.markdown +++ b/doc/api/readline.markdown @@ -125,6 +125,8 @@ Example usage: Pauses the readline `input` stream, allowing it to be resumed later if needed. +Note that this doesn't immediately pause the stream of events. Several events may be emitted after calling `pause`, including `line`. + ### rl.resume() Resumes the readline `input` stream. From 640ad632e3bf04fe07fa2b9dc3ca940c2e8d0261 Mon Sep 17 00:00:00 2001 From: Evan Rutledge Borden Date: Fri, 26 Sep 2014 11:59:39 -0400 Subject: [PATCH 044/144] url: fixed encoding for slash switching emulation. Fixes: https://github.com/joyent/node/issues/8458 Reviewed-by: Trevor Norris Reviewed-by: Chris Dickinson --- lib/url.js | 12 ++++++++---- test/simple/test-url.js | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/lib/url.js b/lib/url.js index 6463424207d..d772b4f58c6 100644 --- a/lib/url.js +++ b/lib/url.js @@ -111,10 +111,14 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { } // Copy chrome, IE, opera backslash-handling behavior. + // Back slashes before the query string get converted to forward slashes // See: https://code.google.com/p/chromium/issues/detail?id=25916 - var hashSplit = url.split('#'); - hashSplit[0] = hashSplit[0].replace(/\\/g, '/'); - url = hashSplit.join('#'); + var queryIndex = url.indexOf('?'), + splitter = (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#', + uSplit = url.split(splitter), + slashRegex = /\\/g; + uSplit[0] = uSplit[0].replace(slashRegex, '/'); + url = uSplit.join(splitter); var rest = url; @@ -122,7 +126,7 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { // This is to support parse stuff like " http://foo.com \n" rest = rest.trim(); - if (!slashesDenoteHost && hashSplit.length === 1) { + if (!slashesDenoteHost && url.split('#').length === 1) { // Try fast path regexp var simplePath = simplePathPattern.exec(rest); if (simplePath) { diff --git a/test/simple/test-url.js b/test/simple/test-url.js index e0a1b872d28..8bfedcdf3d6 100644 --- a/test/simple/test-url.js +++ b/test/simple/test-url.js @@ -45,6 +45,30 @@ var parseTests = { href: 'http://evil-phisher/foo.html#h%5Ca%5Cs%5Ch' }, + 'http:\\\\evil-phisher\\foo.html?json="\\"foo\\""#h\\a\\s\\h': { + protocol: 'http:', + slashes: true, + host: 'evil-phisher', + hostname: 'evil-phisher', + pathname: '/foo.html', + search: '?json=%22%5C%22foo%5C%22%22', + query: 'json=%22%5C%22foo%5C%22%22', + path: '/foo.html?json=%22%5C%22foo%5C%22%22', + hash: '#h%5Ca%5Cs%5Ch', + href: 'http://evil-phisher/foo.html?json=%22%5C%22foo%5C%22%22#h%5Ca%5Cs%5Ch' + }, + + 'http:\\\\evil-phisher\\foo.html#h\\a\\s\\h?blarg': { + protocol: 'http:', + slashes: true, + host: 'evil-phisher', + hostname: 'evil-phisher', + pathname: '/foo.html', + path: '/foo.html', + hash: '#h%5Ca%5Cs%5Ch?blarg', + href: 'http://evil-phisher/foo.html#h%5Ca%5Cs%5Ch?blarg' + }, + 'http:\\\\evil-phisher\\foo.html': { protocol: 'http:', From f769d133b7612edb8115d53d28fad7aab5387580 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Fri, 3 Oct 2014 17:42:37 -0700 Subject: [PATCH 045/144] build: i18n: move noisy variables to separate gypi Fixes: https://github.com/joyent/node/issues/7676#issuecomment-57535890 Reviewed-by: Trevor Norris --- .gitignore | 1 + configure | 33 ++++++++++++++++++++++++--------- tools/icu/icu-generic.gyp | 1 + 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index f5b0105840e..6581dee9d1f 100644 --- a/.gitignore +++ b/.gitignore @@ -68,3 +68,4 @@ deps/zlib/zlib.target.mk # test artifacts tools/faketime +icu_config.gypi diff --git a/configure b/configure index 6db8703201e..c558f7f8dd7 100755 --- a/configure +++ b/configure @@ -691,6 +691,14 @@ def configure_winsdk(o): print('ctrpp not found in WinSDK path--using pre-gen files ' 'from tools/msvs/genfiles.') +def write(filename, data): + filename = os.path.join(root_dir, filename) + print 'creating ', filename + f = open(filename, 'w+') + f.write(data) + +do_not_edit = '# Do not edit. Generated by the configure script.\n' + def glob_to_var(dir_base, dir_sub): list = [] dir_all = os.path.join(dir_base, dir_sub) @@ -703,8 +711,18 @@ def glob_to_var(dir_base, dir_sub): break return list - def configure_intl(o): + icu_config = { + 'variables': {} + } + icu_config_name = 'icu_config.gypi' + def write_config(data, name): + return + + # write an empty file to start with + write(icu_config_name, do_not_edit + + pprint.pformat(icu_config, indent=2) + '\n') + # small ICU is off by default. # always set icu_small, node.gyp depends on it being defined. o['variables']['icu_small'] = b(False) @@ -821,7 +839,10 @@ def configure_intl(o): for i in icu_src: var = 'icu_src_%s' % i path = '../../deps/icu/source/%s' % icu_src[i] - o['variables'][var] = glob_to_var('tools/icu', path) + icu_config['variables'][var] = glob_to_var('tools/icu', path) + # write updated icu_config.gypi with a bunch of paths + write(icu_config_name, do_not_edit + + pprint.pformat(icu_config, indent=2) + '\n') return # end of configure_intl # determine the "flavor" (operating system) we're building for, @@ -860,13 +881,7 @@ output = { } pprint.pprint(output, indent=2) -def write(filename, data): - filename = os.path.join(root_dir, filename) - print 'creating ', filename - f = open(filename, 'w+') - f.write(data) - -write('config.gypi', '# Do not edit. Generated by the configure script.\n' + +write('config.gypi', do_not_edit + pprint.pformat(output, indent=2) + '\n') config = { diff --git a/tools/icu/icu-generic.gyp b/tools/icu/icu-generic.gyp index fa5e5773b2b..bc0a660cbfa 100644 --- a/tools/icu/icu-generic.gyp +++ b/tools/icu/icu-generic.gyp @@ -9,6 +9,7 @@ 'variables': { 'icu_src_derb': [ '../../deps/icu/source/tools/genrb/derb.c' ], }, + 'includes': [ '../../icu_config.gypi' ], 'targets': [ { # a target to hold uconfig defines. From 0a22ed4cc8dded1404c1999939fef402523d1117 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Fri, 3 Oct 2014 22:41:05 -0700 Subject: [PATCH 046/144] build: i18n: py27 -> py26 dependency Move from argparse to optparse for dependency management. Fixes: https://github.com/joyent/node/pull/7719#issuecomment-56868172 Reviewed-by: Trevor Norris --- tools/icu/icutrim.py | 141 ++++++++++++++++++++++--------------------- 1 file changed, 73 insertions(+), 68 deletions(-) diff --git a/tools/icu/icutrim.py b/tools/icu/icutrim.py index f6b54956c55..29a05aa4624 100755 --- a/tools/icu/icutrim.py +++ b/tools/icu/icutrim.py @@ -17,118 +17,123 @@ reload(sys) sys.setdefaultencoding("utf-8") -import argparse +import optparse import os import json import re endian=sys.byteorder -parser = argparse.ArgumentParser(description="ICU Datafile repackager. Example of use: \"mkdir tmp ; python icutrim.py -D ~/Downloads/icudt53l.dat -T tmp -F trim_en.json -O icudt53l.dat\" you will then find a smaller icudt53l.dat in 'tmp'. ", - epilog="ICU tool, http://icu-project.org - master copy at http://source.icu-project.org/repos/icu/tools/trunk/scripts/icutrim.py") +parser = optparse.OptionParser(usage="usage: mkdir tmp ; %prog -D ~/Downloads/icudt53l.dat -T tmp -F trim_en.json -O icudt53l.dat" ) -parser.add_argument("-P","--tool-path", +parser.add_option("-P","--tool-path", action="store", dest="toolpath", help="set the prefix directory for ICU tools") -parser.add_argument("-D","--input-file", +parser.add_option("-D","--input-file", action="store", dest="datfile", help="input data file (icudt__.dat)", - required=True) + ) # required -parser.add_argument("-F","--filter-file", +parser.add_option("-F","--filter-file", action="store", dest="filterfile", help="filter file (JSON format)", - required=True) + ) # required -parser.add_argument("-T","--tmp-dir", +parser.add_option("-T","--tmp-dir", action="store", dest="tmpdir", help="working directory.", - required=True) + ) # required -parser.add_argument("--delete-tmp", +parser.add_option("--delete-tmp", action="count", dest="deltmpdir", help="delete working directory.", default=0) -parser.add_argument("-O","--outfile", +parser.add_option("-O","--outfile", action="store", dest="outfile", help="outfile (NOT a full path)", - required=True) + ) # required -parser.add_argument("-v","--verbose", +parser.add_option("-v","--verbose", action="count", default=0) -parser.add_argument('-e', '--endian', action='store', dest='endian', help='endian, big, little or host, your default is "%s".' % endian, default=endian, metavar='endianness') +parser.add_option('-e', '--endian', action='store', dest='endian', help='endian, big, little or host, your default is "%s".' % endian, default=endian, metavar='endianness') +(options, args) = parser.parse_args() -args = parser.parse_args() +optVars = vars(options) -if args.verbose>0: - print "Options: "+str(args) +for opt in [ "datfile", "filterfile", "tmpdir", "outfile" ]: + if optVars[opt] is None: + print "Missing required option: %s" % opt + sys.exit(1) + +if options.verbose>0: + print "Options: "+str(options) -if (os.path.isdir(args.tmpdir) and args.deltmpdir): - if args.verbose>1: - print "Deleting tmp dir %s.." % (args.tmpdir) - shutil.rmtree(args.tmpdir) +if (os.path.isdir(options.tmpdir) and options.deltmpdir): + if options.verbose>1: + print "Deleting tmp dir %s.." % (options.tmpdir) + shutil.rmtree(options.tmpdir) -if not (os.path.isdir(args.tmpdir)): - os.mkdir(args.tmpdir) +if not (os.path.isdir(options.tmpdir)): + os.mkdir(options.tmpdir) else: - print "Please delete tmpdir %s before beginning." % args.tmpdir + print "Please delete tmpdir %s before beginning." % options.tmpdir sys.exit(1) -if args.endian not in ("big","little","host"): - print "Unknown endianness: %s" % args.endian +if options.endian not in ("big","little","host"): + print "Unknown endianness: %s" % options.endian sys.exit(1) -if args.endian is "host": - args.endian = endian +if options.endian is "host": + options.endian = endian -if not os.path.isdir(args.tmpdir): - print "Error, tmpdir not a directory: %s" % (args.tmpdir) +if not os.path.isdir(options.tmpdir): + print "Error, tmpdir not a directory: %s" % (options.tmpdir) sys.exit(1) -if not os.path.isfile(args.filterfile): - print "Filterfile doesn't exist: %s" % (args.filterfile) +if not os.path.isfile(options.filterfile): + print "Filterfile doesn't exist: %s" % (options.filterfile) sys.exit(1) -if not os.path.isfile(args.datfile): - print "Datfile doesn't exist: %s" % (args.datfile) +if not os.path.isfile(options.datfile): + print "Datfile doesn't exist: %s" % (options.datfile) sys.exit(1) -if not args.datfile.endswith(".dat"): - print "Datfile doesn't end with .dat: %s" % (args.datfile) +if not options.datfile.endswith(".dat"): + print "Datfile doesn't end with .dat: %s" % (options.datfile) sys.exit(1) -outfile = os.path.join(args.tmpdir, args.outfile) +outfile = os.path.join(options.tmpdir, options.outfile) if os.path.isfile(outfile): print "Error, output file does exist: %s" % (outfile) sys.exit(1) -if not args.outfile.endswith(".dat"): - print "Outfile doesn't end with .dat: %s" % (args.outfile) +if not options.outfile.endswith(".dat"): + print "Outfile doesn't end with .dat: %s" % (options.outfile) sys.exit(1) -dataname=args.outfile[0:-4] +dataname=options.outfile[0:-4] ## TODO: need to improve this. Quotes, etc. def runcmd(tool, cmd, doContinue=False): - if(args.toolpath): - cmd = os.path.join(args.toolpath, tool) + " " + cmd + if(options.toolpath): + cmd = os.path.join(options.toolpath, tool) + " " + cmd else: cmd = tool + " " + cmd - if(args.verbose>4): + if(options.verbose>4): print "# " + cmd rc = os.system(cmd) @@ -138,24 +143,24 @@ def runcmd(tool, cmd, doContinue=False): return rc ## STEP 0 - read in json config -fi= open(args.filterfile, "rb") +fi= open(options.filterfile, "rb") config=json.load(fi) fi.close() -if (args.verbose > 6): +if (options.verbose > 6): print config if(config.has_key("comment")): - print "%s: %s" % (args.filterfile, config["comment"]) + print "%s: %s" % (options.filterfile, config["comment"]) ## STEP 1 - copy the data file, swapping endianness endian_letter = "l" -runcmd("icupkg", "-t%s %s %s""" % (endian_letter, args.datfile, outfile)) +runcmd("icupkg", "-t%s %s %s""" % (endian_letter, options.datfile, outfile)) ## STEP 2 - get listing -listfile = os.path.join(args.tmpdir,"icudata.lst") +listfile = os.path.join(options.tmpdir,"icudata.lst") runcmd("icupkg", "-l %s > %s""" % (outfile, listfile)) fi = open(listfile, 'rb') @@ -165,7 +170,7 @@ def runcmd(tool, cmd, doContinue=False): itemset = set(items) -if (args.verbose>1): +if (options.verbose>1): print "input file: %d items" % (len(items)) # list of all trees @@ -192,23 +197,23 @@ def queueForRemoval(tree): if not config["trees"].has_key(tree): return mytree = trees[tree] - if(args.verbose>0): + if(options.verbose>0): print "* %s: %d items" % (tree, len(mytree["locs"])) # do varible substitution for this tree here if type(config["trees"][tree]) == str or type(config["trees"][tree]) == unicode: treeStr = config["trees"][tree] - if(args.verbose>5): + if(options.verbose>5): print " Substituting $%s for tree %s" % (treeStr, tree) if(not config.has_key("variables") or not config["variables"].has_key(treeStr)): print " ERROR: no variable: variables.%s for tree %s" % (treeStr, tree) sys.exit(1) config["trees"][tree] = config["variables"][treeStr] myconfig = config["trees"][tree] - if(args.verbose>4): + if(options.verbose>4): print " Config: %s" % (myconfig) # Process this tree if(len(myconfig)==0 or len(mytree["locs"])==0): - if(args.verbose>2): + if(options.verbose>2): print " No processing for %s - skipping" % (tree) else: only = None @@ -217,7 +222,7 @@ def queueForRemoval(tree): if (len(only)==0) and (mytree["treeprefix"] != ""): thePool = "%spool.res" % (mytree["treeprefix"]) if (thePool in itemset): - if(args.verbose>0): + if(options.verbose>0): print "Removing %s because tree %s is empty." % (thePool, tree) remove.add(thePool) else: @@ -227,12 +232,12 @@ def queueForRemoval(tree): if (only is not None) and not loc in only: # REMOVE loc toRemove = "%s%s%s" % (mytree["treeprefix"], loc, mytree["extension"]) - if(args.verbose>6): + if(options.verbose>6): print "Queueing for removal: %s" % toRemove remove.add(toRemove) def addTreeByType(tree, mytree): - if(args.verbose>1): + if(options.verbose>1): print "(considering %s): %s" % (tree, mytree) trees[tree] = mytree mytree["locs"]=[] @@ -259,18 +264,18 @@ def addTreeByType(tree, mytree): tree = "ROOT" else: tree = treeprefix[0:-1] - if(args.verbose>6): + if(options.verbose>6): print "procesing %s" % (tree) trees[tree] = { "extension": ".res", "treeprefix": treeprefix, "hasIndex": True } # read in the resource list for the tree - treelistfile = os.path.join(args.tmpdir,"%s.lst" % tree) + treelistfile = os.path.join(options.tmpdir,"%s.lst" % tree) runcmd("iculslocs", "-i %s -N %s -T %s -l > %s" % (outfile, dataname, tree, treelistfile)) fi = open(treelistfile, 'rb') treeitems = fi.readlines() trees[tree]["locs"] = [treeitems[i].strip() for i in range(len(treeitems))] fi.close() if(not config.has_key("trees") or not config["trees"].has_key(tree)): - print " Warning: filter file %s does not mention trees.%s - will be kept as-is" % (args.filterfile, tree) + print " Warning: filter file %s does not mention trees.%s - will be kept as-is" % (options.filterfile, tree) else: queueForRemoval(tree) @@ -281,19 +286,19 @@ def removeList(count=0): if(count > 10): print "Giving up - %dth attempt at removal." % count sys.exit(1) - if(args.verbose>1): + if(options.verbose>1): print "%d items to remove - try #%d" % (len(remove),count) if(len(remove)>0): oldcount = len(remove) - hackerrfile=os.path.join(args.tmpdir, "REMOVE.err") - removefile = os.path.join(args.tmpdir, "REMOVE.lst") + hackerrfile=os.path.join(options.tmpdir, "REMOVE.err") + removefile = os.path.join(options.tmpdir, "REMOVE.lst") fi = open(removefile, 'wb') for i in remove: print >>fi, i fi.close() rc = runcmd("icupkg","-r %s %s 2> %s" % (removefile,outfile,hackerrfile),True) if rc is not 0: - if(args.verbose>5): + if(options.verbose>5): print "## Damage control, trying to parse stderr from icupkg.." fi = open(hackerrfile, 'rb') erritems = fi.readlines() @@ -305,13 +310,13 @@ def removeList(count=0): m = pat.match(line) if m: toDelete = m.group(1) - if(args.verbose > 5): + if(options.verbose > 5): print "<< %s added to delete" % toDelete remove.add(toDelete) else: print "ERROR: could not match errline: %s" % line sys.exit(1) - if(args.verbose > 5): + if(options.verbose > 5): print " now %d items to remove" % len(remove) if(oldcount == len(remove)): print " ERROR: could not add any mor eitems to remove. Fail." @@ -326,7 +331,7 @@ def removeList(count=0): # skip trees that don't have res_index if not trees[tree].has_key("hasIndex"): continue - treebunddir = args.tmpdir + treebunddir = options.tmpdir if(trees[tree]["treeprefix"]): treebunddir = os.path.join(treebunddir, trees[tree]["treeprefix"]) if not (os.path.isdir(treebunddir)): @@ -335,4 +340,4 @@ def removeList(count=0): treebundtxt = "%s.txt" % (treebundres[0:-4]) runcmd("iculslocs", "-i %s -N %s -T %s -b %s" % (outfile, dataname, tree, treebundtxt)) runcmd("genrb","-d %s -s %s res_index.txt" % (treebunddir, treebunddir)) - runcmd("icupkg","-s %s -a %s%s %s" % (args.tmpdir, trees[tree]["treeprefix"], RES_INDX, outfile)) + runcmd("icupkg","-s %s -a %s%s %s" % (options.tmpdir, trees[tree]["treeprefix"], RES_INDX, outfile)) From f04f3a0d012603fb7bbc3e1c05a5a6cd01ab4010 Mon Sep 17 00:00:00 2001 From: Johnny Ray Date: Tue, 7 Oct 2014 16:32:05 -0700 Subject: [PATCH 047/144] streams: set default encoding for writable streams Add API Writable#setDefaultEncoding(). PR-URL: https://github.com/joyent/node/pull/8483 Fixes: https://github.com/joyent/node/issues/7159 Reviewed-by: Trevor Norris --- doc/api/stream.markdown | 8 ++ lib/_stream_writable.js | 11 +++ ...stream-writable-change-default-encoding.js | 76 +++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 test/simple/test-stream-writable-change-default-encoding.js diff --git a/doc/api/stream.markdown b/doc/api/stream.markdown index ec8aabb7d89..eb62021bfe8 100644 --- a/doc/api/stream.markdown +++ b/doc/api/stream.markdown @@ -564,6 +564,14 @@ Buffered data will be flushed either at `.uncork()` or at `.end()` call. Flush all data, buffered since `.cork()` call. +#### writable.setDefaultEncoding(encoding) + +* `encoding` {String} The new default encoding +* Return: `Boolean` + +Sets the default encoding for a writable stream. Returns `true` if the encoding +is valid and is set. Otherwise returns `false`. + #### writable.end([chunk][, encoding][, callback]) * `chunk` {String | Buffer} Optional data to write diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js index dbc227bbaf3..11b57c78cd0 100644 --- a/lib/_stream_writable.js +++ b/lib/_stream_writable.js @@ -221,6 +221,17 @@ Writable.prototype.uncork = function() { } }; +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + if (typeof encoding !== 'string') + return false; + // node::ParseEncoding() requires lower case. + encoding = encoding.toLowerCase(); + if (!Buffer.isEncoding(encoding)) + return false; + this._writableState.defaultEncoding = encoding; + return true; +}; + function decodeChunk(state, chunk, encoding) { if (!state.objectMode && state.decodeStrings !== false && diff --git a/test/simple/test-stream-writable-change-default-encoding.js b/test/simple/test-stream-writable-change-default-encoding.js new file mode 100644 index 00000000000..c242b247d3d --- /dev/null +++ b/test/simple/test-stream-writable-change-default-encoding.js @@ -0,0 +1,76 @@ +// 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 common = require('../common'); +var assert = require('assert'); + +var stream = require('stream'); +var util = require('util'); + +function MyWritable(fn, options) { + stream.Writable.call(this, options); + this.fn = fn; +}; + +util.inherits(MyWritable, stream.Writable); + +MyWritable.prototype._write = function (chunk, encoding, callback) { + this.fn(Buffer.isBuffer(chunk), typeof chunk, encoding); + callback(); +}; + +(function defaultCondingIsUtf8() { + var m = new MyWritable(function(isBuffer, type, enc) { + assert.equal(enc, 'utf8'); + }, { decodeStrings: false }); + m.write('foo'); + m.end(); +}()); + +(function changeDefaultEncodingToAscii() { + var m = new MyWritable(function(isBuffer, type, enc) { + assert.equal(enc, 'ascii'); + }, { decodeStrings: false }); + var status = m.setDefaultEncoding('ascii'); + assert.equal(status, true); + m.write('bar'); + m.end(); +}()); + +(function changeDefaultEncodingToInvalidValue() { + var m = new MyWritable(function(isBuffer, type, enc) { + assert.equal(enc, 'utf8'); + }, { decodeStrings: false }); + var status = m.setDefaultEncoding({}); + assert.equal(status, false); + m.write('bar'); + m.end(); +}()); + +(function checkVairableCaseEncoding() { + var m = new MyWritable(function(isBuffer, type, enc) { + assert.equal(enc, 'ascii'); + }, { decodeStrings: false }); + var status = m.setDefaultEncoding('AsCii'); + assert.equal(status, true); + m.write('bar'); + m.end(); +}()); From 6e4bd494a50c3dfd432a5a6dd4a13556443dfa79 Mon Sep 17 00:00:00 2001 From: Steve Mao Date: Fri, 3 Oct 2014 15:53:15 +1000 Subject: [PATCH 048/144] doc: add missing semicolons PR-URL: https://github.com/joyent/node/pull/8498 Reviewed-by: Trevor Norris --- doc/api/stream.markdown | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/api/stream.markdown b/doc/api/stream.markdown index eb62021bfe8..5ffcef91456 100644 --- a/doc/api/stream.markdown +++ b/doc/api/stream.markdown @@ -65,7 +65,7 @@ var server = http.createServer(function (req, res) { // Readable streams emit 'data' events once a listener is added req.on('data', function (chunk) { body += chunk; - }) + }); // the end event tells you that you have entire body req.on('end', function () { @@ -80,8 +80,8 @@ var server = http.createServer(function (req, res) { // write back something interesting to the user: res.write(typeof data); res.end(); - }) -}) + }); +}); server.listen(1337); @@ -158,7 +158,7 @@ hadn't already. var readable = getReadableStreamSomehow(); readable.on('readable', function() { // there is some data to read now -}) +}); ``` Once the internal buffer is drained, a `readable` event will fire @@ -179,7 +179,7 @@ possible, this is the best way to do so. var readable = getReadableStreamSomehow(); readable.on('data', function(chunk) { console.log('got %d bytes of data', chunk.length); -}) +}); ``` #### Event: 'end' @@ -194,7 +194,7 @@ or by calling `read()` repeatedly until you get to the end. var readable = getReadableStreamSomehow(); readable.on('data', function(chunk) { console.log('got %d bytes of data', chunk.length); -}) +}); readable.on('end', function() { console.log('there will be no more data.'); }); @@ -266,7 +266,7 @@ readable.setEncoding('utf8'); readable.on('data', function(chunk) { assert.equal(typeof chunk, 'string'); console.log('got %d characters of string data', chunk.length); -}) +}); ``` #### readable.resume() @@ -286,7 +286,7 @@ var readable = getReadableStreamSomehow(); readable.resume(); readable.on('end', function(chunk) { console.log('got to the end, but did not read anything'); -}) +}); ``` #### readable.pause() @@ -307,7 +307,7 @@ readable.on('data', function(chunk) { console.log('now data will start flowing again'); readable.resume(); }, 1000); -}) +}); ``` #### readable.isPaused() From 4809c7aa4f84385ba358d1947203fbeba8555b76 Mon Sep 17 00:00:00 2001 From: Trevor Norris Date: Wed, 8 Oct 2014 01:06:06 -0700 Subject: [PATCH 049/144] smalloc: update use of ExternalArrayType constants The constants in enum v8::ExternalArrayType have been changed. The old values are there for legacy reasons, but it's best to update anyway. Signed-off-by: Trevor Norris --- lib/smalloc.js | 3 ++- src/smalloc.cc | 18 +++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/smalloc.js b/lib/smalloc.js index 22525ad0dec..ba042c6c4c5 100644 --- a/lib/smalloc.js +++ b/lib/smalloc.js @@ -37,6 +37,7 @@ Object.defineProperty(exports, 'kMaxLength', { // enumerated values for different external array types var Types = {}; +// Must match enum v8::ExternalArrayType. Object.defineProperties(Types, { 'Int8': { enumerable: true, value: 1, writable: false }, 'Uint8': { enumerable: true, value: 2, writable: false }, @@ -68,7 +69,7 @@ function alloc(n, obj, type) { throw new TypeError('obj must be an Object'); } - // 1 == v8::kExternalByteArray, 9 == v8::kExternalPixelArray + // 1 == v8::kExternalUint8Array, 9 == v8::kExternalUint8ClampedArray if (type < 1 || type > 9) throw new TypeError('unknown external array type: ' + type); if (util.isArray(obj)) diff --git a/src/smalloc.cc b/src/smalloc.cc index f2eedc369f3..d271479e41b 100644 --- a/src/smalloc.cc +++ b/src/smalloc.cc @@ -147,23 +147,23 @@ void CallbackInfo::WeakCallback(Isolate* isolate, Local object) { // return size of external array type, or 0 if unrecognized size_t ExternalArraySize(enum ExternalArrayType type) { switch (type) { - case v8::kExternalUnsignedByteArray: + case v8::kExternalUint8Array: return sizeof(uint8_t); - case v8::kExternalByteArray: + case v8::kExternalInt8Array: return sizeof(int8_t); - case v8::kExternalShortArray: + case v8::kExternalInt16Array: return sizeof(int16_t); - case v8::kExternalUnsignedShortArray: + case v8::kExternalUint16Array: return sizeof(uint16_t); - case v8::kExternalIntArray: + case v8::kExternalInt32Array: return sizeof(int32_t); - case v8::kExternalUnsignedIntArray: + case v8::kExternalUint32Array: return sizeof(uint32_t); - case v8::kExternalFloatArray: + case v8::kExternalFloat32Array: return sizeof(float); // NOLINT(runtime/sizeof) - case v8::kExternalDoubleArray: + case v8::kExternalFloat64Array: return sizeof(double); // NOLINT(runtime/sizeof) - case v8::kExternalPixelArray: + case v8::kExternalUint8ClampedArray: return sizeof(uint8_t); } return 0; From 7b4a540422f2155f0e57d963be69960c1325474d Mon Sep 17 00:00:00 2001 From: Trevor Norris Date: Wed, 8 Oct 2014 01:13:43 -0700 Subject: [PATCH 050/144] src: fix jslint warning Signed-off-by: Trevor Norris --- lib/url.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/url.js b/lib/url.js index d772b4f58c6..e01343a5069 100644 --- a/lib/url.js +++ b/lib/url.js @@ -114,7 +114,8 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { // Back slashes before the query string get converted to forward slashes // See: https://code.google.com/p/chromium/issues/detail?id=25916 var queryIndex = url.indexOf('?'), - splitter = (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#', + splitter = + (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#', uSplit = url.split(splitter), slashRegex = /\\/g; uSplit[0] = uSplit[0].replace(slashRegex, '/'); From 573e6afc090d9bf194aef307de4b4bfe59c5867f Mon Sep 17 00:00:00 2001 From: Refael Ackermann Date: Thu, 2 Oct 2014 11:20:51 +0300 Subject: [PATCH 051/144] tools: fix for testing openssl integrations Windows doesn't resolve ".." the way we expect it for symlinks and junctions. PR-URL: https://github.com/joyent/node/pull/8489 Reviewed-by: Trevor Norris Reviewed-by: Fedor Indutny --- test/common.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/common.js b/test/common.js index bd7318c95ef..622b0a3985f 100644 --- a/test/common.js +++ b/test/common.js @@ -30,12 +30,12 @@ exports.libDir = path.join(exports.testDir, '../lib'); exports.tmpDir = path.join(exports.testDir, 'tmp'); exports.PORT = +process.env.NODE_COMMON_PORT || 12346; +exports.opensslCli = path.join(path.dirname(process.execPath), 'openssl-cli'); if (process.platform === 'win32') { exports.PIPE = '\\\\.\\pipe\\libuv-test'; - exports.opensslCli = path.join(process.execPath, '..', 'openssl-cli.exe'); + exports.opensslCli += '.exe'; } else { exports.PIPE = exports.tmpDir + '/test.sock'; - exports.opensslCli = path.join(process.execPath, '..', 'openssl-cli'); } if (!fs.existsSync(exports.opensslCli)) exports.opensslCli = false; From bdc2ea4d52bd4a9871970ec2bfbf80292ca6e8e8 Mon Sep 17 00:00:00 2001 From: Trevor Norris Date: Wed, 8 Oct 2014 01:34:46 -0700 Subject: [PATCH 052/144] src: update use of ExternalArrayType constants Continuation of 4809c7a to update the use of v8::ExternalArrayType. Signed-off-by: Trevor Norris --- src/node.cc | 8 ++++---- src/node_buffer.cc | 2 +- src/smalloc.cc | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/node.cc b/src/node.cc index 1767d255b28..0e798b13537 100644 --- a/src/node.cc +++ b/src/node.cc @@ -120,7 +120,7 @@ using v8::TryCatch; using v8::Uint32; using v8::V8; using v8::Value; -using v8::kExternalUnsignedIntArray; +using v8::kExternalUint32Array; // FIXME(bnoordhuis) Make these per-context? QUEUE handle_wrap_queue = { &handle_wrap_queue, &handle_wrap_queue }; @@ -928,7 +928,7 @@ void SetupAsyncListener(const FunctionCallbackInfo& args) { Environment::AsyncListener* async_listener = env->async_listener(); async_listener_flag_obj->SetIndexedPropertiesToExternalArrayData( async_listener->fields(), - kExternalUnsignedIntArray, + kExternalUint32Array, async_listener->fields_count()); // Do a little housekeeping. @@ -968,7 +968,7 @@ void SetupDomainUse(const FunctionCallbackInfo& args) { Environment::DomainFlag* domain_flag = env->domain_flag(); domain_flag_obj->SetIndexedPropertiesToExternalArrayData( domain_flag->fields(), - kExternalUnsignedIntArray, + kExternalUint32Array, domain_flag->fields_count()); // Do a little housekeeping. @@ -993,7 +993,7 @@ void SetupNextTick(const FunctionCallbackInfo& args) { Local tick_info_obj = args[0].As(); tick_info_obj->SetIndexedPropertiesToExternalArrayData( env->tick_info()->fields(), - kExternalUnsignedIntArray, + kExternalUint32Array, env->tick_info()->fields_count()); env->set_tick_callback_function(args[1].As()); diff --git a/src/node_buffer.cc b/src/node_buffer.cc index 3f8de59b4f8..822c4f868dd 100644 --- a/src/node_buffer.cc +++ b/src/node_buffer.cc @@ -87,7 +87,7 @@ bool HasInstance(Handle obj) { if (!obj->HasIndexedPropertiesInExternalArrayData()) return false; v8::ExternalArrayType type = obj->GetIndexedPropertiesExternalArrayDataType(); - return type == v8::kExternalUnsignedByteArray; + return type == v8::kExternalUint8Array; } diff --git a/src/smalloc.cc b/src/smalloc.cc index d271479e41b..41298030ce1 100644 --- a/src/smalloc.cc +++ b/src/smalloc.cc @@ -51,7 +51,7 @@ using v8::RetainedObjectInfo; using v8::Uint32; using v8::Value; using v8::WeakCallbackData; -using v8::kExternalUnsignedByteArray; +using v8::kExternalUint8Array; class CallbackInfo { @@ -304,7 +304,7 @@ void Alloc(const FunctionCallbackInfo& args) { // it's faster to not pass the default argument then use Uint32Value if (args[2]->IsUndefined()) { - array_type = kExternalUnsignedByteArray; + array_type = kExternalUint8Array; } else { array_type = static_cast(args[2]->Uint32Value()); size_t type_length = ExternalArraySize(array_type); @@ -385,7 +385,7 @@ void AllocDispose(Environment* env, Handle obj) { if (data != NULL) { obj->SetIndexedPropertiesToExternalArrayData(NULL, - kExternalUnsignedByteArray, + kExternalUint8Array, 0); free(data); } From 6462519d3cb7c34671dddb3cedd8441699574f35 Mon Sep 17 00:00:00 2001 From: Trevor Norris Date: Wed, 8 Oct 2014 02:08:54 -0700 Subject: [PATCH 053/144] buffer, doc: misc. fix and cleanup * Add official documentation that a Buffer instance is a viable argument when instantiating a new Buffer. * Properly set the poolOffset when a buffer needs to be truncated. * Add comments clarifying specific peculiar coding choices. * Remove a level of unnecessary indentation. Signed-off-by: Trevor Norris --- doc/api/buffer.markdown | 6 ++++ lib/buffer.js | 61 +++++++++++++++++++++++++---------------- 2 files changed, 43 insertions(+), 24 deletions(-) diff --git a/doc/api/buffer.markdown b/doc/api/buffer.markdown index e4ba04ed7f5..5d9cd9b9b7a 100644 --- a/doc/api/buffer.markdown +++ b/doc/api/buffer.markdown @@ -72,6 +72,12 @@ will be thrown here. Allocates a new buffer using an `array` of octets. +### new Buffer(buffer) + +* `buffer` {Buffer} + +Copies the passed `buffer` data onto a new `Buffer` instance. + ### new Buffer(str[, encoding]) * `str` String - string to encode. diff --git a/lib/buffer.js b/lib/buffer.js index a674991988b..2e29ae4eba7 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -49,17 +49,24 @@ function Buffer(subject, encoding) { if (!util.isBuffer(this)) return new Buffer(subject, encoding); - if (util.isNumber(subject)) + if (util.isNumber(subject)) { this.length = subject > 0 ? subject >>> 0 : 0; - else if (util.isString(subject)) - this.length = Buffer.byteLength(subject, encoding = encoding || 'utf8'); - else if (util.isObject(subject)) { + + } else if (util.isString(subject)) { + if (!util.isString(encoding) || encoding.length === 0) + encoding = 'utf8'; + this.length = Buffer.byteLength(subject, encoding); + + // Handle Arrays, Buffers, Uint8Arrays or JSON. + } else if (util.isObject(subject)) { if (subject.type === 'Buffer' && util.isArray(subject.data)) subject = subject.data; - + // Must use floor() because array length may be > kMaxLength. this.length = +subject.length > 0 ? Math.floor(+subject.length) : 0; - } else + + } else { throw new TypeError('must start with number, buffer, array or string'); + } if (this.length > kMaxLength) { throw new RangeError('Attempt to allocate Buffer larger than maximum ' + @@ -79,25 +86,31 @@ function Buffer(subject, encoding) { alloc(this, this.length); } - if (!util.isNumber(subject)) { - if (util.isString(subject)) { - // In the case of base64 it's possible that the size of the buffer - // allocated was slightly too large. In this case we need to rewrite - // the length to the actual length written. - var len = this.write(subject, encoding); - - // Buffer was truncated after decode, realloc internal ExternalArray - if (len !== this.length) { - this.length = len; - truncate(this, this.length); - } - } else { - if (util.isBuffer(subject)) - subject.copy(this, 0, 0, this.length); - else if (util.isNumber(subject.length) || util.isArray(subject)) - for (var i = 0; i < this.length; i++) - this[i] = subject[i]; + if (util.isNumber(subject)) { + return; + } + + if (util.isString(subject)) { + // In the case of base64 it's possible that the size of the buffer + // allocated was slightly too large. In this case we need to rewrite + // the length to the actual length written. + var len = this.write(subject, encoding); + // Buffer was truncated after decode, realloc internal ExternalArray + if (len !== this.length) { + var prevLen = this.length; + this.length = len; + truncate(this, this.length); + poolOffset -= (prevLen - len); } + + } else if (util.isBuffer(subject)) { + subject.copy(this, 0, 0, this.length); + + } else if (util.isNumber(subject.length) || util.isArray(subject)) { + // Really crappy way to handle Uint8Arrays, but V8 doesn't give a simple + // way to access the data from the C++ API. + for (var i = 0; i < this.length; i++) + this[i] = subject[i]; } } From a2a3fd48934f36d94575dd33d2a2cb732f937f77 Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Mon, 6 Oct 2014 16:23:01 +0400 Subject: [PATCH 054/144] tls_wrap: ignore ZERO_RETURN after close_notify Do not call SSL_read() and ignore ZERO_RETURN if the connection was shutdown and there could not be any reads. Reviewed-By: Ben Noordhuis PR-URL: https://github.com/joyent/node/pull/8519 --- src/tls_wrap.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/tls_wrap.cc b/src/tls_wrap.cc index 84bc87e0cc4..ac05c8ecace 100644 --- a/src/tls_wrap.cc +++ b/src/tls_wrap.cc @@ -447,6 +447,10 @@ void TLSCallbacks::ClearOut() { if (!hello_parser_.IsEnded()) return; + // No reads after EOF + if (eof_) + return; + HandleScope handle_scope(env()->isolate()); Context::Scope context_scope(env()->context()); @@ -476,6 +480,10 @@ void TLSCallbacks::ClearOut() { int err; Local arg = GetSSLError(read, &err, NULL); + // Ignore ZERO_RETURN after EOF, it is basically not a error + if (err == SSL_ERROR_ZERO_RETURN && eof_) + return; + if (!arg.IsEmpty()) { // When TLS Alert are stored in wbio, // it should be flushed to socket before destroyed. From 9116b240c924d37627313416b7ee038d0580afbc Mon Sep 17 00:00:00 2001 From: Refael Ackermann Date: Mon, 29 Sep 2014 13:20:04 +0400 Subject: [PATCH 055/144] deps: update v8 to 3.28.73 Reviewed-By: Fedor Indutny PR-URL: https://github.com/joyent/node/pull/8476 --- deps/v8/.DEPS.git | 66 +- deps/v8/.gitignore | 15 +- deps/v8/AUTHORS | 3 + deps/v8/BUILD.gn | 702 +- deps/v8/ChangeLog | 723 ++ deps/v8/DEPS | 69 +- deps/v8/Makefile | 72 +- deps/v8/Makefile.android | 20 +- deps/v8/Makefile.nacl | 2 +- deps/v8/OWNERS | 1 + deps/v8/PRESUBMIT.py | 69 + deps/v8/benchmarks/v8.json | 16 + deps/v8/build/all.gyp | 2 + deps/v8/build/android.gypi | 37 +- deps/v8/build/detect_v8_host_arch.py | 69 + deps/v8/build/features.gypi | 20 +- deps/v8/build/get_landmines.py | 26 + deps/v8/build/gyp_v8 | 9 + deps/v8/build/landmine_utils.py | 114 + deps/v8/build/landmines.py | 139 + deps/v8/build/standalone.gypi | 54 +- deps/v8/build/toolchain.gypi | 380 +- deps/v8/codereview.settings | 1 + deps/v8/include/libplatform/libplatform.h | 38 + deps/v8/include/v8-debug.h | 71 +- deps/v8/include/v8-platform.h | 9 +- deps/v8/include/v8-profiler.h | 29 +- deps/v8/include/v8-util.h | 13 +- deps/v8/include/v8.h | 439 +- deps/v8/samples/lineprocessor.cc | 80 +- deps/v8/samples/process.cc | 17 +- deps/v8/samples/samples.gyp | 3 +- deps/v8/samples/shell.cc | 32 +- deps/v8/src/DEPS | 13 + deps/v8/src/accessors.cc | 410 +- deps/v8/src/accessors.h | 13 +- deps/v8/src/allocation-site-scopes.cc | 6 +- deps/v8/src/allocation-site-scopes.h | 14 +- deps/v8/src/allocation-tracker.cc | 25 +- deps/v8/src/allocation.cc | 14 +- deps/v8/src/allocation.h | 2 +- deps/v8/src/api.cc | 1157 ++-- deps/v8/src/api.h | 35 +- deps/v8/src/apinatives.js | 34 +- deps/v8/src/arguments.cc | 6 +- deps/v8/src/arguments.h | 36 +- deps/v8/src/arm/assembler-arm-inl.h | 286 +- deps/v8/src/arm/assembler-arm.cc | 1211 ++-- deps/v8/src/arm/assembler-arm.h | 306 +- deps/v8/src/arm/builtins-arm.cc | 138 +- deps/v8/src/arm/code-stubs-arm.cc | 890 +-- deps/v8/src/arm/code-stubs-arm.h | 75 +- deps/v8/src/arm/codegen-arm.cc | 376 +- deps/v8/src/arm/codegen-arm.h | 4 +- deps/v8/src/arm/constants-arm.cc | 8 +- deps/v8/src/arm/constants-arm.h | 71 +- deps/v8/src/arm/cpu-arm.cc | 74 +- deps/v8/src/arm/debug-arm.cc | 146 +- deps/v8/src/arm/deoptimizer-arm.cc | 42 +- deps/v8/src/arm/disasm-arm.cc | 243 +- deps/v8/src/arm/frames-arm.cc | 21 +- deps/v8/src/arm/frames-arm.h | 2 - deps/v8/src/arm/full-codegen-arm.cc | 741 +- deps/v8/src/arm/ic-arm.cc | 471 +- deps/v8/src/arm/lithium-arm.cc | 538 +- deps/v8/src/arm/lithium-arm.h | 401 +- deps/v8/src/arm/lithium-codegen-arm.cc | 925 +-- deps/v8/src/arm/lithium-codegen-arm.h | 57 +- deps/v8/src/arm/lithium-gap-resolver-arm.cc | 44 +- deps/v8/src/arm/lithium-gap-resolver-arm.h | 4 +- deps/v8/src/arm/macro-assembler-arm.cc | 703 +- deps/v8/src/arm/macro-assembler-arm.h | 160 +- deps/v8/src/arm/regexp-macro-assembler-arm.cc | 72 +- deps/v8/src/arm/regexp-macro-assembler-arm.h | 6 +- deps/v8/src/arm/simulator-arm.cc | 265 +- deps/v8/src/arm/simulator-arm.h | 17 +- deps/v8/src/arm/stub-cache-arm.cc | 968 +-- deps/v8/src/arm64/assembler-arm64-inl.h | 460 +- deps/v8/src/arm64/assembler-arm64.cc | 1174 ++-- deps/v8/src/arm64/assembler-arm64.h | 384 +- deps/v8/src/arm64/builtins-arm64.cc | 148 +- deps/v8/src/arm64/code-stubs-arm64.cc | 826 ++- deps/v8/src/arm64/code-stubs-arm64.h | 77 +- deps/v8/src/arm64/codegen-arm64.cc | 144 +- deps/v8/src/arm64/codegen-arm64.h | 4 +- deps/v8/src/arm64/constants-arm64.h | 17 +- deps/v8/src/arm64/cpu-arm64.cc | 37 +- deps/v8/src/arm64/cpu-arm64.h | 71 - deps/v8/src/arm64/debug-arm64.cc | 162 +- deps/v8/src/arm64/decoder-arm64-inl.h | 30 +- deps/v8/src/arm64/decoder-arm64.cc | 14 +- deps/v8/src/arm64/decoder-arm64.h | 4 +- deps/v8/src/arm64/delayed-masm-arm64-inl.h | 55 + deps/v8/src/arm64/delayed-masm-arm64.cc | 198 + deps/v8/src/arm64/delayed-masm-arm64.h | 164 + deps/v8/src/arm64/deoptimizer-arm64.cc | 90 +- deps/v8/src/arm64/disasm-arm64.cc | 70 +- deps/v8/src/arm64/disasm-arm64.h | 10 +- deps/v8/src/arm64/frames-arm64.cc | 10 +- deps/v8/src/arm64/frames-arm64.h | 5 +- deps/v8/src/arm64/full-codegen-arm64.cc | 731 +- deps/v8/src/arm64/ic-arm64.cc | 412 +- deps/v8/src/arm64/instructions-arm64.cc | 28 +- deps/v8/src/arm64/instructions-arm64.h | 58 +- deps/v8/src/arm64/instrument-arm64.cc | 9 +- deps/v8/src/arm64/instrument-arm64.h | 11 +- deps/v8/src/arm64/lithium-arm64.cc | 533 +- deps/v8/src/arm64/lithium-arm64.h | 484 +- deps/v8/src/arm64/lithium-codegen-arm64.cc | 1089 +-- deps/v8/src/arm64/lithium-codegen-arm64.h | 67 +- .../src/arm64/lithium-gap-resolver-arm64.cc | 162 +- .../v8/src/arm64/lithium-gap-resolver-arm64.h | 46 +- deps/v8/src/arm64/macro-assembler-arm64-inl.h | 693 +- deps/v8/src/arm64/macro-assembler-arm64.cc | 1250 ++-- deps/v8/src/arm64/macro-assembler-arm64.h | 226 +- .../src/arm64/regexp-macro-assembler-arm64.cc | 153 +- .../src/arm64/regexp-macro-assembler-arm64.h | 9 +- deps/v8/src/arm64/simulator-arm64.cc | 770 ++- deps/v8/src/arm64/simulator-arm64.h | 214 +- deps/v8/src/arm64/stub-cache-arm64.cc | 959 +-- deps/v8/src/arm64/utils-arm64.cc | 17 +- deps/v8/src/arm64/utils-arm64.h | 10 +- deps/v8/src/array-iterator.js | 102 +- deps/v8/src/array.js | 125 +- deps/v8/src/arraybuffer.js | 7 +- deps/v8/src/assembler.cc | 313 +- deps/v8/src/assembler.h | 175 +- deps/v8/src/assert-scope.cc | 4 +- deps/v8/src/assert-scope.h | 24 +- deps/v8/src/ast-value-factory.cc | 409 ++ deps/v8/src/ast-value-factory.h | 344 + deps/v8/src/ast.cc | 225 +- deps/v8/src/ast.h | 530 +- deps/v8/src/base/DEPS | 7 + deps/v8/src/{ => base}/atomicops.h | 32 +- .../atomicops_internals_arm64_gcc.h | 10 +- .../{ => base}/atomicops_internals_arm_gcc.h | 10 +- .../atomicops_internals_atomicword_compat.h | 22 +- .../src/{ => base}/atomicops_internals_mac.h | 10 +- .../src/base/atomicops_internals_mips64_gcc.h | 307 + .../{ => base}/atomicops_internals_mips_gcc.h | 10 +- .../src/{ => base}/atomicops_internals_tsan.h | 26 +- .../{ => base}/atomicops_internals_x86_gcc.cc | 23 +- .../{ => base}/atomicops_internals_x86_gcc.h | 14 +- .../{ => base}/atomicops_internals_x86_msvc.h | 14 +- deps/v8/src/base/build_config.h | 169 + deps/v8/src/{ => base}/cpu.cc | 93 +- deps/v8/src/{ => base}/cpu.h | 25 +- deps/v8/src/{ => base}/lazy-instance.h | 14 +- deps/v8/src/base/logging.cc | 88 + deps/v8/src/base/logging.h | 223 + deps/v8/src/base/macros.h | 193 +- deps/v8/src/{ => base}/once.cc | 9 +- deps/v8/src/{ => base}/once.h | 14 +- .../{ => base}/platform/condition-variable.cc | 60 +- .../{ => base}/platform/condition-variable.h | 19 +- .../src/{ => base}/platform/elapsed-timer.h | 42 +- deps/v8/src/{ => base}/platform/mutex.cc | 40 +- deps/v8/src/{ => base}/platform/mutex.h | 22 +- .../{ => base/platform}/platform-cygwin.cc | 75 +- .../{ => base/platform}/platform-freebsd.cc | 51 +- .../src/{ => base/platform}/platform-linux.cc | 62 +- .../src/{ => base/platform}/platform-macos.cc | 58 +- .../{ => base/platform}/platform-openbsd.cc | 60 +- .../src/{ => base/platform}/platform-posix.cc | 255 +- .../src/{ => base/platform}/platform-qnx.cc | 67 +- .../{ => base/platform}/platform-solaris.cc | 89 +- .../src/{ => base/platform}/platform-win32.cc | 236 +- deps/v8/src/{ => base/platform}/platform.h | 178 +- deps/v8/src/{ => base}/platform/semaphore.cc | 50 +- deps/v8/src/{ => base}/platform/semaphore.h | 20 +- deps/v8/src/{ => base}/platform/time.cc | 156 +- deps/v8/src/{ => base}/platform/time.h | 25 +- deps/v8/src/{ => base}/qnx-math.h | 6 +- deps/v8/src/base/safe_conversions.h | 67 + deps/v8/src/base/safe_conversions_impl.h | 220 + deps/v8/src/base/safe_math.h | 276 + deps/v8/src/base/safe_math_impl.h | 531 ++ .../utils/random-number-generator.cc | 41 +- .../utils/random-number-generator.h | 16 +- deps/v8/src/{ => base}/win32-headers.h | 8 +- deps/v8/src/{ => base}/win32-math.cc | 10 +- deps/v8/src/{ => base}/win32-math.h | 6 +- deps/v8/src/bignum-dtoa.cc | 40 +- deps/v8/src/bignum.cc | 81 +- deps/v8/src/bootstrapper.cc | 1289 ++-- deps/v8/src/bootstrapper.h | 8 +- deps/v8/src/builtins.cc | 302 +- deps/v8/src/builtins.h | 10 +- deps/v8/src/cached-powers.cc | 24 +- deps/v8/src/cached-powers.h | 3 +- deps/v8/src/char-predicates-inl.h | 4 +- deps/v8/src/char-predicates.h | 2 +- deps/v8/src/checks.cc | 115 +- deps/v8/src/checks.h | 334 +- deps/v8/src/circular-queue-inl.h | 14 +- deps/v8/src/circular-queue.h | 6 +- deps/v8/src/code-stubs-hydrogen.cc | 646 +- deps/v8/src/code-stubs.cc | 505 +- deps/v8/src/code-stubs.h | 1132 ++- deps/v8/src/code.h | 10 +- deps/v8/src/codegen.cc | 58 +- deps/v8/src/codegen.h | 47 +- deps/v8/src/collection-iterator.js | 194 + deps/v8/src/collection.js | 171 +- deps/v8/src/compilation-cache.cc | 16 +- deps/v8/src/compilation-cache.h | 2 +- deps/v8/src/compiler-intrinsics.h | 2 + deps/v8/src/compiler.cc | 398 +- deps/v8/src/compiler.h | 178 +- .../v8/src/compiler/arm/code-generator-arm.cc | 848 +++ .../src/compiler/arm/instruction-codes-arm.h | 86 + .../compiler/arm/instruction-selector-arm.cc | 943 +++ deps/v8/src/compiler/arm/linkage-arm.cc | 67 + .../compiler/arm64/code-generator-arm64.cc | 854 +++ .../compiler/arm64/instruction-codes-arm64.h | 103 + .../arm64/instruction-selector-arm64.cc | 667 ++ deps/v8/src/compiler/arm64/linkage-arm64.cc | 68 + deps/v8/src/compiler/ast-graph-builder.cc | 2055 ++++++ deps/v8/src/compiler/ast-graph-builder.h | 428 ++ deps/v8/src/compiler/change-lowering.cc | 260 + deps/v8/src/compiler/change-lowering.h | 79 + deps/v8/src/compiler/code-generator-impl.h | 132 + deps/v8/src/compiler/code-generator.cc | 381 + deps/v8/src/compiler/code-generator.h | 146 + deps/v8/src/compiler/common-node-cache.h | 51 + deps/v8/src/compiler/common-operator.h | 284 + deps/v8/src/compiler/control-builders.cc | 144 + deps/v8/src/compiler/control-builders.h | 144 + deps/v8/src/compiler/frame.h | 104 + deps/v8/src/compiler/gap-resolver.cc | 136 + deps/v8/src/compiler/gap-resolver.h | 46 + deps/v8/src/compiler/generic-algorithm-inl.h | 48 + deps/v8/src/compiler/generic-algorithm.h | 136 + deps/v8/src/compiler/generic-graph.h | 53 + deps/v8/src/compiler/generic-node-inl.h | 245 + deps/v8/src/compiler/generic-node.h | 271 + deps/v8/src/compiler/graph-builder.cc | 241 + deps/v8/src/compiler/graph-builder.h | 226 + deps/v8/src/compiler/graph-inl.h | 37 + deps/v8/src/compiler/graph-reducer.cc | 94 + deps/v8/src/compiler/graph-reducer.h | 77 + deps/v8/src/compiler/graph-replay.cc | 81 + deps/v8/src/compiler/graph-replay.h | 44 + deps/v8/src/compiler/graph-visualizer.cc | 265 + deps/v8/src/compiler/graph-visualizer.h | 29 + deps/v8/src/compiler/graph.cc | 54 + deps/v8/src/compiler/graph.h | 97 + .../src/compiler/ia32/code-generator-ia32.cc | 956 +++ .../compiler/ia32/instruction-codes-ia32.h | 88 + .../ia32/instruction-selector-ia32.cc | 560 ++ deps/v8/src/compiler/ia32/linkage-ia32.cc | 63 + deps/v8/src/compiler/instruction-codes.h | 117 + .../src/compiler/instruction-selector-impl.h | 371 + deps/v8/src/compiler/instruction-selector.cc | 1053 +++ deps/v8/src/compiler/instruction-selector.h | 212 + deps/v8/src/compiler/instruction.cc | 483 ++ deps/v8/src/compiler/instruction.h | 871 +++ deps/v8/src/compiler/ir-operations.txt | 0 .../src/compiler/js-context-specialization.cc | 157 + .../src/compiler/js-context-specialization.h | 37 + deps/v8/src/compiler/js-generic-lowering.cc | 550 ++ deps/v8/src/compiler/js-generic-lowering.h | 83 + deps/v8/src/compiler/js-graph.cc | 174 + deps/v8/src/compiler/js-graph.h | 107 + deps/v8/src/compiler/js-operator.h | 214 + deps/v8/src/compiler/js-typed-lowering.cc | 604 ++ deps/v8/src/compiler/js-typed-lowering.h | 67 + deps/v8/src/compiler/linkage-impl.h | 206 + deps/v8/src/compiler/linkage.cc | 149 + deps/v8/src/compiler/linkage.h | 193 + deps/v8/src/compiler/lowering-builder.cc | 45 + deps/v8/src/compiler/lowering-builder.h | 38 + deps/v8/src/compiler/machine-node-factory.h | 381 + .../src/compiler/machine-operator-reducer.cc | 343 + .../src/compiler/machine-operator-reducer.h | 52 + deps/v8/src/compiler/machine-operator.h | 168 + deps/v8/src/compiler/machine-type.h | 36 + deps/v8/src/compiler/node-aux-data-inl.h | 43 + deps/v8/src/compiler/node-aux-data.h | 38 + deps/v8/src/compiler/node-cache.cc | 120 + deps/v8/src/compiler/node-cache.h | 53 + deps/v8/src/compiler/node-matchers.h | 133 + deps/v8/src/compiler/node-properties-inl.h | 165 + deps/v8/src/compiler/node-properties.h | 57 + deps/v8/src/compiler/node.cc | 55 + deps/v8/src/compiler/node.h | 95 + deps/v8/src/compiler/opcodes.h | 297 + .../v8/src/compiler/operator-properties-inl.h | 191 + deps/v8/src/compiler/operator-properties.h | 49 + deps/v8/src/compiler/operator.h | 280 + deps/v8/src/compiler/phi-reducer.h | 42 + deps/v8/src/compiler/pipeline.cc | 341 + deps/v8/src/compiler/pipeline.h | 68 + deps/v8/src/compiler/raw-machine-assembler.cc | 158 + deps/v8/src/compiler/raw-machine-assembler.h | 129 + deps/v8/src/compiler/register-allocator.cc | 2232 ++++++ deps/v8/src/compiler/register-allocator.h | 548 ++ deps/v8/src/compiler/representation-change.h | 411 ++ deps/v8/src/compiler/schedule.cc | 92 + deps/v8/src/compiler/schedule.h | 335 + deps/v8/src/compiler/scheduler.cc | 1048 +++ deps/v8/src/compiler/scheduler.h | 84 + deps/v8/src/compiler/simplified-lowering.cc | 1014 +++ deps/v8/src/compiler/simplified-lowering.h | 71 + .../v8/src/compiler/simplified-node-factory.h | 128 + deps/v8/src/compiler/simplified-operator.h | 189 + deps/v8/src/compiler/source-position.cc | 55 + deps/v8/src/compiler/source-position.h | 99 + .../compiler/structured-machine-assembler.cc | 664 ++ .../compiler/structured-machine-assembler.h | 311 + deps/v8/src/compiler/typer.cc | 842 +++ deps/v8/src/compiler/typer.h | 57 + deps/v8/src/compiler/verifier.cc | 245 + deps/v8/src/compiler/verifier.h | 28 + .../v8/src/compiler/x64/code-generator-x64.cc | 1001 +++ .../src/compiler/x64/instruction-codes-x64.h | 108 + .../compiler/x64/instruction-selector-x64.cc | 722 ++ deps/v8/src/compiler/x64/linkage-x64.cc | 83 + deps/v8/src/contexts.cc | 100 +- deps/v8/src/contexts.h | 299 +- deps/v8/src/conversions-inl.h | 42 +- deps/v8/src/conversions.cc | 40 +- deps/v8/src/conversions.h | 26 +- deps/v8/src/counters.cc | 49 +- deps/v8/src/counters.h | 66 +- deps/v8/src/cpu-profiler-inl.h | 16 +- deps/v8/src/cpu-profiler.cc | 71 +- deps/v8/src/cpu-profiler.h | 46 +- deps/v8/src/d8-debug.cc | 219 +- deps/v8/src/d8-debug.h | 117 +- deps/v8/src/d8-posix.cc | 33 +- deps/v8/src/d8-readline.cc | 8 +- deps/v8/src/d8-windows.cc | 6 +- deps/v8/src/d8.cc | 533 +- deps/v8/src/d8.gyp | 19 +- deps/v8/src/d8.h | 87 +- deps/v8/src/d8.js | 232 +- deps/v8/src/data-flow.cc | 6 +- deps/v8/src/data-flow.h | 41 +- deps/v8/src/date.cc | 54 +- deps/v8/src/date.h | 21 +- deps/v8/src/date.js | 4 +- deps/v8/src/dateparser-inl.h | 12 +- deps/v8/src/dateparser.cc | 6 +- deps/v8/src/dateparser.h | 14 +- deps/v8/src/debug-agent.cc | 481 -- deps/v8/src/debug-agent.h | 93 - deps/v8/src/debug-debugger.js | 269 +- deps/v8/src/debug.cc | 1811 ++--- deps/v8/src/debug.h | 998 +-- deps/v8/src/deoptimizer.cc | 240 +- deps/v8/src/deoptimizer.h | 40 +- deps/v8/src/disassembler.cc | 83 +- deps/v8/src/disassembler.h | 2 +- deps/v8/src/diy-fp.cc | 8 +- deps/v8/src/diy-fp.h | 6 +- deps/v8/src/double.h | 12 +- deps/v8/src/dtoa.cc | 20 +- deps/v8/src/effects.h | 20 +- deps/v8/src/elements-kind.cc | 40 +- deps/v8/src/elements-kind.h | 10 +- deps/v8/src/elements.cc | 274 +- deps/v8/src/elements.h | 10 +- deps/v8/src/execution.cc | 451 +- deps/v8/src/execution.h | 108 +- .../externalize-string-extension.cc | 4 +- .../extensions/externalize-string-extension.h | 2 +- .../src/extensions/free-buffer-extension.cc | 7 +- .../v8/src/extensions/free-buffer-extension.h | 2 +- deps/v8/src/extensions/gc-extension.cc | 5 +- deps/v8/src/extensions/gc-extension.h | 6 +- .../v8/src/extensions/statistics-extension.cc | 4 +- deps/v8/src/extensions/statistics-extension.h | 2 +- .../extensions/trigger-failure-extension.cc | 8 +- .../extensions/trigger-failure-extension.h | 2 +- deps/v8/src/factory.cc | 553 +- deps/v8/src/factory.h | 130 +- deps/v8/src/fast-dtoa.cc | 54 +- deps/v8/src/feedback-slots.h | 4 +- deps/v8/src/field-index-inl.h | 124 + deps/v8/src/field-index.cc | 23 + deps/v8/src/field-index.h | 112 + deps/v8/src/fixed-dtoa.cc | 22 +- deps/v8/src/flag-definitions.h | 957 +-- deps/v8/src/flags.cc | 152 +- deps/v8/src/flags.h | 11 +- deps/v8/src/frames-inl.h | 42 +- deps/v8/src/frames.cc | 252 +- deps/v8/src/frames.h | 41 +- deps/v8/src/full-codegen.cc | 202 +- deps/v8/src/full-codegen.h | 64 +- deps/v8/src/func-name-inferrer.cc | 51 +- deps/v8/src/func-name-inferrer.h | 32 +- deps/v8/src/gdb-jit.cc | 274 +- deps/v8/src/gdb-jit.h | 87 +- deps/v8/src/generator.js | 25 +- deps/v8/src/global-handles.cc | 99 +- deps/v8/src/global-handles.h | 22 +- deps/v8/src/globals.h | 747 +- deps/v8/src/handles-inl.h | 26 +- deps/v8/src/handles.cc | 16 +- deps/v8/src/handles.h | 8 +- deps/v8/src/harmony-math.js | 246 - deps/v8/src/harmony-string.js | 60 +- deps/v8/src/hashmap.h | 20 +- deps/v8/src/heap-profiler.cc | 17 +- deps/v8/src/heap-profiler.h | 6 +- deps/v8/src/heap-snapshot-generator-inl.h | 6 +- deps/v8/src/heap-snapshot-generator.cc | 263 +- deps/v8/src/heap-snapshot-generator.h | 13 +- deps/v8/src/heap/gc-tracer.cc | 402 ++ deps/v8/src/heap/gc-tracer.h | 356 + deps/v8/src/{ => heap}/heap-inl.h | 421 +- deps/v8/src/{ => heap}/heap.cc | 2998 ++++---- deps/v8/src/{ => heap}/heap.h | 1390 ++-- .../src/{ => heap}/incremental-marking-inl.h | 31 +- deps/v8/src/{ => heap}/incremental-marking.cc | 408 +- deps/v8/src/{ => heap}/incremental-marking.h | 93 +- deps/v8/src/{ => heap}/mark-compact-inl.h | 37 +- deps/v8/src/{ => heap}/mark-compact.cc | 2124 +++--- deps/v8/src/{ => heap}/mark-compact.h | 231 +- deps/v8/src/{ => heap}/objects-visiting-inl.h | 443 +- deps/v8/src/{ => heap}/objects-visiting.cc | 264 +- deps/v8/src/{ => heap}/objects-visiting.h | 265 +- deps/v8/src/{ => heap}/spaces-inl.h | 114 +- deps/v8/src/{ => heap}/spaces.cc | 890 ++- deps/v8/src/{ => heap}/spaces.h | 744 +- deps/v8/src/{ => heap}/store-buffer-inl.h | 24 +- deps/v8/src/{ => heap}/store-buffer.cc | 343 +- deps/v8/src/{ => heap}/store-buffer.h | 60 +- deps/v8/src/{ => heap}/sweeper-thread.cc | 50 +- deps/v8/src/{ => heap}/sweeper-thread.h | 32 +- deps/v8/src/hydrogen-alias-analysis.h | 2 +- deps/v8/src/hydrogen-bce.cc | 122 +- deps/v8/src/hydrogen-bce.h | 2 +- deps/v8/src/hydrogen-bch.cc | 8 +- deps/v8/src/hydrogen-bch.h | 2 +- deps/v8/src/hydrogen-canonicalize.cc | 4 +- deps/v8/src/hydrogen-canonicalize.h | 2 +- deps/v8/src/hydrogen-check-elimination.cc | 382 +- deps/v8/src/hydrogen-check-elimination.h | 22 +- deps/v8/src/hydrogen-dce.cc | 18 +- deps/v8/src/hydrogen-dce.h | 2 +- deps/v8/src/hydrogen-dehoist.cc | 22 +- deps/v8/src/hydrogen-dehoist.h | 2 +- deps/v8/src/hydrogen-environment-liveness.cc | 20 +- deps/v8/src/hydrogen-environment-liveness.h | 2 +- deps/v8/src/hydrogen-escape-analysis.cc | 18 +- deps/v8/src/hydrogen-escape-analysis.h | 4 +- deps/v8/src/hydrogen-flow-engine.h | 16 +- deps/v8/src/hydrogen-gvn.cc | 153 +- deps/v8/src/hydrogen-gvn.h | 44 +- deps/v8/src/hydrogen-infer-representation.cc | 2 +- deps/v8/src/hydrogen-infer-representation.h | 2 +- deps/v8/src/hydrogen-infer-types.cc | 4 +- deps/v8/src/hydrogen-infer-types.h | 2 +- deps/v8/src/hydrogen-instructions.cc | 1245 ++-- deps/v8/src/hydrogen-instructions.h | 1313 ++-- deps/v8/src/hydrogen-load-elimination.cc | 21 +- deps/v8/src/hydrogen-load-elimination.h | 2 +- deps/v8/src/hydrogen-mark-deoptimize.cc | 6 +- deps/v8/src/hydrogen-mark-deoptimize.h | 2 +- deps/v8/src/hydrogen-mark-unreachable.cc | 2 +- deps/v8/src/hydrogen-mark-unreachable.h | 2 +- deps/v8/src/hydrogen-osr.cc | 8 +- deps/v8/src/hydrogen-osr.h | 6 +- deps/v8/src/hydrogen-range-analysis.cc | 22 +- deps/v8/src/hydrogen-range-analysis.h | 2 +- deps/v8/src/hydrogen-redundant-phi.cc | 4 +- deps/v8/src/hydrogen-redundant-phi.h | 2 +- deps/v8/src/hydrogen-removable-simulates.cc | 231 +- deps/v8/src/hydrogen-removable-simulates.h | 2 +- .../v8/src/hydrogen-representation-changes.cc | 43 +- deps/v8/src/hydrogen-representation-changes.h | 2 +- deps/v8/src/hydrogen-sce.cc | 4 +- deps/v8/src/hydrogen-sce.h | 2 +- deps/v8/src/hydrogen-store-elimination.cc | 17 +- deps/v8/src/hydrogen-store-elimination.h | 4 +- deps/v8/src/hydrogen-types.cc | 70 + deps/v8/src/hydrogen-types.h | 90 + deps/v8/src/hydrogen-uint32-analysis.cc | 39 +- deps/v8/src/hydrogen-uint32-analysis.h | 2 +- deps/v8/src/hydrogen.cc | 3484 ++++++---- deps/v8/src/hydrogen.h | 386 +- deps/v8/src/i18n.cc | 66 +- deps/v8/src/i18n.h | 2 +- deps/v8/src/i18n.js | 31 +- deps/v8/src/ia32/assembler-ia32-inl.h | 152 +- deps/v8/src/ia32/assembler-ia32.cc | 371 +- deps/v8/src/ia32/assembler-ia32.h | 273 +- deps/v8/src/ia32/builtins-ia32.cc | 145 +- deps/v8/src/ia32/code-stubs-ia32.cc | 969 ++- deps/v8/src/ia32/code-stubs-ia32.h | 81 +- deps/v8/src/ia32/codegen-ia32.cc | 755 +- deps/v8/src/ia32/codegen-ia32.h | 4 +- deps/v8/src/ia32/cpu-ia32.cc | 10 +- deps/v8/src/ia32/debug-ia32.cc | 111 +- deps/v8/src/ia32/deoptimizer-ia32.cc | 90 +- deps/v8/src/ia32/disasm-ia32.cc | 203 +- deps/v8/src/ia32/frames-ia32.cc | 10 +- deps/v8/src/ia32/frames-ia32.h | 2 - deps/v8/src/ia32/full-codegen-ia32.cc | 687 +- deps/v8/src/ia32/ic-ia32.cc | 589 +- deps/v8/src/ia32/lithium-codegen-ia32.cc | 1778 ++--- deps/v8/src/ia32/lithium-codegen-ia32.h | 133 +- deps/v8/src/ia32/lithium-gap-resolver-ia32.cc | 120 +- deps/v8/src/ia32/lithium-gap-resolver-ia32.h | 4 +- deps/v8/src/ia32/lithium-ia32.cc | 564 +- deps/v8/src/ia32/lithium-ia32.h | 462 +- deps/v8/src/ia32/macro-assembler-ia32.cc | 750 +- deps/v8/src/ia32/macro-assembler-ia32.h | 83 +- .../src/ia32/regexp-macro-assembler-ia32.cc | 66 +- .../v8/src/ia32/regexp-macro-assembler-ia32.h | 6 +- deps/v8/src/ia32/simulator-ia32.h | 5 +- deps/v8/src/ia32/stub-cache-ia32.cc | 773 +-- deps/v8/src/ic-inl.h | 109 +- deps/v8/src/ic.cc | 1546 +++-- deps/v8/src/ic.h | 391 +- deps/v8/src/icu_util.cc | 2 +- deps/v8/src/interface.cc | 52 +- deps/v8/src/interface.h | 24 +- deps/v8/src/interpreter-irregexp.cc | 33 +- deps/v8/src/isolate-inl.h | 25 +- deps/v8/src/isolate.cc | 820 ++- deps/v8/src/isolate.h | 329 +- deps/v8/src/json-parser.h | 55 +- deps/v8/src/json-stringifier.h | 59 +- deps/v8/src/json.js | 2 + deps/v8/src/jsregexp-inl.h | 10 +- deps/v8/src/jsregexp.cc | 538 +- deps/v8/src/jsregexp.h | 32 +- deps/v8/src/libplatform/DEPS | 8 + deps/v8/src/libplatform/default-platform.cc | 68 +- deps/v8/src/libplatform/default-platform.h | 25 +- deps/v8/src/libplatform/task-queue.cc | 25 +- deps/v8/src/libplatform/task-queue.h | 14 +- deps/v8/src/libplatform/worker-thread.cc | 14 +- deps/v8/src/libplatform/worker-thread.h | 10 +- deps/v8/src/list-inl.h | 21 +- deps/v8/src/list.h | 8 +- deps/v8/src/lithium-allocator-inl.h | 105 +- deps/v8/src/lithium-allocator.cc | 177 +- deps/v8/src/lithium-allocator.h | 89 +- deps/v8/src/lithium-codegen.cc | 40 +- deps/v8/src/lithium-codegen.h | 4 +- deps/v8/src/lithium-inl.h | 112 + deps/v8/src/lithium.cc | 130 +- deps/v8/src/lithium.h | 128 +- deps/v8/src/liveedit-debugger.js | 4 +- deps/v8/src/liveedit.cc | 314 +- deps/v8/src/liveedit.h | 83 +- deps/v8/src/log-inl.h | 2 +- deps/v8/src/log-utils.cc | 40 +- deps/v8/src/log-utils.h | 10 +- deps/v8/src/log.cc | 532 +- deps/v8/src/log.h | 95 +- deps/v8/src/lookup-inl.h | 68 + deps/v8/src/lookup.cc | 275 + deps/v8/src/lookup.h | 217 + deps/v8/src/macro-assembler.h | 73 +- deps/v8/src/macros.py | 9 +- deps/v8/src/math.js | 313 +- deps/v8/src/messages.cc | 10 +- deps/v8/src/messages.h | 2 +- deps/v8/src/messages.js | 210 +- deps/v8/src/mips/OWNERS | 8 + deps/v8/src/mips/assembler-mips-inl.h | 99 +- deps/v8/src/mips/assembler-mips.cc | 330 +- deps/v8/src/mips/assembler-mips.h | 149 +- deps/v8/src/mips/builtins-mips.cc | 164 +- deps/v8/src/mips/code-stubs-mips.cc | 839 +-- deps/v8/src/mips/code-stubs-mips.h | 98 +- deps/v8/src/mips/codegen-mips.cc | 418 +- deps/v8/src/mips/codegen-mips.h | 4 +- deps/v8/src/mips/constants-mips.cc | 28 +- deps/v8/src/mips/constants-mips.h | 29 +- deps/v8/src/mips/cpu-mips.cc | 10 +- deps/v8/src/mips/debug-mips.cc | 145 +- deps/v8/src/mips/deoptimizer-mips.cc | 60 +- deps/v8/src/mips/disasm-mips.cc | 84 +- deps/v8/src/mips/frames-mips.cc | 10 +- deps/v8/src/mips/frames-mips.h | 2 - deps/v8/src/mips/full-codegen-mips.cc | 709 +- deps/v8/src/mips/ic-mips.cc | 471 +- deps/v8/src/mips/lithium-codegen-mips.cc | 936 +-- deps/v8/src/mips/lithium-codegen-mips.h | 82 +- deps/v8/src/mips/lithium-gap-resolver-mips.cc | 42 +- deps/v8/src/mips/lithium-gap-resolver-mips.h | 4 +- deps/v8/src/mips/lithium-mips.cc | 523 +- deps/v8/src/mips/lithium-mips.h | 397 +- deps/v8/src/mips/macro-assembler-mips.cc | 777 +-- deps/v8/src/mips/macro-assembler-mips.h | 103 +- .../src/mips/regexp-macro-assembler-mips.cc | 66 +- .../v8/src/mips/regexp-macro-assembler-mips.h | 9 +- deps/v8/src/mips/simulator-mips.cc | 256 +- deps/v8/src/mips/simulator-mips.h | 27 +- deps/v8/src/mips/stub-cache-mips.cc | 980 +-- deps/v8/src/mips64/OWNERS | 10 + deps/v8/src/mips64/assembler-mips64-inl.h | 457 ++ deps/v8/src/mips64/assembler-mips64.cc | 2933 ++++++++ deps/v8/src/mips64/assembler-mips64.h | 1416 ++++ deps/v8/src/mips64/builtins-mips64.cc | 1597 +++++ deps/v8/src/mips64/code-stubs-mips64.cc | 5329 ++++++++++++++ deps/v8/src/mips64/code-stubs-mips64.h | 448 ++ deps/v8/src/mips64/codegen-mips64.cc | 1142 +++ deps/v8/src/mips64/codegen-mips64.h | 54 + deps/v8/src/mips64/constants-mips64.cc | 362 + deps/v8/src/mips64/constants-mips64.h | 952 +++ deps/v8/src/mips64/cpu-mips64.cc | 59 + deps/v8/src/mips64/debug-mips64.cc | 330 + deps/v8/src/mips64/deoptimizer-mips64.cc | 379 + deps/v8/src/mips64/disasm-mips64.cc | 1504 ++++ deps/v8/src/mips64/frames-mips64.cc | 43 + deps/v8/src/mips64/frames-mips64.h | 215 + deps/v8/src/mips64/full-codegen-mips64.cc | 4888 +++++++++++++ deps/v8/src/mips64/ic-mips64.cc | 1266 ++++ deps/v8/src/mips64/lithium-codegen-mips64.cc | 5950 ++++++++++++++++ deps/v8/src/mips64/lithium-codegen-mips64.h | 451 ++ .../src/mips64/lithium-gap-resolver-mips64.cc | 300 + .../src/mips64/lithium-gap-resolver-mips64.h | 60 + deps/v8/src/mips64/lithium-mips64.cc | 2581 +++++++ deps/v8/src/mips64/lithium-mips64.h | 2848 ++++++++ deps/v8/src/mips64/macro-assembler-mips64.cc | 6111 +++++++++++++++++ deps/v8/src/mips64/macro-assembler-mips64.h | 1793 +++++ .../mips64/regexp-macro-assembler-mips64.cc | 1371 ++++ .../mips64/regexp-macro-assembler-mips64.h | 269 + deps/v8/src/mips64/simulator-mips64.cc | 3451 ++++++++++ deps/v8/src/mips64/simulator-mips64.h | 479 ++ deps/v8/src/mips64/stub-cache-mips64.cc | 1191 ++++ deps/v8/src/mirror-debugger.js | 215 +- deps/v8/src/misc-intrinsics.h | 4 +- deps/v8/src/mksnapshot.cc | 313 +- deps/v8/src/msan.h | 2 +- deps/v8/src/natives-external.cc | 196 + deps/v8/src/natives.h | 9 + deps/v8/src/object-observe.js | 94 +- deps/v8/src/objects-debug.cc | 88 +- deps/v8/src/objects-inl.h | 2197 +++--- deps/v8/src/objects-printer.cc | 1349 ++-- deps/v8/src/objects.cc | 5604 +++++++-------- deps/v8/src/objects.h | 2591 +++---- deps/v8/src/optimizing-compiler-thread.cc | 75 +- deps/v8/src/optimizing-compiler-thread.h | 67 +- deps/v8/src/ostreams.cc | 174 + deps/v8/src/ostreams.h | 130 + deps/v8/src/parser.cc | 1733 ++--- deps/v8/src/parser.h | 367 +- deps/v8/src/perf-jit.cc | 147 + deps/v8/src/perf-jit.h | 120 + deps/v8/src/platform/socket.cc | 201 - deps/v8/src/platform/socket.h | 78 - deps/v8/src/preparse-data.cc | 35 +- deps/v8/src/preparse-data.h | 33 +- deps/v8/src/preparser.cc | 131 +- deps/v8/src/preparser.h | 724 +- deps/v8/src/prettyprinter.cc | 58 +- deps/v8/src/prettyprinter.h | 9 +- deps/v8/src/profile-generator-inl.h | 2 +- deps/v8/src/profile-generator.cc | 70 +- deps/v8/src/profile-generator.h | 28 +- deps/v8/src/promise.js | 527 +- deps/v8/src/property-details-inl.h | 17 +- deps/v8/src/property-details.h | 18 +- deps/v8/src/property.cc | 71 +- deps/v8/src/property.h | 165 +- deps/v8/src/prototype.h | 135 + deps/v8/src/proxy.js | 4 +- .../src/regexp-macro-assembler-irregexp-inl.h | 15 +- .../v8/src/regexp-macro-assembler-irregexp.cc | 87 +- deps/v8/src/regexp-macro-assembler-irregexp.h | 2 + deps/v8/src/regexp-macro-assembler-tracer.cc | 15 +- deps/v8/src/regexp-macro-assembler.cc | 43 +- deps/v8/src/regexp-macro-assembler.h | 3 +- deps/v8/src/regexp-stack.cc | 18 +- deps/v8/src/regexp-stack.h | 2 +- deps/v8/src/regexp.js | 101 +- deps/v8/src/rewriter.cc | 28 +- deps/v8/src/runtime-profiler.cc | 110 +- deps/v8/src/runtime-profiler.h | 11 +- deps/v8/src/runtime.cc | 4786 +++++++------ deps/v8/src/runtime.h | 980 +-- deps/v8/src/runtime.js | 47 +- deps/v8/src/safepoint-table.cc | 50 +- deps/v8/src/safepoint-table.h | 27 +- deps/v8/src/sampler.cc | 92 +- deps/v8/src/sampler.h | 29 +- deps/v8/src/scanner-character-streams.cc | 41 +- deps/v8/src/scanner-character-streams.h | 10 +- deps/v8/src/scanner.cc | 158 +- deps/v8/src/scanner.h | 84 +- deps/v8/src/scopeinfo.cc | 168 +- deps/v8/src/scopeinfo.h | 63 +- deps/v8/src/scopes.cc | 318 +- deps/v8/src/scopes.h | 70 +- deps/v8/src/serialize.cc | 1058 +-- deps/v8/src/serialize.h | 301 +- deps/v8/src/simulator.h | 14 +- deps/v8/src/small-pointer-list.h | 26 +- deps/v8/src/smart-pointers.h | 4 +- deps/v8/src/snapshot-common.cc | 78 +- deps/v8/src/snapshot-empty.cc | 4 +- deps/v8/src/snapshot-external.cc | 140 + deps/v8/src/snapshot-source-sink.cc | 101 + deps/v8/src/snapshot-source-sink.h | 125 + deps/v8/src/snapshot.h | 19 +- deps/v8/src/splay-tree-inl.h | 2 +- deps/v8/src/splay-tree.h | 6 +- deps/v8/src/string-iterator.js | 106 + deps/v8/src/string-search.cc | 5 +- deps/v8/src/string-search.h | 8 +- deps/v8/src/string-stream.cc | 70 +- deps/v8/src/string-stream.h | 42 +- deps/v8/src/string.js | 128 +- deps/v8/src/strtod.cc | 51 +- deps/v8/src/stub-cache.cc | 1126 ++- deps/v8/src/stub-cache.h | 795 +-- deps/v8/src/symbol.js | 13 +- .../kernel/tools/perf/util/jitdump.h | 83 + deps/v8/src/third_party/vtune/vtune-jit.cc | 9 +- deps/v8/src/token.cc | 4 +- deps/v8/src/token.h | 277 +- deps/v8/src/transitions-inl.h | 28 +- deps/v8/src/transitions.cc | 16 +- deps/v8/src/transitions.h | 15 +- deps/v8/src/trig-table.h | 38 - deps/v8/src/type-info.cc | 89 +- deps/v8/src/type-info.h | 17 +- deps/v8/src/typedarray.js | 312 +- deps/v8/src/types-inl.h | 192 +- deps/v8/src/types.cc | 817 ++- deps/v8/src/types.h | 552 +- deps/v8/src/typing.cc | 43 +- deps/v8/src/typing.h | 20 +- deps/v8/src/unbound-queue-inl.h | 18 +- deps/v8/src/unbound-queue.h | 7 +- deps/v8/src/unicode-inl.h | 16 +- deps/v8/src/unicode.cc | 10 +- deps/v8/src/unicode.h | 2 +- deps/v8/src/unique.h | 120 +- deps/v8/src/uri.h | 20 +- deps/v8/src/uri.js | 670 +- deps/v8/src/utils-inl.h | 2 +- deps/v8/src/utils.cc | 150 +- deps/v8/src/utils.h | 359 +- deps/v8/src/v8.cc | 93 +- deps/v8/src/v8.h | 34 +- deps/v8/src/v8checks.h | 39 - deps/v8/src/v8dll-main.cc | 4 +- deps/v8/src/v8globals.h | 554 -- deps/v8/src/v8natives.js | 273 +- deps/v8/src/v8threads.cc | 50 +- deps/v8/src/v8threads.h | 2 +- deps/v8/src/variables.cc | 48 +- deps/v8/src/variables.h | 28 +- deps/v8/src/vector.h | 33 +- deps/v8/src/version.cc | 30 +- deps/v8/src/version.h | 1 + deps/v8/src/vm-state-inl.h | 12 +- deps/v8/src/vm-state.h | 4 +- deps/v8/src/weak_collection.js | 64 +- deps/v8/src/x64/assembler-x64-inl.h | 150 +- deps/v8/src/x64/assembler-x64.cc | 267 +- deps/v8/src/x64/assembler-x64.h | 176 +- deps/v8/src/x64/builtins-x64.cc | 140 +- deps/v8/src/x64/code-stubs-x64.cc | 826 ++- deps/v8/src/x64/code-stubs-x64.h | 60 +- deps/v8/src/x64/codegen-x64.cc | 135 +- deps/v8/src/x64/codegen-x64.h | 6 +- deps/v8/src/x64/cpu-x64.cc | 10 +- deps/v8/src/x64/debug-x64.cc | 111 +- deps/v8/src/x64/deoptimizer-x64.cc | 28 +- deps/v8/src/x64/disasm-x64.cc | 49 +- deps/v8/src/x64/frames-x64.cc | 10 +- deps/v8/src/x64/frames-x64.h | 2 - deps/v8/src/x64/full-codegen-x64.cc | 673 +- deps/v8/src/x64/ic-x64.cc | 612 +- deps/v8/src/x64/lithium-codegen-x64.cc | 937 +-- deps/v8/src/x64/lithium-codegen-x64.h | 36 +- deps/v8/src/x64/lithium-gap-resolver-x64.cc | 36 +- deps/v8/src/x64/lithium-gap-resolver-x64.h | 4 +- deps/v8/src/x64/lithium-x64.cc | 549 +- deps/v8/src/x64/lithium-x64.h | 425 +- deps/v8/src/x64/macro-assembler-x64.cc | 1010 +-- deps/v8/src/x64/macro-assembler-x64.h | 118 +- deps/v8/src/x64/regexp-macro-assembler-x64.cc | 77 +- deps/v8/src/x64/regexp-macro-assembler-x64.h | 9 +- deps/v8/src/x64/simulator-x64.h | 5 +- deps/v8/src/x64/stub-cache-x64.cc | 747 +- deps/v8/src/x87/OWNERS | 1 + deps/v8/src/x87/assembler-x87-inl.h | 571 ++ deps/v8/src/x87/assembler-x87.cc | 2053 ++++++ deps/v8/src/x87/assembler-x87.h | 1053 +++ deps/v8/src/x87/builtins-x87.cc | 1457 ++++ deps/v8/src/x87/code-stubs-x87.cc | 4654 +++++++++++++ deps/v8/src/x87/code-stubs-x87.h | 413 ++ deps/v8/src/x87/codegen-x87.cc | 645 ++ deps/v8/src/x87/codegen-x87.h | 33 + deps/v8/src/x87/cpu-x87.cc | 44 + deps/v8/src/x87/debug-x87.cc | 326 + deps/v8/src/x87/deoptimizer-x87.cc | 403 ++ deps/v8/src/x87/disasm-x87.cc | 1775 +++++ deps/v8/src/x87/frames-x87.cc | 42 + deps/v8/src/x87/frames-x87.h | 125 + deps/v8/src/x87/full-codegen-x87.cc | 4827 +++++++++++++ deps/v8/src/x87/ic-x87.cc | 1211 ++++ deps/v8/src/x87/lithium-codegen-x87.cc | 5717 +++++++++++++++ deps/v8/src/x87/lithium-codegen-x87.h | 504 ++ deps/v8/src/x87/lithium-gap-resolver-x87.cc | 445 ++ deps/v8/src/x87/lithium-gap-resolver-x87.h | 87 + deps/v8/src/x87/lithium-x87.cc | 2683 ++++++++ deps/v8/src/x87/lithium-x87.h | 2917 ++++++++ deps/v8/src/x87/macro-assembler-x87.cc | 3327 +++++++++ deps/v8/src/x87/macro-assembler-x87.h | 1100 +++ deps/v8/src/x87/regexp-macro-assembler-x87.cc | 1309 ++++ deps/v8/src/x87/regexp-macro-assembler-x87.h | 200 + deps/v8/src/x87/simulator-x87.cc | 6 + deps/v8/src/x87/simulator-x87.h | 48 + deps/v8/src/x87/stub-cache-x87.cc | 1201 ++++ deps/v8/src/zone-allocator.h | 4 +- deps/v8/src/zone-containers.h | 6 +- deps/v8/src/zone-inl.h | 58 +- deps/v8/src/zone.cc | 57 +- deps/v8/src/zone.h | 27 +- deps/v8/test/base-unittests/DEPS | 8 + .../v8/test/base-unittests/base-unittests.gyp | 41 + .../test/base-unittests/base-unittests.status | 6 + deps/v8/test/base-unittests/cpu-unittest.cc | 49 + .../platform/condition-variable-unittest.cc} | 153 +- .../base-unittests/platform/mutex-unittest.cc | 91 + .../platform/platform-unittest.cc | 115 + .../base-unittests/platform/time-unittest.cc | 186 + deps/v8/test/base-unittests/testcfg.py | 51 + .../utils/random-number-generator-unittest.cc | 53 + deps/v8/test/benchmarks/benchmarks.status | 4 +- deps/v8/test/benchmarks/testcfg.py | 9 +- deps/v8/test/cctest/DEPS | 3 + deps/v8/test/cctest/cctest.cc | 25 +- deps/v8/test/cctest/cctest.gyp | 83 +- deps/v8/test/cctest/cctest.h | 139 +- deps/v8/test/cctest/cctest.status | 161 +- deps/v8/test/cctest/compiler/call-tester.h | 384 ++ .../v8/test/cctest/compiler/codegen-tester.cc | 578 ++ deps/v8/test/cctest/compiler/codegen-tester.h | 353 + .../v8/test/cctest/compiler/function-tester.h | 194 + .../cctest/compiler/graph-builder-tester.cc | 65 + .../cctest/compiler/graph-builder-tester.h | 114 + deps/v8/test/cctest/compiler/graph-tester.h | 42 + .../compiler/instruction-selector-tester.h | 127 + .../compiler/simplified-graph-builder.cc | 78 + .../compiler/simplified-graph-builder.h | 73 + .../cctest/compiler/test-branch-combine.cc | 462 ++ .../cctest/compiler/test-changes-lowering.cc | 397 ++ .../cctest/compiler/test-codegen-deopt.cc | 344 + .../test/cctest/compiler/test-gap-resolver.cc | 173 + .../cctest/compiler/test-graph-reducer.cc | 661 ++ .../compiler/test-instruction-selector-arm.cc | 1863 +++++ .../test-instruction-selector-ia32.cc | 66 + .../compiler/test-instruction-selector.cc | 22 + .../test/cctest/compiler/test-instruction.cc | 350 + .../cctest/compiler/test-js-constant-cache.cc | 284 + .../test-js-context-specialization.cc | 309 + .../cctest/compiler/test-js-typed-lowering.cc | 1342 ++++ deps/v8/test/cctest/compiler/test-linkage.cc | 113 + .../compiler/test-machine-operator-reducer.cc | 779 +++ .../cctest/compiler/test-node-algorithm.cc | 330 + .../test/cctest/compiler/test-node-cache.cc | 160 + deps/v8/test/cctest/compiler/test-node.cc | 815 +++ deps/v8/test/cctest/compiler/test-operator.cc | 244 + .../test/cctest/compiler/test-phi-reducer.cc | 225 + deps/v8/test/cctest/compiler/test-pipeline.cc | 40 + .../compiler/test-representation-change.cc | 276 + .../v8/test/cctest/compiler/test-run-deopt.cc | 58 + .../cctest/compiler/test-run-intrinsics.cc | 211 + .../cctest/compiler/test-run-jsbranches.cc | 262 + .../test/cctest/compiler/test-run-jscalls.cc | 235 + .../cctest/compiler/test-run-jsexceptions.cc | 45 + .../v8/test/cctest/compiler/test-run-jsops.cc | 524 ++ .../test/cctest/compiler/test-run-machops.cc | 4077 +++++++++++ .../cctest/compiler/test-run-variables.cc | 121 + deps/v8/test/cctest/compiler/test-schedule.cc | 159 + .../v8/test/cctest/compiler/test-scheduler.cc | 1809 +++++ .../compiler/test-simplified-lowering.cc | 1372 ++++ .../test-structured-ifbuilder-fuzzer.cc | 667 ++ .../test-structured-machine-assembler.cc | 1055 +++ deps/v8/test/cctest/compiler/value-helper.h | 131 + deps/v8/test/cctest/gay-fixed.cc | 4 +- deps/v8/test/cctest/gay-precision.cc | 4 +- deps/v8/test/cctest/gay-shortest.cc | 4 +- deps/v8/test/cctest/print-extension.cc | 2 +- deps/v8/test/cctest/print-extension.h | 2 +- deps/v8/test/cctest/profiler-extension.cc | 4 +- deps/v8/test/cctest/profiler-extension.h | 2 +- deps/v8/test/cctest/test-accessors.cc | 58 +- deps/v8/test/cctest/test-alloc.cc | 27 +- deps/v8/test/cctest/test-api.cc | 1898 ++--- deps/v8/test/cctest/test-assembler-arm.cc | 66 +- deps/v8/test/cctest/test-assembler-arm64.cc | 3975 ++++++----- deps/v8/test/cctest/test-assembler-ia32.cc | 68 +- deps/v8/test/cctest/test-assembler-mips.cc | 14 +- deps/v8/test/cctest/test-assembler-mips64.cc | 1375 ++++ deps/v8/test/cctest/test-assembler-x64.cc | 105 +- deps/v8/test/cctest/test-assembler-x87.cc | 315 + deps/v8/test/cctest/test-ast.cc | 8 +- deps/v8/test/cctest/test-atomicops.cc | 7 +- deps/v8/test/cctest/test-bignum-dtoa.cc | 16 +- deps/v8/test/cctest/test-bignum.cc | 8 +- deps/v8/test/cctest/test-checks.cc | 26 + deps/v8/test/cctest/test-circular-queue.cc | 27 +- deps/v8/test/cctest/test-code-stubs-arm.cc | 23 +- deps/v8/test/cctest/test-code-stubs-arm64.cc | 25 +- deps/v8/test/cctest/test-code-stubs-ia32.cc | 19 +- deps/v8/test/cctest/test-code-stubs-mips.cc | 25 +- deps/v8/test/cctest/test-code-stubs-mips64.cc | 188 + deps/v8/test/cctest/test-code-stubs-x64.cc | 19 +- deps/v8/test/cctest/test-code-stubs-x87.cc | 148 + deps/v8/test/cctest/test-code-stubs.cc | 16 +- deps/v8/test/cctest/test-code-stubs.h | 2 +- deps/v8/test/cctest/test-compiler.cc | 45 +- deps/v8/test/cctest/test-constantpool.cc | 305 +- deps/v8/test/cctest/test-conversions.cc | 15 +- deps/v8/test/cctest/test-cpu-profiler.cc | 353 +- deps/v8/test/cctest/test-dataflow.cc | 6 +- deps/v8/test/cctest/test-date.cc | 8 +- deps/v8/test/cctest/test-debug.cc | 1243 ++-- .../test/cctest/test-declarative-accessors.cc | 6 +- deps/v8/test/cctest/test-decls.cc | 219 +- deps/v8/test/cctest/test-deoptimization.cc | 49 +- deps/v8/test/cctest/test-dictionary.cc | 29 +- deps/v8/test/cctest/test-disasm-arm.cc | 16 +- deps/v8/test/cctest/test-disasm-arm64.cc | 19 +- deps/v8/test/cctest/test-disasm-ia32.cc | 177 +- deps/v8/test/cctest/test-disasm-mips.cc | 16 +- deps/v8/test/cctest/test-disasm-mips64.cc | 674 ++ deps/v8/test/cctest/test-disasm-x64.cc | 29 +- deps/v8/test/cctest/test-disasm-x87.cc | 410 ++ deps/v8/test/cctest/test-diy-fp.cc | 8 +- deps/v8/test/cctest/test-double.cc | 14 +- deps/v8/test/cctest/test-dtoa.cc | 16 +- deps/v8/test/cctest/test-fast-dtoa.cc | 18 +- deps/v8/test/cctest/test-fixed-dtoa.cc | 12 +- deps/v8/test/cctest/test-flags.cc | 4 +- .../test/cctest/test-func-name-inference.cc | 10 +- deps/v8/test/cctest/test-fuzz-arm64.cc | 8 +- deps/v8/test/cctest/test-gc-tracer.cc | 125 + deps/v8/test/cctest/test-global-handles.cc | 114 +- deps/v8/test/cctest/test-global-object.cc | 4 +- deps/v8/test/cctest/test-hashing.cc | 26 +- deps/v8/test/cctest/test-hashmap.cc | 7 +- deps/v8/test/cctest/test-heap-profiler.cc | 224 +- deps/v8/test/cctest/test-heap.cc | 840 ++- deps/v8/test/cctest/test-hydrogen-types.cc | 168 + deps/v8/test/cctest/test-javascript-arm64.cc | 24 +- .../v8/test/cctest/test-js-arm64-variables.cc | 24 +- .../test-libplatform-default-platform.cc | 30 + .../cctest/test-libplatform-task-queue.cc | 9 +- .../cctest/test-libplatform-worker-thread.cc | 13 +- deps/v8/test/cctest/test-libplatform.h | 21 +- deps/v8/test/cctest/test-list.cc | 4 +- deps/v8/test/cctest/test-liveedit.cc | 24 +- deps/v8/test/cctest/test-lockers.cc | 47 +- deps/v8/test/cctest/test-log-stack-tracer.cc | 38 +- deps/v8/test/cctest/test-log.cc | 45 +- .../test/cctest/test-macro-assembler-arm.cc | 23 +- .../test/cctest/test-macro-assembler-ia32.cc | 42 +- .../test/cctest/test-macro-assembler-mips.cc | 17 +- .../cctest/test-macro-assembler-mips64.cc | 217 + .../test/cctest/test-macro-assembler-x64.cc | 165 +- .../test/cctest/test-macro-assembler-x87.cc | 150 + deps/v8/test/cctest/test-mark-compact.cc | 49 +- deps/v8/test/cctest/test-mementos.cc | 13 +- .../v8/test/cctest/test-microtask-delivery.cc | 4 +- deps/v8/test/cctest/test-mutex.cc | 118 - deps/v8/test/cctest/test-object-observe.cc | 15 +- .../v8/test/cctest/test-ordered-hash-table.cc | 132 +- deps/v8/test/cctest/test-ostreams.cc | 148 + deps/v8/test/cctest/test-parsing.cc | 1324 +++- deps/v8/test/cctest/test-platform-linux.cc | 13 +- deps/v8/test/cctest/test-platform-tls.cc | 93 - deps/v8/test/cctest/test-platform-win32.cc | 16 +- deps/v8/test/cctest/test-platform.cc | 6 +- deps/v8/test/cctest/test-profile-generator.cc | 31 +- .../cctest/test-random-number-generator.cc | 49 +- deps/v8/test/cctest/test-regexp.cc | 437 +- deps/v8/test/cctest/test-reloc-info.cc | 4 +- deps/v8/test/cctest/test-representation.cc | 7 +- deps/v8/test/cctest/test-semaphore.cc | 61 +- deps/v8/test/cctest/test-serialize.cc | 370 +- deps/v8/test/cctest/test-socket.cc | 176 - deps/v8/test/cctest/test-spaces.cc | 30 +- deps/v8/test/cctest/test-strings.cc | 17 +- deps/v8/test/cctest/test-strtod.cc | 16 +- deps/v8/test/cctest/test-symbols.cc | 13 +- .../v8/test/cctest/test-thread-termination.cc | 117 +- deps/v8/test/cctest/test-threads.cc | 57 +- deps/v8/test/cctest/test-time.cc | 197 - deps/v8/test/cctest/test-types.cc | 456 +- deps/v8/test/cctest/test-unbound-queue.cc | 7 +- deps/v8/test/cctest/test-unique.cc | 10 +- .../test-unscopables-hidden-prototype.cc | 103 + deps/v8/test/cctest/test-utils-arm64.cc | 34 +- deps/v8/test/cctest/test-utils-arm64.h | 36 +- deps/v8/test/cctest/test-utils.cc | 59 +- deps/v8/test/cctest/test-version.cc | 6 +- deps/v8/test/cctest/test-weakmaps.cc | 45 +- deps/v8/test/cctest/test-weaksets.cc | 28 +- deps/v8/test/cctest/test-weaktypedarrays.cc | 28 +- deps/v8/test/cctest/trace-extension.cc | 6 +- deps/v8/test/cctest/trace-extension.h | 2 +- deps/v8/test/compiler-unittests/DEPS | 6 + .../arm/instruction-selector-arm-unittest.cc | 27 + .../change-lowering-unittest.cc | 257 + .../compiler-unittests/compiler-unittests.cc | 86 + .../compiler-unittests/compiler-unittests.gyp | 61 + .../compiler-unittests/compiler-unittests.h | 69 + .../compiler-unittests.status | 6 + .../instruction-selector-unittest.cc | 92 + .../instruction-selector-unittest.h | 129 + .../test/compiler-unittests/node-matchers.cc | 454 ++ .../test/compiler-unittests/node-matchers.h | 71 + deps/v8/test/compiler-unittests/testcfg.py | 51 + deps/v8/test/fuzz-natives/base.js | 6 +- deps/v8/test/fuzz-natives/fuzz-natives.status | 21 + deps/v8/test/fuzz-natives/testcfg.py | 17 +- deps/v8/test/intl/intl.status | 6 + deps/v8/test/mjsunit/allocation-site-info.js | 729 +- deps/v8/test/mjsunit/apply.js | 8 +- .../mjsunit/array-construct-transition.js | 18 +- .../mjsunit/array-constructor-feedback.js | 326 +- deps/v8/test/mjsunit/array-feedback.js | 303 +- .../v8/test/mjsunit/array-literal-feedback.js | 103 +- .../test/mjsunit/array-literal-transitions.js | 203 +- .../v8/test/mjsunit/array-natives-elements.js | 70 +- .../array-push-unshift-read-only-length.js | 107 + deps/v8/test/mjsunit/array-shift2.js | 18 + deps/v8/test/mjsunit/array-shift3.js | 15 + deps/v8/test/mjsunit/assert-opt-and-deopt.js | 2 +- deps/v8/test/mjsunit/binary-op-newspace.js | 2 +- .../test/mjsunit/bounds-checks-elimination.js | 123 + deps/v8/test/mjsunit/builtins.js | 11 +- .../test/mjsunit/compiler/inline-arguments.js | 26 + .../mjsunit/compiler/math-floor-global.js | 2 +- .../test/mjsunit/compiler/math-floor-local.js | 2 +- deps/v8/test/mjsunit/const-eval-init.js | 33 +- deps/v8/test/mjsunit/const-redecl.js | 82 +- deps/v8/test/mjsunit/constant-folding-2.js | 11 + deps/v8/test/mjsunit/cross-realm-filtering.js | 141 + deps/v8/test/mjsunit/debug-break-native.js | 42 + deps/v8/test/mjsunit/debug-compile-event.js | 26 +- .../test/mjsunit/debug-compile-optimized.js | 18 + deps/v8/test/mjsunit/debug-is-active.js | 28 + deps/v8/test/mjsunit/debug-mirror-cache.js | 3 + deps/v8/test/mjsunit/debug-script.js | 2 +- deps/v8/test/mjsunit/debug-scripts-request.js | 2 + .../v8/test/mjsunit/debug-stepin-positions.js | 3 +- .../debug-toggle-mirror-cache.js} | 26 +- deps/v8/test/mjsunit/define-property-gc.js | 2 +- deps/v8/test/mjsunit/deserialize-reference.js | 8 + deps/v8/test/mjsunit/dictionary-properties.js | 48 + deps/v8/test/mjsunit/elements-kind-depends.js | 2 +- deps/v8/test/mjsunit/elements-kind.js | 337 +- .../mjsunit/elements-transition-hoisting.js | 20 +- deps/v8/test/mjsunit/elements-transition.js | 164 +- deps/v8/test/mjsunit/error-tostring-omit.js | 18 +- .../{harmony => es6}/array-iterator.js | 95 +- .../test/mjsunit/es6/collection-iterator.js | 200 + .../mjsunit/{harmony => es6}/collections.js | 454 +- .../es6/debug-promises-throw-in-reject.js | 61 - .../es6/debug-promises-undefined-reject.js | 57 - .../es6/debug-promises/async-task-event.js | 61 + .../test/mjsunit/es6/debug-promises/events.js | 124 + .../reentry.js} | 2 +- .../debug-promises/reject-after-resolve.js | 37 + .../es6/debug-promises/reject-caught-all.js | 72 + .../es6/debug-promises/reject-caught-late.js | 34 + .../debug-promises/reject-caught-uncaught.js | 36 + .../debug-promises/reject-in-constructor.js | 39 + .../es6/debug-promises/reject-uncaught-all.js | 69 + .../debug-promises/reject-uncaught-late.js | 76 + .../reject-uncaught-uncaught.js | 69 + .../reject-with-invalid-reject.js | 77 + .../reject-with-throw-in-reject.js | 87 + .../reject-with-undefined-reject.js | 77 + .../throw-caught-all.js} | 40 +- .../throw-caught-late.js} | 8 +- .../throw-caught-uncaught.js} | 12 +- .../throw-in-constructor.js} | 10 +- .../throw-uncaught-all.js} | 43 +- .../throw-uncaught-uncaught.js} | 42 +- .../throw-with-throw-in-reject.js | 90 + .../throw-with-undefined-reject.js | 88 + .../try-reject-in-constructor.js | 42 + .../try-throw-reject-in-constructor.js | 44 + .../es6/debug-stepin-collections-foreach.js | 118 + .../{harmony => es6}/iteration-semantics.js | 88 +- .../{harmony => es6}/iteration-syntax.js | 2 +- deps/v8/test/mjsunit/es6/math-cbrt.js | 2 - deps/v8/test/mjsunit/es6/math-clz32.js | 2 +- deps/v8/test/mjsunit/es6/math-expm1.js | 2 +- deps/v8/test/mjsunit/es6/math-fround.js | 43 +- deps/v8/test/mjsunit/es6/math-hyperbolic.js | 2 - deps/v8/test/mjsunit/es6/math-hypot.js | 2 - deps/v8/test/mjsunit/es6/math-log1p.js | 47 +- deps/v8/test/mjsunit/es6/math-log2-log10.js | 2 - deps/v8/test/mjsunit/es6/math-sign.js | 2 - deps/v8/test/mjsunit/es6/math-trunc.js | 2 - .../v8/test/mjsunit/es6/mirror-collections.js | 144 + deps/v8/test/mjsunit/es6/mirror-promises.js | 27 +- deps/v8/test/mjsunit/es6/mirror-symbols.js | 38 + deps/v8/test/mjsunit/es6/promises.js | 42 +- .../{harmony => es6}/regress/regress-2186.js | 2 - .../es6/regress/regress-cr372788.js} | 25 +- .../regress/regress-crbug-248025.js | 2 - .../regress/regress-crbug-346141.js | 2 - deps/v8/test/mjsunit/es6/string-html.js | 159 + deps/v8/test/mjsunit/es6/string-iterator.js | 89 + .../test/mjsunit/{harmony => es6}/symbols.js | 46 +- .../test/mjsunit/es6/typed-array-iterator.js | 39 + deps/v8/test/mjsunit/es6/unscopables.js | 664 ++ deps/v8/test/mjsunit/es6/weak_collections.js | 333 - .../mjsunit/es7/object-observe-debug-event.js | 51 + .../mjsunit/es7/object-observe-runtime.js | 18 + deps/v8/test/mjsunit/es7/object-observe.js | 13 +- deps/v8/test/mjsunit/fast-non-keyed.js | 6 +- deps/v8/test/mjsunit/fast-prototype.js | 13 +- .../mjsunit/global-const-var-conflicts.js | 13 +- deps/v8/test/mjsunit/harmony/array-fill.js | 4 +- .../test/mjsunit/harmony/arrow-functions.js | 48 + .../test/mjsunit/harmony/block-conflicts.js | 133 +- .../mjsunit/harmony/block-const-assign.js | 3 +- .../mjsunit/harmony/block-early-errors.js | 3 +- deps/v8/test/mjsunit/harmony/block-for.js | 42 +- deps/v8/test/mjsunit/harmony/block-leave.js | 1 - .../mjsunit/harmony/block-let-crankshaft.js | 258 +- .../mjsunit/harmony/block-let-declaration.js | 28 +- .../mjsunit/harmony/block-let-semantics.js | 1 - deps/v8/test/mjsunit/harmony/block-scoping.js | 12 +- .../test/mjsunit/harmony/debug-blockscopes.js | 13 +- .../harmony/debug-evaluate-blockscopes.js | 1 - .../regress-2336.js => harmony/empty-for.js} | 59 +- .../harmony/generators-debug-liveedit.js | 119 + .../mjsunit/harmony/generators-iteration.js | 52 +- .../mjsunit/harmony/generators-parsing.js | 45 +- .../harmony/generators-poisoned-properties.js | 42 + .../mjsunit/harmony/generators-runtime.js | 24 +- deps/v8/test/mjsunit/harmony/private.js | 20 +- .../harmony/proxies-example-membrane.js | 2 +- deps/v8/test/mjsunit/harmony/proxies-hash.js | 2 +- deps/v8/test/mjsunit/harmony/proxies-json.js | 2 +- .../test/mjsunit/harmony/proxies-symbols.js | 2 +- .../harmony/proxies-with-unscopables.js | 153 + deps/v8/test/mjsunit/harmony/proxies.js | 2 +- .../mjsunit/harmony/regress/regress-3426.js | 7 + .../test/mjsunit/harmony/set-prototype-of.js | 2 - .../mjsunit/harmony/string-codepointat.js | 91 + .../mjsunit/harmony/string-fromcodepoint.js | 62 + deps/v8/test/mjsunit/harmony/typeof.js | 35 - .../test/mjsunit/json-stringify-recursive.js | 2 + .../mjsunit/keyed-load-dictionary-stub.js | 20 + deps/v8/test/mjsunit/math-abs.js | 2 +- deps/v8/test/mjsunit/math-floor-part1.js | 2 +- deps/v8/test/mjsunit/math-floor-part2.js | 2 +- deps/v8/test/mjsunit/math-floor-part3.js | 2 +- deps/v8/test/mjsunit/math-floor-part4.js | 2 +- deps/v8/test/mjsunit/migrations.js | 311 + deps/v8/test/mjsunit/mirror-object.js | 16 +- deps/v8/test/mjsunit/mirror-script.js | 2 +- deps/v8/test/mjsunit/mjsunit.js | 27 +- deps/v8/test/mjsunit/mjsunit.status | 264 +- .../v8/test/mjsunit/object-define-property.js | 20 +- deps/v8/test/mjsunit/object-toprimitive.js | 2 + deps/v8/test/mjsunit/opt-elements-kind.js | 23 +- deps/v8/test/mjsunit/osr-elements-kind.js | 103 +- .../test/mjsunit/outobject-double-for-in.js | 66 + .../mjsunit/override-read-only-property.js | 2 - deps/v8/test/mjsunit/own-symbols.js | 55 + deps/v8/test/mjsunit/packed-elements.js | 18 +- deps/v8/test/mjsunit/polymorph-arrays.js | 12 +- deps/v8/test/mjsunit/proto-accessor.js | 2 - deps/v8/test/mjsunit/readonly.js | 3 +- deps/v8/test/mjsunit/regress-3456.js | 13 + .../mjsunit/regress/debug-prepare-step-in.js | 2 + deps/v8/test/mjsunit/regress/regress-1170.js | 11 +- .../test/mjsunit/regress/regress-1199637.js | 16 +- .../test/mjsunit/regress/regress-1213575.js | 2 +- deps/v8/test/mjsunit/regress/regress-1530.js | 48 +- deps/v8/test/mjsunit/regress/regress-1708.js | 2 +- deps/v8/test/mjsunit/regress/regress-2790.js | 2 +- .../v8/test/mjsunit/regress/regress-320532.js | 2 +- deps/v8/test/mjsunit/regress/regress-3281.js | 7 +- deps/v8/test/mjsunit/regress/regress-3307.js | 24 + deps/v8/test/mjsunit/regress/regress-3315.js | 26 + deps/v8/test/mjsunit/regress/regress-3334.js | 13 + deps/v8/test/mjsunit/regress/regress-334.js | 8 +- deps/v8/test/mjsunit/regress/regress-3359.js | 12 + deps/v8/test/mjsunit/regress/regress-3380.js | 16 + deps/v8/test/mjsunit/regress/regress-3392.js | 18 + deps/v8/test/mjsunit/regress/regress-3404.js | 27 + deps/v8/test/mjsunit/regress/regress-3462.js | 48 + deps/v8/test/mjsunit/regress/regress-3476.js | 24 + .../v8/test/mjsunit/regress/regress-370827.js | 21 + .../v8/test/mjsunit/regress/regress-373283.js | 18 + .../v8/test/mjsunit/regress/regress-377290.js | 17 + .../v8/test/mjsunit/regress/regress-379770.js | 26 + .../v8/test/mjsunit/regress/regress-380049.js | 9 + .../v8/test/mjsunit/regress/regress-380092.js | 22 + .../v8/test/mjsunit/regress/regress-381313.js | 42 + .../regress/regress-392114.js} | 53 +- deps/v8/test/mjsunit/regress/regress-99167.js | 2 +- .../regress/regress-cntl-descriptors-enum.js | 4 +- .../mjsunit/regress/regress-crbug-245480.js | 38 +- .../mjsunit/regress/regress-crbug-350864.js | 2 - .../mjsunit/regress/regress-crbug-374838.js | 20 + .../mjsunit/regress/regress-crbug-380512.js | 12 + .../mjsunit/regress/regress-crbug-381534.js | 40 + .../mjsunit/regress/regress-crbug-382513.js | 11 + .../mjsunit/regress/regress-crbug-385002.js | 15 + .../mjsunit/regress/regress-crbug-387599.js | 19 + .../mjsunit/regress/regress-crbug-387627.js | 13 + .../mjsunit/regress/regress-crbug-387636.js | 14 + .../mjsunit/regress/regress-crbug-390918.js | 18 + .../mjsunit/regress/regress-crbug-390925.js | 9 + .../mjsunit/regress/regress-crbug-393988.js | 8 + .../mjsunit/regress/regress-crbug-401915.js | 20 + .../regress/regress-create-exception.js | 2 +- .../regress/regress-debug-context-load.js | 8 + .../regress/regress-double-property.js | 9 + ...ress-escape-preserve-smi-representation.js | 13 +- ...eeze-const.js => regress-freeze-setter.js} | 4 +- .../regress-function-constructor-receiver.js | 17 + .../regress/regress-mask-array-length.js | 10 + .../regress/regress-regexp-nocase.js} | 11 +- .../regress-set-flags-stress-compact.js | 10 + .../regress-update-field-type-attributes.js | 12 + deps/v8/test/mjsunit/runtime-gen/apply.js | 9 + .../runtime-gen/arraybuffergetbytelength.js | 5 + .../runtime-gen/arraybufferinitialize.js | 6 + .../mjsunit/runtime-gen/arraybufferisview.js | 5 + .../mjsunit/runtime-gen/arraybufferneuter.js | 5 + .../runtime-gen/arraybuffersliceimpl.js | 7 + .../arraybufferviewgetbytelength.js | 5 + .../arraybufferviewgetbyteoffset.js | 5 + .../test/mjsunit/runtime-gen/arrayconcat.js | 5 + .../mjsunit/runtime-gen/availablelocalesof.js | 5 + .../mjsunit/runtime-gen/basicjsonstringify.js | 5 + .../v8/test/mjsunit/runtime-gen/booleanize.js | 6 + .../runtime-gen/boundfunctiongetbindings.js | 5 + deps/v8/test/mjsunit/runtime-gen/break.js | 4 + .../runtime-gen/breakiteratoradopttext.js | 6 + .../runtime-gen/breakiteratorbreaktype.js | 5 + .../runtime-gen/breakiteratorcurrent.js | 5 + .../mjsunit/runtime-gen/breakiteratorfirst.js | 5 + .../mjsunit/runtime-gen/breakiteratornext.js | 5 + .../runtime-gen/canonicalizelanguagetag.js | 5 + .../runtime-gen/changebreakonexception.js | 6 + .../test/mjsunit/runtime-gen/charfromcode.js | 5 + .../runtime-gen/checkexecutionstate.js | 7 + .../runtime-gen/checkisbootstrapping.js | 6 + .../mjsunit/runtime-gen/clearbreakpoint.js | 5 + .../runtime-gen/clearfunctiontypefeedback.js | 5 + .../test/mjsunit/runtime-gen/clearstepping.js | 4 + .../mjsunit/runtime-gen/collectstacktrace.js | 6 + .../test/mjsunit/runtime-gen/compilestring.js | 6 + .../mjsunit/runtime-gen/constructdouble.js | 6 + .../runtime-gen/createbreakiterator.js | 7 + .../mjsunit/runtime-gen/createcollator.js | 7 + .../runtime-gen/createglobalprivatesymbol.js | 5 + .../runtime-gen/createjsfunctionproxy.js | 8 + .../test/mjsunit/runtime-gen/createjsproxy.js | 6 + .../runtime-gen/createprivateownsymbol.js | 5 + .../runtime-gen/createprivatesymbol.js | 5 + .../test/mjsunit/runtime-gen/createsymbol.js | 5 + .../mjsunit/runtime-gen/dataviewgetbuffer.js | 5 + .../mjsunit/runtime-gen/dataviewgetfloat32.js | 7 + .../mjsunit/runtime-gen/dataviewgetfloat64.js | 7 + .../mjsunit/runtime-gen/dataviewgetint16.js | 7 + .../mjsunit/runtime-gen/dataviewgetint32.js | 7 + .../mjsunit/runtime-gen/dataviewgetint8.js | 7 + .../mjsunit/runtime-gen/dataviewgetuint16.js | 7 + .../mjsunit/runtime-gen/dataviewgetuint32.js | 7 + .../mjsunit/runtime-gen/dataviewgetuint8.js | 7 + .../mjsunit/runtime-gen/dataviewinitialize.js | 8 + .../mjsunit/runtime-gen/dataviewsetfloat32.js | 8 + .../mjsunit/runtime-gen/dataviewsetfloat64.js | 8 + .../mjsunit/runtime-gen/dataviewsetint16.js | 8 + .../mjsunit/runtime-gen/dataviewsetint32.js | 8 + .../mjsunit/runtime-gen/dataviewsetint8.js | 8 + .../mjsunit/runtime-gen/dataviewsetuint16.js | 8 + .../mjsunit/runtime-gen/dataviewsetuint32.js | 8 + .../mjsunit/runtime-gen/dataviewsetuint8.js | 8 + .../mjsunit/runtime-gen/datecacheversion.js | 4 + .../mjsunit/runtime-gen/datecurrenttime.js | 4 + .../mjsunit/runtime-gen/datelocaltimezone.js | 5 + .../test/mjsunit/runtime-gen/datemakeday.js | 6 + .../mjsunit/runtime-gen/dateparsestring.js | 6 + .../test/mjsunit/runtime-gen/datesetvalue.js | 7 + deps/v8/test/mjsunit/runtime-gen/datetoutc.js | 5 + .../runtime-gen/debugasynctaskevent.js | 5 + .../v8/test/mjsunit/runtime-gen/debugbreak.js | 4 + .../debugcallbacksupportsstepping.js | 5 + .../mjsunit/runtime-gen/debugconstructedby.js | 6 + .../debugdisassembleconstructor.js | 5 + .../runtime-gen/debugdisassemblefunction.js | 5 + .../test/mjsunit/runtime-gen/debugevaluate.js | 12 + .../runtime-gen/debugevaluateglobal.js | 10 + .../mjsunit/runtime-gen/debuggetproperty.js | 6 + .../runtime-gen/debuggetpropertydetails.js | 6 + .../mjsunit/runtime-gen/debuggetprototype.js | 5 + .../debugindexedinterceptorelementvalue.js | 8 + .../debugnamedinterceptorpropertyvalue.js | 8 + .../mjsunit/runtime-gen/debugpoppromise.js | 4 + .../debugpreparestepinifstepping.js | 5 + .../mjsunit/runtime-gen/debugprintscopes.js | 4 + .../mjsunit/runtime-gen/debugpromiseevent.js | 5 + .../runtime-gen/debugpromiserejectevent.js | 6 + .../debugpropertyattributesfromdetails.js | 5 + .../debugpropertyindexfromdetails.js | 5 + .../debugpropertytypefromdetails.js | 5 + .../mjsunit/runtime-gen/debugpushpromise.js | 5 + .../mjsunit/runtime-gen/debugreferencedby.js | 7 + .../v8/test/mjsunit/runtime-gen/debugtrace.js | 4 + .../defineaccessorpropertyunchecked.js | 9 + .../runtime-gen/defineapiaccessorproperty.js | 9 + .../definedatapropertyunchecked.js | 8 + .../mjsunit/runtime-gen/deleteproperty.js | 7 + .../mjsunit/runtime-gen/deoptimizefunction.js | 5 + deps/v8/test/mjsunit/runtime-gen/doublehi.js | 5 + deps/v8/test/mjsunit/runtime-gen/doublelo.js | 5 + .../mjsunit/runtime-gen/enqueuemicrotask.js | 5 + .../runtime-gen/estimatenumberofelements.js | 5 + .../runtime-gen/executeindebugcontext.js | 6 + .../runtime-gen/finisharrayprototypesetup.js | 5 + deps/v8/test/mjsunit/runtime-gen/fix.js | 5 + .../test/mjsunit/runtime-gen/flattenstring.js | 5 + .../runtime-gen/functionbindarguments.js | 8 + .../runtime-gen/functiongetinferredname.js | 5 + .../mjsunit/runtime-gen/functiongetname.js | 5 + .../mjsunit/runtime-gen/functiongetscript.js | 5 + .../functiongetscriptsourceposition.js | 5 + .../runtime-gen/functiongetsourcecode.js | 5 + .../runtime-gen/functionisapifunction.js | 5 + .../mjsunit/runtime-gen/functionisarrow.js | 5 + .../mjsunit/runtime-gen/functionisbuiltin.js | 5 + .../runtime-gen/functionisgenerator.js | 5 + .../functionmarknameshouldprintasanonymous.js | 5 + .../functionnameshouldprintasanonymous.js | 5 + .../runtime-gen/functionremoveprototype.js | 5 + .../functionsetinstanceclassname.js | 6 + .../mjsunit/runtime-gen/functionsetlength.js | 6 + .../mjsunit/runtime-gen/functionsetname.js | 6 + .../runtime-gen/functionsetprototype.js | 6 + .../runtime-gen/getallscopesdetails.js | 10 + .../runtime-gen/getargumentsproperty.js | 5 + .../test/mjsunit/runtime-gen/getarraykeys.js | 6 + .../mjsunit/runtime-gen/getbreaklocations.js | 6 + .../test/mjsunit/runtime-gen/getcalltrap.js | 5 + .../runtime-gen/getconstructordelegate.js | 5 + .../mjsunit/runtime-gen/getconstructtrap.js | 5 + .../mjsunit/runtime-gen/getdataproperty.js | 6 + .../runtime-gen/getdefaulticulocale.js | 4 + .../mjsunit/runtime-gen/getdefaultreceiver.js | 5 + .../test/mjsunit/runtime-gen/getframecount.js | 7 + .../mjsunit/runtime-gen/getframedetails.js | 8 + .../getfunctioncodepositionfromsource.js | 6 + .../runtime-gen/getfunctiondelegate.js | 5 + .../runtime-gen/getfunctionscopecount.js | 5 + .../runtime-gen/getfunctionscopedetails.js | 6 + .../v8/test/mjsunit/runtime-gen/gethandler.js | 5 + .../test/mjsunit/runtime-gen/getheapusage.js | 4 + .../getimplfrominitializedintlobject.js | 5 + .../getindexedinterceptorelementnames.js | 5 + .../mjsunit/runtime-gen/getinterceptorinfo.js | 5 + .../runtime-gen/getlanguagetagvariants.js | 5 + .../getnamedinterceptorpropertynames.js | 5 + .../getobjectcontextnotifierperformchange.js | 5 + .../getobjectcontextobjectgetnotifier.js | 5 + .../getobjectcontextobjectobserve.js | 5 + .../runtime-gen/getobservationstate.js | 4 + .../runtime-gen/getoptimizationcount.js | 5 + .../mjsunit/runtime-gen/getownelementnames.js | 5 + .../mjsunit/runtime-gen/getownproperty.js | 6 + .../runtime-gen/getownpropertynames.js | 6 + .../test/mjsunit/runtime-gen/getproperty.js | 6 + .../mjsunit/runtime-gen/getpropertynames.js | 5 + .../runtime-gen/getpropertynamesfast.js | 5 + .../test/mjsunit/runtime-gen/getprototype.js | 5 + .../v8/test/mjsunit/runtime-gen/getrootnan.js | 6 + .../test/mjsunit/runtime-gen/getscopecount.js | 8 + .../mjsunit/runtime-gen/getscopedetails.js | 10 + deps/v8/test/mjsunit/runtime-gen/getscript.js | 5 + .../mjsunit/runtime-gen/getstepinpositions.js | 8 + .../mjsunit/runtime-gen/gettemplatefield.js | 8 + .../mjsunit/runtime-gen/getthreadcount.js | 7 + .../mjsunit/runtime-gen/getthreaddetails.js | 8 + .../test/mjsunit/runtime-gen/getv8version.js | 4 + .../mjsunit/runtime-gen/getweakmapentries.js | 5 + .../mjsunit/runtime-gen/getweaksetvalues.js | 5 + .../test/mjsunit/runtime-gen/globalprint.js | 5 + .../test/mjsunit/runtime-gen/globalproxy.js | 5 + .../v8/test/mjsunit/runtime-gen/haselement.js | 6 + .../mjsunit/runtime-gen/hasownproperty.js | 6 + .../test/mjsunit/runtime-gen/hasproperty.js | 6 + .../test/mjsunit/runtime-gen/havesamemap.js | 6 + .../mjsunit/runtime-gen/internalcompare.js | 7 + .../mjsunit/runtime-gen/internaldateformat.js | 6 + .../mjsunit/runtime-gen/internaldateparse.js | 6 + .../runtime-gen/internalnumberformat.js | 6 + .../runtime-gen/internalnumberparse.js | 6 + .../runtime-gen/internalsetprototype.js | 6 + .../mjsunit/runtime-gen/isattachedglobal.js | 5 + .../mjsunit/runtime-gen/isbreakonexception.js | 5 + .../isconcurrentrecompilationsupported.js | 4 + .../test/mjsunit/runtime-gen/isextensible.js | 5 + .../runtime-gen/isinitializedintlobject.js | 5 + .../isinitializedintlobjectoftype.js | 6 + .../mjsunit/runtime-gen/isinprototypechain.js | 6 + .../mjsunit/runtime-gen/isjsfunctionproxy.js | 5 + .../mjsunit/runtime-gen/isjsglobalproxy.js | 5 + .../v8/test/mjsunit/runtime-gen/isjsmodule.js | 5 + deps/v8/test/mjsunit/runtime-gen/isjsproxy.js | 5 + .../v8/test/mjsunit/runtime-gen/isobserved.js | 5 + .../test/mjsunit/runtime-gen/isoptimized.js | 4 + .../runtime-gen/ispropertyenumerable.js | 6 + .../runtime-gen/issloppymodefunction.js | 5 + .../v8/test/mjsunit/runtime-gen/istemplate.js | 5 + .../v8/test/mjsunit/runtime-gen/isvalidsmi.js | 5 + .../mjsunit/runtime-gen/keyedgetproperty.js | 6 + .../liveeditcheckanddropactivations.js | 6 + .../runtime-gen/liveeditcomparestrings.js | 6 + .../runtime-gen/liveeditfunctionsetscript.js | 6 + .../mjsunit/runtime-gen/loadmutabledouble.js | 6 + .../mjsunit/runtime-gen/lookupaccessor.js | 7 + deps/v8/test/mjsunit/runtime-gen/mapclear.js | 5 + deps/v8/test/mjsunit/runtime-gen/mapdelete.js | 6 + deps/v8/test/mjsunit/runtime-gen/mapget.js | 6 + .../v8/test/mjsunit/runtime-gen/mapgetsize.js | 5 + deps/v8/test/mjsunit/runtime-gen/maphas.js | 6 + .../test/mjsunit/runtime-gen/mapinitialize.js | 5 + .../runtime-gen/mapiteratorinitialize.js | 7 + .../mjsunit/runtime-gen/mapiteratornext.js | 6 + deps/v8/test/mjsunit/runtime-gen/mapset.js | 7 + .../markasinitializedintlobjectoftype.js | 7 + deps/v8/test/mjsunit/runtime-gen/mathacos.js | 5 + deps/v8/test/mjsunit/runtime-gen/mathasin.js | 5 + deps/v8/test/mjsunit/runtime-gen/mathatan.js | 5 + deps/v8/test/mjsunit/runtime-gen/mathatan2.js | 6 + deps/v8/test/mjsunit/runtime-gen/mathexprt.js | 5 + .../test/mjsunit/runtime-gen/mathfloorrt.js | 5 + .../v8/test/mjsunit/runtime-gen/mathfround.js | 5 + deps/v8/test/mjsunit/runtime-gen/mathlogrt.js | 5 + .../v8/test/mjsunit/runtime-gen/mathsqrtrt.js | 5 + deps/v8/test/mjsunit/runtime-gen/maxsmi.js | 4 + .../mjsunit/runtime-gen/movearraycontents.js | 6 + .../runtime-gen/neveroptimizefunction.js | 5 + .../test/mjsunit/runtime-gen/newarguments.js | 5 + .../mjsunit/runtime-gen/newobjectfrombound.js | 5 + deps/v8/test/mjsunit/runtime-gen/newstring.js | 6 + .../mjsunit/runtime-gen/newstringwrapper.js | 5 + .../mjsunit/runtime-gen/newsymbolwrapper.js | 5 + .../runtime-gen/notifycontextdisposed.js | 4 + deps/v8/test/mjsunit/runtime-gen/numberadd.js | 6 + deps/v8/test/mjsunit/runtime-gen/numberand.js | 6 + .../test/mjsunit/runtime-gen/numbercompare.js | 7 + deps/v8/test/mjsunit/runtime-gen/numberdiv.js | 6 + .../test/mjsunit/runtime-gen/numberequals.js | 6 + .../v8/test/mjsunit/runtime-gen/numberimul.js | 6 + deps/v8/test/mjsunit/runtime-gen/numbermod.js | 6 + deps/v8/test/mjsunit/runtime-gen/numbermul.js | 6 + deps/v8/test/mjsunit/runtime-gen/numberor.js | 6 + deps/v8/test/mjsunit/runtime-gen/numbersar.js | 6 + deps/v8/test/mjsunit/runtime-gen/numbershl.js | 6 + deps/v8/test/mjsunit/runtime-gen/numbershr.js | 6 + deps/v8/test/mjsunit/runtime-gen/numbersub.js | 6 + .../runtime-gen/numbertoexponential.js | 6 + .../test/mjsunit/runtime-gen/numbertofixed.js | 6 + .../mjsunit/runtime-gen/numbertointeger.js | 5 + .../numbertointegermapminuszero.js | 5 + .../mjsunit/runtime-gen/numbertojsint32.js | 5 + .../mjsunit/runtime-gen/numbertojsuint32.js | 5 + .../mjsunit/runtime-gen/numbertoprecision.js | 6 + .../runtime-gen/numbertoradixstring.js | 6 + .../mjsunit/runtime-gen/numbertostringrt.js | 5 + .../mjsunit/runtime-gen/numberunaryminus.js | 5 + deps/v8/test/mjsunit/runtime-gen/numberxor.js | 6 + .../test/mjsunit/runtime-gen/objectfreeze.js | 5 + .../objectwascreatedincurrentorigin.js | 5 + .../runtime-gen/observationweakmapcreate.js | 4 + .../observerobjectandrecordhavesameorigin.js | 7 + ...timizeobjectforaddingmultipleproperties.js | 6 + deps/v8/test/mjsunit/runtime-gen/ownkeys.js | 5 + deps/v8/test/mjsunit/runtime-gen/parsejson.js | 5 + .../mjsunit/runtime-gen/preventextensions.js | 5 + .../test/mjsunit/runtime-gen/pushifabsent.js | 6 + .../mjsunit/runtime-gen/quotejsonstring.js | 5 + .../test/mjsunit/runtime-gen/regexpcompile.js | 7 + .../runtime-gen/regexpconstructresult.js | 7 + .../mjsunit/runtime-gen/regexpexecmultiple.js | 8 + .../test/mjsunit/runtime-gen/regexpexecrt.js | 8 + .../runtime-gen/regexpinitializeobject.js | 9 + .../mjsunit/runtime-gen/removearrayholes.js | 6 + deps/v8/test/mjsunit/runtime-gen/rempio2.js | 5 + .../test/mjsunit/runtime-gen/roundnumber.js | 5 + .../test/mjsunit/runtime-gen/runmicrotasks.js | 4 + .../mjsunit/runtime-gen/runninginsimulator.js | 4 + deps/v8/test/mjsunit/runtime-gen/setadd.js | 6 + deps/v8/test/mjsunit/runtime-gen/setclear.js | 5 + deps/v8/test/mjsunit/runtime-gen/setcode.js | 6 + .../runtime-gen/setdebugeventlistener.js | 6 + deps/v8/test/mjsunit/runtime-gen/setdelete.js | 6 + .../mjsunit/runtime-gen/setdisablebreak.js | 5 + deps/v8/test/mjsunit/runtime-gen/setflags.js | 5 + .../runtime-gen/setfunctionbreakpoint.js | 7 + .../v8/test/mjsunit/runtime-gen/setgetsize.js | 5 + deps/v8/test/mjsunit/runtime-gen/sethas.js | 6 + .../test/mjsunit/runtime-gen/setinitialize.js | 5 + .../test/mjsunit/runtime-gen/setisobserved.js | 5 + .../runtime-gen/setiteratorinitialize.js | 7 + .../mjsunit/runtime-gen/setiteratornext.js | 6 + .../test/mjsunit/runtime-gen/setprototype.js | 6 + .../runtime-gen/setscopevariablevalue.js | 10 + .../runtime-gen/smilexicographiccompare.js | 6 + .../runtime-gen/sparsejoinwithseparator.js | 7 + .../runtime-gen/specialarrayfunctions.js | 4 + .../runtime-gen/stringbuilderconcat.js | 7 + .../mjsunit/runtime-gen/stringbuilderjoin.js | 7 + .../mjsunit/runtime-gen/stringcharcodeatrt.js | 6 + .../test/mjsunit/runtime-gen/stringequals.js | 6 + .../test/mjsunit/runtime-gen/stringindexof.js | 7 + .../mjsunit/runtime-gen/stringlastindexof.js | 7 + .../runtime-gen/stringlocalecompare.js | 6 + .../test/mjsunit/runtime-gen/stringmatch.js | 7 + .../mjsunit/runtime-gen/stringnormalize.js | 6 + .../mjsunit/runtime-gen/stringparsefloat.js | 5 + .../mjsunit/runtime-gen/stringparseint.js | 6 + .../stringreplaceglobalregexpwithstring.js | 8 + .../stringreplaceonecharwithstring.js | 7 + .../test/mjsunit/runtime-gen/stringsplit.js | 7 + .../test/mjsunit/runtime-gen/stringtoarray.js | 6 + .../mjsunit/runtime-gen/stringtolowercase.js | 5 + .../mjsunit/runtime-gen/stringtonumber.js | 5 + .../mjsunit/runtime-gen/stringtouppercase.js | 5 + .../v8/test/mjsunit/runtime-gen/stringtrim.js | 7 + .../mjsunit/runtime-gen/symboldescription.js | 5 + .../mjsunit/runtime-gen/symbolisprivate.js | 5 + .../mjsunit/runtime-gen/symbolregistry.js | 4 + deps/v8/test/mjsunit/runtime-gen/tobool.js | 5 + .../mjsunit/runtime-gen/tofastproperties.js | 5 + .../v8/test/mjsunit/runtime-gen/traceenter.js | 4 + deps/v8/test/mjsunit/runtime-gen/traceexit.js | 5 + .../mjsunit/runtime-gen/truncatestring.js | 6 + .../mjsunit/runtime-gen/trymigrateinstance.js | 5 + .../runtime-gen/typedarraygetbuffer.js | 5 + .../runtime-gen/typedarraygetlength.js | 5 + .../runtime-gen/typedarrayinitialize.js | 9 + .../typedarrayinitializefromarraylike.js | 8 + .../runtime-gen/typedarraymaxsizeinheap.js | 4 + .../runtime-gen/typedarraysetfastcases.js | 7 + deps/v8/test/mjsunit/runtime-gen/typeof.js | 5 + .../unblockconcurrentrecompilation.js | 6 + deps/v8/test/mjsunit/runtime-gen/uriescape.js | 5 + .../test/mjsunit/runtime-gen/uriunescape.js | 5 + .../runtime-gen/weakcollectiondelete.js | 6 + .../mjsunit/runtime-gen/weakcollectionget.js | 6 + .../mjsunit/runtime-gen/weakcollectionhas.js | 6 + .../runtime-gen/weakcollectioninitialize.js | 5 + .../mjsunit/runtime-gen/weakcollectionset.js | 7 + deps/v8/test/mjsunit/sin-cos.js | 97 +- deps/v8/test/mjsunit/stack-traces-overflow.js | 23 +- deps/v8/test/mjsunit/stack-traces.js | 20 + .../test/mjsunit/tools/profviz-test.default | 460 +- .../mjsunit/tools/tickprocessor-test.default | 20 +- .../tools/tickprocessor-test.func-info | 7 +- .../mjsunit/tools/tickprocessor-test.gc-state | 7 +- .../tools/tickprocessor-test.ignore-unknown | 15 +- .../tools/tickprocessor-test.separate-ic | 20 +- deps/v8/test/mjsunit/tools/tickprocessor.js | 6 +- .../v8/test/mjsunit/value-wrapper-accessor.js | 10 +- deps/v8/test/mjsunit/with-readonly.js | 2 - deps/v8/test/mozilla/mozilla.status | 36 +- deps/v8/test/preparser/duplicate-property.pyt | 2 +- deps/v8/test/promises-aplus/testcfg.py | 6 +- deps/v8/test/test262/test262.status | 25 +- deps/v8/test/test262/testcfg.py | 4 +- .../js/Object-defineProperty-expected.txt | 4 +- .../Object-getOwnPropertyNames-expected.txt | 44 +- .../fast/js/Object-getOwnPropertyNames.js | 44 +- ...ve-property-access-edge-cases-expected.txt | 18 +- .../fast/js/read-modify-eval-expected.txt | 2 +- .../webkit/fast/js/string-anchor-expected.txt | 4 +- .../fast/js/string-fontcolor-expected.txt | 4 +- .../fast/js/string-fontsize-expected.txt | 4 +- .../webkit/fast/js/string-link-expected.txt | 4 +- .../v8/test/webkit/for-in-cached-expected.txt | 4 +- deps/v8/test/webkit/for-in-cached.js | 4 +- .../object-literal-direct-put-expected.txt | 4 +- .../test/webkit/object-literal-direct-put.js | 4 +- .../webkit/object-literal-syntax-expected.txt | 24 +- deps/v8/test/webkit/object-literal-syntax.js | 24 +- ...tring-replacement-outofmemory-expected.txt | 9 + .../webkit/string-replacement-outofmemory.js | 2 +- deps/v8/test/webkit/webkit.status | 19 +- deps/v8/testing/gmock.gyp | 62 + deps/v8/testing/gtest-type-names.h | 34 + deps/v8/testing/gtest.gyp | 159 + deps/v8/third_party/fdlibm/LICENSE | 6 + deps/v8/third_party/fdlibm/README.v8 | 18 + deps/v8/third_party/fdlibm/fdlibm.cc | 273 + deps/v8/third_party/fdlibm/fdlibm.h | 31 + deps/v8/third_party/fdlibm/fdlibm.js | 518 ++ deps/v8/tools/DEPS | 8 + deps/v8/tools/check-static-initializers.sh | 3 +- ...ate-trig-table.py => concatenate-files.py} | 76 +- deps/v8/tools/disasm.py | 3 +- deps/v8/tools/external-reference-check.py | 43 + deps/v8/tools/fuzz-harness.sh | 2 +- deps/v8/tools/gcmole/Makefile | 15 +- deps/v8/tools/gcmole/bootstrap.sh | 11 +- deps/v8/tools/gcmole/gcmole.cc | 127 +- deps/v8/tools/gcmole/gcmole.lua | 12 +- deps/v8/tools/gdbinit | 33 + deps/v8/tools/gen-postmortem-metadata.py | 16 +- deps/v8/tools/generate-runtime-tests.py | 1412 ++++ deps/v8/tools/grokdump.py | 9 +- deps/v8/tools/gyp/v8.gyp | 695 +- deps/v8/tools/js2c.py | 92 +- deps/v8/tools/lexer-shell.cc | 54 +- deps/v8/tools/lexer-shell.gyp | 6 +- deps/v8/tools/ll_prof.py | 3 +- deps/v8/tools/parser-shell.cc | 67 +- deps/v8/tools/plot-timer-events | 30 +- deps/v8/tools/presubmit.py | 30 +- deps/v8/tools/profile_view.js | 18 - deps/v8/tools/profviz/composer.js | 26 +- deps/v8/tools/profviz/stdio.js | 2 +- deps/v8/tools/push-to-trunk/auto_roll.py | 23 + deps/v8/tools/push-to-trunk/auto_tag.py | 200 + .../v8/tools/push-to-trunk/bump_up_version.py | 241 + deps/v8/tools/push-to-trunk/chromium_roll.py | 6 +- .../v8/tools/push-to-trunk/common_includes.py | 55 +- deps/v8/tools/push-to-trunk/git_recipes.py | 13 +- deps/v8/tools/push-to-trunk/push_to_trunk.py | 46 +- deps/v8/tools/push-to-trunk/releases.py | 68 +- deps/v8/tools/push-to-trunk/test_scripts.py | 218 +- deps/v8/tools/run-deopt-fuzzer.py | 47 +- deps/v8/tools/run-tests.py | 127 +- deps/v8/tools/run.py | 12 + deps/v8/tools/run_benchmarks.py | 421 ++ deps/v8/tools/testrunner/local/commands.py | 89 +- deps/v8/tools/testrunner/local/execution.py | 229 +- .../testrunner/{network => local}/perfdata.py | 0 deps/v8/tools/testrunner/local/pool.py | 146 + .../tools/testrunner/local/pool_unittest.py | 41 + deps/v8/tools/testrunner/local/progress.py | 59 + deps/v8/tools/testrunner/local/statusfile.py | 4 +- deps/v8/tools/testrunner/local/testsuite.py | 17 +- deps/v8/tools/testrunner/local/utils.py | 8 + .../testrunner/network/network_execution.py | 4 +- deps/v8/tools/testrunner/objects/context.py | 13 +- deps/v8/tools/testrunner/objects/testcase.py | 2 + deps/v8/tools/tickprocessor.js | 71 +- .../v8/tools/unittests/run_benchmarks_test.py | 297 + deps/v8/tools/whitespace.txt | 8 + 1662 files changed, 245114 insertions(+), 74654 deletions(-) create mode 100644 deps/v8/benchmarks/v8.json create mode 100644 deps/v8/build/detect_v8_host_arch.py create mode 100755 deps/v8/build/get_landmines.py create mode 100644 deps/v8/build/landmine_utils.py create mode 100755 deps/v8/build/landmines.py create mode 100644 deps/v8/include/libplatform/libplatform.h create mode 100644 deps/v8/src/DEPS delete mode 100644 deps/v8/src/arm64/cpu-arm64.h create mode 100644 deps/v8/src/arm64/delayed-masm-arm64-inl.h create mode 100644 deps/v8/src/arm64/delayed-masm-arm64.cc create mode 100644 deps/v8/src/arm64/delayed-masm-arm64.h create mode 100644 deps/v8/src/ast-value-factory.cc create mode 100644 deps/v8/src/ast-value-factory.h create mode 100644 deps/v8/src/base/DEPS rename deps/v8/src/{ => base}/atomicops.h (90%) rename deps/v8/src/{ => base}/atomicops_internals_arm64_gcc.h (97%) rename deps/v8/src/{ => base}/atomicops_internals_arm_gcc.h (98%) rename deps/v8/src/{ => base}/atomicops_internals_atomicword_compat.h (87%) rename deps/v8/src/{ => base}/atomicops_internals_mac.h (97%) create mode 100644 deps/v8/src/base/atomicops_internals_mips64_gcc.h rename deps/v8/src/{ => base}/atomicops_internals_mips_gcc.h (96%) rename deps/v8/src/{ => base}/atomicops_internals_tsan.h (94%) rename deps/v8/src/{ => base}/atomicops_internals_x86_gcc.cc (89%) rename deps/v8/src/{ => base}/atomicops_internals_x86_gcc.h (97%) rename deps/v8/src/{ => base}/atomicops_internals_x86_msvc.h (96%) create mode 100644 deps/v8/src/base/build_config.h rename deps/v8/src/{ => base}/cpu.cc (88%) rename deps/v8/src/{ => base}/cpu.h (88%) rename deps/v8/src/{ => base}/lazy-instance.h (97%) create mode 100644 deps/v8/src/base/logging.cc create mode 100644 deps/v8/src/base/logging.h rename deps/v8/src/{ => base}/once.cc (92%) rename deps/v8/src/{ => base}/once.h (93%) rename deps/v8/src/{ => base}/platform/condition-variable.cc (89%) rename deps/v8/src/{ => base}/platform/condition-variable.h (89%) rename deps/v8/src/{ => base}/platform/elapsed-timer.h (74%) rename deps/v8/src/{ => base}/platform/mutex.cc (87%) rename deps/v8/src/{ => base}/platform/mutex.h (94%) rename deps/v8/src/{ => base/platform}/platform-cygwin.cc (80%) rename deps/v8/src/{ => base/platform}/platform-freebsd.cc (91%) rename deps/v8/src/{ => base/platform}/platform-linux.cc (92%) rename deps/v8/src/{ => base/platform}/platform-macos.cc (91%) rename deps/v8/src/{ => base/platform}/platform-openbsd.cc (91%) rename deps/v8/src/{ => base/platform}/platform-posix.cc (74%) rename deps/v8/src/{ => base/platform}/platform-qnx.cc (91%) rename deps/v8/src/{ => base/platform}/platform-solaris.cc (79%) rename deps/v8/src/{ => base/platform}/platform-win32.cc (88%) rename deps/v8/src/{ => base/platform}/platform.h (73%) rename deps/v8/src/{ => base}/platform/semaphore.cc (83%) rename deps/v8/src/{ => base}/platform/semaphore.h (85%) rename deps/v8/src/{ => base}/platform/time.cc (82%) rename deps/v8/src/{ => base}/platform/time.h (95%) rename deps/v8/src/{ => base}/qnx-math.h (77%) create mode 100644 deps/v8/src/base/safe_conversions.h create mode 100644 deps/v8/src/base/safe_conversions_impl.h create mode 100644 deps/v8/src/base/safe_math.h create mode 100644 deps/v8/src/base/safe_math_impl.h rename deps/v8/src/{ => base}/utils/random-number-generator.cc (78%) rename deps/v8/src/{ => base}/utils/random-number-generator.h (93%) rename deps/v8/src/{ => base}/win32-headers.h (94%) rename deps/v8/src/{ => base}/win32-math.cc (93%) rename deps/v8/src/{ => base}/win32-math.h (90%) create mode 100644 deps/v8/src/collection-iterator.js create mode 100644 deps/v8/src/compiler/arm/code-generator-arm.cc create mode 100644 deps/v8/src/compiler/arm/instruction-codes-arm.h create mode 100644 deps/v8/src/compiler/arm/instruction-selector-arm.cc create mode 100644 deps/v8/src/compiler/arm/linkage-arm.cc create mode 100644 deps/v8/src/compiler/arm64/code-generator-arm64.cc create mode 100644 deps/v8/src/compiler/arm64/instruction-codes-arm64.h create mode 100644 deps/v8/src/compiler/arm64/instruction-selector-arm64.cc create mode 100644 deps/v8/src/compiler/arm64/linkage-arm64.cc create mode 100644 deps/v8/src/compiler/ast-graph-builder.cc create mode 100644 deps/v8/src/compiler/ast-graph-builder.h create mode 100644 deps/v8/src/compiler/change-lowering.cc create mode 100644 deps/v8/src/compiler/change-lowering.h create mode 100644 deps/v8/src/compiler/code-generator-impl.h create mode 100644 deps/v8/src/compiler/code-generator.cc create mode 100644 deps/v8/src/compiler/code-generator.h create mode 100644 deps/v8/src/compiler/common-node-cache.h create mode 100644 deps/v8/src/compiler/common-operator.h create mode 100644 deps/v8/src/compiler/control-builders.cc create mode 100644 deps/v8/src/compiler/control-builders.h create mode 100644 deps/v8/src/compiler/frame.h create mode 100644 deps/v8/src/compiler/gap-resolver.cc create mode 100644 deps/v8/src/compiler/gap-resolver.h create mode 100644 deps/v8/src/compiler/generic-algorithm-inl.h create mode 100644 deps/v8/src/compiler/generic-algorithm.h create mode 100644 deps/v8/src/compiler/generic-graph.h create mode 100644 deps/v8/src/compiler/generic-node-inl.h create mode 100644 deps/v8/src/compiler/generic-node.h create mode 100644 deps/v8/src/compiler/graph-builder.cc create mode 100644 deps/v8/src/compiler/graph-builder.h create mode 100644 deps/v8/src/compiler/graph-inl.h create mode 100644 deps/v8/src/compiler/graph-reducer.cc create mode 100644 deps/v8/src/compiler/graph-reducer.h create mode 100644 deps/v8/src/compiler/graph-replay.cc create mode 100644 deps/v8/src/compiler/graph-replay.h create mode 100644 deps/v8/src/compiler/graph-visualizer.cc create mode 100644 deps/v8/src/compiler/graph-visualizer.h create mode 100644 deps/v8/src/compiler/graph.cc create mode 100644 deps/v8/src/compiler/graph.h create mode 100644 deps/v8/src/compiler/ia32/code-generator-ia32.cc create mode 100644 deps/v8/src/compiler/ia32/instruction-codes-ia32.h create mode 100644 deps/v8/src/compiler/ia32/instruction-selector-ia32.cc create mode 100644 deps/v8/src/compiler/ia32/linkage-ia32.cc create mode 100644 deps/v8/src/compiler/instruction-codes.h create mode 100644 deps/v8/src/compiler/instruction-selector-impl.h create mode 100644 deps/v8/src/compiler/instruction-selector.cc create mode 100644 deps/v8/src/compiler/instruction-selector.h create mode 100644 deps/v8/src/compiler/instruction.cc create mode 100644 deps/v8/src/compiler/instruction.h create mode 100644 deps/v8/src/compiler/ir-operations.txt create mode 100644 deps/v8/src/compiler/js-context-specialization.cc create mode 100644 deps/v8/src/compiler/js-context-specialization.h create mode 100644 deps/v8/src/compiler/js-generic-lowering.cc create mode 100644 deps/v8/src/compiler/js-generic-lowering.h create mode 100644 deps/v8/src/compiler/js-graph.cc create mode 100644 deps/v8/src/compiler/js-graph.h create mode 100644 deps/v8/src/compiler/js-operator.h create mode 100644 deps/v8/src/compiler/js-typed-lowering.cc create mode 100644 deps/v8/src/compiler/js-typed-lowering.h create mode 100644 deps/v8/src/compiler/linkage-impl.h create mode 100644 deps/v8/src/compiler/linkage.cc create mode 100644 deps/v8/src/compiler/linkage.h create mode 100644 deps/v8/src/compiler/lowering-builder.cc create mode 100644 deps/v8/src/compiler/lowering-builder.h create mode 100644 deps/v8/src/compiler/machine-node-factory.h create mode 100644 deps/v8/src/compiler/machine-operator-reducer.cc create mode 100644 deps/v8/src/compiler/machine-operator-reducer.h create mode 100644 deps/v8/src/compiler/machine-operator.h create mode 100644 deps/v8/src/compiler/machine-type.h create mode 100644 deps/v8/src/compiler/node-aux-data-inl.h create mode 100644 deps/v8/src/compiler/node-aux-data.h create mode 100644 deps/v8/src/compiler/node-cache.cc create mode 100644 deps/v8/src/compiler/node-cache.h create mode 100644 deps/v8/src/compiler/node-matchers.h create mode 100644 deps/v8/src/compiler/node-properties-inl.h create mode 100644 deps/v8/src/compiler/node-properties.h create mode 100644 deps/v8/src/compiler/node.cc create mode 100644 deps/v8/src/compiler/node.h create mode 100644 deps/v8/src/compiler/opcodes.h create mode 100644 deps/v8/src/compiler/operator-properties-inl.h create mode 100644 deps/v8/src/compiler/operator-properties.h create mode 100644 deps/v8/src/compiler/operator.h create mode 100644 deps/v8/src/compiler/phi-reducer.h create mode 100644 deps/v8/src/compiler/pipeline.cc create mode 100644 deps/v8/src/compiler/pipeline.h create mode 100644 deps/v8/src/compiler/raw-machine-assembler.cc create mode 100644 deps/v8/src/compiler/raw-machine-assembler.h create mode 100644 deps/v8/src/compiler/register-allocator.cc create mode 100644 deps/v8/src/compiler/register-allocator.h create mode 100644 deps/v8/src/compiler/representation-change.h create mode 100644 deps/v8/src/compiler/schedule.cc create mode 100644 deps/v8/src/compiler/schedule.h create mode 100644 deps/v8/src/compiler/scheduler.cc create mode 100644 deps/v8/src/compiler/scheduler.h create mode 100644 deps/v8/src/compiler/simplified-lowering.cc create mode 100644 deps/v8/src/compiler/simplified-lowering.h create mode 100644 deps/v8/src/compiler/simplified-node-factory.h create mode 100644 deps/v8/src/compiler/simplified-operator.h create mode 100644 deps/v8/src/compiler/source-position.cc create mode 100644 deps/v8/src/compiler/source-position.h create mode 100644 deps/v8/src/compiler/structured-machine-assembler.cc create mode 100644 deps/v8/src/compiler/structured-machine-assembler.h create mode 100644 deps/v8/src/compiler/typer.cc create mode 100644 deps/v8/src/compiler/typer.h create mode 100644 deps/v8/src/compiler/verifier.cc create mode 100644 deps/v8/src/compiler/verifier.h create mode 100644 deps/v8/src/compiler/x64/code-generator-x64.cc create mode 100644 deps/v8/src/compiler/x64/instruction-codes-x64.h create mode 100644 deps/v8/src/compiler/x64/instruction-selector-x64.cc create mode 100644 deps/v8/src/compiler/x64/linkage-x64.cc delete mode 100644 deps/v8/src/debug-agent.cc delete mode 100644 deps/v8/src/debug-agent.h create mode 100644 deps/v8/src/field-index-inl.h create mode 100644 deps/v8/src/field-index.cc create mode 100644 deps/v8/src/field-index.h delete mode 100644 deps/v8/src/harmony-math.js create mode 100644 deps/v8/src/heap/gc-tracer.cc create mode 100644 deps/v8/src/heap/gc-tracer.h rename deps/v8/src/{ => heap}/heap-inl.h (68%) rename deps/v8/src/{ => heap}/heap.cc (68%) rename deps/v8/src/{ => heap}/heap.h (72%) rename deps/v8/src/{ => heap}/incremental-marking-inl.h (82%) rename deps/v8/src/{ => heap}/incremental-marking.cc (72%) rename deps/v8/src/{ => heap}/incremental-marking.h (75%) rename deps/v8/src/{ => heap}/mark-compact-inl.h (74%) rename deps/v8/src/{ => heap}/mark-compact.cc (73%) rename deps/v8/src/{ => heap}/mark-compact.h (83%) rename deps/v8/src/{ => heap}/objects-visiting-inl.h (69%) rename deps/v8/src/{ => heap}/objects-visiting.cc (54%) rename deps/v8/src/{ => heap}/objects-visiting.h (68%) rename deps/v8/src/{ => heap}/spaces-inl.h (72%) rename deps/v8/src/{ => heap}/spaces.cc (79%) rename deps/v8/src/{ => heap}/spaces.h (83%) rename deps/v8/src/{ => heap}/store-buffer-inl.h (75%) rename deps/v8/src/{ => heap}/store-buffer.cc (61%) rename deps/v8/src/{ => heap}/store-buffer.h (84%) rename deps/v8/src/{ => heap}/sweeper-thread.cc (52%) rename deps/v8/src/{ => heap}/sweeper-thread.h (50%) create mode 100644 deps/v8/src/hydrogen-types.cc create mode 100644 deps/v8/src/hydrogen-types.h create mode 100644 deps/v8/src/libplatform/DEPS create mode 100644 deps/v8/src/lithium-inl.h create mode 100644 deps/v8/src/lookup-inl.h create mode 100644 deps/v8/src/lookup.cc create mode 100644 deps/v8/src/lookup.h create mode 100644 deps/v8/src/mips64/OWNERS create mode 100644 deps/v8/src/mips64/assembler-mips64-inl.h create mode 100644 deps/v8/src/mips64/assembler-mips64.cc create mode 100644 deps/v8/src/mips64/assembler-mips64.h create mode 100644 deps/v8/src/mips64/builtins-mips64.cc create mode 100644 deps/v8/src/mips64/code-stubs-mips64.cc create mode 100644 deps/v8/src/mips64/code-stubs-mips64.h create mode 100644 deps/v8/src/mips64/codegen-mips64.cc create mode 100644 deps/v8/src/mips64/codegen-mips64.h create mode 100644 deps/v8/src/mips64/constants-mips64.cc create mode 100644 deps/v8/src/mips64/constants-mips64.h create mode 100644 deps/v8/src/mips64/cpu-mips64.cc create mode 100644 deps/v8/src/mips64/debug-mips64.cc create mode 100644 deps/v8/src/mips64/deoptimizer-mips64.cc create mode 100644 deps/v8/src/mips64/disasm-mips64.cc create mode 100644 deps/v8/src/mips64/frames-mips64.cc create mode 100644 deps/v8/src/mips64/frames-mips64.h create mode 100644 deps/v8/src/mips64/full-codegen-mips64.cc create mode 100644 deps/v8/src/mips64/ic-mips64.cc create mode 100644 deps/v8/src/mips64/lithium-codegen-mips64.cc create mode 100644 deps/v8/src/mips64/lithium-codegen-mips64.h create mode 100644 deps/v8/src/mips64/lithium-gap-resolver-mips64.cc create mode 100644 deps/v8/src/mips64/lithium-gap-resolver-mips64.h create mode 100644 deps/v8/src/mips64/lithium-mips64.cc create mode 100644 deps/v8/src/mips64/lithium-mips64.h create mode 100644 deps/v8/src/mips64/macro-assembler-mips64.cc create mode 100644 deps/v8/src/mips64/macro-assembler-mips64.h create mode 100644 deps/v8/src/mips64/regexp-macro-assembler-mips64.cc create mode 100644 deps/v8/src/mips64/regexp-macro-assembler-mips64.h create mode 100644 deps/v8/src/mips64/simulator-mips64.cc create mode 100644 deps/v8/src/mips64/simulator-mips64.h create mode 100644 deps/v8/src/mips64/stub-cache-mips64.cc create mode 100644 deps/v8/src/natives-external.cc create mode 100644 deps/v8/src/ostreams.cc create mode 100644 deps/v8/src/ostreams.h create mode 100644 deps/v8/src/perf-jit.cc create mode 100644 deps/v8/src/perf-jit.h delete mode 100644 deps/v8/src/platform/socket.cc delete mode 100644 deps/v8/src/platform/socket.h create mode 100644 deps/v8/src/prototype.h create mode 100644 deps/v8/src/snapshot-external.cc create mode 100644 deps/v8/src/snapshot-source-sink.cc create mode 100644 deps/v8/src/snapshot-source-sink.h create mode 100644 deps/v8/src/string-iterator.js create mode 100644 deps/v8/src/third_party/kernel/tools/perf/util/jitdump.h delete mode 100644 deps/v8/src/trig-table.h delete mode 100644 deps/v8/src/v8checks.h delete mode 100644 deps/v8/src/v8globals.h create mode 100644 deps/v8/src/x87/OWNERS create mode 100644 deps/v8/src/x87/assembler-x87-inl.h create mode 100644 deps/v8/src/x87/assembler-x87.cc create mode 100644 deps/v8/src/x87/assembler-x87.h create mode 100644 deps/v8/src/x87/builtins-x87.cc create mode 100644 deps/v8/src/x87/code-stubs-x87.cc create mode 100644 deps/v8/src/x87/code-stubs-x87.h create mode 100644 deps/v8/src/x87/codegen-x87.cc create mode 100644 deps/v8/src/x87/codegen-x87.h create mode 100644 deps/v8/src/x87/cpu-x87.cc create mode 100644 deps/v8/src/x87/debug-x87.cc create mode 100644 deps/v8/src/x87/deoptimizer-x87.cc create mode 100644 deps/v8/src/x87/disasm-x87.cc create mode 100644 deps/v8/src/x87/frames-x87.cc create mode 100644 deps/v8/src/x87/frames-x87.h create mode 100644 deps/v8/src/x87/full-codegen-x87.cc create mode 100644 deps/v8/src/x87/ic-x87.cc create mode 100644 deps/v8/src/x87/lithium-codegen-x87.cc create mode 100644 deps/v8/src/x87/lithium-codegen-x87.h create mode 100644 deps/v8/src/x87/lithium-gap-resolver-x87.cc create mode 100644 deps/v8/src/x87/lithium-gap-resolver-x87.h create mode 100644 deps/v8/src/x87/lithium-x87.cc create mode 100644 deps/v8/src/x87/lithium-x87.h create mode 100644 deps/v8/src/x87/macro-assembler-x87.cc create mode 100644 deps/v8/src/x87/macro-assembler-x87.h create mode 100644 deps/v8/src/x87/regexp-macro-assembler-x87.cc create mode 100644 deps/v8/src/x87/regexp-macro-assembler-x87.h create mode 100644 deps/v8/src/x87/simulator-x87.cc create mode 100644 deps/v8/src/x87/simulator-x87.h create mode 100644 deps/v8/src/x87/stub-cache-x87.cc create mode 100644 deps/v8/test/base-unittests/DEPS create mode 100644 deps/v8/test/base-unittests/base-unittests.gyp create mode 100644 deps/v8/test/base-unittests/base-unittests.status create mode 100644 deps/v8/test/base-unittests/cpu-unittest.cc rename deps/v8/test/{cctest/test-condition-variable.cc => base-unittests/platform/condition-variable-unittest.cc} (58%) create mode 100644 deps/v8/test/base-unittests/platform/mutex-unittest.cc create mode 100644 deps/v8/test/base-unittests/platform/platform-unittest.cc create mode 100644 deps/v8/test/base-unittests/platform/time-unittest.cc create mode 100644 deps/v8/test/base-unittests/testcfg.py create mode 100644 deps/v8/test/base-unittests/utils/random-number-generator-unittest.cc create mode 100644 deps/v8/test/cctest/DEPS create mode 100644 deps/v8/test/cctest/compiler/call-tester.h create mode 100644 deps/v8/test/cctest/compiler/codegen-tester.cc create mode 100644 deps/v8/test/cctest/compiler/codegen-tester.h create mode 100644 deps/v8/test/cctest/compiler/function-tester.h create mode 100644 deps/v8/test/cctest/compiler/graph-builder-tester.cc create mode 100644 deps/v8/test/cctest/compiler/graph-builder-tester.h create mode 100644 deps/v8/test/cctest/compiler/graph-tester.h create mode 100644 deps/v8/test/cctest/compiler/instruction-selector-tester.h create mode 100644 deps/v8/test/cctest/compiler/simplified-graph-builder.cc create mode 100644 deps/v8/test/cctest/compiler/simplified-graph-builder.h create mode 100644 deps/v8/test/cctest/compiler/test-branch-combine.cc create mode 100644 deps/v8/test/cctest/compiler/test-changes-lowering.cc create mode 100644 deps/v8/test/cctest/compiler/test-codegen-deopt.cc create mode 100644 deps/v8/test/cctest/compiler/test-gap-resolver.cc create mode 100644 deps/v8/test/cctest/compiler/test-graph-reducer.cc create mode 100644 deps/v8/test/cctest/compiler/test-instruction-selector-arm.cc create mode 100644 deps/v8/test/cctest/compiler/test-instruction-selector-ia32.cc create mode 100644 deps/v8/test/cctest/compiler/test-instruction-selector.cc create mode 100644 deps/v8/test/cctest/compiler/test-instruction.cc create mode 100644 deps/v8/test/cctest/compiler/test-js-constant-cache.cc create mode 100644 deps/v8/test/cctest/compiler/test-js-context-specialization.cc create mode 100644 deps/v8/test/cctest/compiler/test-js-typed-lowering.cc create mode 100644 deps/v8/test/cctest/compiler/test-linkage.cc create mode 100644 deps/v8/test/cctest/compiler/test-machine-operator-reducer.cc create mode 100644 deps/v8/test/cctest/compiler/test-node-algorithm.cc create mode 100644 deps/v8/test/cctest/compiler/test-node-cache.cc create mode 100644 deps/v8/test/cctest/compiler/test-node.cc create mode 100644 deps/v8/test/cctest/compiler/test-operator.cc create mode 100644 deps/v8/test/cctest/compiler/test-phi-reducer.cc create mode 100644 deps/v8/test/cctest/compiler/test-pipeline.cc create mode 100644 deps/v8/test/cctest/compiler/test-representation-change.cc create mode 100644 deps/v8/test/cctest/compiler/test-run-deopt.cc create mode 100644 deps/v8/test/cctest/compiler/test-run-intrinsics.cc create mode 100644 deps/v8/test/cctest/compiler/test-run-jsbranches.cc create mode 100644 deps/v8/test/cctest/compiler/test-run-jscalls.cc create mode 100644 deps/v8/test/cctest/compiler/test-run-jsexceptions.cc create mode 100644 deps/v8/test/cctest/compiler/test-run-jsops.cc create mode 100644 deps/v8/test/cctest/compiler/test-run-machops.cc create mode 100644 deps/v8/test/cctest/compiler/test-run-variables.cc create mode 100644 deps/v8/test/cctest/compiler/test-schedule.cc create mode 100644 deps/v8/test/cctest/compiler/test-scheduler.cc create mode 100644 deps/v8/test/cctest/compiler/test-simplified-lowering.cc create mode 100644 deps/v8/test/cctest/compiler/test-structured-ifbuilder-fuzzer.cc create mode 100644 deps/v8/test/cctest/compiler/test-structured-machine-assembler.cc create mode 100644 deps/v8/test/cctest/compiler/value-helper.h create mode 100644 deps/v8/test/cctest/test-assembler-mips64.cc create mode 100644 deps/v8/test/cctest/test-assembler-x87.cc create mode 100644 deps/v8/test/cctest/test-checks.cc create mode 100644 deps/v8/test/cctest/test-code-stubs-mips64.cc create mode 100644 deps/v8/test/cctest/test-code-stubs-x87.cc create mode 100644 deps/v8/test/cctest/test-disasm-mips64.cc create mode 100644 deps/v8/test/cctest/test-disasm-x87.cc create mode 100644 deps/v8/test/cctest/test-gc-tracer.cc create mode 100644 deps/v8/test/cctest/test-hydrogen-types.cc create mode 100644 deps/v8/test/cctest/test-libplatform-default-platform.cc create mode 100644 deps/v8/test/cctest/test-macro-assembler-mips64.cc create mode 100644 deps/v8/test/cctest/test-macro-assembler-x87.cc delete mode 100644 deps/v8/test/cctest/test-mutex.cc create mode 100644 deps/v8/test/cctest/test-ostreams.cc delete mode 100644 deps/v8/test/cctest/test-platform-tls.cc delete mode 100644 deps/v8/test/cctest/test-socket.cc delete mode 100644 deps/v8/test/cctest/test-time.cc create mode 100644 deps/v8/test/cctest/test-unscopables-hidden-prototype.cc create mode 100644 deps/v8/test/compiler-unittests/DEPS create mode 100644 deps/v8/test/compiler-unittests/arm/instruction-selector-arm-unittest.cc create mode 100644 deps/v8/test/compiler-unittests/change-lowering-unittest.cc create mode 100644 deps/v8/test/compiler-unittests/compiler-unittests.cc create mode 100644 deps/v8/test/compiler-unittests/compiler-unittests.gyp create mode 100644 deps/v8/test/compiler-unittests/compiler-unittests.h create mode 100644 deps/v8/test/compiler-unittests/compiler-unittests.status create mode 100644 deps/v8/test/compiler-unittests/instruction-selector-unittest.cc create mode 100644 deps/v8/test/compiler-unittests/instruction-selector-unittest.h create mode 100644 deps/v8/test/compiler-unittests/node-matchers.cc create mode 100644 deps/v8/test/compiler-unittests/node-matchers.h create mode 100644 deps/v8/test/compiler-unittests/testcfg.py create mode 100644 deps/v8/test/mjsunit/array-push-unshift-read-only-length.js create mode 100644 deps/v8/test/mjsunit/array-shift2.js create mode 100644 deps/v8/test/mjsunit/array-shift3.js create mode 100644 deps/v8/test/mjsunit/bounds-checks-elimination.js create mode 100644 deps/v8/test/mjsunit/cross-realm-filtering.js create mode 100644 deps/v8/test/mjsunit/debug-break-native.js create mode 100644 deps/v8/test/mjsunit/debug-compile-optimized.js create mode 100644 deps/v8/test/mjsunit/debug-is-active.js rename deps/v8/test/{cctest/test-cpu-x64.cc => mjsunit/debug-toggle-mirror-cache.js} (75%) create mode 100644 deps/v8/test/mjsunit/deserialize-reference.js create mode 100644 deps/v8/test/mjsunit/dictionary-properties.js rename deps/v8/test/mjsunit/{harmony => es6}/array-iterator.js (73%) create mode 100644 deps/v8/test/mjsunit/es6/collection-iterator.js rename deps/v8/test/mjsunit/{harmony => es6}/collections.js (68%) delete mode 100644 deps/v8/test/mjsunit/es6/debug-promises-throw-in-reject.js delete mode 100644 deps/v8/test/mjsunit/es6/debug-promises-undefined-reject.js create mode 100644 deps/v8/test/mjsunit/es6/debug-promises/async-task-event.js create mode 100644 deps/v8/test/mjsunit/es6/debug-promises/events.js rename deps/v8/test/mjsunit/es6/{debug-promises-reentry.js => debug-promises/reentry.js} (90%) create mode 100644 deps/v8/test/mjsunit/es6/debug-promises/reject-after-resolve.js create mode 100644 deps/v8/test/mjsunit/es6/debug-promises/reject-caught-all.js create mode 100644 deps/v8/test/mjsunit/es6/debug-promises/reject-caught-late.js create mode 100644 deps/v8/test/mjsunit/es6/debug-promises/reject-caught-uncaught.js create mode 100644 deps/v8/test/mjsunit/es6/debug-promises/reject-in-constructor.js create mode 100644 deps/v8/test/mjsunit/es6/debug-promises/reject-uncaught-all.js create mode 100644 deps/v8/test/mjsunit/es6/debug-promises/reject-uncaught-late.js create mode 100644 deps/v8/test/mjsunit/es6/debug-promises/reject-uncaught-uncaught.js create mode 100644 deps/v8/test/mjsunit/es6/debug-promises/reject-with-invalid-reject.js create mode 100644 deps/v8/test/mjsunit/es6/debug-promises/reject-with-throw-in-reject.js create mode 100644 deps/v8/test/mjsunit/es6/debug-promises/reject-with-undefined-reject.js rename deps/v8/test/mjsunit/es6/{debug-promises-caught-all.js => debug-promises/throw-caught-all.js} (58%) rename deps/v8/test/mjsunit/es6/{debug-promises-caught-late.js => debug-promises/throw-caught-late.js} (70%) rename deps/v8/test/mjsunit/es6/{debug-promises-caught-uncaught.js => debug-promises/throw-caught-uncaught.js} (63%) rename deps/v8/test/mjsunit/es6/{debug-promises-throw-in-constructor.js => debug-promises/throw-in-constructor.js} (69%) rename deps/v8/test/mjsunit/es6/{debug-promises-uncaught-all.js => debug-promises/throw-uncaught-all.js} (59%) rename deps/v8/test/mjsunit/es6/{debug-promises-uncaught-uncaught.js => debug-promises/throw-uncaught-uncaught.js} (60%) create mode 100644 deps/v8/test/mjsunit/es6/debug-promises/throw-with-throw-in-reject.js create mode 100644 deps/v8/test/mjsunit/es6/debug-promises/throw-with-undefined-reject.js create mode 100644 deps/v8/test/mjsunit/es6/debug-promises/try-reject-in-constructor.js create mode 100644 deps/v8/test/mjsunit/es6/debug-promises/try-throw-reject-in-constructor.js create mode 100644 deps/v8/test/mjsunit/es6/debug-stepin-collections-foreach.js rename deps/v8/test/mjsunit/{harmony => es6}/iteration-semantics.js (82%) rename deps/v8/test/mjsunit/{harmony => es6}/iteration-syntax.js (98%) create mode 100644 deps/v8/test/mjsunit/es6/mirror-collections.js create mode 100644 deps/v8/test/mjsunit/es6/mirror-symbols.js rename deps/v8/test/mjsunit/{harmony => es6}/regress/regress-2186.js (98%) rename deps/v8/test/{cctest/test-cpu-ia32.cc => mjsunit/es6/regress/regress-cr372788.js} (75%) rename deps/v8/test/mjsunit/{harmony => es6}/regress/regress-crbug-248025.js (98%) rename deps/v8/test/mjsunit/{harmony => es6}/regress/regress-crbug-346141.js (89%) create mode 100644 deps/v8/test/mjsunit/es6/string-html.js create mode 100644 deps/v8/test/mjsunit/es6/string-iterator.js rename deps/v8/test/mjsunit/{harmony => es6}/symbols.js (90%) create mode 100644 deps/v8/test/mjsunit/es6/typed-array-iterator.js create mode 100644 deps/v8/test/mjsunit/es6/unscopables.js delete mode 100644 deps/v8/test/mjsunit/es6/weak_collections.js create mode 100644 deps/v8/test/mjsunit/es7/object-observe-debug-event.js create mode 100644 deps/v8/test/mjsunit/es7/object-observe-runtime.js create mode 100644 deps/v8/test/mjsunit/harmony/arrow-functions.js rename deps/v8/test/mjsunit/{regress/regress-2336.js => harmony/empty-for.js} (70%) create mode 100644 deps/v8/test/mjsunit/harmony/generators-debug-liveedit.js create mode 100644 deps/v8/test/mjsunit/harmony/generators-poisoned-properties.js create mode 100644 deps/v8/test/mjsunit/harmony/proxies-with-unscopables.js create mode 100644 deps/v8/test/mjsunit/harmony/regress/regress-3426.js create mode 100644 deps/v8/test/mjsunit/harmony/string-codepointat.js create mode 100644 deps/v8/test/mjsunit/harmony/string-fromcodepoint.js delete mode 100644 deps/v8/test/mjsunit/harmony/typeof.js create mode 100644 deps/v8/test/mjsunit/keyed-load-dictionary-stub.js create mode 100644 deps/v8/test/mjsunit/migrations.js create mode 100644 deps/v8/test/mjsunit/outobject-double-for-in.js create mode 100644 deps/v8/test/mjsunit/own-symbols.js create mode 100644 deps/v8/test/mjsunit/regress-3456.js create mode 100644 deps/v8/test/mjsunit/regress/regress-3307.js create mode 100644 deps/v8/test/mjsunit/regress/regress-3315.js create mode 100644 deps/v8/test/mjsunit/regress/regress-3334.js create mode 100644 deps/v8/test/mjsunit/regress/regress-3359.js create mode 100644 deps/v8/test/mjsunit/regress/regress-3380.js create mode 100644 deps/v8/test/mjsunit/regress/regress-3392.js create mode 100644 deps/v8/test/mjsunit/regress/regress-3404.js create mode 100644 deps/v8/test/mjsunit/regress/regress-3462.js create mode 100644 deps/v8/test/mjsunit/regress/regress-3476.js create mode 100644 deps/v8/test/mjsunit/regress/regress-370827.js create mode 100644 deps/v8/test/mjsunit/regress/regress-373283.js create mode 100644 deps/v8/test/mjsunit/regress/regress-377290.js create mode 100644 deps/v8/test/mjsunit/regress/regress-379770.js create mode 100644 deps/v8/test/mjsunit/regress/regress-380049.js create mode 100644 deps/v8/test/mjsunit/regress/regress-380092.js create mode 100644 deps/v8/test/mjsunit/regress/regress-381313.js rename deps/v8/test/{cctest/test-cpu.cc => mjsunit/regress/regress-392114.js} (63%) create mode 100644 deps/v8/test/mjsunit/regress/regress-crbug-374838.js create mode 100644 deps/v8/test/mjsunit/regress/regress-crbug-380512.js create mode 100644 deps/v8/test/mjsunit/regress/regress-crbug-381534.js create mode 100644 deps/v8/test/mjsunit/regress/regress-crbug-382513.js create mode 100644 deps/v8/test/mjsunit/regress/regress-crbug-385002.js create mode 100644 deps/v8/test/mjsunit/regress/regress-crbug-387599.js create mode 100644 deps/v8/test/mjsunit/regress/regress-crbug-387627.js create mode 100644 deps/v8/test/mjsunit/regress/regress-crbug-387636.js create mode 100644 deps/v8/test/mjsunit/regress/regress-crbug-390918.js create mode 100644 deps/v8/test/mjsunit/regress/regress-crbug-390925.js create mode 100644 deps/v8/test/mjsunit/regress/regress-crbug-393988.js create mode 100644 deps/v8/test/mjsunit/regress/regress-crbug-401915.js create mode 100644 deps/v8/test/mjsunit/regress/regress-debug-context-load.js create mode 100644 deps/v8/test/mjsunit/regress/regress-double-property.js rename deps/v8/test/mjsunit/regress/{regress-global-freeze-const.js => regress-freeze-setter.js} (68%) create mode 100644 deps/v8/test/mjsunit/regress/regress-function-constructor-receiver.js create mode 100644 deps/v8/test/mjsunit/regress/regress-mask-array-length.js rename deps/v8/test/{cctest/test-platform-macos.cc => mjsunit/regress/regress-regexp-nocase.js} (88%) create mode 100644 deps/v8/test/mjsunit/regress/regress-set-flags-stress-compact.js create mode 100644 deps/v8/test/mjsunit/regress/regress-update-field-type-attributes.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/apply.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/arraybuffergetbytelength.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/arraybufferinitialize.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/arraybufferisview.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/arraybufferneuter.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/arraybuffersliceimpl.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/arraybufferviewgetbytelength.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/arraybufferviewgetbyteoffset.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/arrayconcat.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/availablelocalesof.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/basicjsonstringify.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/booleanize.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/boundfunctiongetbindings.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/break.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/breakiteratoradopttext.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/breakiteratorbreaktype.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/breakiteratorcurrent.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/breakiteratorfirst.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/breakiteratornext.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/canonicalizelanguagetag.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/changebreakonexception.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/charfromcode.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/checkexecutionstate.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/checkisbootstrapping.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/clearbreakpoint.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/clearfunctiontypefeedback.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/clearstepping.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/collectstacktrace.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/compilestring.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/constructdouble.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/createbreakiterator.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/createcollator.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/createglobalprivatesymbol.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/createjsfunctionproxy.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/createjsproxy.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/createprivateownsymbol.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/createprivatesymbol.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/createsymbol.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dataviewgetbuffer.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dataviewgetfloat32.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dataviewgetfloat64.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dataviewgetint16.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dataviewgetint32.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dataviewgetint8.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dataviewgetuint16.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dataviewgetuint32.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dataviewgetuint8.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dataviewinitialize.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dataviewsetfloat32.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dataviewsetfloat64.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dataviewsetint16.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dataviewsetint32.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dataviewsetint8.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dataviewsetuint16.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dataviewsetuint32.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dataviewsetuint8.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/datecacheversion.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/datecurrenttime.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/datelocaltimezone.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/datemakeday.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/dateparsestring.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/datesetvalue.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/datetoutc.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugasynctaskevent.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugbreak.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugcallbacksupportsstepping.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugconstructedby.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugdisassembleconstructor.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugdisassemblefunction.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugevaluate.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugevaluateglobal.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debuggetproperty.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debuggetpropertydetails.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debuggetprototype.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugindexedinterceptorelementvalue.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugnamedinterceptorpropertyvalue.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugpoppromise.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugpreparestepinifstepping.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugprintscopes.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugpromiseevent.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugpromiserejectevent.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugpropertyattributesfromdetails.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugpropertyindexfromdetails.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugpropertytypefromdetails.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugpushpromise.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugreferencedby.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/debugtrace.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/defineaccessorpropertyunchecked.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/defineapiaccessorproperty.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/definedatapropertyunchecked.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/deleteproperty.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/deoptimizefunction.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/doublehi.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/doublelo.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/enqueuemicrotask.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/estimatenumberofelements.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/executeindebugcontext.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/finisharrayprototypesetup.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/fix.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/flattenstring.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/functionbindarguments.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/functiongetinferredname.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/functiongetname.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/functiongetscript.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/functiongetscriptsourceposition.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/functiongetsourcecode.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/functionisapifunction.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/functionisarrow.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/functionisbuiltin.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/functionisgenerator.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/functionmarknameshouldprintasanonymous.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/functionnameshouldprintasanonymous.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/functionremoveprototype.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/functionsetinstanceclassname.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/functionsetlength.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/functionsetname.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/functionsetprototype.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getallscopesdetails.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getargumentsproperty.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getarraykeys.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getbreaklocations.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getcalltrap.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getconstructordelegate.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getconstructtrap.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getdataproperty.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getdefaulticulocale.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getdefaultreceiver.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getframecount.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getframedetails.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getfunctioncodepositionfromsource.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getfunctiondelegate.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getfunctionscopecount.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getfunctionscopedetails.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/gethandler.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getheapusage.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getimplfrominitializedintlobject.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getindexedinterceptorelementnames.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getinterceptorinfo.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getlanguagetagvariants.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getnamedinterceptorpropertynames.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getobjectcontextnotifierperformchange.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getobjectcontextobjectgetnotifier.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getobjectcontextobjectobserve.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getobservationstate.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getoptimizationcount.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getownelementnames.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getownproperty.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getownpropertynames.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getproperty.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getpropertynames.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getpropertynamesfast.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getprototype.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getrootnan.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getscopecount.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getscopedetails.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getscript.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getstepinpositions.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/gettemplatefield.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getthreadcount.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getthreaddetails.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getv8version.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getweakmapentries.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/getweaksetvalues.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/globalprint.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/globalproxy.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/haselement.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/hasownproperty.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/hasproperty.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/havesamemap.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/internalcompare.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/internaldateformat.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/internaldateparse.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/internalnumberformat.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/internalnumberparse.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/internalsetprototype.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/isattachedglobal.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/isbreakonexception.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/isconcurrentrecompilationsupported.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/isextensible.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/isinitializedintlobject.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/isinitializedintlobjectoftype.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/isinprototypechain.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/isjsfunctionproxy.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/isjsglobalproxy.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/isjsmodule.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/isjsproxy.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/isobserved.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/isoptimized.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/ispropertyenumerable.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/issloppymodefunction.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/istemplate.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/isvalidsmi.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/keyedgetproperty.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/liveeditcheckanddropactivations.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/liveeditcomparestrings.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/liveeditfunctionsetscript.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/loadmutabledouble.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/lookupaccessor.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/mapclear.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/mapdelete.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/mapget.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/mapgetsize.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/maphas.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/mapinitialize.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/mapiteratorinitialize.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/mapiteratornext.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/mapset.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/markasinitializedintlobjectoftype.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/mathacos.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/mathasin.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/mathatan.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/mathatan2.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/mathexprt.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/mathfloorrt.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/mathfround.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/mathlogrt.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/mathsqrtrt.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/maxsmi.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/movearraycontents.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/neveroptimizefunction.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/newarguments.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/newobjectfrombound.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/newstring.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/newstringwrapper.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/newsymbolwrapper.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/notifycontextdisposed.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numberadd.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numberand.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numbercompare.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numberdiv.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numberequals.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numberimul.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numbermod.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numbermul.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numberor.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numbersar.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numbershl.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numbershr.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numbersub.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numbertoexponential.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numbertofixed.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numbertointeger.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numbertointegermapminuszero.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numbertojsint32.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numbertojsuint32.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numbertoprecision.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numbertoradixstring.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numbertostringrt.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numberunaryminus.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/numberxor.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/objectfreeze.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/objectwascreatedincurrentorigin.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/observationweakmapcreate.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/observerobjectandrecordhavesameorigin.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/optimizeobjectforaddingmultipleproperties.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/ownkeys.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/parsejson.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/preventextensions.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/pushifabsent.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/quotejsonstring.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/regexpcompile.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/regexpconstructresult.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/regexpexecmultiple.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/regexpexecrt.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/regexpinitializeobject.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/removearrayholes.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/rempio2.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/roundnumber.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/runmicrotasks.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/runninginsimulator.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/setadd.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/setclear.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/setcode.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/setdebugeventlistener.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/setdelete.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/setdisablebreak.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/setflags.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/setfunctionbreakpoint.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/setgetsize.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/sethas.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/setinitialize.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/setisobserved.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/setiteratorinitialize.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/setiteratornext.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/setprototype.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/setscopevariablevalue.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/smilexicographiccompare.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/sparsejoinwithseparator.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/specialarrayfunctions.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringbuilderconcat.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringbuilderjoin.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringcharcodeatrt.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringequals.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringindexof.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringlastindexof.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringlocalecompare.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringmatch.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringnormalize.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringparsefloat.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringparseint.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringreplaceglobalregexpwithstring.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringreplaceonecharwithstring.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringsplit.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringtoarray.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringtolowercase.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringtonumber.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringtouppercase.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/stringtrim.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/symboldescription.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/symbolisprivate.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/symbolregistry.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/tobool.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/tofastproperties.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/traceenter.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/traceexit.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/truncatestring.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/trymigrateinstance.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/typedarraygetbuffer.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/typedarraygetlength.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/typedarrayinitialize.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/typedarrayinitializefromarraylike.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/typedarraymaxsizeinheap.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/typedarraysetfastcases.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/typeof.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/unblockconcurrentrecompilation.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/uriescape.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/uriunescape.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/weakcollectiondelete.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/weakcollectionget.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/weakcollectionhas.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/weakcollectioninitialize.js create mode 100644 deps/v8/test/mjsunit/runtime-gen/weakcollectionset.js create mode 100644 deps/v8/testing/gmock.gyp create mode 100644 deps/v8/testing/gtest-type-names.h create mode 100644 deps/v8/testing/gtest.gyp create mode 100644 deps/v8/third_party/fdlibm/LICENSE create mode 100644 deps/v8/third_party/fdlibm/README.v8 create mode 100644 deps/v8/third_party/fdlibm/fdlibm.cc create mode 100644 deps/v8/third_party/fdlibm/fdlibm.h create mode 100644 deps/v8/third_party/fdlibm/fdlibm.js create mode 100644 deps/v8/tools/DEPS rename deps/v8/tools/{generate-trig-table.py => concatenate-files.py} (53%) create mode 100644 deps/v8/tools/external-reference-check.py create mode 100644 deps/v8/tools/gdbinit create mode 100755 deps/v8/tools/generate-runtime-tests.py create mode 100755 deps/v8/tools/push-to-trunk/auto_tag.py create mode 100755 deps/v8/tools/push-to-trunk/bump_up_version.py create mode 100755 deps/v8/tools/run.py create mode 100755 deps/v8/tools/run_benchmarks.py rename deps/v8/tools/testrunner/{network => local}/perfdata.py (100%) create mode 100644 deps/v8/tools/testrunner/local/pool.py create mode 100644 deps/v8/tools/testrunner/local/pool_unittest.py create mode 100644 deps/v8/tools/unittests/run_benchmarks_test.py create mode 100644 deps/v8/tools/whitespace.txt diff --git a/deps/v8/.DEPS.git b/deps/v8/.DEPS.git index e1e6982c05e..7775744953a 100644 --- a/deps/v8/.DEPS.git +++ b/deps/v8/.DEPS.git @@ -13,8 +13,14 @@ vars = { deps = { 'v8/build/gyp': Var('git_url') + '/external/gyp.git@a3e2a5caf24a1e0a45401e09ad131210bf16b852', + 'v8/buildtools': + Var('git_url') + '/chromium/buildtools.git@fb782d4369d5ae04f17a2fceef7de5a63e50f07b', + 'v8/testing/gmock': + Var('git_url') + '/external/googlemock.git@896ba0e03f520fb9b6ed582bde2bd00847e3c3f2', + 'v8/testing/gtest': + Var('git_url') + '/external/googletest.git@4650552ff637bb44ecf7784060091cbed3252211', 'v8/third_party/icu': - Var('git_url') + '/chromium/deps/icu46.git@7a1ec88f69e25b3efcf76196d07f7815255db025', + Var('git_url') + '/chromium/deps/icu52.git@26d8859357ac0bfb86b939bf21c087b8eae22494', } deps_os = { @@ -28,14 +34,68 @@ deps_os = { } include_rules = [ - + '+include', + '+unicode', + '+third_party/fdlibm' ] skip_child_includes = [ - + 'build', + 'third_party' ] hooks = [ + { + 'action': + [ + 'download_from_google_storage', + '--no_resume', + '--platform=win32', + '--no_auth', + '--bucket', + 'chromium-clang-format', + '-s', + 'v8/buildtools/win/clang-format.exe.sha1' +], + 'pattern': + '.', + 'name': + 'clang_format_win' +}, + { + 'action': + [ + 'download_from_google_storage', + '--no_resume', + '--platform=darwin', + '--no_auth', + '--bucket', + 'chromium-clang-format', + '-s', + 'v8/buildtools/mac/clang-format.sha1' +], + 'pattern': + '.', + 'name': + 'clang_format_mac' +}, + { + 'action': + [ + 'download_from_google_storage', + '--no_resume', + '--platform=linux*', + '--no_auth', + '--bucket', + 'chromium-clang-format', + '-s', + 'v8/buildtools/linux64/clang-format.sha1' +], + 'pattern': + '.', + 'name': + 'clang_format_linux' +}, { 'action': [ diff --git a/deps/v8/.gitignore b/deps/v8/.gitignore index ebcb5816b7d..d0d4b436df1 100644 --- a/deps/v8/.gitignore +++ b/deps/v8/.gitignore @@ -21,11 +21,18 @@ #*# *~ .cpplint-cache +.cproject .d8_history +.gclient_entries +.project +.pydevproject +.settings .*.sw? bsuite d8 d8_g +gccauses +gcsuspects shell shell_g /_* @@ -33,6 +40,7 @@ shell_g /build/gyp /build/ipch/ /build/Release +/buildtools /hydrogen.cfg /obj /out @@ -45,13 +53,18 @@ shell_g /test/benchmarks/sunspider /test/mozilla/CHECKED_OUT_VERSION /test/mozilla/data +/test/mozilla/data.old /test/mozilla/downloaded_* /test/promises-aplus/promises-tests /test/promises-aplus/promises-tests.tar.gz /test/promises-aplus/sinon /test/test262/data +/test/test262/data.old /test/test262/tc39-test262-* -/third_party +/testing/gmock +/testing/gtest +/third_party/icu +/third_party/llvm /tools/jsfunfuzz /tools/jsfunfuzz.zip /tools/oom_dump/oom_dump diff --git a/deps/v8/AUTHORS b/deps/v8/AUTHORS index 4ef2bcca339..7ac08156994 100644 --- a/deps/v8/AUTHORS +++ b/deps/v8/AUTHORS @@ -13,6 +13,7 @@ Bloomberg Finance L.P. NVIDIA Corporation BlackBerry Limited Opera Software ASA +Intel Corporation Akinori MUSHA Alexander Botero-Lowry @@ -24,6 +25,7 @@ Baptiste Afsa Bert Belder Burcu Dogan Craig Schlenter +Chunyang Dai Daniel Andersson Daniel James Derek J Conrod @@ -64,6 +66,7 @@ Subrato K De Tobias Burnus Vincent Belliard Vlad Burlik +Weiliang Lin Xi Qian Yuqiang Xian Zaheer Ahmad diff --git a/deps/v8/BUILD.gn b/deps/v8/BUILD.gn index 2a6178eab07..efa4b717c9a 100644 --- a/deps/v8/BUILD.gn +++ b/deps/v8/BUILD.gn @@ -14,17 +14,11 @@ v8_enable_verify_heap = false v8_interpreted_regexp = false v8_object_print = false v8_postmortem_support = false -v8_use_default_platform = true v8_use_snapshot = true - -if (is_debug) { - v8_enable_extra_checks = true -} else { - v8_enable_extra_checks = false -} - -# TODO(jochen): Add support for want_seperate_host_toolset. -# TODO(jochen): Add toolchain.gypi support. +v8_use_external_startup_data = false +v8_enable_extra_checks = is_debug +v8_target_arch = cpu_arch +v8_random_seed = "314159265" ############################################################################### @@ -33,14 +27,32 @@ if (is_debug) { config("internal_config") { visibility = ":*" # Only targets in this file can depend on this. - include_dirs = [ "src" ] + include_dirs = [ "." ] if (component_mode == "shared_library") { defines = [ + "V8_SHARED", "BUILDING_V8_SHARED", + ] + } +} + +config("internal_config_base") { + visibility = ":*" # Only targets in this file can depend on this. + + include_dirs = [ "." ] +} + +# This config should only be applied to code using V8 and not any V8 code +# itself. +config("external_config") { + if (is_component_build) { + defines = [ "V8_SHARED", + "USING_V8_SHARED", ] } + include_dirs = [ "include" ] } config("features") { @@ -83,11 +95,6 @@ config("features") { "V8_I18N_SUPPORT", ] } - if (v8_use_default_platform == true) { - defines += [ - "V8_USE_DEFAULT_PLATFORM", - ] - } if (v8_compress_startup_data == "bz2") { defines += [ "COMPRESS_STARTUP_DATA_BZ2", @@ -103,25 +110,62 @@ config("features") { "ENABLE_HANDLE_ZAPPING", ] } + if (v8_use_external_startup_data == true) { + defines += [ + "V8_USE_EXTERNAL_STARTUP_DATA", + ] + } } -############################################################################### -# Actions -# - -# TODO(jochen): Do actions need visibility settings as well? -action("generate_trig_table") { +config("toolchain") { visibility = ":*" # Only targets in this file can depend on this. - script = "tools/generate-trig-table.py" + defines = [] + cflags = [] - outputs = [ - "$target_gen_dir/trig-table.cc" - ] + # TODO(jochen): Add support for arm, mips, mipsel. - args = rebase_path(outputs, root_build_dir) + if (v8_target_arch == "arm64") { + defines += [ + "V8_TARGET_ARCH_ARM64", + ] + } + if (v8_target_arch == "x86") { + defines += [ + "V8_TARGET_ARCH_IA32", + ] + } + if (v8_target_arch == "x64") { + defines += [ + "V8_TARGET_ARCH_X64", + ] + } + if (is_win) { + defines += [ + "WIN32", + ] + # TODO(jochen): Support v8_enable_prof. + } + + # TODO(jochen): Add support for compiling with simulators. + + if (is_debug) { + # TODO(jochen): Add support for different debug optimization levels. + defines += [ + "ENABLE_DISASSEMBLER", + "V8_ENABLE_CHECKS", + "OBJECT_PRINT", + "VERIFY_HEAP", + "DEBUG", + "OPTIMIZED_DEBUG", + ] + } } +############################################################################### +# Actions +# + action("js2c") { visibility = ":*" # Only targets in this file can depend on this. @@ -134,9 +178,11 @@ action("js2c") { sources = [ "src/runtime.js", "src/v8natives.js", + "src/symbol.js", "src/array.js", "src/string.js", "src/uri.js", + "third_party/fdlibm/fdlibm.js", "src/math.js", "src/messages.js", "src/apinatives.js", @@ -148,8 +194,14 @@ action("js2c") { "src/regexp.js", "src/arraybuffer.js", "src/typedarray.js", + "src/collection.js", + "src/collection-iterator.js", + "src/weak_collection.js", + "src/promise.js", "src/object-observe.js", "src/macros.py", + "src/array-iterator.js", + "src/string-iterator.js", ] outputs = [ @@ -160,10 +212,19 @@ action("js2c") { sources += [ "src/i18n.js" ] } - args = - rebase_path(outputs, root_build_dir) + - [ "EXPERIMENTAL", v8_compress_startup_data ] + - rebase_path(sources, root_build_dir) + args = [ + rebase_path("$target_gen_dir/libraries.cc", root_build_dir), + "CORE", + v8_compress_startup_data + ] + rebase_path(sources, root_build_dir) + + if (v8_use_external_startup_data) { + outputs += [ "$target_gen_dir/libraries.bin" ] + args += [ + "--startup_blob", + rebase_path("$target_gen_dir/libraries.bin", root_build_dir) + ] + } } action("js2c_experimental") { @@ -177,26 +238,53 @@ action("js2c_experimental") { sources = [ "src/macros.py", - "src/symbol.js", "src/proxy.js", - "src/collection.js", - "src/weak_collection.js", - "src/promise.js", "src/generator.js", - "src/array-iterator.js", "src/harmony-string.js", "src/harmony-array.js", - "src/harmony-math.js", ] outputs = [ "$target_gen_dir/experimental-libraries.cc" ] - args = - rebase_path(outputs, root_build_dir) + - [ "CORE", v8_compress_startup_data ] + - rebase_path(sources, root_build_dir) + args = [ + rebase_path("$target_gen_dir/experimental-libraries.cc", root_build_dir), + "EXPERIMENTAL", + v8_compress_startup_data + ] + rebase_path(sources, root_build_dir) + + if (v8_use_external_startup_data) { + outputs += [ "$target_gen_dir/libraries_experimental.bin" ] + args += [ + "--startup_blob", + rebase_path("$target_gen_dir/libraries_experimental.bin", root_build_dir) + ] + } +} + +if (v8_use_external_startup_data) { + action("natives_blob") { + visibility = ":*" # Only targets in this file can depend on this. + + deps = [ + ":js2c", + ":js2c_experimental" + ] + + sources = [ + "$target_gen_dir/libraries.bin", + "$target_gen_dir/libraries_experimental.bin" + ] + + outputs = [ + "$root_gen_dir/natives_blob.bin" + ] + + script = "tools/concatenate-files.py" + + args = rebase_path(sources + outputs, root_build_dir) + } } action("postmortem-metadata") { @@ -218,6 +306,40 @@ action("postmortem-metadata") { rebase_path(sources, root_build_dir) } +action("run_mksnapshot") { + visibility = ":*" # Only targets in this file can depend on this. + + deps = [ ":mksnapshot($host_toolchain)" ] + + script = "tools/run.py" + + outputs = [ + "$target_gen_dir/snapshot.cc" + ] + + args = [ + "./" + rebase_path(get_label_info(":mksnapshot($host_toolchain)", + "root_out_dir") + "/mksnapshot", + root_build_dir), + "--log-snapshot-positions", + "--logfile", rebase_path("$target_gen_dir/snapshot.log", root_build_dir), + rebase_path("$target_gen_dir/snapshot.cc", root_build_dir) + ] + + if (v8_random_seed != "0") { + args += [ "--random-seed", v8_random_seed ] + } + + if (v8_use_external_startup_data) { + outputs += [ "$root_gen_dir/snapshot_blob.bin" ] + args += [ + "--startup_blob", + rebase_path("$root_gen_dir/snapshot_blob.bin", root_build_dir) + ] + } +} + + ############################################################################### # Source Sets (aka static libraries) # @@ -228,18 +350,64 @@ source_set("v8_nosnapshot") { deps = [ ":js2c", ":js2c_experimental", - ":generate_trig_table", ":v8_base", ] sources = [ "$target_gen_dir/libraries.cc", "$target_gen_dir/experimental-libraries.cc", - "$target_gen_dir/trig-table.cc", "src/snapshot-empty.cc", + "src/snapshot-common.cc", + ] + + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":internal_config", ":features", ":toolchain" ] +} + +source_set("v8_snapshot") { + visibility = ":*" # Only targets in this file can depend on this. + + deps = [ + ":js2c", + ":js2c_experimental", + ":run_mksnapshot", + ":v8_base", + ] + + sources = [ + "$target_gen_dir/libraries.cc", + "$target_gen_dir/experimental-libraries.cc", + "$target_gen_dir/snapshot.cc", + "src/snapshot-common.cc", ] - configs += [ ":internal_config", ":features" ] + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":internal_config", ":features", ":toolchain" ] +} + +if (v8_use_external_startup_data) { + source_set("v8_external_snapshot") { + visibility = ":*" # Only targets in this file can depend on this. + + deps = [ + ":js2c", + ":js2c_experimental", + ":run_mksnapshot", + ":v8_base", + ":natives_blob", + ] + + sources = [ + "src/natives-external.cc", + "src/snapshot-external.cc", + ] + + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":internal_config", ":features", ":toolchain" ] + } } source_set("v8_base") { @@ -262,10 +430,10 @@ source_set("v8_base") { "src/assembler.h", "src/assert-scope.h", "src/assert-scope.cc", + "src/ast-value-factory.cc", + "src/ast-value-factory.h", "src/ast.cc", "src/ast.h", - "src/atomicops.h", - "src/atomicops_internals_x86_gcc.cc", "src/bignum-dtoa.cc", "src/bignum-dtoa.h", "src/bignum.cc", @@ -291,6 +459,95 @@ source_set("v8_base") { "src/codegen.h", "src/compilation-cache.cc", "src/compilation-cache.h", + "src/compiler/ast-graph-builder.cc", + "src/compiler/ast-graph-builder.h", + "src/compiler/code-generator-impl.h", + "src/compiler/code-generator.cc", + "src/compiler/code-generator.h", + "src/compiler/common-node-cache.h", + "src/compiler/common-operator.h", + "src/compiler/control-builders.cc", + "src/compiler/control-builders.h", + "src/compiler/frame.h", + "src/compiler/gap-resolver.cc", + "src/compiler/gap-resolver.h", + "src/compiler/generic-algorithm-inl.h", + "src/compiler/generic-algorithm.h", + "src/compiler/generic-graph.h", + "src/compiler/generic-node-inl.h", + "src/compiler/generic-node.h", + "src/compiler/graph-builder.cc", + "src/compiler/graph-builder.h", + "src/compiler/graph-inl.h", + "src/compiler/graph-reducer.cc", + "src/compiler/graph-reducer.h", + "src/compiler/graph-replay.cc", + "src/compiler/graph-replay.h", + "src/compiler/graph-visualizer.cc", + "src/compiler/graph-visualizer.h", + "src/compiler/graph.cc", + "src/compiler/graph.h", + "src/compiler/instruction-codes.h", + "src/compiler/instruction-selector-impl.h", + "src/compiler/instruction-selector.cc", + "src/compiler/instruction-selector.h", + "src/compiler/instruction.cc", + "src/compiler/instruction.h", + "src/compiler/js-context-specialization.cc", + "src/compiler/js-context-specialization.h", + "src/compiler/js-generic-lowering.cc", + "src/compiler/js-generic-lowering.h", + "src/compiler/js-graph.cc", + "src/compiler/js-graph.h", + "src/compiler/js-operator.h", + "src/compiler/js-typed-lowering.cc", + "src/compiler/js-typed-lowering.h", + "src/compiler/linkage-impl.h", + "src/compiler/linkage.cc", + "src/compiler/linkage.h", + "src/compiler/lowering-builder.cc", + "src/compiler/lowering-builder.h", + "src/compiler/machine-node-factory.h", + "src/compiler/machine-operator-reducer.cc", + "src/compiler/machine-operator-reducer.h", + "src/compiler/machine-operator.h", + "src/compiler/node-aux-data-inl.h", + "src/compiler/node-aux-data.h", + "src/compiler/node-cache.cc", + "src/compiler/node-cache.h", + "src/compiler/node-matchers.h", + "src/compiler/node-properties-inl.h", + "src/compiler/node-properties.h", + "src/compiler/node.cc", + "src/compiler/node.h", + "src/compiler/opcodes.h", + "src/compiler/operator-properties-inl.h", + "src/compiler/operator-properties.h", + "src/compiler/operator.h", + "src/compiler/phi-reducer.h", + "src/compiler/pipeline.cc", + "src/compiler/pipeline.h", + "src/compiler/raw-machine-assembler.cc", + "src/compiler/raw-machine-assembler.h", + "src/compiler/register-allocator.cc", + "src/compiler/register-allocator.h", + "src/compiler/representation-change.h", + "src/compiler/schedule.cc", + "src/compiler/schedule.h", + "src/compiler/scheduler.cc", + "src/compiler/scheduler.h", + "src/compiler/simplified-lowering.cc", + "src/compiler/simplified-lowering.h", + "src/compiler/simplified-node-factory.h", + "src/compiler/simplified-operator.h", + "src/compiler/source-position.cc", + "src/compiler/source-position.h", + "src/compiler/structured-machine-assembler.cc", + "src/compiler/structured-machine-assembler.h", + "src/compiler/typer.cc", + "src/compiler/typer.h", + "src/compiler/verifier.cc", + "src/compiler/verifier.h", "src/compiler.cc", "src/compiler.h", "src/contexts.cc", @@ -303,8 +560,6 @@ source_set("v8_base") { "src/cpu-profiler-inl.h", "src/cpu-profiler.cc", "src/cpu-profiler.h", - "src/cpu.cc", - "src/cpu.h", "src/data-flow.cc", "src/data-flow.h", "src/date.cc", @@ -312,8 +567,6 @@ source_set("v8_base") { "src/dateparser-inl.h", "src/dateparser.cc", "src/dateparser.h", - "src/debug-agent.cc", - "src/debug-agent.h", "src/debug.cc", "src/debug.h", "src/deoptimizer.cc", @@ -348,6 +601,9 @@ source_set("v8_base") { "src/fast-dtoa.cc", "src/fast-dtoa.h", "src/feedback-slots.h", + "src/field-index.cc", + "src/field-index.h", + "src/field-index-inl.h", "src/fixed-dtoa.cc", "src/fixed-dtoa.h", "src/flag-definitions.h", @@ -369,14 +625,32 @@ source_set("v8_base") { "src/handles.cc", "src/handles.h", "src/hashmap.h", - "src/heap-inl.h", "src/heap-profiler.cc", "src/heap-profiler.h", "src/heap-snapshot-generator-inl.h", "src/heap-snapshot-generator.cc", "src/heap-snapshot-generator.h", - "src/heap.cc", - "src/heap.h", + "src/heap/gc-tracer.cc", + "src/heap/gc-tracer.h", + "src/heap/heap-inl.h", + "src/heap/heap.cc", + "src/heap/heap.h", + "src/heap/incremental-marking.cc", + "src/heap/incremental-marking.h", + "src/heap/mark-compact-inl.h", + "src/heap/mark-compact.cc", + "src/heap/mark-compact.h", + "src/heap/objects-visiting-inl.h", + "src/heap/objects-visiting.cc", + "src/heap/objects-visiting.h", + "src/heap/spaces-inl.h", + "src/heap/spaces.cc", + "src/heap/spaces.h", + "src/heap/store-buffer-inl.h", + "src/heap/store-buffer.cc", + "src/heap/store-buffer.h", + "src/heap/sweeper-thread.h", + "src/heap/sweeper-thread.cc", "src/hydrogen-alias-analysis.h", "src/hydrogen-bce.cc", "src/hydrogen-bce.h", @@ -425,6 +699,8 @@ source_set("v8_base") { "src/hydrogen-sce.h", "src/hydrogen-store-elimination.cc", "src/hydrogen-store-elimination.h", + "src/hydrogen-types.cc", + "src/hydrogen-types.h", "src/hydrogen-uint32-analysis.cc", "src/hydrogen-uint32-analysis.h", "src/i18n.cc", @@ -434,8 +710,6 @@ source_set("v8_base") { "src/ic-inl.h", "src/ic.cc", "src/ic.h", - "src/incremental-marking.cc", - "src/incremental-marking.h", "src/interface.cc", "src/interface.h", "src/interpreter-irregexp.cc", @@ -447,14 +721,6 @@ source_set("v8_base") { "src/jsregexp-inl.h", "src/jsregexp.cc", "src/jsregexp.h", - "src/lazy-instance.h", - # TODO(jochen): move libplatform/ files to their own target. - "src/libplatform/default-platform.cc", - "src/libplatform/default-platform.h", - "src/libplatform/task-queue.cc", - "src/libplatform/task-queue.h", - "src/libplatform/worker-thread.cc", - "src/libplatform/worker-thread.h", "src/list-inl.h", "src/list.h", "src/lithium-allocator-inl.h", @@ -471,9 +737,10 @@ source_set("v8_base") { "src/log-utils.h", "src/log.cc", "src/log.h", + "src/lookup-inl.h", + "src/lookup.cc", + "src/lookup.h", "src/macro-assembler.h", - "src/mark-compact.cc", - "src/mark-compact.h", "src/messages.cc", "src/messages.h", "src/msan.h", @@ -481,28 +748,16 @@ source_set("v8_base") { "src/objects-debug.cc", "src/objects-inl.h", "src/objects-printer.cc", - "src/objects-visiting.cc", - "src/objects-visiting.h", "src/objects.cc", "src/objects.h", - "src/once.cc", - "src/once.h", - "src/optimizing-compiler-thread.h", "src/optimizing-compiler-thread.cc", + "src/optimizing-compiler-thread.h", + "src/ostreams.cc", + "src/ostreams.h", "src/parser.cc", "src/parser.h", - "src/platform/elapsed-timer.h", - "src/platform/time.cc", - "src/platform/time.h", - "src/platform.h", - "src/platform/condition-variable.cc", - "src/platform/condition-variable.h", - "src/platform/mutex.cc", - "src/platform/mutex.h", - "src/platform/semaphore.cc", - "src/platform/semaphore.h", - "src/platform/socket.cc", - "src/platform/socket.h", + "src/perf-jit.cc", + "src/perf-jit.h", "src/preparse-data-format.h", "src/preparse-data.cc", "src/preparse-data.h", @@ -516,6 +771,7 @@ source_set("v8_base") { "src/property-details.h", "src/property.cc", "src/property.h", + "src/prototype.h", "src/regexp-macro-assembler-irregexp-inl.h", "src/regexp-macro-assembler-irregexp.cc", "src/regexp-macro-assembler-irregexp.h", @@ -547,14 +803,9 @@ source_set("v8_base") { "src/serialize.h", "src/small-pointer-list.h", "src/smart-pointers.h", - "src/snapshot-common.cc", + "src/snapshot-source-sink.cc", + "src/snapshot-source-sink.h", "src/snapshot.h", - "src/spaces-inl.h", - "src/spaces.cc", - "src/spaces.h", - "src/store-buffer-inl.h", - "src/store-buffer.cc", - "src/store-buffer.h", "src/string-search.cc", "src/string-search.h", "src/string-stream.cc", @@ -563,8 +814,6 @@ source_set("v8_base") { "src/strtod.h", "src/stub-cache.cc", "src/stub-cache.h", - "src/sweeper-thread.h", - "src/sweeper-thread.cc", "src/token.cc", "src/token.h", "src/transitions-inl.h", @@ -587,12 +836,8 @@ source_set("v8_base") { "src/utils-inl.h", "src/utils.cc", "src/utils.h", - "src/utils/random-number-generator.cc", - "src/utils/random-number-generator.h", "src/v8.cc", "src/v8.h", - "src/v8checks.h", - "src/v8globals.h", "src/v8memory.h", "src/v8threads.cc", "src/v8threads.h", @@ -605,9 +850,11 @@ source_set("v8_base") { "src/zone-inl.h", "src/zone.cc", "src/zone.h", + "third_party/fdlibm/fdlibm.cc", + "third_party/fdlibm/fdlibm.h", ] - if (cpu_arch == "x86") { + if (v8_target_arch == "x86") { sources += [ "src/ia32/assembler-ia32-inl.h", "src/ia32/assembler-ia32.cc", @@ -636,8 +883,12 @@ source_set("v8_base") { "src/ia32/regexp-macro-assembler-ia32.cc", "src/ia32/regexp-macro-assembler-ia32.h", "src/ia32/stub-cache-ia32.cc", + "src/compiler/ia32/code-generator-ia32.cc", + "src/compiler/ia32/instruction-codes-ia32.h", + "src/compiler/ia32/instruction-selector-ia32.cc", + "src/compiler/ia32/linkage-ia32.cc", ] - } else if (cpu_arch == "x64") { + } else if (v8_target_arch == "x64") { sources += [ "src/x64/assembler-x64-inl.h", "src/x64/assembler-x64.cc", @@ -666,8 +917,12 @@ source_set("v8_base") { "src/x64/regexp-macro-assembler-x64.cc", "src/x64/regexp-macro-assembler-x64.h", "src/x64/stub-cache-x64.cc", + "src/compiler/x64/code-generator-x64.cc", + "src/compiler/x64/instruction-codes-x64.h", + "src/compiler/x64/instruction-selector-x64.cc", + "src/compiler/x64/linkage-x64.cc", ] - } else if (cpu_arch == "arm") { + } else if (v8_target_arch == "arm") { sources += [ "src/arm/assembler-arm-inl.h", "src/arm/assembler-arm.cc", @@ -699,8 +954,12 @@ source_set("v8_base") { "src/arm/regexp-macro-assembler-arm.h", "src/arm/simulator-arm.cc", "src/arm/stub-cache-arm.cc", + "src/compiler/arm/code-generator-arm.cc", + "src/compiler/arm/instruction-codes-arm.h", + "src/compiler/arm/instruction-selector-arm.cc", + "src/compiler/arm/linkage-arm.cc", ] - } else if (cpu_arch == "arm64") { + } else if (v8_target_arch == "arm64") { sources += [ "src/arm64/assembler-arm64.cc", "src/arm64/assembler-arm64.h", @@ -712,7 +971,6 @@ source_set("v8_base") { "src/arm64/code-stubs-arm64.h", "src/arm64/constants-arm64.h", "src/arm64/cpu-arm64.cc", - "src/arm64/cpu-arm64.h", "src/arm64/debug-arm64.cc", "src/arm64/decoder-arm64.cc", "src/arm64/decoder-arm64.h", @@ -744,8 +1002,12 @@ source_set("v8_base") { "src/arm64/stub-cache-arm64.cc", "src/arm64/utils-arm64.cc", "src/arm64/utils-arm64.h", + "src/compiler/arm64/code-generator-arm64.cc", + "src/compiler/arm64/instruction-codes-arm64.h", + "src/compiler/arm64/instruction-selector-arm64.cc", + "src/compiler/arm64/linkage-arm64.cc", ] - } else if (cpu_arch == "mipsel") { + } else if (v8_target_arch == "mipsel") { sources += [ "src/mips/assembler-mips.cc", "src/mips/assembler-mips.h", @@ -780,41 +1042,122 @@ source_set("v8_base") { ] } - configs += [ ":internal_config", ":features" ] + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":internal_config", ":features", ":toolchain" ] + + defines = [] + deps = [ ":v8_libbase" ] + + if (is_linux) { + if (v8_compress_startup_data == "bz2") { + libs += [ "bz2" ] + } + } + + if (v8_enable_i18n_support) { + deps += [ "//third_party/icu" ] + if (is_win) { + deps += [ "//third_party/icu:icudata" ] + } + # TODO(jochen): Add support for icu_use_data_file_flag + defines += [ "ICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE" ] + } else { + sources -= [ + "src/i18n.cc", + "src/i18n.h", + ] + } + + if (v8_postmortem_support) { + sources += [ "$target_gen_dir/debug-support.cc" ] + deps += [ ":postmortem-metadata" ] + } +} + +source_set("v8_libbase") { + visibility = ":*" # Only targets in this file can depend on this. + + sources = [ + "src/base/atomicops.h", + "src/base/atomicops_internals_arm64_gcc.h", + "src/base/atomicops_internals_arm_gcc.h", + "src/base/atomicops_internals_atomicword_compat.h", + "src/base/atomicops_internals_mac.h", + "src/base/atomicops_internals_mips_gcc.h", + "src/base/atomicops_internals_tsan.h", + "src/base/atomicops_internals_x86_gcc.cc", + "src/base/atomicops_internals_x86_gcc.h", + "src/base/atomicops_internals_x86_msvc.h", + "src/base/build_config.h", + "src/base/cpu.cc", + "src/base/cpu.h", + "src/base/lazy-instance.h", + "src/base/logging.cc", + "src/base/logging.h", + "src/base/macros.h", + "src/base/once.cc", + "src/base/once.h", + "src/base/platform/elapsed-timer.h", + "src/base/platform/time.cc", + "src/base/platform/time.h", + "src/base/platform/condition-variable.cc", + "src/base/platform/condition-variable.h", + "src/base/platform/mutex.cc", + "src/base/platform/mutex.h", + "src/base/platform/platform.h", + "src/base/platform/semaphore.cc", + "src/base/platform/semaphore.h", + "src/base/safe_conversions.h", + "src/base/safe_conversions_impl.h", + "src/base/safe_math.h", + "src/base/safe_math_impl.h", + "src/base/utils/random-number-generator.cc", + "src/base/utils/random-number-generator.h", + ] + + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":internal_config_base", ":features", ":toolchain" ] defines = [] - deps = [] if (is_posix) { sources += [ - "src/platform-posix.cc" + "src/base/platform/platform-posix.cc" ] } if (is_linux) { sources += [ - "src/platform-linux.cc" + "src/base/platform/platform-linux.cc" ] - # TODO(brettw) - # 'conditions': [ - # ['v8_compress_startup_data=="bz2"', { - # 'libraries': [ - # '-lbz2', - # ] - # }], - # ], - libs = [ "rt" ] } else if (is_android) { - # TODO(brettw) OS=="android" condition from tools/gyp/v8.gyp + defines += [ "CAN_USE_VFP_INSTRUCTIONS" ] + + if (build_os == "mac") { + if (current_toolchain == host_toolchain) { + sources += [ "src/base/platform/platform-macos.cc" ] + } else { + sources += [ "src/base/platform/platform-linux.cc" ] + } + } else { + sources += [ "src/base/platform/platform-linux.cc" ] + if (current_toolchain == host_toolchain) { + defines += [ "V8_LIBRT_NOT_AVAILABLE" ] + } + } } else if (is_mac) { - sources += [ "src/platform-macos,cc" ] + sources += [ "src/base/platform/platform-macos.cc" ] } else if (is_win) { + # TODO(jochen): Add support for cygwin. sources += [ - "src/platform-win32.cc", - "src/win32-math.cc", - "src/win32-math.h", + "src/base/platform/platform-win32.cc", + "src/base/win32-headers.h", + "src/base/win32-math.cc", + "src/base/win32-math.h", ] defines += [ "_CRT_RAND_S" ] # for rand_s() @@ -822,52 +1165,117 @@ source_set("v8_base") { libs = [ "winmm.lib", "ws2_32.lib" ] } + # TODO(jochen): Add support for qnx, freebsd, openbsd, netbsd, and solaris. +} + +source_set("v8_libplatform") { + sources = [ + "include/libplatform/libplatform.h", + "src/libplatform/default-platform.cc", + "src/libplatform/default-platform.h", + "src/libplatform/task-queue.cc", + "src/libplatform/task-queue.h", + "src/libplatform/worker-thread.cc", + "src/libplatform/worker-thread.h", + ] - if (v8_enable_i18n_support) { - deps += [ "//third_party/icu" ] - if (is_win) { - deps += [ "//third_party/icu:icudata" ] - } - } else { - sources -= [ - "src/i18n.cc", - "src/i18n.h", - ] - } + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":internal_config_base", ":features", ":toolchain" ] - # TODO(brettw) other conditions from v8.gyp - # TODO(brettw) icu_use_data_file_flag + deps = [ + ":v8_libbase", + ] } ############################################################################### # Executables # -# TODO(jochen): Remove this as soon as toolchain.gypi is integrated. -if (build_cpu_arch != cpu_arch) { +if (current_toolchain == host_toolchain) { + executable("mksnapshot") { + visibility = ":*" # Only targets in this file can depend on this. -executable("mksnapshot") { - sources = [ - ] + sources = [ + "src/mksnapshot.cc", + ] + + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":internal_config", ":features", ":toolchain" ] + + deps = [ + ":v8_base", + ":v8_libplatform", + ":v8_nosnapshot", + ] + + if (v8_compress_startup_data == "bz2") { + libs = [ "bz2" ] + } + } } -} else { +############################################################################### +# Public targets +# + +if (component_mode == "shared_library") { -executable("mksnapshot") { +component("v8") { sources = [ - "src/mksnapshot.cc", + "src/v8dll-main.cc", ] - configs += [ ":internal_config", ":features" ] + if (v8_use_external_startup_data) { + deps = [ + ":v8_base", + ":v8_external_snapshot", + ] + } else if (v8_use_snapshot) { + deps = [ + ":v8_base", + ":v8_snapshot", + ] + } else { + deps = [ + ":v8_base", + ":v8_nosnapshot", + ] + } - deps = [ - ":v8_base", - ":v8_nosnapshot", - ] + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":internal_config", ":features", ":toolchain" ] - if (v8_compress_startup_data == "bz2") { - libs = [ "bz2" ] + direct_dependent_configs = [ ":external_config" ] + + if (is_android && current_toolchain != host_toolchain) { + libs += [ "log" ] } } +} else { + +group("v8") { + if (v8_use_external_startup_data) { + deps = [ + ":v8_base", + ":v8_external_snapshot", + ] + } else if (v8_use_snapshot) { + deps = [ + ":v8_base", + ":v8_snapshot", + ] + } else { + deps = [ + ":v8_base", + ":v8_nosnapshot", + ] + } + + direct_dependent_configs = [ ":external_config" ] +} + } diff --git a/deps/v8/ChangeLog b/deps/v8/ChangeLog index 8f1d2563859..0b2872a7c21 100644 --- a/deps/v8/ChangeLog +++ b/deps/v8/ChangeLog @@ -1,3 +1,726 @@ +2014-08-13: Version 3.28.73 + + Performance and stability improvements on all platforms. + + +2014-08-12: Version 3.28.71 + + ToNumber(Symbol) should throw TypeError (issue 3499). + + Performance and stability improvements on all platforms. + + +2014-08-11: Version 3.28.69 + + Performance and stability improvements on all platforms. + + +2014-08-09: Version 3.28.65 + + Performance and stability improvements on all platforms. + + +2014-08-08: Version 3.28.64 + + ES6: Implement WeakMap and WeakSet constructor logic (issue 3399). + + Enable ES6 unscopables (issue 3401). + + Turn on harmony_unscopables for es_staging (issue 3401). + + Remove proxies from --harmony switch for M38, because problems. + + Reland "Add initial support for compiler unit tests using GTest/GMock." + (issue 3489). + + Enable ES6 iteration by default (issue 2214). + + Performance and stability improvements on all platforms. + + +2014-08-07: Version 3.28.62 + + Only escape U+0022 in argument values of `String.prototype` HTML methods + (issue 2217). + + Update webkit test for expected own properties. + + This implements unscopables (issue 3401). + + Add `CheckObjectCoercible` for the `String.prototype` HTML methods + (issue 2218). + + Add initial support for compiler unit tests using GTest/GMock (issue + 3489). + + Trigger exception debug events on Promise reject (Chromium issue + 393913). + + Refactor unit tests for the base library to use GTest (issue 3489). + + Performance and stability improvements on all platforms. + + +2014-08-06: Version 3.28.60 + + Enable ES6 Map and Set by default (issue 1622). + + Performance and stability improvements on all platforms. + + +2014-08-06: Version 3.28.59 + + Removed GetConstructor from the API. Instead either get the + "constructor" property stored in the prototype, or keep a side-table. + + Enable ES6 Symbols by default (issue 2158). + + Performance and stability improvements on all platforms. + + +2014-08-05: Version 3.28.57 + + Add dependencies on gtest and gmock. + + Performance and stability improvements on all platforms. + + +2014-08-04: Version 3.28.54 + + Performance and stability improvements on all platforms. + + +2014-08-01: Version 3.28.53 + + Performance and stability improvements on all platforms. + + +2014-07-31: Version 3.28.52 + + Performance and stability improvements on all platforms. + + +2014-07-31: Version 3.28.51 + + Drop deprecated memory related notification API (Chromium issue 397026). + + Performance and stability improvements on all platforms. + + +2014-07-31: Version 3.28.50 + + Use emergency memory in the case of out of memory during evacuation + (Chromium issue 395314). + + Performance and stability improvements on all platforms. + + +2014-07-30: Version 3.28.48 + + Fix Object.freeze with field type tracking. Keep the descriptor properly + intact while update the field type (issue 3458). + + Performance and stability improvements on all platforms. + + +2014-07-29: Version 3.28.45 + + Performance and stability improvements on all platforms. + + +2014-07-28: Version 3.28.43 + + Performance and stability improvements on all platforms. + + +2014-07-25: Version 3.28.38 + + Fix issue with setters and their holders in accessors.cc (Chromium issue + 3462). + + Introduce more debug events for promises (issue 3093). + + Move gc notifications from V8 to Isolate and make idle hint mandatory + (Chromium issue 397026). + + The accessors should get the value from the holder and not from this + (issue 3461). + + Performance and stability improvements on all platforms. + + +2014-07-24: Version 3.28.35 + + Rebaseline/update the intl tests with ICU 52 (issue 3454). + + Expose the content of Sets and WeakSets through SetMirror (issue 3093). + + Performance and stability improvements on all platforms. + + +2014-07-23: Version 3.28.32 + + Update ICU to 5.2 (matching chromium) (issue 3452). + + Performance and stability improvements on all platforms. + + +2014-07-22: Version 3.28.31 + + Remove harmony-typeof. + + Implement String.prototype.codePointAt and String.fromCodePoint (issue + 2840). + + Performance and stability improvements on all platforms. + + +2014-07-21: Version 3.28.30 + + Performance and stability improvements on all platforms. + + +2014-07-21: Version 3.28.29 + + Performance and stability improvements on all platforms. + + +2014-07-18: Version 3.28.28 + + Performance and stability improvements on all platforms. + + +2014-07-17: Version 3.28.26 + + Ship ES6 Math functions (issue 2938). + + Make ToPrimitive throw on symbol wrappers (issue 3442). + + Performance and stability improvements on all platforms. + + +2014-07-16: Version 3.28.25 + + Performance and stability improvements on all platforms. + + +2014-07-16: Version 3.28.24 + + Removed some copy-n-paste from StackFrame::Foo API entries (issue 3436). + + Performance and stability improvements on all platforms. + + +2014-07-15: Version 3.28.23 + + Fix error message about read-only symbol properties (issue 3441). + + Include symbol properties in Object.{create,defineProperties} (issue + 3440). + + Performance and stability improvements on all platforms. + + +2014-07-14: Version 3.28.22 + + Performance and stability improvements on all platforms. + + +2014-07-11: Version 3.28.21 + + Make `let` usable as an identifier in ES6 sloppy mode (issue 2198). + + Support ES6 Map and Set in heap profiler (issue 3368). + + Performance and stability improvements on all platforms. + + +2014-07-10: Version 3.28.20 + + Remove deprecate counter/histogram methods. + + Fixed printing of external references (Chromium issue 392068). + + Fix several issues with ES6 redeclaration checks (issue 3426). + + Performance and stability improvements on all platforms. + + +2014-07-09: Version 3.28.19 + + Performance and stability improvements on all platforms. + + +2014-07-09: Version 3.28.18 + + Reland "Postpone termination exceptions in debug scope." (issue 3408). + + Performance and stability improvements on all platforms. + + +2014-07-08: Version 3.28.17 + + MIPS: Fix computed properties on object literals with a double as + propertyname (Chromium issue 390732). + + Performance and stability improvements on all platforms. + + +2014-07-08: Version 3.28.16 + + Fix computed properties on object literals with a double as propertyname + (Chromium issue 390732). + + Avoid brittle use of .bind in Promise.all (issue 3420). + + Performance and stability improvements on all platforms. + + +2014-07-07: Version 3.28.15 + + Remove a bunch of Isolate::UncheckedCurrent calls. + + Performance and stability improvements on all platforms. + + +2014-07-07: Version 3.28.14 + + Use the HeapObjectIterator to scan-on-scavenge map pages (Chromium issue + 390732). + + Introduce debug events for Microtask queue (Chromium issue 272416). + + Split out libplatform into a separate libary. + + Add clang-format to presubmit checks. + + Stack traces exposed to Javascript should omit extensions (issue 311). + + Remove deprecated v8::Context::HasOutOfMemoryException. + + Postpone termination exceptions in debug scope (issue 3408). + + Performance and stability improvements on all platforms. + + +2014-07-04: Version 3.28.13 + + Rollback to r22134. + + +2014-07-04: Version 3.28.12 + + Use the HeapObjectIterator to scan-on-scavenge map pages (Chromium issue + 390732). + + Introduce debug events for Microtask queue (Chromium issue 272416). + + Performance and stability improvements on all platforms. + + +2014-07-03: Version 3.28.11 + + Split out libplatform into a separate libary. + + Performance and stability improvements on all platforms. + + +2014-07-03: Version 3.28.10 + + Add clang-format to presubmit checks. + + Stack traces exposed to Javascript should omit extensions (issue 311). + + Remove deprecated v8::Context::HasOutOfMemoryException. + + Postpone termination exceptions in debug scope (issue 3408). + + Performance and stability improvements on all platforms. + + +2014-07-02: Version 3.28.9 + + Make freeze & friends ignore private properties (issue 3419). + + Introduce a builddeps make target (issue 3418). + + Performance and stability improvements on all platforms. + + +2014-07-01: Version 3.28.8 + + Remove static initializer from isolate. + + ES6: Add missing Set.prototype.keys function (issue 3411). + + Introduce debug events for promises (issue 3093). + + Performance and stability improvements on all platforms. + + +2014-06-30: Version 3.28.7 + + Performance and stability improvements on all platforms. + + +2014-06-30: Version 3.28.6 + + Unbreak "os" stuff in shared d8 builds (issue 3407). + + Performance and stability improvements on all platforms. + + +2014-06-26: Version 3.28.4 + + Compile optimized code with active debugger but no break points + (Chromium issue 386492). + + Optimize Map/Set.prototype.forEach. + + Collect garbage with kReduceMemoryFootprintMask in IdleNotification + (Chromium issue 350720). + + Performance and stability improvements on all platforms. + + +2014-06-26: Version 3.28.3 + + Grow heap slower if GC freed many global handles (Chromium issue + 263503). + + Performance and stability improvements on all platforms. + + +2014-06-25: Version 3.28.2 + + Remove bogus assertions in HCompareObjectEqAndBranch (Chromium issue + 387636). + + Do not eagerly update allow_osr_at_loop_nesting_level (Chromium issue + 387599). + + Set host_arch to ia32 on machines with a 32bit userland but a 64bit + kernel (Chromium issue 368384). + + Map/Set: Implement constructor parameter handling (issue 3398). + + Performance and stability improvements on all platforms. + + +2014-06-24: Version 3.28.1 + + Support LiveEdit on Arm64 (Chromium issue 368580). + + Run JS micro tasks in the appropriate context (Chromium issue 385349). + + Add a use counter API. + + Set host_arch to ia32 on machines with a 32bit userland but a 64bit + kernel. + + Performance and stability improvements on all platforms. + + +2014-06-23: Version 3.28.0 + + MIPS: Support LiveEdit (Chromium issue 368580). + + Array.concat: properly go to dictionary mode when required (Chromium + issue 387031). + + Support LiveEdit on ARM (Chromium issue 368580). + + Performance and stability improvements on all platforms. + + +2014-06-18: Version 3.27.34 + + Reduce number of writes to DependentCode array when inserting dependent + IC (Chromium issue 305878). + + Performance and stability improvements on all platforms. + + +2014-06-17: Version 3.27.33 + + Do GC if CodeRange fails to allocate a block (Chromium issue 305878). + + Throw syntax error when a getter/setter has the wrong number of params + (issue 3371). + + Performance and stability improvements on all platforms. + + +2014-06-17: Version 3.27.32 + + Performance and stability improvements on all platforms. + + +2014-06-16: Version 3.27.31 + + Version fix. + + +2014-06-16: Version 3.27.30 + + Fix representation of Phis for mutable-heapnumber-in-object-literal + properties (issue 3392). + + Performance and stability improvements on all platforms. + + +2014-06-16: Version 3.27.29 + + Emulate MLS on pre-ARMv6T2. Cleaned up thumbee vs. thumb2 confusion. + + X87: Fixed flooring division by a power of 2, once again.. (issue 3259). + + Fixed undefined behavior in RNG (Chromium issue 377790). + + Performance and stability improvements on all platforms. + + +2014-06-13: Version 3.27.28 + + Add v8::Promise::Then (Chromium issue 371288). + + Performance and stability improvements on all platforms. + + +2014-06-12: Version 3.27.27 + + Fix detection of VFP3D16 on Galaxy Tab 10.1 (issue 3387). + + Performance and stability improvements on all platforms. + + +2014-06-12: Version 3.27.26 + + MIPS: Fixed flooring division by a power of 2, once again.. (issue + 3259). + + Fixed flooring division by a power of 2, once again.. (issue 3259). + + Fix unsigned comparisons (issue 3380). + + Performance and stability improvements on all platforms. + + +2014-06-11: Version 3.27.25 + + Performance and stability improvements on all platforms. + + +2014-06-11: Version 3.27.24 + + Fix invalid attributes when generalizing because of incompatible map + change (Chromium issue 382143). + + Fix missing smi check in inlined indexOf/lastIndexOf (Chromium issue + 382513). + + Performance and stability improvements on all platforms. + + +2014-06-06: Version 3.27.23 + + Performance and stability improvements on all platforms. + + +2014-06-06: Version 3.27.22 + + Performance and stability improvements on all platforms. + + +2014-06-06: Version 3.27.21 + + Turn on harmony_collections for es_staging (issue 1622). + + Do not make heap iterable eagerly (Chromium issue 379740). + + Performance and stability improvements on all platforms. + + +2014-06-05: Version 3.27.20 + + Fix invalid loop condition for Array.lastIndexOf() (Chromium issue + 380512). + + Add API support for passing a C++ function as a microtask callback. + + Performance and stability improvements on all platforms. + + +2014-06-04: Version 3.27.19 + + Split Put into Put and Remove. + + ES6: Add support for values/keys/entries for Map and Set (issue 1793). + + Performance and stability improvements on all platforms. + + +2014-06-03: Version 3.27.18 + + Remove PROHIBITS_OVERWRITING as it is subsumed by non-configurable + properties. + + Performance and stability improvements on all platforms. + + +2014-06-02: Version 3.27.17 + + BuildNumberToString: Check for undefined keys in the cache (Chromium + issue 368114). + + HRor and HSar can deoptimize (issue 3359). + + Simplify, speed-up correct-context ObjectObserve calls. + + Performance and stability improvements on all platforms. + + +2014-05-29: Version 3.27.16 + + Allow microtasks to throw exceptions and handle them gracefully + (Chromium issue 371566). + + Performance and stability improvements on all platforms. + + +2014-05-28: Version 3.27.15 + + Performance and stability improvements on all platforms. + + +2014-05-27: Version 3.27.14 + + Reland "Customized support for feedback on calls to Array." and follow- + up fixes (Chromium issues 377198, 377290). + + Performance and stability improvements on all platforms. + + +2014-05-26: Version 3.27.13 + + Performance and stability improvements on all platforms. + + +2014-05-26: Version 3.27.12 + + Check for cached transition to ExternalArray elements kind (issue 3337). + + Support ES6 weak collections in heap profiler (Chromium issue 376196). + + Performance and stability improvements on all platforms. + + +2014-05-23: Version 3.27.11 + + Add support for ES6 Symbol in heap profiler (Chromium issue 376194). + + Performance and stability improvements on all platforms. + + +2014-05-22: Version 3.27.10 + + Implement Mirror object for Symbols (issue 3290). + + Allow debugger to step into Map and Set forEach callbacks (issue 3341). + + Fix ArrayShift hydrogen support (Chromium issue 374838). + + Use SameValueZero for Map and Set (issue 1622). + + Array Iterator next should check for own property. + + Performance and stability improvements on all platforms. + + +2014-05-21: Version 3.27.9 + + Disable ArrayShift hydrogen support (Chromium issue 374838). + + ES6 Map/Set iterators/forEach improvements (issue 1793). + + Performance and stability improvements on all platforms. + + +2014-05-20: Version 3.27.8 + + Move microtask queueing logic from JavaScript to C++. + + Partial revert of "Next bunch of fixes for check elimination" (Chromium + issue 372173). + + Performance and stability improvements on all platforms. + + +2014-05-19: Version 3.27.7 + + Performance and stability improvements on all platforms. + + +2014-05-19: Version 3.27.6 + + Performance and stability improvements on all platforms. + + +2014-05-16: Version 3.27.5 + + Performance and stability improvements on all platforms. + + +2014-05-15: Version 3.27.4 + + Drop thenable coercion cache (Chromium issue 372788). + + Skip write barriers when updating the weak hash table (Chromium issue + 359401). + + Performance and stability improvements on all platforms. + + +2014-05-14: Version 3.27.3 + + Performance and stability improvements on all platforms. + + +2014-05-13: Version 3.27.2 + + Harden %SetIsObserved with RUNTIME_ASSERTs (Chromium issue 371782). + + Drop unused static microtask API. + + Introduce an api to query the microtask autorun state of an isolate. + + Performance and stability improvements on all platforms. + + +2014-05-12: Version 3.27.1 + + Object.observe: avoid accessing acceptList properties more than once + (issue 3315). + + Array Iterator prototype should not have a constructor (issue 3293). + + Fix typos in unit test for Array.prototype.fill(). + + Shorten autogenerated error message for functions only (issue 3019, + Chromium issue 331971). + + Reland "Removed default Isolate." (Chromium issue 359977). + + Performance and stability improvements on all platforms. + + +2014-05-09: Version 3.27.0 + + Unbreak samples and tools. + + Performance and stability improvements on all platforms. + + 2014-05-08: Version 3.26.33 Removed default Isolate (Chromium issue 359977). diff --git a/deps/v8/DEPS b/deps/v8/DEPS index 24b7841584f..9459204f2cb 100644 --- a/deps/v8/DEPS +++ b/deps/v8/DEPS @@ -2,26 +2,89 @@ # directory and assume that the root of the checkout is in ./v8/, so # all paths in here must match this assumption. +vars = { + "chromium_trunk": "https://src.chromium.org/svn/trunk", + + "buildtools_revision": "fb782d4369d5ae04f17a2fceef7de5a63e50f07b", +} + deps = { # Remember to keep the revision in sync with the Makefile. "v8/build/gyp": "http://gyp.googlecode.com/svn/trunk@1831", "v8/third_party/icu": - "https://src.chromium.org/svn/trunk/deps/third_party/icu46@258359", + Var("chromium_trunk") + "/deps/third_party/icu52@277999", + + "v8/buildtools": + "https://chromium.googlesource.com/chromium/buildtools.git@" + + Var("buildtools_revision"), + + "v8/testing/gtest": + "http://googletest.googlecode.com/svn/trunk@692", + + "v8/testing/gmock": + "http://googlemock.googlecode.com/svn/trunk@485", } deps_os = { "win": { "v8/third_party/cygwin": - "http://src.chromium.org/svn/trunk/deps/third_party/cygwin@66844", + Var("chromium_trunk") + "/deps/third_party/cygwin@66844", "v8/third_party/python_26": - "http://src.chromium.org/svn/trunk/tools/third_party/python_26@89111", + Var("chromium_trunk") + "/tools/third_party/python_26@89111", } } +include_rules = [ + # Everybody can use some things. + "+include", + "+unicode", + "+third_party/fdlibm", +] + +# checkdeps.py shouldn't check for includes in these directories: +skip_child_includes = [ + "build", + "third_party", +] + hooks = [ + # Pull clang-format binaries using checked-in hashes. + { + "name": "clang_format_win", + "pattern": ".", + "action": [ "download_from_google_storage", + "--no_resume", + "--platform=win32", + "--no_auth", + "--bucket", "chromium-clang-format", + "-s", "v8/buildtools/win/clang-format.exe.sha1", + ], + }, + { + "name": "clang_format_mac", + "pattern": ".", + "action": [ "download_from_google_storage", + "--no_resume", + "--platform=darwin", + "--no_auth", + "--bucket", "chromium-clang-format", + "-s", "v8/buildtools/mac/clang-format.sha1", + ], + }, + { + "name": "clang_format_linux", + "pattern": ".", + "action": [ "download_from_google_storage", + "--no_resume", + "--platform=linux*", + "--no_auth", + "--bucket", "chromium-clang-format", + "-s", "v8/buildtools/linux64/clang-format.sha1", + ], + }, { # A change to a .gyp, .gypi, or to GYP itself should run the generator. "pattern": ".", diff --git a/deps/v8/Makefile b/deps/v8/Makefile index a99b09c0705..96d7a7ae4d3 100644 --- a/deps/v8/Makefile +++ b/deps/v8/Makefile @@ -70,6 +70,10 @@ ifeq ($(backtrace), off) else GYPFLAGS += -Dv8_enable_backtrace=1 endif +# verifypredictable=on +ifeq ($(verifypredictable), on) + GYPFLAGS += -Dv8_enable_verify_predictable=1 +endif # snapshot=off ifeq ($(snapshot), off) GYPFLAGS += -Dv8_use_snapshot='false' @@ -156,11 +160,6 @@ ifeq ($(armv7), true) endif endif endif -# vfp2=off. Deprecated, use armfpu= -# vfp3=off. Deprecated, use armfpu= -ifeq ($(vfp3), off) - GYPFLAGS += -Darm_fpu=vfp -endif # hardfp=on/off. Deprecated, use armfloatabi ifeq ($(hardfp),on) GYPFLAGS += -Darm_float_abi=hard @@ -169,16 +168,10 @@ ifeq ($(hardfp),off) GYPFLAGS += -Darm_float_abi=softfp endif endif -# armneon=on/off -ifeq ($(armneon), on) - GYPFLAGS += -Darm_neon=1 -endif # fpu: armfpu=xxx # xxx: vfp, vfpv3-d16, vfpv3, neon. ifeq ($(armfpu),) -ifneq ($(vfp3), off) GYPFLAGS += -Darm_fpu=default -endif else GYPFLAGS += -Darm_fpu=$(armfpu) endif @@ -198,19 +191,19 @@ ifeq ($(armthumb), on) GYPFLAGS += -Darm_thumb=1 endif endif -# armtest=on +# arm_test_noprobe=on # With this flag set, by default v8 will only use features implied # by the compiler (no probe). This is done by modifying the default -# values of enable_armv7, enable_vfp2, enable_vfp3 and enable_32dregs. +# values of enable_armv7, enable_vfp3, enable_32dregs and enable_neon. # Modifying these flags when launching v8 will enable the probing for # the specified values. -# When using the simulator, this flag is implied. -ifeq ($(armtest), on) - GYPFLAGS += -Darm_test=on +ifeq ($(arm_test_noprobe), on) + GYPFLAGS += -Darm_test_noprobe=on endif # ----------------- available targets: -------------------- -# - "dependencies": pulls in external dependencies (currently: GYP) +# - "builddeps": pulls in external dependencies for building +# - "dependencies": pulls in all external dependencies # - "grokdump": rebuilds heap constants lists used by grokdump # - any arch listed in ARCHES (see below) # - any mode listed in MODES @@ -228,11 +221,11 @@ endif # Architectures and modes to be compiled. Consider these to be internal # variables, don't override them (use the targets instead). -ARCHES = ia32 x64 arm arm64 mips mipsel +ARCHES = ia32 x64 x32 arm arm64 mips mipsel mips64el x87 DEFAULT_ARCHES = ia32 x64 arm MODES = release debug optdebug DEFAULT_MODES = release debug -ANDROID_ARCHES = android_ia32 android_arm android_arm64 android_mipsel +ANDROID_ARCHES = android_ia32 android_arm android_arm64 android_mipsel android_x87 NACL_ARCHES = nacl_ia32 nacl_x64 # List of files that trigger Makefile regeneration: @@ -258,7 +251,7 @@ NACL_CHECKS = $(addsuffix .check,$(NACL_BUILDS)) # File where previously used GYPFLAGS are stored. ENVFILE = $(OUTDIR)/environment -.PHONY: all check clean dependencies $(ENVFILE).new native \ +.PHONY: all check clean builddeps dependencies $(ENVFILE).new native \ qc quickcheck $(QUICKCHECKS) \ $(addsuffix .quickcheck,$(MODES)) $(addsuffix .quickcheck,$(ARCHES)) \ $(ARCHES) $(MODES) $(BUILDS) $(CHECKS) $(addsuffix .clean,$(ARCHES)) \ @@ -406,18 +399,22 @@ clean: $(addsuffix .clean, $(ARCHES) $(ANDROID_ARCHES) $(NACL_ARCHES)) native.cl # GYP file generation targets. OUT_MAKEFILES = $(addprefix $(OUTDIR)/Makefile.,$(BUILDS)) $(OUT_MAKEFILES): $(GYPFILES) $(ENVFILE) - PYTHONPATH="$(shell pwd)/tools/generate_shim_headers:$(PYTHONPATH)" \ - PYTHONPATH="$(shell pwd)/build/gyp/pylib:$(PYTHONPATH)" \ + $(eval CXX_TARGET_ARCH:=$(shell $(CXX) -v 2>&1 | grep ^Target: | \ + cut -f 2 -d " " | cut -f 1 -d "-" )) + $(eval CXX_TARGET_ARCH:=$(subst aarch64,arm64,$(CXX_TARGET_ARCH))) + $(eval V8_TARGET_ARCH:=$(subst .,,$(suffix $(basename $@)))) + PYTHONPATH="$(shell pwd)/tools/generate_shim_headers:$(shell pwd)/build:$(PYTHONPATH):$(shell pwd)/build/gyp/pylib:$(PYTHONPATH)" \ GYP_GENERATORS=make \ build/gyp/gyp --generator-output="$(OUTDIR)" build/all.gyp \ -Ibuild/standalone.gypi --depth=. \ - -Dv8_target_arch=$(subst .,,$(suffix $(basename $@))) \ + -Dv8_target_arch=$(V8_TARGET_ARCH) \ + $(if $(findstring $(CXX_TARGET_ARCH),$(V8_TARGET_ARCH)), \ + -Dtarget_arch=$(V8_TARGET_ARCH),) \ $(if $(findstring optdebug,$@),-Dv8_optimized_debug=2,) \ -S$(suffix $(basename $@))$(suffix $@) $(GYPFLAGS) $(OUTDIR)/Makefile.native: $(GYPFILES) $(ENVFILE) - PYTHONPATH="$(shell pwd)/tools/generate_shim_headers:$(PYTHONPATH)" \ - PYTHONPATH="$(shell pwd)/build/gyp/pylib:$(PYTHONPATH)" \ + PYTHONPATH="$(shell pwd)/tools/generate_shim_headers:$(shell pwd)/build:$(PYTHONPATH):$(shell pwd)/build/gyp/pylib:$(PYTHONPATH)" \ GYP_GENERATORS=make \ build/gyp/gyp --generator-output="$(OUTDIR)" build/all.gyp \ -Ibuild/standalone.gypi --depth=. -S.native $(GYPFLAGS) @@ -471,11 +468,26 @@ GPATH GRTAGS GSYMS GTAGS: gtags.files $(shell cat gtags.files 2> /dev/null) gtags.clean: rm -f gtags.files GPATH GRTAGS GSYMS GTAGS -# Dependencies. +# Dependencies. "builddeps" are dependencies required solely for building, +# "dependencies" includes also dependencies required for development. # Remember to keep these in sync with the DEPS file. -dependencies: +builddeps: svn checkout --force http://gyp.googlecode.com/svn/trunk build/gyp \ --revision 1831 - svn checkout --force \ - https://src.chromium.org/chrome/trunk/deps/third_party/icu46 \ - third_party/icu --revision 258359 + if svn info third_party/icu 2>&1 | grep -q icu46 ; then \ + svn switch --force \ + https://src.chromium.org/chrome/trunk/deps/third_party/icu52 \ + third_party/icu --revision 277999 ; \ + else \ + svn checkout --force \ + https://src.chromium.org/chrome/trunk/deps/third_party/icu52 \ + third_party/icu --revision 277999 ; \ + fi + svn checkout --force http://googletest.googlecode.com/svn/trunk \ + testing/gtest --revision 692 + svn checkout --force http://googlemock.googlecode.com/svn/trunk \ + testing/gmock --revision 485 + +dependencies: builddeps + # The spec is a copy of the hooks in v8's DEPS file. + gclient sync -r fb782d4369d5ae04f17a2fceef7de5a63e50f07b --spec="solutions = [{u'managed': False, u'name': u'buildtools', u'url': u'https://chromium.googlesource.com/chromium/buildtools.git', u'custom_deps': {}, u'custom_hooks': [{u'name': u'clang_format_win',u'pattern': u'.',u'action': [u'download_from_google_storage',u'--no_resume',u'--platform=win32',u'--no_auth',u'--bucket',u'chromium-clang-format',u'-s',u'buildtools/win/clang-format.exe.sha1']},{u'name': u'clang_format_mac',u'pattern': u'.',u'action': [u'download_from_google_storage',u'--no_resume',u'--platform=darwin',u'--no_auth',u'--bucket',u'chromium-clang-format',u'-s',u'buildtools/mac/clang-format.sha1']},{u'name': u'clang_format_linux',u'pattern': u'.',u'action': [u'download_from_google_storage',u'--no_resume',u'--platform=linux*',u'--no_auth',u'--bucket',u'chromium-clang-format',u'-s',u'buildtools/linux64/clang-format.sha1']}],u'deps_file': u'.DEPS.git', u'safesync_url': u''}]" diff --git a/deps/v8/Makefile.android b/deps/v8/Makefile.android index 396b58d7444..d46af31fdb7 100644 --- a/deps/v8/Makefile.android +++ b/deps/v8/Makefile.android @@ -26,7 +26,7 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Those definitions should be consistent with the main Makefile -ANDROID_ARCHES = android_ia32 android_arm android_arm64 android_mipsel +ANDROID_ARCHES = android_ia32 android_arm android_arm64 android_mipsel android_x87 MODES = release debug # Generates all combinations of ANDROID ARCHES and MODES, @@ -51,13 +51,13 @@ ifeq ($(ARCH), android_arm) DEFINES += arm_neon=0 arm_version=7 TOOLCHAIN_ARCH = arm-linux-androideabi TOOLCHAIN_PREFIX = $(TOOLCHAIN_ARCH) - TOOLCHAIN_VER = 4.6 + TOOLCHAIN_VER = 4.8 else ifeq ($(ARCH), android_arm64) - DEFINES = target_arch=arm64 v8_target_arch=arm64 android_target_arch=arm64 android_target_platform=20 + DEFINES = target_arch=arm64 v8_target_arch=arm64 android_target_arch=arm64 android_target_platform=L TOOLCHAIN_ARCH = aarch64-linux-android TOOLCHAIN_PREFIX = $(TOOLCHAIN_ARCH) - TOOLCHAIN_VER = 4.8 + TOOLCHAIN_VER = 4.9 else ifeq ($(ARCH), android_mipsel) DEFINES = target_arch=mipsel v8_target_arch=mipsel android_target_platform=14 @@ -73,7 +73,14 @@ else TOOLCHAIN_PREFIX = i686-linux-android TOOLCHAIN_VER = 4.6 else - $(error Target architecture "${ARCH}" is not supported) + ifeq ($(ARCH), android_x87) + DEFINES = target_arch=x87 v8_target_arch=x87 android_target_arch=x86 android_target_platform=14 + TOOLCHAIN_ARCH = x86 + TOOLCHAIN_PREFIX = i686-linux-android + TOOLCHAIN_VER = 4.6 + else + $(error Target architecture "${ARCH}" is not supported) + endif endif endif endif @@ -91,6 +98,7 @@ endif # For mksnapshot host generation. DEFINES += host_os=${HOST_OS} +DEFINES += OS=android .SECONDEXPANSION: $(ANDROID_BUILDS): $(OUTDIR)/Makefile.$$@ @@ -112,7 +120,7 @@ $(ANDROID_MAKEFILES): GYP_DEFINES="${DEFINES}" \ CC="${ANDROID_TOOLCHAIN}/bin/${TOOLCHAIN_PREFIX}-gcc" \ CXX="${ANDROID_TOOLCHAIN}/bin/${TOOLCHAIN_PREFIX}-g++" \ - PYTHONPATH="$(shell pwd)/tools/generate_shim_headers:$(PYTHONPATH)" \ + PYTHONPATH="$(shell pwd)/tools/generate_shim_headers:$(shell pwd)/build:$(PYTHONPATH)" \ build/gyp/gyp --generator-output="${OUTDIR}" build/all.gyp \ -Ibuild/standalone.gypi --depth=. -Ibuild/android.gypi \ -S$(suffix $(basename $@))$(suffix $@) ${GYPFLAGS} diff --git a/deps/v8/Makefile.nacl b/deps/v8/Makefile.nacl index 1d34a3b30aa..34bd960fed1 100644 --- a/deps/v8/Makefile.nacl +++ b/deps/v8/Makefile.nacl @@ -97,7 +97,7 @@ $(NACL_MAKEFILES): GYP_DEFINES="${GYPENV}" \ CC=${NACL_CC} \ CXX=${NACL_CXX} \ - PYTHONPATH="$(shell pwd)/tools/generate_shim_headers:$(PYTHONPATH)" \ + PYTHONPATH="$(shell pwd)/tools/generate_shim_headers:$(shell pwd)/build:$(PYTHONPATH)" \ build/gyp/gyp --generator-output="${OUTDIR}" build/all.gyp \ -Ibuild/standalone.gypi --depth=. \ -S$(suffix $(basename $@))$(suffix $@) $(GYPFLAGS) \ diff --git a/deps/v8/OWNERS b/deps/v8/OWNERS index 2fbb3ef2ac1..f67b3ec5c62 100644 --- a/deps/v8/OWNERS +++ b/deps/v8/OWNERS @@ -18,4 +18,5 @@ titzer@chromium.org ulan@chromium.org vegorov@chromium.org verwaest@chromium.org +vogelheim@chromium.org yangguo@chromium.org diff --git a/deps/v8/PRESUBMIT.py b/deps/v8/PRESUBMIT.py index 41d79eb5300..55bb99ab8ac 100644 --- a/deps/v8/PRESUBMIT.py +++ b/deps/v8/PRESUBMIT.py @@ -31,6 +31,9 @@ for more details about the presubmit API built into gcl. """ +import sys + + def _V8PresubmitChecks(input_api, output_api): """Runs the V8 presubmit checks.""" import sys @@ -38,6 +41,8 @@ def _V8PresubmitChecks(input_api, output_api): input_api.PresubmitLocalPath(), 'tools')) from presubmit import CppLintProcessor from presubmit import SourceProcessor + from presubmit import CheckGeneratedRuntimeTests + from presubmit import CheckExternalReferenceRegistration results = [] if not CppLintProcessor().Run(input_api.PresubmitLocalPath()): @@ -46,6 +51,65 @@ def _V8PresubmitChecks(input_api, output_api): results.append(output_api.PresubmitError( "Copyright header, trailing whitespaces and two empty lines " \ "between declarations check failed")) + if not CheckGeneratedRuntimeTests(input_api.PresubmitLocalPath()): + results.append(output_api.PresubmitError( + "Generated runtime tests check failed")) + if not CheckExternalReferenceRegistration(input_api.PresubmitLocalPath()): + results.append(output_api.PresubmitError( + "External references registration check failed")) + return results + + +def _CheckUnwantedDependencies(input_api, output_api): + """Runs checkdeps on #include statements added in this + change. Breaking - rules is an error, breaking ! rules is a + warning. + """ + # We need to wait until we have an input_api object and use this + # roundabout construct to import checkdeps because this file is + # eval-ed and thus doesn't have __file__. + original_sys_path = sys.path + try: + sys.path = sys.path + [input_api.os_path.join( + input_api.PresubmitLocalPath(), 'buildtools', 'checkdeps')] + import checkdeps + from cpp_checker import CppChecker + from rules import Rule + finally: + # Restore sys.path to what it was before. + sys.path = original_sys_path + + added_includes = [] + for f in input_api.AffectedFiles(): + if not CppChecker.IsCppFile(f.LocalPath()): + continue + + changed_lines = [line for line_num, line in f.ChangedContents()] + added_includes.append([f.LocalPath(), changed_lines]) + + deps_checker = checkdeps.DepsChecker(input_api.PresubmitLocalPath()) + + error_descriptions = [] + warning_descriptions = [] + for path, rule_type, rule_description in deps_checker.CheckAddedCppIncludes( + added_includes): + description_with_path = '%s\n %s' % (path, rule_description) + if rule_type == Rule.DISALLOW: + error_descriptions.append(description_with_path) + else: + warning_descriptions.append(description_with_path) + + results = [] + if error_descriptions: + results.append(output_api.PresubmitError( + 'You added one or more #includes that violate checkdeps rules.', + error_descriptions)) + if warning_descriptions: + results.append(output_api.PresubmitPromptOrNotify( + 'You added one or more #includes of files that are temporarily\n' + 'allowed but being removed. Can you avoid introducing the\n' + '#include? See relevant DEPS file(s) for details and contacts.', + warning_descriptions)) return results @@ -54,7 +118,10 @@ def _CommonChecks(input_api, output_api): results = [] results.extend(input_api.canned_checks.CheckOwners( input_api, output_api, source_file_filter=None)) + results.extend(input_api.canned_checks.CheckPatchFormatted( + input_api, output_api)) results.extend(_V8PresubmitChecks(input_api, output_api)) + results.extend(_CheckUnwantedDependencies(input_api, output_api)) return results @@ -110,7 +177,9 @@ def GetPreferredTryMasters(project, change): 'v8_linux64_rel': set(['defaulttests']), 'v8_linux_arm_dbg': set(['defaulttests']), 'v8_linux_arm64_rel': set(['defaulttests']), + 'v8_linux_layout_dbg': set(['defaulttests']), 'v8_mac_rel': set(['defaulttests']), 'v8_win_rel': set(['defaulttests']), + 'v8_win64_rel': set(['defaulttests']), }, } diff --git a/deps/v8/benchmarks/v8.json b/deps/v8/benchmarks/v8.json new file mode 100644 index 00000000000..f4210d9d406 --- /dev/null +++ b/deps/v8/benchmarks/v8.json @@ -0,0 +1,16 @@ +{ + "path": ["."], + "main": "run.js", + "run_count": 2, + "results_regexp": "^%s: (.+)$", + "benchmarks": [ + {"name": "Richards"}, + {"name": "DeltaBlue"}, + {"name": "Crypto"}, + {"name": "RayTrace"}, + {"name": "EarleyBoyer"}, + {"name": "RegExp"}, + {"name": "Splay"}, + {"name": "NavierStokes"} + ] +} diff --git a/deps/v8/build/all.gyp b/deps/v8/build/all.gyp index 3860379ea9c..5e410a3d0f2 100644 --- a/deps/v8/build/all.gyp +++ b/deps/v8/build/all.gyp @@ -10,7 +10,9 @@ 'dependencies': [ '../samples/samples.gyp:*', '../src/d8.gyp:d8', + '../test/base-unittests/base-unittests.gyp:*', '../test/cctest/cctest.gyp:*', + '../test/compiler-unittests/compiler-unittests.gyp:*', ], 'conditions': [ ['component!="shared_library"', { diff --git a/deps/v8/build/android.gypi b/deps/v8/build/android.gypi index 73ac93a434a..46ece08524e 100644 --- a/deps/v8/build/android.gypi +++ b/deps/v8/build/android.gypi @@ -35,9 +35,6 @@ 'variables': { 'android_ndk_root%': ' %r' % (func.__name__, val[0]) + return val[0] + return inner + return memoizer + + +@memoize() +def IsWindows(): + return sys.platform in ['win32', 'cygwin'] + + +@memoize() +def IsLinux(): + return sys.platform.startswith(('linux', 'freebsd')) + + +@memoize() +def IsMac(): + return sys.platform == 'darwin' + + +@memoize() +def gyp_defines(): + """Parses and returns GYP_DEFINES env var as a dictionary.""" + return dict(arg.split('=', 1) + for arg in shlex.split(os.environ.get('GYP_DEFINES', ''))) + +@memoize() +def gyp_msvs_version(): + return os.environ.get('GYP_MSVS_VERSION', '') + +@memoize() +def distributor(): + """ + Returns a string which is the distributed build engine in use (if any). + Possible values: 'goma', 'ib', '' + """ + if 'goma' in gyp_defines(): + return 'goma' + elif IsWindows(): + if 'CHROME_HEADLESS' in os.environ: + return 'ib' # use (win and !goma and headless) as approximation of ib + + +@memoize() +def platform(): + """ + Returns a string representing the platform this build is targetted for. + Possible values: 'win', 'mac', 'linux', 'ios', 'android' + """ + if 'OS' in gyp_defines(): + if 'android' in gyp_defines()['OS']: + return 'android' + else: + return gyp_defines()['OS'] + elif IsWindows(): + return 'win' + elif IsLinux(): + return 'linux' + else: + return 'mac' + + +@memoize() +def builder(): + """ + Returns a string representing the build engine (not compiler) to use. + Possible values: 'make', 'ninja', 'xcode', 'msvs', 'scons' + """ + if 'GYP_GENERATORS' in os.environ: + # for simplicity, only support the first explicit generator + generator = os.environ['GYP_GENERATORS'].split(',')[0] + if generator.endswith('-android'): + return generator.split('-')[0] + elif generator.endswith('-ninja'): + return 'ninja' + else: + return generator + else: + if platform() == 'android': + # Good enough for now? Do any android bots use make? + return 'make' + elif platform() == 'ios': + return 'xcode' + elif IsWindows(): + return 'msvs' + elif IsLinux(): + return 'make' + elif IsMac(): + return 'xcode' + else: + assert False, 'Don\'t know what builder we\'re using!' diff --git a/deps/v8/build/landmines.py b/deps/v8/build/landmines.py new file mode 100755 index 00000000000..bd1fb28f719 --- /dev/null +++ b/deps/v8/build/landmines.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python +# Copyright 2014 the V8 project authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +""" +This script runs every build as a hook. If it detects that the build should +be clobbered, it will touch the file /.landmine_triggered. The +various build scripts will then check for the presence of this file and clobber +accordingly. The script will also emit the reasons for the clobber to stdout. + +A landmine is tripped when a builder checks out a different revision, and the +diff between the new landmines and the old ones is non-null. At this point, the +build is clobbered. +""" + +import difflib +import logging +import optparse +import os +import sys +import subprocess +import time + +import landmine_utils + + +SRC_DIR = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + + +def get_target_build_dir(build_tool, target): + """ + Returns output directory absolute path dependent on build and targets. + Examples: + r'c:\b\build\slave\win\build\src\out\Release' + '/mnt/data/b/build/slave/linux/build/src/out/Debug' + '/b/build/slave/ios_rel_device/build/src/xcodebuild/Release-iphoneos' + + Keep this function in sync with tools/build/scripts/slave/compile.py + """ + ret = None + if build_tool == 'xcode': + ret = os.path.join(SRC_DIR, 'xcodebuild', target) + elif build_tool in ['make', 'ninja', 'ninja-ios']: # TODO: Remove ninja-ios. + ret = os.path.join(SRC_DIR, 'out', target) + elif build_tool in ['msvs', 'vs', 'ib']: + ret = os.path.join(SRC_DIR, 'build', target) + else: + raise NotImplementedError('Unexpected GYP_GENERATORS (%s)' % build_tool) + return os.path.abspath(ret) + + +def set_up_landmines(target, new_landmines): + """Does the work of setting, planting, and triggering landmines.""" + out_dir = get_target_build_dir(landmine_utils.builder(), target) + + landmines_path = os.path.join(out_dir, '.landmines') + if not os.path.exists(out_dir): + return + + if not os.path.exists(landmines_path): + print "Landmines tracker didn't exists." + + # FIXME(machenbach): Clobber deletes the .landmines tracker. Difficult + # to know if we are right after a clobber or if it is first-time landmines + # deployment. Also, a landmine-triggered clobber right after a clobber is + # not possible. Different clobber methods for msvs, xcode and make all + # have different blacklists of files that are not deleted. + if os.path.exists(landmines_path): + triggered = os.path.join(out_dir, '.landmines_triggered') + with open(landmines_path, 'r') as f: + old_landmines = f.readlines() + if old_landmines != new_landmines: + old_date = time.ctime(os.stat(landmines_path).st_ctime) + diff = difflib.unified_diff(old_landmines, new_landmines, + fromfile='old_landmines', tofile='new_landmines', + fromfiledate=old_date, tofiledate=time.ctime(), n=0) + + with open(triggered, 'w') as f: + f.writelines(diff) + print "Setting landmine: %s" % triggered + elif os.path.exists(triggered): + # Remove false triggered landmines. + os.remove(triggered) + print "Removing landmine: %s" % triggered + with open(landmines_path, 'w') as f: + f.writelines(new_landmines) + + +def process_options(): + """Returns a list of landmine emitting scripts.""" + parser = optparse.OptionParser() + parser.add_option( + '-s', '--landmine-scripts', action='append', + default=[os.path.join(SRC_DIR, 'build', 'get_landmines.py')], + help='Path to the script which emits landmines to stdout. The target ' + 'is passed to this script via option -t. Note that an extra ' + 'script can be specified via an env var EXTRA_LANDMINES_SCRIPT.') + parser.add_option('-v', '--verbose', action='store_true', + default=('LANDMINES_VERBOSE' in os.environ), + help=('Emit some extra debugging information (default off). This option ' + 'is also enabled by the presence of a LANDMINES_VERBOSE environment ' + 'variable.')) + + options, args = parser.parse_args() + + if args: + parser.error('Unknown arguments %s' % args) + + logging.basicConfig( + level=logging.DEBUG if options.verbose else logging.ERROR) + + extra_script = os.environ.get('EXTRA_LANDMINES_SCRIPT') + if extra_script: + return options.landmine_scripts + [extra_script] + else: + return options.landmine_scripts + + +def main(): + landmine_scripts = process_options() + + if landmine_utils.builder() in ('dump_dependency_json', 'eclipse'): + return 0 + + landmines = [] + for s in landmine_scripts: + proc = subprocess.Popen([sys.executable, s], stdout=subprocess.PIPE) + output, _ = proc.communicate() + landmines.extend([('%s\n' % l.strip()) for l in output.splitlines()]) + + for target in ('Debug', 'Release'): + set_up_landmines(target, landmines) + + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/deps/v8/build/standalone.gypi b/deps/v8/build/standalone.gypi index befa73851e3..2ed19f65eac 100644 --- a/deps/v8/build/standalone.gypi +++ b/deps/v8/build/standalone.gypi @@ -33,8 +33,8 @@ 'includes': ['toolchain.gypi'], 'variables': { 'component%': 'static_library', - 'clang%': 0, 'asan%': 0, + 'tsan%': 0, 'visibility%': 'hidden', 'v8_enable_backtrace%': 0, 'v8_enable_i18n_support%': 1, @@ -51,13 +51,7 @@ # Anything else gets passed through, which probably won't work # very well; such hosts should pass an explicit target_arch # to gyp. - 'host_arch%': - '&1 | grep -q "^Target: arm" && echo "yes" || echo "no")', - }, 'conditions': [ - ['armcompiler=="yes"', { + ['v8_target_arch==host_arch and android_webview_build==0', { + # Host built with an Arm CXX compiler. 'conditions': [ [ 'arm_version==7', { 'cflags': ['-march=armv7-a',], }], [ 'arm_version==7 or arm_version=="default"', { 'conditions': [ - [ 'arm_neon==1', { - 'cflags': ['-mfpu=neon',], - }, - { - 'conditions': [ - [ 'arm_fpu!="default"', { - 'cflags': ['-mfpu=<(arm_fpu)',], - }], - ], + [ 'arm_fpu!="default"', { + 'cflags': ['-mfpu=<(arm_fpu)',], }], ], }], @@ -123,44 +173,11 @@ [ 'arm_thumb==0', { 'cflags': ['-marm',], }], - [ 'arm_test=="on"', { - 'defines': [ - 'ARM_TEST', - ], - }], ], }, { - # armcompiler=="no" + # 'v8_target_arch!=host_arch' + # Host not built with an Arm CXX compiler (simulator build). 'conditions': [ - [ 'arm_version==7 or arm_version=="default"', { - 'defines': [ - 'CAN_USE_ARMV7_INSTRUCTIONS=1', - ], - 'conditions': [ - [ 'arm_fpu=="default"', { - 'defines': [ - 'CAN_USE_VFP3_INSTRUCTIONS', - ], - }], - [ 'arm_fpu=="vfpv3-d16"', { - 'defines': [ - 'CAN_USE_VFP3_INSTRUCTIONS', - ], - }], - [ 'arm_fpu=="vfpv3"', { - 'defines': [ - 'CAN_USE_VFP3_INSTRUCTIONS', - 'CAN_USE_VFP32DREGS', - ], - }], - [ 'arm_fpu=="neon" or arm_neon==1', { - 'defines': [ - 'CAN_USE_VFP3_INSTRUCTIONS', - 'CAN_USE_VFP32DREGS', - ], - }], - ], - }], [ 'arm_float_abi=="hard"', { 'defines': [ 'USE_EABI_HARDFLOAT=1', @@ -172,33 +189,21 @@ ], }], ], - 'defines': [ - 'ARM_TEST', - ], }], ], }], # _toolset=="host" ['_toolset=="target"', { - 'variables': { - 'armcompiler': '&1 | grep -q "^Target: arm" && echo "yes" || echo "no")', - }, 'conditions': [ - ['armcompiler=="yes"', { + ['v8_target_arch==target_arch and android_webview_build==0', { + # Target built with an Arm CXX compiler. 'conditions': [ [ 'arm_version==7', { 'cflags': ['-march=armv7-a',], }], [ 'arm_version==7 or arm_version=="default"', { 'conditions': [ - [ 'arm_neon==1', { - 'cflags': ['-mfpu=neon',], - }, - { - 'conditions': [ - [ 'arm_fpu!="default"', { - 'cflags': ['-mfpu=<(arm_fpu)',], - }], - ], + [ 'arm_fpu!="default"', { + 'cflags': ['-mfpu=<(arm_fpu)',], }], ], }], @@ -211,44 +216,11 @@ [ 'arm_thumb==0', { 'cflags': ['-marm',], }], - [ 'arm_test=="on"', { - 'defines': [ - 'ARM_TEST', - ], - }], ], }, { - # armcompiler=="no" + # 'v8_target_arch!=target_arch' + # Target not built with an Arm CXX compiler (simulator build). 'conditions': [ - [ 'arm_version==7 or arm_version=="default"', { - 'defines': [ - 'CAN_USE_ARMV7_INSTRUCTIONS=1', - ], - 'conditions': [ - [ 'arm_fpu=="default"', { - 'defines': [ - 'CAN_USE_VFP3_INSTRUCTIONS', - ], - }], - [ 'arm_fpu=="vfpv3-d16"', { - 'defines': [ - 'CAN_USE_VFP3_INSTRUCTIONS', - ], - }], - [ 'arm_fpu=="vfpv3"', { - 'defines': [ - 'CAN_USE_VFP3_INSTRUCTIONS', - 'CAN_USE_VFP32DREGS', - ], - }], - [ 'arm_fpu=="neon" or arm_neon==1', { - 'defines': [ - 'CAN_USE_VFP3_INSTRUCTIONS', - 'CAN_USE_VFP32DREGS', - ], - }], - ], - }], [ 'arm_float_abi=="hard"', { 'defines': [ 'USE_EABI_HARDFLOAT=1', @@ -260,9 +232,6 @@ ], }], ], - 'defines': [ - 'ARM_TEST', - ], }], ], }], # _toolset=="target" @@ -278,15 +247,19 @@ 'V8_TARGET_ARCH_IA32', ], }], # v8_target_arch=="ia32" + ['v8_target_arch=="x87"', { + 'defines': [ + 'V8_TARGET_ARCH_X87', + ], + 'cflags': ['-march=i586'], + }], # v8_target_arch=="x87" ['v8_target_arch=="mips"', { 'defines': [ 'V8_TARGET_ARCH_MIPS', ], - 'variables': { - 'mipscompiler': '&1 | grep -q "^Target: mips" && echo "yes" || echo "no")', - }, 'conditions': [ - ['mipscompiler=="yes"', { + ['v8_target_arch==target_arch and android_webview_build==0', { + # Target built with a Mips CXX compiler. 'target_conditions': [ ['_toolset=="target"', { 'cflags': ['-EB'], @@ -299,10 +272,10 @@ 'cflags': ['-msoft-float'], 'ldflags': ['-msoft-float'], }], - ['mips_arch_variant=="mips32r2"', { + ['mips_arch_variant=="r2"', { 'cflags': ['-mips32r2', '-Wa,-mips32r2'], }], - ['mips_arch_variant=="mips32r1"', { + ['mips_arch_variant=="r1"', { 'cflags': ['-mips32', '-Wa,-mips32'], }], ], @@ -324,7 +297,7 @@ '__mips_soft_float=1' ], }], - ['mips_arch_variant=="mips32r2"', { + ['mips_arch_variant=="r2"', { 'defines': ['_MIPS_ARCH_MIPS32R2',], }], ], @@ -333,11 +306,9 @@ 'defines': [ 'V8_TARGET_ARCH_MIPS', ], - 'variables': { - 'mipscompiler': '&1 | grep -q "^Target: mips" && echo "yes" || echo "no")', - }, 'conditions': [ - ['mipscompiler=="yes"', { + ['v8_target_arch==target_arch and android_webview_build==0', { + # Target built with a Mips CXX compiler. 'target_conditions': [ ['_toolset=="target"', { 'cflags': ['-EL'], @@ -350,10 +321,10 @@ 'cflags': ['-msoft-float'], 'ldflags': ['-msoft-float'], }], - ['mips_arch_variant=="mips32r2"', { + ['mips_arch_variant=="r2"', { 'cflags': ['-mips32r2', '-Wa,-mips32r2'], }], - ['mips_arch_variant=="mips32r1"', { + ['mips_arch_variant=="r1"', { 'cflags': ['-mips32', '-Wa,-mips32'], }], ['mips_arch_variant=="loongson"', { @@ -378,7 +349,7 @@ '__mips_soft_float=1' ], }], - ['mips_arch_variant=="mips32r2"', { + ['mips_arch_variant=="r2"', { 'defines': ['_MIPS_ARCH_MIPS32R2',], }], ['mips_arch_variant=="loongson"', { @@ -386,6 +357,68 @@ }], ], }], # v8_target_arch=="mipsel" + ['v8_target_arch=="mips64el"', { + 'defines': [ + 'V8_TARGET_ARCH_MIPS64', + ], + 'conditions': [ + ['v8_target_arch==target_arch and android_webview_build==0', { + # Target built with a Mips CXX compiler. + 'target_conditions': [ + ['_toolset=="target"', { + 'cflags': ['-EL'], + 'ldflags': ['-EL'], + 'conditions': [ + [ 'v8_use_mips_abi_hardfloat=="true"', { + 'cflags': ['-mhard-float'], + 'ldflags': ['-mhard-float'], + }, { + 'cflags': ['-msoft-float'], + 'ldflags': ['-msoft-float'], + }], + ['mips_arch_variant=="r6"', { + 'cflags': ['-mips64r6', '-mabi=64', '-Wa,-mips64r6'], + 'ldflags': [ + '-mips64r6', '-mabi=64', + '-Wl,--dynamic-linker=$(LDSO_PATH)', + '-Wl,--rpath=$(LD_R_PATH)', + ], + }], + ['mips_arch_variant=="r2"', { + 'cflags': ['-mips64r2', '-mabi=64', '-Wa,-mips64r2'], + 'ldflags': [ + '-mips64r2', '-mabi=64', + '-Wl,--dynamic-linker=$(LDSO_PATH)', + '-Wl,--rpath=$(LD_R_PATH)', + ], + }], + ], + }], + ], + }], + [ 'v8_can_use_fpu_instructions=="true"', { + 'defines': [ + 'CAN_USE_FPU_INSTRUCTIONS', + ], + }], + [ 'v8_use_mips_abi_hardfloat=="true"', { + 'defines': [ + '__mips_hard_float=1', + 'CAN_USE_FPU_INSTRUCTIONS', + ], + }, { + 'defines': [ + '__mips_soft_float=1' + ], + }], + ['mips_arch_variant=="r6"', { + 'defines': ['_MIPS_ARCH_MIPS64R6',], + }], + ['mips_arch_variant=="r2"', { + 'defines': ['_MIPS_ARCH_MIPS64R2',], + }], + ], + }], # v8_target_arch=="mips64el" ['v8_target_arch=="x64"', { 'defines': [ 'V8_TARGET_ARCH_X64', @@ -400,16 +433,42 @@ }, 'msvs_configuration_platform': 'x64', }], # v8_target_arch=="x64" + ['v8_target_arch=="x32"', { + 'defines': [ + # x32 port shares the source code with x64 port. + 'V8_TARGET_ARCH_X64', + 'V8_TARGET_ARCH_32_BIT', + ], + 'cflags': [ + '-mx32', + # Inhibit warning if long long type is used. + '-Wno-long-long', + ], + 'ldflags': [ + '-mx32', + ], + }], # v8_target_arch=="x32" ['OS=="win"', { 'defines': [ 'WIN32', ], + # 4351: VS 2005 and later are warning us that they've fixed a bug + # present in VS 2003 and earlier. + 'msvs_disabled_warnings': [4351], 'msvs_configuration_attributes': { 'OutputDirectory': '<(DEPTH)\\build\\$(ConfigurationName)', 'IntermediateDirectory': '$(OutDir)\\obj\\$(ProjectName)', 'CharacterSet': '1', }, }], + ['OS=="win" and v8_target_arch=="ia32"', { + 'msvs_settings': { + 'VCCLCompilerTool': { + # Ensure no surprising artifacts from 80bit double math with x86. + 'AdditionalOptions': ['/arch:SSE2'], + }, + }, + }], ['OS=="win" and v8_enable_prof==1', { 'msvs_settings': { 'VCLinkerTool': { @@ -417,44 +476,28 @@ }, }, }], - ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris" \ - or OS=="netbsd" or OS=="qnx"', { - 'conditions': [ - [ 'v8_no_strict_aliasing==1', { - 'cflags': [ '-fno-strict-aliasing' ], - }], - ], # conditions - }], - ['OS=="solaris"', { - 'defines': [ '__C99FEATURES__=1' ], # isinf() etc. - }], - ['(OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris" \ + ['(OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris" \ or OS=="netbsd" or OS=="mac" or OS=="android" or OS=="qnx") and \ (v8_target_arch=="arm" or v8_target_arch=="ia32" or \ - v8_target_arch=="mips" or v8_target_arch=="mipsel")', { - # Check whether the host compiler and target compiler support the - # '-m32' option and set it if so. + v8_target_arch=="x87" or v8_target_arch=="mips" or \ + v8_target_arch=="mipsel")', { 'target_conditions': [ ['_toolset=="host"', { - 'variables': { - 'm32flag': ' /dev/null 2>&1 < /dev/null) && echo "-m32" || true)', - }, - 'cflags': [ '<(m32flag)' ], - 'ldflags': [ '<(m32flag)' ], + 'conditions': [ + ['host_cxx_is_biarch==1', { + 'cflags': [ '-m32' ], + 'ldflags': [ '-m32' ] + }], + ], 'xcode_settings': { 'ARCHS': [ 'i386' ], }, }], ['_toolset=="target"', { - 'variables': { - 'm32flag': ' /dev/null 2>&1 < /dev/null) && echo "-m32" || true)', - 'clang%': 0, - }, 'conditions': [ - ['((OS!="android" and OS!="qnx") or clang==1) and \ - nacl_target_arch!="nacl_x64"', { - 'cflags': [ '<(m32flag)' ], - 'ldflags': [ '<(m32flag)' ], + ['target_cxx_is_biarch==1 and nacl_target_arch!="nacl_x64"', { + 'cflags': [ '-m32' ], + 'ldflags': [ '-m32' ], }], ], 'xcode_settings': { @@ -465,28 +508,35 @@ }], ['(OS=="linux" or OS=="android") and \ (v8_target_arch=="x64" or v8_target_arch=="arm64")', { - # Check whether the host compiler and target compiler support the - # '-m64' option and set it if so. 'target_conditions': [ ['_toolset=="host"', { - 'variables': { - 'm64flag': ' /dev/null 2>&1 < /dev/null) && echo "-m64" || true)', - }, - 'cflags': [ '<(m64flag)' ], - 'ldflags': [ '<(m64flag)' ], - }], - ['_toolset=="target"', { - 'variables': { - 'm64flag': ' /dev/null 2>&1 < /dev/null) && echo "-m64" || true)', - }, 'conditions': [ - ['((OS!="android" and OS!="qnx") or clang==1)', { - 'cflags': [ '<(m64flag)' ], - 'ldflags': [ '<(m64flag)' ], + ['host_cxx_is_biarch==1', { + 'cflags': [ '-m64' ], + 'ldflags': [ '-m64' ] }], - ], - }] - ], + ], + }], + ['_toolset=="target"', { + 'conditions': [ + ['target_cxx_is_biarch==1', { + 'cflags': [ '-m64' ], + 'ldflags': [ '-m64' ], + }], + ] + }], + ], + }], + ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris" \ + or OS=="netbsd" or OS=="qnx"', { + 'conditions': [ + [ 'v8_no_strict_aliasing==1', { + 'cflags': [ '-fno-strict-aliasing' ], + }], + ], # conditions + }], + ['OS=="solaris"', { + 'defines': [ '__C99FEATURES__=1' ], # isinf() etc. }], ['OS=="freebsd" or OS=="openbsd"', { 'cflags': [ '-I/usr/local/include' ], diff --git a/deps/v8/codereview.settings b/deps/v8/codereview.settings index 3f642f13bd9..b7f853cd594 100644 --- a/deps/v8/codereview.settings +++ b/deps/v8/codereview.settings @@ -5,3 +5,4 @@ STATUS: http://v8-status.appspot.com/status TRY_ON_UPLOAD: False TRYSERVER_SVN_URL: svn://svn.chromium.org/chrome-try-v8 TRYSERVER_ROOT: v8 +PROJECT: v8 diff --git a/deps/v8/include/libplatform/libplatform.h b/deps/v8/include/libplatform/libplatform.h new file mode 100644 index 00000000000..2125e9746b9 --- /dev/null +++ b/deps/v8/include/libplatform/libplatform.h @@ -0,0 +1,38 @@ +// Copyright 2014 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_LIBPLATFORM_LIBPLATFORM_H_ +#define V8_LIBPLATFORM_LIBPLATFORM_H_ + +#include "include/v8-platform.h" + +namespace v8 { +namespace platform { + +/** + * Returns a new instance of the default v8::Platform implementation. + * + * The caller will take ownership of the returned pointer. |thread_pool_size| + * is the number of worker threads to allocate for background jobs. If a value + * of zero is passed, a suitable default based on the current number of + * processors online will be chosen. + */ +v8::Platform* CreateDefaultPlatform(int thread_pool_size = 0); + + +/** + * Pumps the message loop for the given isolate. + * + * The caller has to make sure that this is called from the right thread. + * Returns true if a task was executed, and false otherwise. This call does + * not block if no task is pending. The |platform| has to be created using + * |CreateDefaultPlatform|. + */ +bool PumpMessageLoop(v8::Platform* platform, v8::Isolate* isolate); + + +} // namespace platform +} // namespace v8 + +#endif // V8_LIBPLATFORM_LIBPLATFORM_H_ diff --git a/deps/v8/include/v8-debug.h b/deps/v8/include/v8-debug.h index bd3eb77c4d7..e72415952d9 100644 --- a/deps/v8/include/v8-debug.h +++ b/deps/v8/include/v8-debug.h @@ -19,8 +19,10 @@ enum DebugEvent { NewFunction = 3, BeforeCompile = 4, AfterCompile = 5, - ScriptCollected = 6, - BreakForCommand = 7 + CompileError = 6, + PromiseEvent = 7, + AsyncTaskEvent = 8, + BreakForCommand = 9 }; @@ -137,7 +139,7 @@ class V8_EXPORT Debug { * A EventCallback2 does not take possession of the event data, * and must not rely on the data persisting after the handler returns. */ - typedef void (*EventCallback2)(const EventDetails& event_details); + typedef void (*EventCallback)(const EventDetails& event_details); /** * Debug message callback function. @@ -147,23 +149,14 @@ class V8_EXPORT Debug { * A MessageHandler2 does not take possession of the message data, * and must not rely on the data persisting after the handler returns. */ - typedef void (*MessageHandler2)(const Message& message); - - /** - * Debug host dispatch callback function. - */ - typedef void (*HostDispatchHandler)(); + typedef void (*MessageHandler)(const Message& message); /** * Callback function for the host to ensure debug messages are processed. */ typedef void (*DebugMessageDispatchHandler)(); - static bool SetDebugEventListener2(EventCallback2 that, - Handle data = Handle()); - - // Set a JavaScript debug event listener. - static bool SetDebugEventListener(v8::Handle that, + static bool SetDebugEventListener(EventCallback that, Handle data = Handle()); // Schedule a debugger break to happen when JavaScript code is run @@ -181,36 +174,13 @@ class V8_EXPORT Debug { // stops. static void DebugBreakForCommand(Isolate* isolate, ClientData* data); - // TODO(svenpanne) Remove this when Chrome is updated. - static void DebugBreakForCommand(ClientData* data, Isolate* isolate) { - DebugBreakForCommand(isolate, data); - } - // Message based interface. The message protocol is JSON. - static void SetMessageHandler2(MessageHandler2 handler); + static void SetMessageHandler(MessageHandler handler); static void SendCommand(Isolate* isolate, const uint16_t* command, int length, ClientData* client_data = NULL); - // Dispatch interface. - static void SetHostDispatchHandler(HostDispatchHandler handler, - int period = 100); - - /** - * Register a callback function to be called when a debug message has been - * received and is ready to be processed. For the debug messages to be - * processed V8 needs to be entered, and in certain embedding scenarios this - * callback can be used to make sure V8 is entered for the debug message to - * be processed. Note that debug messages will only be processed if there is - * a V8 break. This can happen automatically by using the option - * --debugger-auto-break. - * \param provide_locker requires that V8 acquires v8::Locker for you before - * calling handler - */ - static void SetDebugMessageDispatchHandler( - DebugMessageDispatchHandler handler, bool provide_locker = false); - /** * Run a JavaScript function in the debugger. * \param fun the function to call @@ -237,22 +207,6 @@ class V8_EXPORT Debug { */ static Local GetMirror(v8::Handle obj); - /** - * Enable the V8 builtin debug agent. The debugger agent will listen on the - * supplied TCP/IP port for remote debugger connection. - * \param name the name of the embedding application - * \param port the TCP/IP port to listen on - * \param wait_for_connection whether V8 should pause on a first statement - * allowing remote debugger to connect before anything interesting happened - */ - static bool EnableAgent(const char* name, int port, - bool wait_for_connection = false); - - /** - * Disable the V8 builtin debug agent. The TCP/IP connection will be closed. - */ - static void DisableAgent(); - /** * Makes V8 process all pending debug messages. * @@ -271,10 +225,6 @@ class V8_EXPORT Debug { * until V8 gets control again; however, embedding application may improve * this by manually calling this method. * - * It makes sense to call this method whenever a new debug message arrived and - * V8 is not already running. Method v8::Debug::SetDebugMessageDispatchHandler - * should help with the former condition. - * * Technically this method in many senses is equivalent to executing empty * script: * 1. It does nothing except for processing all pending debug messages. @@ -305,11 +255,6 @@ class V8_EXPORT Debug { * unexpectedly used. LiveEdit is enabled by default. */ static void SetLiveEditEnabled(Isolate* isolate, bool enable); - - // TODO(svenpanne) Remove this when Chrome is updated. - static void SetLiveEditEnabled(bool enable, Isolate* isolate) { - SetLiveEditEnabled(isolate, enable); - } }; diff --git a/deps/v8/include/v8-platform.h b/deps/v8/include/v8-platform.h index 5667211c321..1f1679f0e0b 100644 --- a/deps/v8/include/v8-platform.h +++ b/deps/v8/include/v8-platform.h @@ -5,10 +5,10 @@ #ifndef V8_V8_PLATFORM_H_ #define V8_V8_PLATFORM_H_ -#include "v8.h" - namespace v8 { +class Isolate; + /** * A Task represents a unit of work. */ @@ -37,6 +37,8 @@ class Platform { kLongRunningTask }; + virtual ~Platform() {} + /** * Schedules a task to be invoked on a background thread. |expected_runtime| * indicates that the task will run a long time. The Platform implementation @@ -53,9 +55,6 @@ class Platform { * scheduling. The definition of "foreground" is opaque to V8. */ virtual void CallOnForegroundThread(Isolate* isolate, Task* task) = 0; - - protected: - virtual ~Platform() {} }; } // namespace v8 diff --git a/deps/v8/include/v8-profiler.h b/deps/v8/include/v8-profiler.h index 19d143e01bb..7fc193db58e 100644 --- a/deps/v8/include/v8-profiler.h +++ b/deps/v8/include/v8-profiler.h @@ -219,19 +219,20 @@ class V8_EXPORT HeapGraphEdge { class V8_EXPORT HeapGraphNode { public: enum Type { - kHidden = 0, // Hidden node, may be filtered when shown to user. - kArray = 1, // An array of elements. - kString = 2, // A string. - kObject = 3, // A JS object (except for arrays and strings). - kCode = 4, // Compiled code. - kClosure = 5, // Function closure. - kRegExp = 6, // RegExp. - kHeapNumber = 7, // Number stored in the heap. - kNative = 8, // Native object (not from V8 heap). - kSynthetic = 9, // Synthetic object, usualy used for grouping - // snapshot items together. - kConsString = 10, // Concatenated string. A pair of pointers to strings. - kSlicedString = 11 // Sliced string. A fragment of another string. + kHidden = 0, // Hidden node, may be filtered when shown to user. + kArray = 1, // An array of elements. + kString = 2, // A string. + kObject = 3, // A JS object (except for arrays and strings). + kCode = 4, // Compiled code. + kClosure = 5, // Function closure. + kRegExp = 6, // RegExp. + kHeapNumber = 7, // Number stored in the heap. + kNative = 8, // Native object (not from V8 heap). + kSynthetic = 9, // Synthetic object, usualy used for grouping + // snapshot items together. + kConsString = 10, // Concatenated string. A pair of pointers to strings. + kSlicedString = 11, // Sliced string. A fragment of another string. + kSymbol = 12 // A Symbol (ES6). }; /** Returns node type (see HeapGraphNode::Type). */ @@ -292,7 +293,7 @@ class V8_EXPORT OutputStream { // NOLINT */ virtual WriteResult WriteHeapStatsChunk(HeapStatsUpdate* data, int count) { return kAbort; - }; + } }; diff --git a/deps/v8/include/v8-util.h b/deps/v8/include/v8-util.h index 60feff549d9..1eaf1ab68f6 100644 --- a/deps/v8/include/v8-util.h +++ b/deps/v8/include/v8-util.h @@ -154,7 +154,7 @@ class PersistentValueMap { */ bool SetReturnValue(const K& key, ReturnValue returnValue) { - return SetReturnValueFromVal(returnValue, Traits::Get(&impl_, key)); + return SetReturnValueFromVal(&returnValue, Traits::Get(&impl_, key)); } /** @@ -227,7 +227,7 @@ class PersistentValueMap { } template bool SetReturnValue(ReturnValue returnValue) { - return SetReturnValueFromVal(returnValue, value_); + return SetReturnValueFromVal(&returnValue, value_); } void Reset() { value_ = kPersistentContainerNotFound; @@ -300,6 +300,7 @@ class PersistentValueMap { K key = Traits::KeyFromWeakCallbackData(data); Traits::Dispose(data.GetIsolate(), persistentValueMap->Remove(key).Pass(), key); + Traits::DisposeCallbackData(data.GetParameter()); } } @@ -308,10 +309,10 @@ class PersistentValueMap { } static bool SetReturnValueFromVal( - ReturnValue& returnValue, PersistentContainerValue value) { + ReturnValue* returnValue, PersistentContainerValue value) { bool hasValue = value != kPersistentContainerNotFound; if (hasValue) { - returnValue.SetInternal( + returnValue->SetInternal( *reinterpret_cast(FromVal(value))); } return hasValue; @@ -337,7 +338,7 @@ class PersistentValueMap { static UniquePersistent Release(PersistentContainerValue v) { UniquePersistent p; p.val_ = FromVal(v); - if (Traits::kCallbackType != kNotWeak && !p.IsEmpty()) { + if (Traits::kCallbackType != kNotWeak && p.IsWeak()) { Traits::DisposeCallbackData( p.template ClearWeak()); } @@ -422,7 +423,7 @@ class PersistentValueVector { */ void Append(UniquePersistent persistent) { Traits::Append(&impl_, ClearAndLeak(&persistent)); - }; + } /** * Are there any values in the vector? diff --git a/deps/v8/include/v8.h b/deps/v8/include/v8.h index 538b6581f1d..ef0bda63f43 100644 --- a/deps/v8/include/v8.h +++ b/deps/v8/include/v8.h @@ -895,6 +895,13 @@ struct Maybe { }; +// Convenience wrapper. +template +inline Maybe maybe(T t) { + return Maybe(t); +} + + // --- Special objects --- @@ -916,20 +923,24 @@ class ScriptOrigin { Handle resource_name, Handle resource_line_offset = Handle(), Handle resource_column_offset = Handle(), - Handle resource_is_shared_cross_origin = Handle()) + Handle resource_is_shared_cross_origin = Handle(), + Handle script_id = Handle()) : resource_name_(resource_name), resource_line_offset_(resource_line_offset), resource_column_offset_(resource_column_offset), - resource_is_shared_cross_origin_(resource_is_shared_cross_origin) { } + resource_is_shared_cross_origin_(resource_is_shared_cross_origin), + script_id_(script_id) { } V8_INLINE Handle ResourceName() const; V8_INLINE Handle ResourceLineOffset() const; V8_INLINE Handle ResourceColumnOffset() const; V8_INLINE Handle ResourceIsSharedCrossOrigin() const; + V8_INLINE Handle ScriptID() const; private: Handle resource_name_; Handle resource_line_offset_; Handle resource_column_offset_; Handle resource_is_shared_cross_origin_; + Handle script_id_; }; @@ -946,6 +957,15 @@ class V8_EXPORT UnboundScript { int GetId(); Handle GetScriptName(); + /** + * Data read from magic sourceURL comments. + */ + Handle GetSourceURL(); + /** + * Data read from magic sourceMappingURL comments. + */ + Handle GetSourceMappingURL(); + /** * Returns zero based line number of the code_pos location in the script. * -1 will be returned if no information available. @@ -984,24 +1004,9 @@ class V8_EXPORT Script { */ Local GetUnboundScript(); - // To be deprecated; use GetUnboundScript()->GetId(); - int GetId() { - return GetUnboundScript()->GetId(); - } - - // Use GetUnboundScript()->GetId(); V8_DEPRECATED("Use GetUnboundScript()->GetId()", - Handle GetScriptName()) { - return GetUnboundScript()->GetScriptName(); - } - - /** - * Returns zero based line number of the code_pos location in the script. - * -1 will be returned if no information available. - */ - V8_DEPRECATED("Use GetUnboundScript()->GetLineNumber()", - int GetLineNumber(int code_pos)) { - return GetUnboundScript()->GetLineNumber(code_pos); + int GetId()) { + return GetUnboundScript()->GetId(); } }; @@ -1039,15 +1044,14 @@ class V8_EXPORT ScriptCompiler { int length; BufferPolicy buffer_policy; - private: - // Prevent copying. Not implemented. - CachedData(const CachedData&); - CachedData& operator=(const CachedData&); + private: + // Prevent copying. Not implemented. + CachedData(const CachedData&); + CachedData& operator=(const CachedData&); }; /** - * Source code which can be then compiled to a UnboundScript or - * BoundScript. + * Source code which can be then compiled to a UnboundScript or Script. */ class Source { public: @@ -1065,7 +1069,7 @@ class V8_EXPORT ScriptCompiler { private: friend class ScriptCompiler; - // Prevent copying. Not implemented. + // Prevent copying. Not implemented. Source(const Source&); Source& operator=(const Source&); @@ -1077,19 +1081,31 @@ class V8_EXPORT ScriptCompiler { Handle resource_column_offset; Handle resource_is_shared_cross_origin; - // Cached data from previous compilation (if any), or generated during - // compilation (if the generate_cached_data flag is passed to - // ScriptCompiler). + // Cached data from previous compilation (if a kConsume*Cache flag is + // set), or hold newly generated cache data (kProduce*Cache flags) are + // set when calling a compile method. CachedData* cached_data; }; enum CompileOptions { - kNoCompileOptions, - kProduceDataToCache = 1 << 0 + kNoCompileOptions = 0, + kProduceParserCache, + kConsumeParserCache, + kProduceCodeCache, + kConsumeCodeCache, + + // Support the previous API for a transition period. + kProduceDataToCache }; /** * Compiles the specified script (context-independent). + * Cached data as part of the source object can be optionally produced to be + * consumed later to speed up compilation of identical source scripts. + * + * Note that when producing cached data, the source must point to NULL for + * cached data. When consuming cached data, the cached data must have been + * produced by the same version of V8. * * \param source Script source code. * \return Compiled script object (context independent; for running it must be @@ -1124,6 +1140,12 @@ class V8_EXPORT Message { Local Get() const; Local GetSourceLine() const; + /** + * Returns the origin for the script from where the function causing the + * error originates. + */ + ScriptOrigin GetScriptOrigin() const; + /** * Returns the resource name for the script from where the function causing * the error originates. @@ -1201,6 +1223,7 @@ class V8_EXPORT StackTrace { kIsConstructor = 1 << 5, kScriptNameOrSourceURL = 1 << 6, kScriptId = 1 << 7, + kExposeFramesAcrossSecurityOrigins = 1 << 8, kOverview = kLineNumber | kColumnOffset | kScriptName | kFunctionName, kDetailed = kOverview | kIsEval | kIsConstructor | kScriptNameOrSourceURL }; @@ -2071,11 +2094,7 @@ typedef void (*AccessorSetterCallback)( * accessors have an explicit access control parameter which specifies * the kind of cross-context access that should be allowed. * - * Additionally, for security, accessors can prohibit overwriting by - * accessors defined in JavaScript. For objects that have such - * accessors either locally or in their prototype chain it is not - * possible to overwrite the accessor by using __defineGetter__ or - * __defineSetter__ from JavaScript code. + * TODO(dcarney): Remove PROHIBITS_OVERWRITING as it is now unused. */ enum AccessControl { DEFAULT = 0, @@ -2090,13 +2109,11 @@ enum AccessControl { */ class V8_EXPORT Object : public Value { public: - bool Set(Handle key, - Handle value, - PropertyAttribute attribs = None); + bool Set(Handle key, Handle value); bool Set(uint32_t index, Handle value); - // Sets a local property on this object bypassing interceptors and + // Sets an own property on this object bypassing interceptors and // overriding accessors or read-only properties. // // Note that if the object has an interceptor the property will be set @@ -2119,6 +2136,11 @@ class V8_EXPORT Object : public Value { */ PropertyAttribute GetPropertyAttributes(Handle key); + /** + * Returns Object.getOwnPropertyDescriptor as per ES5 section 15.2.3.3. + */ + Local GetOwnPropertyDescriptor(Local key); + bool Has(Handle key); bool Delete(Handle key); @@ -2203,12 +2225,6 @@ class V8_EXPORT Object : public Value { */ Local ObjectProtoToString(); - /** - * Returns the function invoked as a constructor for this object. - * May be the null value. - */ - Local GetConstructor(); - /** * Returns the name of the function invoked as a constructor for this object. */ @@ -2429,6 +2445,10 @@ class ReturnValue { // Convenience getter for Isolate V8_INLINE Isolate* GetIsolate(); + // Pointer setter: Uncompilable to prevent inadvertent misuse. + template + V8_INLINE void Set(S* whatever); + private: template friend class ReturnValue; template friend class FunctionCallbackInfo; @@ -2629,6 +2649,7 @@ class V8_EXPORT Promise : public Object { */ Local Chain(Handle handler); Local Catch(Handle handler); + Local Then(Handle handler); V8_INLINE static Promise* Cast(Value* obj); @@ -3865,8 +3886,8 @@ class V8_EXPORT ResourceConstraints { uint64_t virtual_memory_limit, uint32_t number_of_processors); - int max_new_space_size() const { return max_new_space_size_; } - void set_max_new_space_size(int value) { max_new_space_size_ = value; } + int max_semi_space_size() const { return max_semi_space_size_; } + void set_max_semi_space_size(int value) { max_semi_space_size_ = value; } int max_old_space_size() const { return max_old_space_size_; } void set_max_old_space_size(int value) { max_old_space_size_ = value; } int max_executable_size() const { return max_executable_size_; } @@ -3879,18 +3900,18 @@ class V8_EXPORT ResourceConstraints { void set_max_available_threads(int value) { max_available_threads_ = value; } - int code_range_size() const { return code_range_size_; } - void set_code_range_size(int value) { + size_t code_range_size() const { return code_range_size_; } + void set_code_range_size(size_t value) { code_range_size_ = value; } private: - int max_new_space_size_; + int max_semi_space_size_; int max_old_space_size_; int max_executable_size_; uint32_t* stack_limit_; int max_available_threads_; - int code_range_size_; + size_t code_range_size_; }; @@ -3965,6 +3986,9 @@ typedef void (*MemoryAllocationCallback)(ObjectSpace space, // --- Leave Script Callback --- typedef void (*CallCompletedCallback)(); +// --- Microtask Callback --- +typedef void (*MicrotaskCallback)(void* data); + // --- Failed Access Check Callback --- typedef void (*FailedAccessCheckCallback)(Local target, AccessType type, @@ -4133,6 +4157,20 @@ class V8_EXPORT Isolate { kMinorGarbageCollection }; + /** + * Features reported via the SetUseCounterCallback callback. Do not chang + * assigned numbers of existing items; add new features to the end of this + * list. + */ + enum UseCounterFeature { + kUseAsm = 0, + kUseCounterFeatureCount // This enum value must be last. + }; + + typedef void (*UseCounterCallback)(Isolate* isolate, + UseCounterFeature feature); + + /** * Creates a new isolate. Does not change the currently entered * isolate. @@ -4211,7 +4249,8 @@ class V8_EXPORT Isolate { * kept alive by JavaScript objects. * \returns the adjusted value. */ - int64_t AdjustAmountOfExternalAllocatedMemory(int64_t change_in_bytes); + V8_INLINE int64_t + AdjustAmountOfExternalAllocatedMemory(int64_t change_in_bytes); /** * Returns heap profiler for this isolate. Will return NULL until the isolate @@ -4375,6 +4414,7 @@ class V8_EXPORT Isolate { /** * Experimental: Runs the Microtask Work Queue until empty + * Any exceptions thrown by microtask callbacks are swallowed. */ void RunMicrotasks(); @@ -4383,12 +4423,71 @@ class V8_EXPORT Isolate { */ void EnqueueMicrotask(Handle microtask); + /** + * Experimental: Enqueues the callback to the Microtask Work Queue + */ + void EnqueueMicrotask(MicrotaskCallback microtask, void* data = NULL); + /** * Experimental: Controls whether the Microtask Work Queue is automatically * run when the script call depth decrements to zero. */ void SetAutorunMicrotasks(bool autorun); + /** + * Experimental: Returns whether the Microtask Work Queue is automatically + * run when the script call depth decrements to zero. + */ + bool WillAutorunMicrotasks() const; + + /** + * Sets a callback for counting the number of times a feature of V8 is used. + */ + void SetUseCounterCallback(UseCounterCallback callback); + + /** + * Enables the host application to provide a mechanism for recording + * statistics counters. + */ + void SetCounterFunction(CounterLookupCallback); + + /** + * Enables the host application to provide a mechanism for recording + * histograms. The CreateHistogram function returns a + * histogram which will later be passed to the AddHistogramSample + * function. + */ + void SetCreateHistogramFunction(CreateHistogramCallback); + void SetAddHistogramSampleFunction(AddHistogramSampleCallback); + + /** + * Optional notification that the embedder is idle. + * V8 uses the notification to reduce memory footprint. + * This call can be used repeatedly if the embedder remains idle. + * Returns true if the embedder should stop calling IdleNotification + * until real work has been done. This indicates that V8 has done + * as much cleanup as it will be able to do. + * + * The idle_time_in_ms argument specifies the time V8 has to do reduce + * the memory footprint. There is no guarantee that the actual work will be + * done within the time limit. + */ + bool IdleNotification(int idle_time_in_ms); + + /** + * Optional notification that the system is running low on memory. + * V8 uses these notifications to attempt to free memory. + */ + void LowMemoryNotification(); + + /** + * Optional notification that a context has been disposed. V8 uses + * these notifications to guide the GC heuristic. Returns the number + * of context disposals - including this one - since the last time + * V8 had a chance to clean up. + */ + int ContextDisposedNotification(); + private: template friend class PersistentValueMap; @@ -4402,6 +4501,7 @@ class V8_EXPORT Isolate { void SetObjectGroupId(internal::Object** object, UniqueId id); void SetReferenceFromGroup(UniqueId id, internal::Object** object); void SetReference(internal::Object** parent, internal::Object** child); + void CollectAllGarbage(const char* gc_reason); }; class V8_EXPORT StartupData { @@ -4512,7 +4612,7 @@ struct JitCodeEvent { // Size of the instructions. size_t code_len; // Script info for CODE_ADDED event. - Handle @@ -44,7 +44,7 @@

    Node Modules

    Scoped packages are installed the same way, except they are grouped together in a sub-folder of the relevant node_modules folder with the name of that scope prefix by the @ symbol, e.g. npm install @myorg/package would place -the package in {prefix}/node_modules/@myorg/package. See scopes(7) for +the package in {prefix}/node_modules/@myorg/package. See scopes(7) for more details.

    If you wish to require() a package, then install it locally.

    Executables

    @@ -59,7 +59,7 @@

    Man Pages

    When in local mode, man pages are not installed.

    Man pages are not installed on Windows systems.

    Cache

    -

    See npm-cache(1). Cache files are stored in ~/.npm on Posix, or +

    See npm-cache(1). Cache files are stored in ~/.npm on Posix, or ~/npm-cache on Windows.

    This is controlled by the cache configuration param.

    Temp Files

    @@ -159,18 +159,18 @@

    Publishing

    not be included in the package tarball.

    This allows a package maintainer to install all of their dependencies (and dev dependencies) locally, but only re-publish those items that -cannot be found elsewhere. See package.json(5) for more information.

    +cannot be found elsewhere. See package.json(5) for more information.

    SEE ALSO

    @@ -184,5 +184,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/files/npm-json.html b/deps/npm/html/doc/files/npm-json.html index b00032dba98..ade4fd07ec4 100644 --- a/deps/npm/html/doc/files/npm-json.html +++ b/deps/npm/html/doc/files/npm-json.html @@ -1,9 +1,9 @@ - package.json + npm-json - + @@ -14,7 +14,7 @@

    DESCRIPTION

    This document is all you need to know about what's required in your package.json file. It must be actual JSON, not just a JavaScript object literal.

    A lot of the behavior described in this document is affected by the config -settings described in npm-config(7).

    +settings described in npm-config(7).

    name

    The most important things in your package.json are the name and version fields. Those are actually required, and your package won't install without @@ -35,7 +35,7 @@

    name

    already, before you get too attached to it. http://registry.npmjs.org/

    A name can be optionally prefixed by a scope, e.g. @myorg/mypackage. See -npm-scope(7) for more detail.

    +npm-scope(7) for more detail.

    version

    The most important things in your package.json are the name and version fields. Those are actually required, and your package won't install without @@ -45,7 +45,7 @@

    version

    Version must be parseable by node-semver, which is bundled with npm as a dependency. (npm install semver to use it yourself.)

    -

    More on version numbers and ranges at semver(7).

    +

    More on version numbers and ranges at semver(7).

    description

    Put a description in it. It's a string. This helps people discover your package, as it's listed in npm search.

    @@ -161,16 +161,16 @@

    bin

    directories

    The CommonJS Packages spec details a few ways that you can indicate the structure of your package using a directories -hash. If you look at npm's package.json, +object. If you look at npm's package.json, you'll see that it has directories for doc, lib, and man.

    In the future, this information may be used in other creative ways.

    directories.lib

    Tell people where the bulk of your library is. Nothing special is done with the lib folder in any way, but it's useful meta info.

    directories.bin

    -

    If you specify a "bin" directory, then all the files in that folder will -be used as the "bin" hash.

    -

    If you have a "bin" hash already, then this has no effect.

    +

    If you specify a bin directory, then all the files in that folder will +be added as children of the bin path.

    +

    If you have a bin path already, then this has no effect.

    directories.man

    A folder that is full of man pages. Sugar to generate a "man" array by walking the folder.

    @@ -197,37 +197,37 @@

    repository

    directly to a VCS program without any modification. It should not be a url to an html project page that you put in your browser. It's for computers.

    scripts

    -

    The "scripts" member is an object hash of script commands that are run +

    The "scripts" property is a dictionary containing script commands that are run at various times in the lifecycle of your package. The key is the lifecycle event, and the value is the command to run at that point.

    -

    See npm-scripts(7) to find out more about writing package scripts.

    +

    See npm-scripts(7) to find out more about writing package scripts.

    config

    -

    A "config" hash can be used to set configuration -parameters used in package scripts that persist across upgrades. For -instance, if a package had the following:

    +

    A "config" object can be used to set configuration parameters used in package +scripts that persist across upgrades. For instance, if a package had the +following:

    { "name" : "foo"
     , "config" : { "port" : "8080" } }
     

    and then had a "start" command that then referenced the npm_package_config_port environment variable, then the user could override that by doing npm config set foo:port 8001.

    -

    See npm-config(7) and npm-scripts(7) for more on package +

    See npm-config(7) and npm-scripts(7) for more on package configs.

    dependencies

    -

    Dependencies are specified with a simple hash of package name to +

    Dependencies are specified in a simple object that maps a package name to a version range. The version range is a string which has one or more -space-separated descriptors. Dependencies can also be identified with -a tarball or git URL.

    +space-separated descriptors. Dependencies can also be identified with a +tarball or git URL.

    Please do not put test harnesses or transpilers in your -dependencies hash. See devDependencies, below.

    -

    See semver(7) for more details about specifying version ranges.

    +dependencies object. See devDependencies, below.

    +

    See semver(7) for more details about specifying version ranges.

    • version Must match version exactly
    • >version Must be greater than version
    • >=version etc
    • <version
    • <=version
    • -
    • ~version "Approximately equivalent to version" See semver(7)
    • -
    • ^version "Compatible with version" See semver(7)
    • +
    • ~version "Approximately equivalent to version" See semver(7)
    • +
    • ^version "Compatible with version" See semver(7)
    • 1.2.x 1.2.0, 1.2.1, etc., but not 1.3.0
    • http://... See 'URLs as Dependencies' below
    • * Matches any version
    • @@ -236,7 +236,7 @@

      dependencies

    • range1 || range2 Passes if either range1 or range2 are satisfied.
    • git... See 'Git URLs as Dependencies' below
    • user/repo See 'GitHub URLs' below
    • -
    • tag A specific version tagged and published as tag See npm-tag(1)
    • +
    • tag A specific version tagged and published as tag See npm-tag(1)
    • path/path/path See Local Paths below

    For example, these are all valid:

    @@ -252,7 +252,7 @@

    dependencies

    , "two" : "2.x" , "thr" : "3.3.x" , "lat" : "latest" - , "dyl" : "~/projects/dyl" + , "dyl" : "file:../dyl" } }

    URLs as Dependencies

    @@ -278,12 +278,21 @@

    GitHub URLs

    } }

    Local Paths

    -

    As of version 2.0.0 you can provide a path to a local directory that -contains a package. Local paths can be in the form:

    +

    As of version 2.0.0 you can provide a path to a local directory that contains a +package. Local paths can be saved using npm install --save, using any of +these forms:

    ../foo/bar
     ~/foo/bar
     ./foo/bar
     /foo/bar
    +

    in which case they will be normalized to a relative path and added to your +package.json. For example:

    +
    {
    +  "name": "baz",
    +  "dependencies": {
    +    "bar": "file:../foo/bar"
    +  }
    +}
     

    This feature is helpful for local offline development and creating tests that require npm installing where you don't want to hit an external server, but should not be used when publishing packages @@ -292,11 +301,11 @@

    devDependencies

    If someone is planning on downloading and using your module in their program, then they probably don't want or need to download and build the external test or documentation framework that you use.

    -

    In this case, it's best to list these additional items in a -devDependencies hash.

    +

    In this case, it's best to map these additional items in a devDependencies +object.

    These things will be installed when doing npm link or npm install from the root of a package, and can be managed like any other npm -configuration param. See npm-config(7) for more on the topic.

    +configuration param. See npm-config(7) for more on the topic.

    For build steps that are not platform-specific, such as compiling CoffeeScript or other languages to JavaScript, use the prepublish script to do this, and make the required package a devDependency.

    @@ -346,11 +355,11 @@

    bundledDependencies

    Array of package names that will be bundled when publishing the package.

    If this is spelled "bundleDependencies", then that is also honorable.

    optionalDependencies

    -

    If a dependency can be used, but you would like npm to proceed if it -cannot be found or fails to install, then you may put it in the -optionalDependencies hash. This is a map of package name to version -or url, just like the dependencies hash. The difference is that -failure is tolerated.

    +

    If a dependency can be used, but you would like npm to proceed if it cannot be +found or fails to install, then you may put it in the optionalDependencies +object. This is a map of package name to version or url, just like the +dependencies object. The difference is that build failures do not cause +installation to fail.

    It is still your program's responsibility to handle the lack of the dependency. For example, something like this:

    try {
    @@ -385,11 +394,11 @@ 

    engines

    field is advisory only.

    engineStrict

    If you are sure that your module will definitely not run properly on -versions of Node/npm other than those specified in the engines hash, +versions of Node/npm other than those specified in the engines object, then you can set "engineStrict": true in your package.json file. This will override the user's engine-strict config setting.

    Please do not do this unless you are really very very sure. If your -engines hash is something overly restrictive, you can quite easily and +engines object is something overly restrictive, you can quite easily and inadvertently lock yourself into obscurity and prevent your users from updating to new versions of Node. Consider this choice carefully. If people abuse it, it will be removed in a future version of npm.

    @@ -419,11 +428,11 @@

    preferGlobal

    private

    If you set "private": true in your package.json, then npm will refuse to publish it.

    -

    This is a way to prevent accidental publication of private repositories. -If you would like to ensure that a given package is only ever published -to a specific registry (for example, an internal registry), -then use the publishConfig hash described below -to override the registry config param at publish-time.

    +

    This is a way to prevent accidental publication of private repositories. If +you would like to ensure that a given package is only ever published to a +specific registry (for example, an internal registry), then use the +publishConfig dictionary described below to override the registry config +param at publish-time.

    publishConfig

    This is a set of config values that will be used at publish-time. It's especially handy if you want to set the tag or registry, so that you can @@ -431,7 +440,7 @@

    publishConfig

    the global public registry by default.

    Any config values can be overridden, but of course only "tag" and "registry" probably matter for the purposes of publishing.

    -

    See npm-config(7) to see the list of config options that can be +

    See npm-config(7) to see the list of config options that can be overridden.

    DEFAULT VALUES

    npm will default some values based on package contents.

    @@ -453,16 +462,16 @@

    DEFAULT VALUES

    SEE ALSO

    @@ -476,5 +485,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/files/npmrc.html b/deps/npm/html/doc/files/npmrc.html index f1f4817eb34..9f379006f09 100644 --- a/deps/npm/html/doc/files/npmrc.html +++ b/deps/npm/html/doc/files/npmrc.html @@ -15,7 +15,7 @@

    DESCRIPTION

    variables, and npmrc files.

    The npm config command can be used to update and edit the contents of the user and global npmrc files.

    -

    For a list of available configuration options, see npm-config(7).

    +

    For a list of available configuration options, see npm-config(7).

    FILES

    The four relevant files are:

      @@ -55,11 +55,11 @@

      Built-in config file

      manner.

      SEE ALSO

      @@ -73,5 +73,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/files/package.json.html b/deps/npm/html/doc/files/package.json.html index b00032dba98..183ad8ea5d6 100644 --- a/deps/npm/html/doc/files/package.json.html +++ b/deps/npm/html/doc/files/package.json.html @@ -14,7 +14,7 @@

      DESCRIPTION

      This document is all you need to know about what's required in your package.json file. It must be actual JSON, not just a JavaScript object literal.

      A lot of the behavior described in this document is affected by the config -settings described in npm-config(7).

      +settings described in npm-config(7).

      name

      The most important things in your package.json are the name and version fields. Those are actually required, and your package won't install without @@ -35,7 +35,7 @@

      name

      already, before you get too attached to it. http://registry.npmjs.org/

    A name can be optionally prefixed by a scope, e.g. @myorg/mypackage. See -npm-scope(7) for more detail.

    +npm-scope(7) for more detail.

    version

    The most important things in your package.json are the name and version fields. Those are actually required, and your package won't install without @@ -45,7 +45,7 @@

    version

    Version must be parseable by node-semver, which is bundled with npm as a dependency. (npm install semver to use it yourself.)

    -

    More on version numbers and ranges at semver(7).

    +

    More on version numbers and ranges at semver(7).

    description

    Put a description in it. It's a string. This helps people discover your package, as it's listed in npm search.

    @@ -161,16 +161,16 @@

    bin

    directories

    The CommonJS Packages spec details a few ways that you can indicate the structure of your package using a directories -hash. If you look at npm's package.json, +object. If you look at npm's package.json, you'll see that it has directories for doc, lib, and man.

    In the future, this information may be used in other creative ways.

    directories.lib

    Tell people where the bulk of your library is. Nothing special is done with the lib folder in any way, but it's useful meta info.

    directories.bin

    -

    If you specify a "bin" directory, then all the files in that folder will -be used as the "bin" hash.

    -

    If you have a "bin" hash already, then this has no effect.

    +

    If you specify a bin directory, then all the files in that folder will +be added as children of the bin path.

    +

    If you have a bin path already, then this has no effect.

    directories.man

    A folder that is full of man pages. Sugar to generate a "man" array by walking the folder.

    @@ -197,37 +197,37 @@

    repository

    directly to a VCS program without any modification. It should not be a url to an html project page that you put in your browser. It's for computers.

    scripts

    -

    The "scripts" member is an object hash of script commands that are run +

    The "scripts" property is a dictionary containing script commands that are run at various times in the lifecycle of your package. The key is the lifecycle event, and the value is the command to run at that point.

    -

    See npm-scripts(7) to find out more about writing package scripts.

    +

    See npm-scripts(7) to find out more about writing package scripts.

    config

    -

    A "config" hash can be used to set configuration -parameters used in package scripts that persist across upgrades. For -instance, if a package had the following:

    +

    A "config" object can be used to set configuration parameters used in package +scripts that persist across upgrades. For instance, if a package had the +following:

    { "name" : "foo"
     , "config" : { "port" : "8080" } }
     

    and then had a "start" command that then referenced the npm_package_config_port environment variable, then the user could override that by doing npm config set foo:port 8001.

    -

    See npm-config(7) and npm-scripts(7) for more on package +

    See npm-config(7) and npm-scripts(7) for more on package configs.

    dependencies

    -

    Dependencies are specified with a simple hash of package name to +

    Dependencies are specified in a simple object that maps a package name to a version range. The version range is a string which has one or more -space-separated descriptors. Dependencies can also be identified with -a tarball or git URL.

    +space-separated descriptors. Dependencies can also be identified with a +tarball or git URL.

    Please do not put test harnesses or transpilers in your -dependencies hash. See devDependencies, below.

    -

    See semver(7) for more details about specifying version ranges.

    +dependencies object. See devDependencies, below.

    +

    See semver(7) for more details about specifying version ranges.

    • version Must match version exactly
    • >version Must be greater than version
    • >=version etc
    • <version
    • <=version
    • -
    • ~version "Approximately equivalent to version" See semver(7)
    • -
    • ^version "Compatible with version" See semver(7)
    • +
    • ~version "Approximately equivalent to version" See semver(7)
    • +
    • ^version "Compatible with version" See semver(7)
    • 1.2.x 1.2.0, 1.2.1, etc., but not 1.3.0
    • http://... See 'URLs as Dependencies' below
    • * Matches any version
    • @@ -236,7 +236,7 @@

      dependencies

    • range1 || range2 Passes if either range1 or range2 are satisfied.
    • git... See 'Git URLs as Dependencies' below
    • user/repo See 'GitHub URLs' below
    • -
    • tag A specific version tagged and published as tag See npm-tag(1)
    • +
    • tag A specific version tagged and published as tag See npm-tag(1)
    • path/path/path See Local Paths below

    For example, these are all valid:

    @@ -252,7 +252,7 @@

    dependencies

    , "two" : "2.x" , "thr" : "3.3.x" , "lat" : "latest" - , "dyl" : "~/projects/dyl" + , "dyl" : "file:../dyl" } }

    URLs as Dependencies

    @@ -278,12 +278,21 @@

    GitHub URLs

    } }

    Local Paths

    -

    As of version 2.0.0 you can provide a path to a local directory that -contains a package. Local paths can be in the form:

    +

    As of version 2.0.0 you can provide a path to a local directory that contains a +package. Local paths can be saved using npm install --save, using any of +these forms:

    ../foo/bar
     ~/foo/bar
     ./foo/bar
     /foo/bar
    +

    in which case they will be normalized to a relative path and added to your +package.json. For example:

    +
    {
    +  "name": "baz",
    +  "dependencies": {
    +    "bar": "file:../foo/bar"
    +  }
    +}
     

    This feature is helpful for local offline development and creating tests that require npm installing where you don't want to hit an external server, but should not be used when publishing packages @@ -292,11 +301,11 @@

    devDependencies

    If someone is planning on downloading and using your module in their program, then they probably don't want or need to download and build the external test or documentation framework that you use.

    -

    In this case, it's best to list these additional items in a -devDependencies hash.

    +

    In this case, it's best to map these additional items in a devDependencies +object.

    These things will be installed when doing npm link or npm install from the root of a package, and can be managed like any other npm -configuration param. See npm-config(7) for more on the topic.

    +configuration param. See npm-config(7) for more on the topic.

    For build steps that are not platform-specific, such as compiling CoffeeScript or other languages to JavaScript, use the prepublish script to do this, and make the required package a devDependency.

    @@ -346,11 +355,11 @@

    bundledDependencies

    Array of package names that will be bundled when publishing the package.

    If this is spelled "bundleDependencies", then that is also honorable.

    optionalDependencies

    -

    If a dependency can be used, but you would like npm to proceed if it -cannot be found or fails to install, then you may put it in the -optionalDependencies hash. This is a map of package name to version -or url, just like the dependencies hash. The difference is that -failure is tolerated.

    +

    If a dependency can be used, but you would like npm to proceed if it cannot be +found or fails to install, then you may put it in the optionalDependencies +object. This is a map of package name to version or url, just like the +dependencies object. The difference is that build failures do not cause +installation to fail.

    It is still your program's responsibility to handle the lack of the dependency. For example, something like this:

    try {
    @@ -385,11 +394,11 @@ 

    engines

    field is advisory only.

    engineStrict

    If you are sure that your module will definitely not run properly on -versions of Node/npm other than those specified in the engines hash, +versions of Node/npm other than those specified in the engines object, then you can set "engineStrict": true in your package.json file. This will override the user's engine-strict config setting.

    Please do not do this unless you are really very very sure. If your -engines hash is something overly restrictive, you can quite easily and +engines object is something overly restrictive, you can quite easily and inadvertently lock yourself into obscurity and prevent your users from updating to new versions of Node. Consider this choice carefully. If people abuse it, it will be removed in a future version of npm.

    @@ -419,11 +428,11 @@

    preferGlobal

    private

    If you set "private": true in your package.json, then npm will refuse to publish it.

    -

    This is a way to prevent accidental publication of private repositories. -If you would like to ensure that a given package is only ever published -to a specific registry (for example, an internal registry), -then use the publishConfig hash described below -to override the registry config param at publish-time.

    +

    This is a way to prevent accidental publication of private repositories. If +you would like to ensure that a given package is only ever published to a +specific registry (for example, an internal registry), then use the +publishConfig dictionary described below to override the registry config +param at publish-time.

    publishConfig

    This is a set of config values that will be used at publish-time. It's especially handy if you want to set the tag or registry, so that you can @@ -431,7 +440,7 @@

    publishConfig

    the global public registry by default.

    Any config values can be overridden, but of course only "tag" and "registry" probably matter for the purposes of publishing.

    -

    See npm-config(7) to see the list of config options that can be +

    See npm-config(7) to see the list of config options that can be overridden.

    DEFAULT VALUES

    npm will default some values based on package contents.

    @@ -453,16 +462,16 @@

    DEFAULT VALUES

    SEE ALSO

    @@ -476,5 +485,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/index.html b/deps/npm/html/doc/index.html index bae85662626..6c68895e073 100644 --- a/deps/npm/html/doc/index.html +++ b/deps/npm/html/doc/index.html @@ -1,6 +1,6 @@ - npm-index + index @@ -10,217 +10,213 @@

    npm-index

    Index of all npm documentation

    -

    README

    +

    README

    node package manager

    Command Line Documentation

    Using npm on the command line

    -

    npm(1)

    +

    npm(1)

    node package manager

    -

    npm-adduser(1)

    +

    npm-adduser(1)

    Add a registry user account

    -

    npm-bin(1)

    +

    npm-bin(1)

    Display npm bin folder

    -

    npm-bugs(1)

    +

    npm-bugs(1)

    Bugs for a package in a web browser maybe

    -

    npm-build(1)

    +

    npm-build(1)

    Build a package

    -

    npm-bundle(1)

    +

    npm-bundle(1)

    REMOVED

    -

    npm-cache(1)

    +

    npm-cache(1)

    Manipulates packages cache

    -

    npm-completion(1)

    +

    npm-completion(1)

    Tab Completion for npm

    -

    npm-config(1)

    +

    npm-config(1)

    Manage the npm configuration files

    -

    npm-dedupe(1)

    +

    npm-dedupe(1)

    Reduce duplication

    -

    npm-deprecate(1)

    +

    npm-deprecate(1)

    Deprecate a version of a package

    -

    npm-docs(1)

    +

    npm-docs(1)

    Docs for a package in a web browser maybe

    -

    npm-edit(1)

    +

    npm-edit(1)

    Edit an installed package

    -

    npm-explore(1)

    +

    npm-explore(1)

    Browse an installed package

    -

    npm-help-search(1)

    +

    npm-help-search(1)

    Search npm help documentation

    -

    npm-help(1)

    +

    npm-help(1)

    Get help on npm

    -

    npm-init(1)

    +

    npm-init(1)

    Interactively create a package.json file

    -

    npm-install(1)

    +

    npm-install(1)

    Install a package

    - +

    Symlink a package folder

    -

    npm-ls(1)

    +

    npm-ls(1)

    List installed packages

    -

    npm-outdated(1)

    +

    npm-outdated(1)

    Check for outdated packages

    -

    npm-owner(1)

    +

    npm-owner(1)

    Manage package owners

    -

    npm-pack(1)

    +

    npm-pack(1)

    Create a tarball from a package

    -

    npm-prefix(1)

    +

    npm-prefix(1)

    Display prefix

    -

    npm-prune(1)

    +

    npm-prune(1)

    Remove extraneous packages

    -

    npm-publish(1)

    +

    npm-publish(1)

    Publish a package

    -

    npm-rebuild(1)

    +

    npm-rebuild(1)

    Rebuild a package

    -

    npm-repo(1)

    +

    npm-repo(1)

    Open package repository page in the browser

    -

    npm-restart(1)

    +

    npm-restart(1)

    Start a package

    -

    npm-rm(1)

    +

    npm-rm(1)

    Remove a package

    -

    npm-root(1)

    +

    npm-root(1)

    Display npm root

    -

    npm-run-script(1)

    +

    npm-run-script(1)

    Run arbitrary package scripts

    -

    npm-search(1)

    +

    npm-search(1)

    Search for packages

    -

    npm-shrinkwrap(1)

    +

    npm-shrinkwrap(1)

    Lock down dependency versions

    -

    npm-star(1)

    +

    npm-star(1)

    Mark your favorite packages

    -

    npm-stars(1)

    +

    npm-stars(1)

    View packages marked as favorites

    -

    npm-start(1)

    +

    npm-start(1)

    Start a package

    -

    npm-stop(1)

    +

    npm-stop(1)

    Stop a package

    -

    npm-submodule(1)

    -

    Add a package as a git submodule

    -

    npm-tag(1)

    +

    npm-tag(1)

    Tag a published version

    -

    npm-test(1)

    +

    npm-test(1)

    Test a package

    -

    npm-uninstall(1)

    +

    npm-uninstall(1)

    Remove a package

    -

    npm-unpublish(1)

    +

    npm-unpublish(1)

    Remove a package from the registry

    -

    npm-update(1)

    +

    npm-update(1)

    Update a package

    -

    npm-version(1)

    +

    npm-version(1)

    Bump a package version

    -

    npm-view(1)

    +

    npm-view(1)

    View registry info

    -

    npm-whoami(1)

    +

    npm-whoami(1)

    Display npm username

    API Documentation

    Using npm in your Node programs

    -

    npm(3)

    +

    npm(3)

    node package manager

    -

    npm-bin(3)

    +

    npm-bin(3)

    Display npm bin folder

    -

    npm-bugs(3)

    +

    npm-bugs(3)

    Bugs for a package in a web browser maybe

    -

    npm-cache(3)

    +

    npm-cache(3)

    manage the npm cache programmatically

    -

    npm-commands(3)

    +

    npm-commands(3)

    npm commands

    -

    npm-config(3)

    +

    npm-config(3)

    Manage the npm configuration files

    -

    npm-deprecate(3)

    +

    npm-deprecate(3)

    Deprecate a version of a package

    -

    npm-docs(3)

    +

    npm-docs(3)

    Docs for a package in a web browser maybe

    -

    npm-edit(3)

    +

    npm-edit(3)

    Edit an installed package

    -

    npm-explore(3)

    +

    npm-explore(3)

    Browse an installed package

    -

    npm-help-search(3)

    +

    npm-help-search(3)

    Search the help pages

    -

    npm-init(3)

    +

    npm-init(3)

    Interactively create a package.json file

    -

    npm-install(3)

    +

    npm-install(3)

    install a package programmatically

    - +

    Symlink a package folder

    -

    npm-load(3)

    +

    npm-load(3)

    Load config settings

    -

    npm-ls(3)

    +

    npm-ls(3)

    List installed packages

    -

    npm-outdated(3)

    +

    npm-outdated(3)

    Check for outdated packages

    -

    npm-owner(3)

    +

    npm-owner(3)

    Manage package owners

    -

    npm-pack(3)

    +

    npm-pack(3)

    Create a tarball from a package

    -

    npm-prefix(3)

    +

    npm-prefix(3)

    Display prefix

    -

    npm-prune(3)

    +

    npm-prune(3)

    Remove extraneous packages

    -

    npm-publish(3)

    +

    npm-publish(3)

    Publish a package

    -

    npm-rebuild(3)

    +

    npm-rebuild(3)

    Rebuild a package

    -

    npm-repo(3)

    +

    npm-repo(3)

    Open package repository page in the browser

    -

    npm-restart(3)

    +

    npm-restart(3)

    Start a package

    -

    npm-root(3)

    +

    npm-root(3)

    Display npm root

    -

    npm-run-script(3)

    +

    npm-run-script(3)

    Run arbitrary package scripts

    -

    npm-search(3)

    +

    npm-search(3)

    Search for packages

    -

    npm-shrinkwrap(3)

    +

    npm-shrinkwrap(3)

    programmatically generate package shrinkwrap file

    -

    npm-start(3)

    +

    npm-start(3)

    Start a package

    -

    npm-stop(3)

    +

    npm-stop(3)

    Stop a package

    -

    npm-submodule(3)

    -

    Add a package as a git submodule

    -

    npm-tag(3)

    +

    npm-tag(3)

    Tag a published version

    -

    npm-test(3)

    +

    npm-test(3)

    Test a package

    -

    npm-uninstall(3)

    +

    npm-uninstall(3)

    uninstall a package programmatically

    -

    npm-unpublish(3)

    +

    npm-unpublish(3)

    Remove a package from the registry

    -

    npm-update(3)

    +

    npm-update(3)

    Update a package

    -

    npm-version(3)

    +

    npm-version(3)

    Bump a package version

    -

    npm-view(3)

    +

    npm-view(3)

    View registry info

    -

    npm-whoami(3)

    +

    npm-whoami(3)

    Display npm username

    Files

    File system structures npm uses

    -

    npm-folders(5)

    +

    npm-folders(5)

    Folder Structures Used by npm

    -

    npmrc(5)

    +

    npmrc(5)

    The npm config files

    -

    package.json(5)

    +

    package.json(5)

    Specifics of npm's package.json handling

    Misc

    Various other bits and bobs

    -

    npm-coding-style(7)

    +

    npm-coding-style(7)

    npm's "funny" coding style

    -

    npm-config(7)

    +

    npm-config(7)

    More than you probably want to know about npm configuration

    -

    npm-developers(7)

    +

    npm-developers(7)

    Developer Guide

    -

    npm-disputes(7)

    +

    npm-disputes(7)

    Handling Module Name Disputes

    -

    npm-faq(7)

    +

    npm-faq(7)

    Frequently Asked Questions

    -

    npm-index(7)

    +

    npm-index(7)

    Index of all npm documentation

    -

    npm-registry(7)

    +

    npm-registry(7)

    The JavaScript Package Registry

    -

    npm-scope(7)

    +

    npm-scope(7)

    Scoped packages

    -

    npm-scripts(7)

    +

    npm-scripts(7)

    How npm handles the "scripts" field

    -

    removing-npm(7)

    +

    removing-npm(7)

    Cleaning the Slate

    -

    semver(7)

    +

    semver(7)

    The semantic versioner for npm

    @@ -234,5 +230,5 @@

    semver(7)

           - + diff --git a/deps/npm/html/doc/misc/npm-coding-style.html b/deps/npm/html/doc/misc/npm-coding-style.html index 5d94f84bf0e..30d3e07cfab 100644 --- a/deps/npm/html/doc/misc/npm-coding-style.html +++ b/deps/npm/html/doc/misc/npm-coding-style.html @@ -109,11 +109,11 @@

    Logging

    logging the same object over and over again is not helpful. Logs should report what's happening so that it's easier to track down where a fault occurs.

    -

    Use appropriate log levels. See npm-config(7) and search for +

    Use appropriate log levels. See npm-config(7) and search for "loglevel".

    Case, naming, etc.

    Use lowerCamelCase for multiword identifiers when they refer to objects, -functions, methods, members, or anything not specified in this section.

    +functions, methods, properties, or anything not specified in this section.

    Use UpperCamelCase for class names (things that you'd pass to "new").

    Use all-lower-hyphen-css-case for multiword filenames and config keys.

    Use named functions. They make stack traces easier to follow.

    @@ -131,9 +131,9 @@

    null, undefined, false, 0

    Boolean objects are verboten.

    SEE ALSO

    @@ -147,5 +147,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/misc/npm-config.html b/deps/npm/html/doc/misc/npm-config.html index e7696f491ea..249d5934c9e 100644 --- a/deps/npm/html/doc/misc/npm-config.html +++ b/deps/npm/html/doc/misc/npm-config.html @@ -33,7 +33,7 @@

    npmrc Files

  • global config file ($PREFIX/npmrc)
  • npm builtin config file (/path/to/npm/npmrc)
  • -

    See npmrc(5) for more details.

    +

    See npmrc(5) for more details.

    Default Configs

    A set of configuration parameters that are internal to npm, and are defaults if nothing else is specified.

    @@ -79,7 +79,7 @@

    Shorthands and Other CLI Niceties

    Per-Package Config Settings

    -

    When running scripts (see npm-scripts(7)) the package.json "config" +

    When running scripts (see npm-scripts(7)) the package.json "config" keys are overwritten in the environment if there is a config param of <name>[@<version>]:<key>. For example, if the package.json has this:

    @@ -90,7 +90,7 @@

    Shorthands and Other CLI Niceties

    http.createServer(...).listen(process.env.npm_package_config_port)

    then the user could change the behavior by doing:

    npm config set foo:port 80
    -

    See package.json(5) for more information.

    +

    See package.json(5) for more information.

    Config Settings

    always-auth

      @@ -138,7 +138,7 @@

      cache

    • Default: Windows: %AppData%\npm-cache, Posix: ~/.npm
    • Type: path
    -

    The location of npm's cache directory. See npm-cache(1)

    +

    The location of npm's cache directory. See npm-cache(1)

    cache-lock-stale

    • Default: 60000 (1 minute)
    • @@ -285,7 +285,7 @@

      global

    Operates in "global" mode, so that packages are installed into the prefix folder instead of the current working directory. See -npm-folders(5) for more on the differences in behavior.

    +npm-folders(5) for more on the differences in behavior.

    IlG||>&m()vh!j1bs%Xt$;1BU+W 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 0 if there is data available, 0 if libuv is done reading for + now, or < 0 on error. + + The callee is responsible for stopping closing the stream when an error happens + by calling :c:func:`uv_read_stop` or :c:func:`uv_close`. Trying to read + from the stream again is undefined. + + The callee is responsible for freeing the buffer, libuv does not reuse it. + The buffer may be a null buffer (where buf->base=NULL and buf->len=0) on + error. + +.. c:type:: void (*uv_write_cb)(uv_write_t* req, int status) + + Callback called after data was written on a stream. `status` will be 0 in + case of success, < 0 otherwise. + +.. c:type:: void (*uv_connect_cb)(uv_connect_t* req, int status) + + Callback called after a connection started by :c:func:`uv_connect` is done. + `status` will be 0 in case of success, < 0 otherwise. + +.. c:type:: void (*uv_shutdown_cb)(uv_shutdown_t* req, int status) + + Callback called after s shutdown request has been completed. `status` will + be 0 in case of success, < 0 otherwise. + +.. c:type:: void (*uv_connection_cb)(uv_stream_t* server, int status) + + Callback called when a stream server has received an incoming connection. + The user can accept the connection by calling :c:func:`uv_accept`. + `status` will de 0 in case of success, < 0 otherwise. + + +Public members +^^^^^^^^^^^^^^ + +.. c:member:: size_t uv_stream_t.write_queue_size + + Contains the amount of queued bytes waiting to be sent. Readonly. + +.. seealso:: The :c:type:`uv_handle_t` members also apply. + + +API +--- + +.. c:function:: int uv_shutdown(uv_shutdown_t* req, uv_stream_t* handle, uv_shutdown_cb cb) + + Shutdown the outgoing (write) side of a duplex stream. It waits for pending + write requests to complete. The `handle` should refer to a initialized stream. + `req` should be an uninitialized shutdown request struct. The `cb` is called + after shutdown is complete. + +.. c:function:: int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb) + + Start listening for incoming connections. `backlog` indicates the number of + connections the kernel might queue, same as ``listen(2)``. When a new + incoming connection is received the :c:type:`uv_connection_cb` callback is + called. + +.. c:function:: int uv_accept(uv_stream_t* server, uv_stream_t* client) + + This call is used in conjunction with :c:func:`uv_listen` to accept incoming + connections. Call this function after receiving a :c:type:`uv_connection_cb` + to accept the connection. Before calling this function the client handle must + be initialized. < 0 return value indicates an error. + + When the :c:type:`uv_connection_cb` callback is called it is guaranteed that + this function will complete successfully the first time. If you attempt to use + it more than once, it may fail. It is suggested to only call this function once + per :c:type:`uv_connection_cb` call. + + .. note:: + `server` and `client` must be handles running on the same loop. + +.. c:function:: int uv_read_start(uv_stream_t*, uv_alloc_cb alloc_cb, uv_read_cb read_cb) + + Read data from an incoming stream. The callback will be made several + times until there is no more data to read or :c:func:`uv_read_stop` is called. + When we've reached EOF `nread` will be set to ``UV_EOF``. + + When `nread` < 0, the `buf` parameter might not point to a valid buffer; + in that case `buf.len` and `buf.base` are both set to 0. + + .. note:: + `nread` might also be 0, which does *not* indicate an error or EOF, it happens when + libuv requested a buffer through the alloc callback but then decided that it didn't + need that buffer. + +.. c:function:: int uv_read_stop(uv_stream_t*) + + Stop reading data from the stream. The :c:type:`uv_read_cb` callback will + no longer be called. + +.. c:function:: int uv_write(uv_write_t* req, uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb) + + Write data to stream. Buffers are written in order. Example: + + :: + + uv_buf_t a[] = { + { .base = "1", .len = 1 }, + { .base = "2", .len = 1 } + }; + + uv_buf_t b[] = { + { .base = "3", .len = 1 }, + { .base = "4", .len = 1 } + }; + + uv_write_t req1; + uv_write_t req2; + + /* writes "1234" */ + uv_write(&req1, stream, a, 2); + uv_write(&req2, stream, b, 2); + +.. c:function:: int uv_write2(uv_write_t* req, uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_stream_t* send_handle, uv_write_cb cb) + + Extended write function for sending handles over a pipe. The pipe must be + initialized with `ipc` == 1. + + .. note:: + `send_handle` must be a TCP socket or pipe, which is a server or a connection (listening + or connected state). Bound sockets or pipes will be assumed to be servers. + +.. c:function:: int uv_try_write(uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs) + + Same as :c:func:`uv_write`, but won't queue a write request if it can't be + completed immediately. + + Will return either: + + * > 0: number of bytes written (can be less than the supplied buffer size). + * < 0: negative error code (``UV_EAGAIN`` is returned if no data can be sent + immediately). + +.. c:function:: int uv_is_readable(const uv_stream_t* handle) + + Returns 1 if the stream is readable, 0 otherwise. + +.. c:function:: int uv_is_writable(const uv_stream_t* handle) + + Returns 1 if the stream is writable, 0 otherwise. + +.. c:function:: int uv_stream_set_blocking(uv_stream_t* handle, int blocking) + + Enable or disable blocking mode for a stream. + + When blocking mode is enabled all writes complete synchronously. The + interface remains unchanged otherwise, e.g. completion or failure of the + operation will still be reported through a callback which is made + asychronously. + + .. warning:: + Relying too much on this API is not recommended. It is likely to change + significantly in the future. + + Currently this only works on Windows and only for + :c:type:`uv_pipe_t` handles. + + Also libuv currently makes no ordering guarantee when the blocking mode + is changed after write requests have already been submitted. Therefore it is + recommended to set the blocking mode immediately after opening or creating + the stream. + +.. seealso:: The :c:type:`uv_handle_t` API functions also apply. diff --git a/deps/uv/docs/src/tcp.rst b/deps/uv/docs/src/tcp.rst new file mode 100644 index 00000000000..2c1001b531f --- /dev/null +++ b/deps/uv/docs/src/tcp.rst @@ -0,0 +1,97 @@ + +.. _tcp: + +:c:type:`uv_tcp_t` --- TCP handle +================================= + +TCP handles are used to represent both TCP streams and servers. + +:c:type:`uv_tcp_t` is a 'subclass' of :c:type:`uv_stream_t`. + + +Data types +---------- + +.. c:type:: uv_tcp_t + + TCP handle type. + + +Public members +^^^^^^^^^^^^^^ + +N/A + +.. seealso:: The :c:type:`uv_stream_t` members also apply. + + +API +--- + +.. c:function:: int uv_tcp_init(uv_loop_t*, uv_tcp_t* handle) + + Initialize the handle. + +.. c:function:: int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock) + + Open an existing file descriptor or SOCKET as a TCP handle. + + .. note:: + The user is responsible for setting the file descriptor in + non-blocking mode. + +.. c:function:: int uv_tcp_nodelay(uv_tcp_t* handle, int enable) + + Enable / disable Nagle's algorithm. + +.. c:function:: int uv_tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay) + + Enable / disable TCP keep-alive. `delay` is the initial delay in seconds, + ignored when `enable` is zero. + +.. c:function:: int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable) + + Enable / disable simultaneous asynchronous accept requests that are + queued by the operating system when listening for new TCP connections. + + This setting is used to tune a TCP server for the desired performance. + Having simultaneous accepts can significantly improve the rate of accepting + connections (which is why it is enabled by default) but may lead to uneven + load distribution in multi-process setups. + +.. c:function:: int uv_tcp_bind(uv_tcp_t* handle, const struct sockaddr* addr, unsigned int flags) + + Bind the handle to an address and port. `addr` should point to an + initialized ``struct sockaddr_in`` or ``struct sockaddr_in6``. + + When the port is already taken, you can expect to see an ``UV_EADDRINUSE`` + error from either :c:func:`uv_tcp_bind`, :c:func:`uv_listen` or + :c:func:`uv_tcp_connect`. That is, a successful call to this function does + not guarantee that the call to :c:func:`uv_listen` or :c:func:`uv_tcp_connect` + will succeed as well. + + `flags` con contain ``UV_TCP_IPV6ONLY``, in which case dual-stack support + is disabled and only IPv6 is used. + +.. c:function:: int uv_tcp_getsockname(const uv_tcp_t* handle, struct sockaddr* name, int* namelen) + + Get the current address to which the handle is bound. `addr` must point to + a valid and big enough chunk of memory, ``struct sockaddr_storage`` is + recommended for IPv4 and IPv6 support. + +.. c:function:: int uv_tcp_getpeername(const uv_tcp_t* handle, struct sockaddr* name, int* namelen) + + Get the address of the peer connected to the handle. `addr` must point to + a valid and big enough chunk of memory, ``struct sockaddr_storage`` is + recommended for IPv4 and IPv6 support. + +.. c:function:: int uv_tcp_connect(uv_connect_t* req, uv_tcp_t* handle, const struct sockaddr* addr, uv_connect_cb cb) + + Establish an IPv4 or IPv6 TCP connection. Provide an initialized TCP handle + and an uninitialized :c:type:`uv_connect_t`. `addr` should point to an + initialized ``struct sockaddr_in`` or ``struct sockaddr_in6``. + + The callback is made when the connection has been established or when a + connection error happened. + +.. seealso:: The :c:type:`uv_stream_t` API functions also apply. diff --git a/deps/uv/docs/src/threading.rst b/deps/uv/docs/src/threading.rst new file mode 100644 index 00000000000..38daf4e5a17 --- /dev/null +++ b/deps/uv/docs/src/threading.rst @@ -0,0 +1,156 @@ + +.. _threading: + +Threading and synchronization utilities +======================================= + +libuv provides cross-platform implementations for multiple threading and +synchronization primitives. The API largely follows the pthreads API. + + +Data types +---------- + +.. c:type:: uv_thread_t + + Thread data type. + +.. c:type:: void (*uv_thread_cb)(void* arg) + + Callback that is invoked to initialize thread execution. `arg` is the same + value that was passed to :c:func:`uv_thread_create`. + +.. c:type:: uv_key_t + + Thread-local key data type. + +.. c:type:: uv_once_t + + Once-only initializer data type. + +.. c:type:: uv_mutex_t + + Mutex data type. + +.. c:type:: uv_rwlock_t + + Read-write lock data type. + +.. c:type:: uv_sem_t + + Semaphore data type. + +.. c:type:: uv_cond_t + + Condition data type. + +.. c:type:: uv_barrier_t + + Barrier data type. + + +API +--- + +Threads +^^^^^^^ + +.. c:function:: int uv_thread_create(uv_thread_t* tid, uv_thread_cb entry, void* arg) +.. c:function:: unsigned long uv_thread_self(void) +.. c:function:: int uv_thread_join(uv_thread_t *tid) + +Thread-local storage +^^^^^^^^^^^^^^^^^^^^ + +.. note:: + The total thread-local storage size may be limited. That is, it may not be possible to + create many TLS keys. + +.. c:function:: int uv_key_create(uv_key_t* key) +.. c:function:: void uv_key_delete(uv_key_t* key) +.. c:function:: void* uv_key_get(uv_key_t* key) +.. c:function:: void uv_key_set(uv_key_t* key, void* value) + +Once-only initialization +^^^^^^^^^^^^^^^^^^^^^^^^ + +Runs a function once and only once. Concurrent calls to :c:func:`uv_once` with the +same guard will block all callers except one (it's unspecified which one). +The guard should be initialized statically with the UV_ONCE_INIT macro. + +.. c:function:: void uv_once(uv_once_t* guard, void (*callback)(void)) + +Mutex locks +^^^^^^^^^^^ + +Functions return 0 on success or an error code < 0 (unless the +return type is void, of course). + +.. c:function:: int uv_mutex_init(uv_mutex_t* handle) +.. c:function:: void uv_mutex_destroy(uv_mutex_t* handle) +.. c:function:: void uv_mutex_lock(uv_mutex_t* handle) +.. c:function:: int uv_mutex_trylock(uv_mutex_t* handle) +.. c:function:: void uv_mutex_unlock(uv_mutex_t* handle) + +Read-write locks +^^^^^^^^^^^^^^^^ + +Functions return 0 on success or an error code < 0 (unless the +return type is void, of course). + +.. c:function:: int uv_rwlock_init(uv_rwlock_t* rwlock) +.. c:function:: void uv_rwlock_destroy(uv_rwlock_t* rwlock) +.. c:function:: void uv_rwlock_rdlock(uv_rwlock_t* rwlock) +.. c:function:: int uv_rwlock_tryrdlock(uv_rwlock_t* rwlock) +.. c:function:: void uv_rwlock_rdunlock(uv_rwlock_t* rwlock) +.. c:function:: void uv_rwlock_wrlock(uv_rwlock_t* rwlock) +.. c:function:: int uv_rwlock_trywrlock(uv_rwlock_t* rwlock) +.. c:function:: void uv_rwlock_wrunlock(uv_rwlock_t* rwlock) + +Semaphores +^^^^^^^^^^ + +Functions return 0 on success or an error code < 0 (unless the +return type is void, of course). + +.. c:function:: int uv_sem_init(uv_sem_t* sem, unsigned int value) +.. c:function:: void uv_sem_destroy(uv_sem_t* sem) +.. c:function:: void uv_sem_post(uv_sem_t* sem) +.. c:function:: void uv_sem_wait(uv_sem_t* sem) +.. c:function:: int uv_sem_trywait(uv_sem_t* sem) + +Conditions +^^^^^^^^^^ + +Functions return 0 on success or an error code < 0 (unless the +return type is void, of course). + +.. note:: + Callers should be prepared to deal with spurious wakeups on :c:func:`uv_cond_wait` and + :c:func:`uv_cond_timedwait`. + +.. c:function:: int uv_cond_init(uv_cond_t* cond) +.. c:function:: void uv_cond_destroy(uv_cond_t* cond) +.. c:function:: void uv_cond_signal(uv_cond_t* cond) +.. c:function:: void uv_cond_broadcast(uv_cond_t* cond) +.. c:function:: void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex) +.. c:function:: int uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout) + +Barriers +^^^^^^^^ + +Functions return 0 on success or an error code < 0 (unless the +return type is void, of course). + +.. note:: + :c:func:`uv_barrier_wait` returns a value > 0 to an arbitrarily chosen "serializer" thread + to facilitate cleanup, i.e. + + :: + + if (uv_barrier_wait(&barrier) > 0) + uv_barrier_destroy(&barrier); + +.. c:function:: int uv_barrier_init(uv_barrier_t* barrier, unsigned int count) +.. c:function:: void uv_barrier_destroy(uv_barrier_t* barrier) +.. c:function:: int uv_barrier_wait(uv_barrier_t* barrier) diff --git a/deps/uv/docs/src/threadpool.rst b/deps/uv/docs/src/threadpool.rst new file mode 100644 index 00000000000..875bb36aeab --- /dev/null +++ b/deps/uv/docs/src/threadpool.rst @@ -0,0 +1,59 @@ + +.. _threadpool: + +Thread pool work scheduling +=========================== + +libuv provides a threadpool which can be used to run user code and get notified +in the loop thread. This thread pool is internally used to run al filesystem +operations, as well as getaddrinfo and getnameinfo requests. + +Its default size is 4, but it can be changed at startup time by setting the +``UV_THREADPOOL_SIZE`` environment variable to any value (the absolute maximum +is 128). + +The threadpool is global and shared across all event loops. + + +Data types +---------- + +.. c:type:: uv_work_t + + Work request type. + +.. c:type:: void (*uv_work_cb)(uv_work_t* req) + + Callback passed to :c:func:`uv_queue_work` which will be run on the thread + pool. + +.. c:type:: void (*uv_after_work_cb)(uv_work_t* req, int status) + + Callback passed to :c:func:`uv_queue_work` which will be called on the loop + thread after the work on the threadpool has been completed. If the work + was cancelled using :c:func:`uv_cancel` `status` will be ``UV_ECANCELED``. + + +Public members +^^^^^^^^^^^^^^ + +.. c:member:: uv_loop_t* uv_work_t.loop + + Loop that started this request and where completion will be reported. + Readonly. + +.. seealso:: The :c:type:`uv_req_t` members also apply. + + +API +--- + +.. c:function:: int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb, uv_after_work_cb after_work_cb) + + Initializes a work request which will run the given `work_cb` in a thread + from the threadpool. Once `work_cb` is completed, `after_work_cb` will be + called on the loop thread. + + This request can be cancelled with :c:func:`uv_cancel`. + +.. seealso:: The :c:type:`uv_req_t` API functions also apply. diff --git a/deps/uv/docs/src/timer.rst b/deps/uv/docs/src/timer.rst new file mode 100644 index 00000000000..e558704cb20 --- /dev/null +++ b/deps/uv/docs/src/timer.rst @@ -0,0 +1,68 @@ + +.. _timer: + +:c:type:`uv_timer_t` --- Timer handle +===================================== + +Timer handles are used to schedule callbacks to be called in the future. + + +Data types +---------- + +.. c:type:: uv_timer_t + + Timer handle type. + +.. c:type:: void (*uv_timer_cb)(uv_timer_t* handle) + + Type definition for callback passed to :c:func:`uv_timer_start`. + + +Public members +^^^^^^^^^^^^^^ + +N/A + +.. seealso:: The :c:type:`uv_handle_t` members also apply. + + +API +--- + +.. c:function:: int uv_timer_init(uv_loop_t* loop, uv_timer_t* handle) + + Initialize the handle. + +.. c:function:: int uv_timer_start(uv_timer_t* handle, uv_timer_cb cb, uint64_t timeout, uint64_t repeat) + + Start the timer. `timeout` and `repeat` are in milliseconds. + + If `timeout` is zero, the callback fires on the next event loop iteration. + If `repeat` is non-zero, the callback fires first after `timeout` + milliseconds and then repeatedly after `repeat` milliseconds. + +.. c:function:: int uv_timer_stop(uv_timer_t* handle) + + Stop the timer, the callback will not be called anymore. + +.. c:function:: int uv_timer_again(uv_timer_t* handle) + + Stop the timer, and if it is repeating restart it using the repeat value + as the timeout. If the timer has never been started before it returns + UV_EINVAL. + +.. c:function:: void uv_timer_set_repeat(uv_timer_t* handle, uint64_t repeat) + + Set the repeat value in milliseconds. + + .. note:: + If the repeat value is set from a timer callback it does not immediately take effect. + If the timer was non-repeating before, it will have been stopped. If it was repeating, + then the old repeat value will have been used to schedule the next timeout. + +.. c:function:: uint64_t uv_timer_get_repeat(const uv_timer_t* handle) + + Get the timer repeat value. + +.. seealso:: The :c:type:`uv_handle_t` API functions also apply. diff --git a/deps/uv/docs/src/tty.rst b/deps/uv/docs/src/tty.rst new file mode 100644 index 00000000000..8cb00663203 --- /dev/null +++ b/deps/uv/docs/src/tty.rst @@ -0,0 +1,63 @@ + +.. _tty: + +:c:type:`uv_tty_t` --- TTY handle +================================= + +TTY handles represent a stream for the console. + +:c:type:`uv_tty_t` is a 'subclass' of :c:type:`uv_stream_t`. + + +Data types +---------- + +.. c:type:: uv_tty_t + + TTY handle type. + + +Public members +^^^^^^^^^^^^^^ + +N/A + +.. seealso:: The :c:type:`uv_stream_t` members also apply. + + +API +--- + +.. c:function:: int uv_tty_init(uv_loop_t*, uv_tty_t*, uv_file fd, int readable) + + Initialize a new TTY stream with the given file descriptor. Usually the + file descriptor will be: + + * 0 = stdin + * 1 = stdout + * 2 = stderr + + `readable`, specifies if you plan on calling :c:func:`uv_read_start` with + this stream. stdin is readable, stdout is not. + + .. note:: + TTY streams which are not readable have blocking writes. + +.. c:function:: int uv_tty_set_mode(uv_tty_t*, int mode) + + Set the TTY mode. 0 for normal, 1 for raw. + +.. c:function:: int uv_tty_reset_mode(void) + + To be called when the program exits. Resets TTY settings to default + values for the next process to take over. + + This function is async signal-safe on Unix platforms but can fail with error + code ``UV_EBUSY`` if you call it when execution is inside + :c:func:`uv_tty_set_mode`. + +.. c:function:: int uv_tty_get_winsize(uv_tty_t*, int* width, int* height) + + Gets the current Window size. On success it returns 0. + +.. seealso:: The :c:type:`uv_stream_t` API functions also apply. diff --git a/deps/uv/docs/src/udp.rst b/deps/uv/docs/src/udp.rst new file mode 100644 index 00000000000..175ce07a2db --- /dev/null +++ b/deps/uv/docs/src/udp.rst @@ -0,0 +1,280 @@ + +.. _udp: + +:c:type:`uv_udp_t` --- UDP handle +================================= + +UDP handles encapsulate UDP communication for both clients and servers. + + +Data types +---------- + +.. c:type:: uv_udp_t + + UDP handle type. + +.. c:type:: uv_udp_send_t + + UDP send request type. + +.. c:type:: uv_udp_flags + + Flags used in :c:func:`uv_udp_bind` and :c:type:`uv_udp_recv_cb`.. + + :: + + enum uv_udp_flags { + /* Disables dual stack mode. */ + UV_UDP_IPV6ONLY = 1, + /* + * Indicates message was truncated because read buffer was too small. The + * remainder was discarded by the OS. Used in uv_udp_recv_cb. + */ + UV_UDP_PARTIAL = 2, + /* + * Indicates if SO_REUSEADDR will be set when binding the handle in + * uv_udp_bind. + * This sets the SO_REUSEPORT socket flag on the BSDs and OS X. On other + * Unix platforms, it sets the SO_REUSEADDR flag. What that means is that + * multiple threads or processes can bind to the same address without error + * (provided they all set the flag) but only the last one to bind will receive + * any traffic, in effect "stealing" the port from the previous listener. + */ + UV_UDP_REUSEADDR = 4 + }; + +.. c:type:: void (*uv_udp_send_cb)(uv_udp_send_t* req, int status) + + Type definition for callback passed to :c:func:`uv_udp_send`, which is + called after the data was sent. + +.. c:type:: void (*uv_udp_recv_cb)(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags) + + Type definition for callback passed to :c:func:`uv_udp_recv_start`, which + is called when the endpoint receives data. + + * `handle`: UDP handle + * `nread`: Number of bytes that have been received. + 0 if there is no more data to read. You may discard or repurpose + the read buffer. Note that 0 may also mean that an empty datagram + was received (in this case `addr` is not NULL). < 0 if a transmission + error was detected. + * `buf`: :c:type:`uv_buf_t` with the received data. + * `addr`: ``struct sockaddr*`` containing the address of the sender. + Can be NULL. Valid for the duration of the callback only. + * `flags`: One or more or'ed UV_UDP_* constants. Right now only + ``UV_UDP_PARTIAL`` is used. + + .. note:: + The receive callback will be called with `nread` == 0 and `addr` == NULL when there is + nothing to read, and with `nread` == 0 and `addr` != NULL when an empty UDP packet is + received. + +.. c:type:: uv_membership + + Membership type for a multicast address. + + :: + + typedef enum { + UV_LEAVE_GROUP = 0, + UV_JOIN_GROUP + } uv_membership; + + +Public members +^^^^^^^^^^^^^^ + +.. c:member:: size_t uv_udp_t.send_queue_size + + Number of bytes queued for sending. This field strictly shows how much + information is currently queued. + +.. c:member:: size_t uv_udp_t.send_queue_count + + Number of send requests currently in the queue awaiting to be processed. + +.. c:member:: uv_udp_t* uv_udp_send_t.handle + + UDP handle where this send request is taking place. + +.. seealso:: The :c:type:`uv_handle_t` members also apply. + + +API +--- + +.. c:function:: int uv_udp_init(uv_loop_t*, uv_udp_t* handle) + + Initialize a new UDP handle. The actual socket is created lazily. + Returns 0 on success. + +.. c:function:: int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock) + + Opens an existing file descriptor or Windows SOCKET as a UDP handle. + + Unix only: + The only requirement of the `sock` argument is that it follows the datagram + contract (works in unconnected mode, supports sendmsg()/recvmsg(), etc). + In other words, other datagram-type sockets like raw sockets or netlink + sockets can also be passed to this function. + +.. c:function:: int uv_udp_bind(uv_udp_t* handle, const struct sockaddr* addr, unsigned int flags) + + Bind the UDP handle to an IP address and port. + + :param handle: UDP handle. Should have been initialized with + :c:func:`uv_udp_init`. + + :param addr: `struct sockaddr_in` or `struct sockaddr_in6` + with the address and port to bind to. + + :param flags: Indicate how the socket will be bound, + ``UV_UDP_IPV6ONLY`` and ``UV_UDP_REUSEADDR`` are supported. + + :returns: 0 on success, or an error code < 0 on failure. + +.. c:function:: int uv_udp_getsockname(const uv_udp_t* handle, struct sockaddr* name, int* namelen) + + Get the local IP and port of the UDP handle. + + :param handle: UDP handle. Should have been initialized with + :c:func:`uv_udp_init` and bound. + + :param name: Pointer to the structure to be filled with the address data. + In order to support IPv4 and IPv6 `struct sockaddr_storage` should be + used. + + :param namelen: On input it indicates the data of the `name` field. On + output it indicates how much of it was filled. + + :returns: 0 on success, or an error code < 0 on failure. + +.. c:function:: int uv_udp_set_membership(uv_udp_t* handle, const char* multicast_addr, const char* interface_addr, uv_membership membership) + + Set membership for a multicast address + + :param handle: UDP handle. Should have been initialized with + :c:func:`uv_udp_init`. + + :param multicast_addr: Multicast address to set membership for. + + :param interface_addr: Interface address. + + :param membership: Should be ``UV_JOIN_GROUP`` or ``UV_LEAVE_GROUP``. + + :returns: 0 on success, or an error code < 0 on failure. + +.. c:function:: int uv_udp_set_multicast_loop(uv_udp_t* handle, int on) + + Set IP multicast loop flag. Makes multicast packets loop back to + local sockets. + + :param handle: UDP handle. Should have been initialized with + :c:func:`uv_udp_init`. + + :param on: 1 for on, 0 for off. + + :returns: 0 on success, or an error code < 0 on failure. + +.. c:function:: int uv_udp_set_multicast_ttl(uv_udp_t* handle, int ttl) + + Set the multicast ttl. + + :param handle: UDP handle. Should have been initialized with + :c:func:`uv_udp_init`. + + :param ttl: 1 through 255. + + :returns: 0 on success, or an error code < 0 on failure. + +.. c:function:: int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr) + + Set the multicast interface to send or receive data on. + + :param handle: UDP handle. Should have been initialized with + :c:func:`uv_udp_init`. + + :param interface_addr: interface address. + + :returns: 0 on success, or an error code < 0 on failure. + +.. c:function:: int uv_udp_set_broadcast(uv_udp_t* handle, int on) + + Set broadcast on or off. + + :param handle: UDP handle. Should have been initialized with + :c:func:`uv_udp_init`. + + :param on: 1 for on, 0 for off. + + :returns: 0 on success, or an error code < 0 on failure. + +.. c:function:: int uv_udp_set_ttl(uv_udp_t* handle, int ttl) + + Set the time to live. + + :param handle: UDP handle. Should have been initialized with + :c:func:`uv_udp_init`. + + :param ttl: 1 through 255. + + :returns: 0 on success, or an error code < 0 on failure. + +.. c:function:: int uv_udp_send(uv_udp_send_t* req, uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, uv_udp_send_cb send_cb) + + Send data over the UDP socket. If the socket has not previously been bound + with :c:func:`uv_udp_bind` it will be bound to 0.0.0.0 + (the "all interfaces" IPv4 address) and a random port number. + + :param req: UDP request handle. Need not be initialized. + + :param handle: UDP handle. Should have been initialized with + :c:func:`uv_udp_init`. + + :param bufs: List of buffers to send. + + :param nbufs: Number of buffers in `bufs`. + + :param addr: `struct sockaddr_in` or `struct sockaddr_in6` with the + address and port of the remote peer. + + :param send_cb: Callback to invoke when the data has been sent out. + + :returns: 0 on success, or an error code < 0 on failure. + +.. c:function:: int uv_udp_try_send(uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr) + + Same as :c:func:`uv_udp_send`, but won't queue a send request if it can't + be completed immediately. + + :returns: >= 0: number of bytes sent (it matches the given buffer size). + < 0: negative error code (``UV_EAGAIN`` is returned when the message + can't be sent immediately). + +.. c:function:: int uv_udp_recv_start(uv_udp_t* handle, uv_alloc_cb alloc_cb, uv_udp_recv_cb recv_cb) + + Prepare for receiving data. If the socket has not previously been bound + with :c:func:`uv_udp_bind` it is bound to 0.0.0.0 (the "all interfaces" + IPv4 address) and a random port number. + + :param handle: UDP handle. Should have been initialized with + :c:func:`uv_udp_init`. + + :param alloc_cb: Callback to invoke when temporary storage is needed. + + :param recv_cb: Callback to invoke with received data. + + :returns: 0 on success, or an error code < 0 on failure. + +.. c:function:: int uv_udp_recv_stop(uv_udp_t* handle) + + Stop listening for incoming datagrams. + + :param handle: UDP handle. Should have been initialized with + :c:func:`uv_udp_init`. + + :returns: 0 on success, or an error code < 0 on failure. + +.. seealso:: The :c:type:`uv_handle_t` API functions also apply. diff --git a/deps/uv/include/uv-errno.h b/deps/uv/include/uv-errno.h index 00b48609a9a..c34132795cd 100644 --- a/deps/uv/include/uv-errno.h +++ b/deps/uv/include/uv-errno.h @@ -57,12 +57,6 @@ # define UV__EACCES (-4092) #endif -#if defined(EADDRINFO) && !defined(_WIN32) -# define UV__EADDRINFO EADDRINFO -#else -# define UV__EADDRINFO (-4091) -#endif - #if defined(EADDRINUSE) && !defined(_WIN32) # define UV__EADDRINUSE (-EADDRINUSE) #else diff --git a/deps/uv/include/uv-unix.h b/deps/uv/include/uv-unix.h index bbaaefc3ed1..e72492564db 100644 --- a/deps/uv/include/uv-unix.h +++ b/deps/uv/include/uv-unix.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -117,13 +118,14 @@ struct uv__async { #endif /* Note: May be cast to struct iovec. See writev(2). */ -typedef struct { +typedef struct uv_buf_t { char* base; size_t len; } uv_buf_t; typedef int uv_file; typedef int uv_os_sock_t; +typedef int uv_os_fd_t; #define UV_ONCE_INIT PTHREAD_ONCE_INIT @@ -155,6 +157,47 @@ typedef pthread_barrier_t uv_barrier_t; typedef gid_t uv_gid_t; typedef uid_t uv_uid_t; +typedef struct dirent uv__dirent_t; + +#if defined(DT_UNKNOWN) +# define HAVE_DIRENT_TYPES +# if defined(DT_REG) +# define UV__DT_FILE DT_REG +# else +# define UV__DT_FILE -1 +# endif +# if defined(DT_DIR) +# define UV__DT_DIR DT_DIR +# else +# define UV__DT_DIR -2 +# endif +# if defined(DT_LNK) +# define UV__DT_LINK DT_LNK +# else +# define UV__DT_LINK -3 +# endif +# if defined(DT_FIFO) +# define UV__DT_FIFO DT_FIFO +# else +# define UV__DT_FIFO -4 +# endif +# if defined(DT_SOCK) +# define UV__DT_SOCKET DT_SOCK +# else +# define UV__DT_SOCKET -5 +# endif +# if defined(DT_CHR) +# define UV__DT_CHAR DT_CHR +# else +# define UV__DT_CHAR -6 +# endif +# if defined(DT_BLK) +# define UV__DT_BLOCK DT_BLK +# else +# define UV__DT_BLOCK -7 +# endif +#endif + /* Platform-specific definitions for uv_dlopen support. */ #define UV_DYNAMIC /* empty */ @@ -176,7 +219,7 @@ typedef struct { uv_async_t wq_async; \ uv_rwlock_t cloexec_lock; \ uv_handle_t* closing_handles; \ - void* process_handles[1][2]; \ + void* process_handles[2]; \ void* prepare_handles[2]; \ void* check_handles[2]; \ void* idle_handles[2]; \ diff --git a/deps/uv/include/uv-version.h b/deps/uv/include/uv-version.h index d33c8f8bde7..a95f48b4946 100644 --- a/deps/uv/include/uv-version.h +++ b/deps/uv/include/uv-version.h @@ -23,16 +23,17 @@ #define UV_VERSION_H /* - * Versions with an even minor version (e.g. 0.6.1 or 1.0.4) are API and ABI - * stable. When the minor version is odd, the API can change between patch - * releases. Make sure you update the -soname directives in configure.ac + * Versions with the same major number are ABI stable. API is allowed to + * evolve between minor releases, but only in a backwards compatible way. + * Make sure you update the -soname directives in configure.ac * and uv.gyp whenever you bump UV_VERSION_MAJOR or UV_VERSION_MINOR (but * not UV_VERSION_PATCH.) */ -#define UV_VERSION_MAJOR 0 -#define UV_VERSION_MINOR 11 -#define UV_VERSION_PATCH 28 +#define UV_VERSION_MAJOR 1 +#define UV_VERSION_MINOR 0 +#define UV_VERSION_PATCH 0 #define UV_VERSION_IS_RELEASE 1 +#define UV_VERSION_SUFFIX "rc1" #endif /* UV_VERSION_H */ diff --git a/deps/uv/include/uv-win.h b/deps/uv/include/uv-win.h index 136b0b45de5..293b41d08ca 100644 --- a/deps/uv/include/uv-win.h +++ b/deps/uv/include/uv-win.h @@ -39,6 +39,20 @@ typedef struct pollfd { } WSAPOLLFD, *PWSAPOLLFD, *LPWSAPOLLFD; #endif +#ifndef LOCALE_INVARIANT +# define LOCALE_INVARIANT 0x007f +#endif + +#ifndef _malloca +# if defined(_DEBUG) +# define _malloca(size) malloc(size) +# define _freea(ptr) free(ptr) +# else +# define _malloca(size) alloca(size) +# define _freea(ptr) +# endif +#endif + #include #include #include @@ -215,8 +229,8 @@ typedef struct uv_buf_t { } uv_buf_t; typedef int uv_file; - typedef SOCKET uv_os_sock_t; +typedef HANDLE uv_os_fd_t; typedef HANDLE uv_thread_t; @@ -275,6 +289,19 @@ typedef struct uv_once_s { typedef unsigned char uv_uid_t; typedef unsigned char uv_gid_t; +typedef struct uv__dirent_s { + int d_type; + char d_name[1]; +} uv__dirent_t; + +#define UV__DT_DIR UV_DIRENT_DIR +#define UV__DT_FILE UV_DIRENT_FILE +#define UV__DT_LINK UV_DIRENT_LINK +#define UV__DT_FIFO UV_DIRENT_FIFO +#define UV__DT_SOCKET UV_DIRENT_SOCKET +#define UV__DT_CHAR UV_DIRENT_CHAR +#define UV__DT_BLOCK UV_DIRENT_BLOCK + /* Platform-specific definitions for uv_dlopen support. */ #define UV_DYNAMIC FAR WINAPI typedef struct { @@ -289,8 +316,6 @@ RB_HEAD(uv_timer_tree_s, uv_timer_s); HANDLE iocp; \ /* The current time according to the event loop. in msecs. */ \ uint64_t time; \ - /* GetTickCount() result when the event loop time was last updated. */ \ - DWORD last_tick_count; \ /* Tail of a single-linked circular queue of pending reqs. If the queue */ \ /* is empty, tail_ is NULL. If there is only one item, */ \ /* tail_->next_req == tail_ */ \ @@ -443,7 +468,8 @@ RB_HEAD(uv_timer_tree_s, uv_timer_s); int queue_len; \ } pending_ipc_info; \ uv_write_t* non_overlapped_writes_tail; \ - void* reserved; + uv_mutex_t readfile_mutex; \ + volatile HANDLE readfile_thread; #define UV_PIPE_PRIVATE_FIELDS \ HANDLE handle; \ diff --git a/deps/uv/include/uv.h b/deps/uv/include/uv.h index df6d9549c11..9ee9e9c42e7 100644 --- a/deps/uv/include/uv.h +++ b/deps/uv/include/uv.h @@ -227,6 +227,7 @@ typedef struct uv_work_s uv_work_t; /* None of the above. */ typedef struct uv_cpu_info_s uv_cpu_info_t; typedef struct uv_interface_address_s uv_interface_address_t; +typedef struct uv_dirent_s uv_dirent_t; typedef enum { @@ -236,180 +237,43 @@ typedef enum { } uv_run_mode; -/* - * Returns the libuv version packed into a single integer. 8 bits are used for - * each component, with the patch number stored in the 8 least significant - * bits. E.g. for libuv 1.2.3 this would return 0x010203. - */ UV_EXTERN unsigned int uv_version(void); - -/* - * Returns the libuv version number as a string. For non-release versions - * "-pre" is appended, so the version number could be "1.2.3-pre". - */ UV_EXTERN const char* uv_version_string(void); - -/* - * All functions besides uv_run() are non-blocking. - * - * All callbacks in libuv are made asynchronously. That is they are never - * made by the function that takes them as a parameter. - */ - -/* - * Returns the initialized default loop. It may return NULL in case of - * allocation failture. - */ UV_EXTERN uv_loop_t* uv_default_loop(void); - -/* - * Initializes a uv_loop_t structure. - */ UV_EXTERN int uv_loop_init(uv_loop_t* loop); - -/* - * Closes all internal loop resources. This function must only be called once - * the loop has finished it's execution or it will return UV_EBUSY. After this - * function returns the user shall free the memory allocated for the loop. - */ UV_EXTERN int uv_loop_close(uv_loop_t* loop); - /* - * Allocates and initializes a new loop. - * * NOTE: * This function is DEPRECATED (to be removed after 0.12), users should * allocate the loop manually and use uv_loop_init instead. */ UV_EXTERN uv_loop_t* uv_loop_new(void); - /* - * Cleans up a loop once it has finished executio and frees its memory. - * * NOTE: * This function is DEPRECATED (to be removed after 0.12). Users should use * uv_loop_close and free the memory manually instead. */ UV_EXTERN void uv_loop_delete(uv_loop_t*); - -/* - * Returns size of the loop struct, useful for dynamic lookup with FFI. - */ UV_EXTERN size_t uv_loop_size(void); - -/* - * This function runs the event loop. It will act differently depending on the - * specified mode: - * - UV_RUN_DEFAULT: Runs the event loop until the reference count drops to - * zero. Always returns zero. - * - UV_RUN_ONCE: Poll for new events once. Note that this function blocks if - * there are no pending events. Returns zero when done (no active handles - * or requests left), or non-zero if more events are expected (meaning you - * should run the event loop again sometime in the future). - * - UV_RUN_NOWAIT: Poll for new events once but don't block if there are no - * pending events. Returns zero when done (no active handles - * or requests left), or non-zero if more events are expected (meaning you - * should run the event loop again sometime in the future). - */ -UV_EXTERN int uv_run(uv_loop_t*, uv_run_mode mode); - -/* - * This function checks whether the reference count, the number of active - * handles or requests left in the event loop, is non-zero. - */ UV_EXTERN int uv_loop_alive(const uv_loop_t* loop); -/* - * This function will stop the event loop by forcing uv_run to end as soon as - * possible, but not sooner than the next loop iteration. - * If this function was called before blocking for i/o, the loop won't block - * for i/o on this iteration. - */ +UV_EXTERN int uv_run(uv_loop_t*, uv_run_mode mode); UV_EXTERN void uv_stop(uv_loop_t*); -/* - * Manually modify the event loop's reference count. Useful if the user wants - * to have a handle or timeout that doesn't keep the loop alive. - */ UV_EXTERN void uv_ref(uv_handle_t*); UV_EXTERN void uv_unref(uv_handle_t*); UV_EXTERN int uv_has_ref(const uv_handle_t*); -/* - * Update the event loop's concept of "now". Libuv caches the current time - * at the start of the event loop tick in order to reduce the number of - * time-related system calls. - * - * You won't normally need to call this function unless you have callbacks - * that block the event loop for longer periods of time, where "longer" is - * somewhat subjective but probably on the order of a millisecond or more. - */ UV_EXTERN void uv_update_time(uv_loop_t*); - -/* - * Return the current timestamp in milliseconds. The timestamp is cached at - * the start of the event loop tick, see |uv_update_time()| for details and - * rationale. - * - * The timestamp increases monotonically from some arbitrary point in time. - * Don't make assumptions about the starting point, you will only get - * disappointed. - * - * Use uv_hrtime() if you need sub-millisecond granularity. - */ UV_EXTERN uint64_t uv_now(const uv_loop_t*); -/* - * Get backend file descriptor. Only kqueue, epoll and event ports are - * supported. - * - * This can be used in conjunction with `uv_run(loop, UV_RUN_NOWAIT)` to - * poll in one thread and run the event loop's event callbacks in another. - * - * Useful for embedding libuv's event loop in another event loop. - * See test/test-embed.c for an example. - * - * Note that embedding a kqueue fd in another kqueue pollset doesn't work on - * all platforms. It's not an error to add the fd but it never generates - * events. - */ UV_EXTERN int uv_backend_fd(const uv_loop_t*); - -/* - * Get the poll timeout. The return value is in milliseconds, or -1 for no - * timeout. - */ UV_EXTERN int uv_backend_timeout(const uv_loop_t*); - -/* - * Should prepare a buffer that libuv can use to read data into. - * - * `suggested_size` is a hint. Returning a buffer that is smaller is perfectly - * okay as long as `buf.len > 0`. - * - * If you return a buffer with `buf.len == 0`, libuv skips the read and calls - * your read or recv callback with nread=UV_ENOBUFS. - * - * Note that returning a zero-length buffer does not stop the handle, call - * uv_read_stop() or uv_udp_recv_stop() for that. - */ typedef void (*uv_alloc_cb)(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf); - -/* - * `nread` is > 0 if there is data available, 0 if libuv is done reading for - * now, or < 0 on error. - * - * The callee is responsible for closing the stream when an error happens - * by calling uv_close(). Trying to read from the stream again is undefined. - * - * The callee is responsible for freeing the buffer, libuv does not reuse it. - * The buffer may be a null buffer (where buf->base=NULL and buf->len=0) on - * error. - */ typedef void (*uv_read_cb)(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf); @@ -463,12 +327,6 @@ typedef struct { } uv_stat_t; -/* -* This will be called repeatedly after the uv_fs_event_t is initialized. -* If uv_fs_event_t was initialized with a directory the filename parameter -* will be a relative path to a file contained in the directory. -* The events parameter is an ORed mask of enum uv_fs_event elements. -*/ typedef void (*uv_fs_event_cb)(uv_fs_event_t* handle, const char* filename, int events, @@ -488,9 +346,6 @@ typedef enum { } uv_membership; -/* - * Most functions return 0 on success or an error code < 0 on failure. - */ UV_EXTERN const char* uv_strerror(int err); UV_EXTERN const char* uv_err_name(int err); @@ -502,6 +357,7 @@ UV_EXTERN const char* uv_err_name(int err); uv_req_type type; \ /* private */ \ void* active_queue[2]; \ + void* reserved[4]; \ UV_REQ_PRIVATE_FIELDS \ /* Abstract base class of all requests. */ @@ -514,14 +370,6 @@ struct uv_req_s { UV_PRIVATE_REQ_TYPES -/* - * uv_shutdown_t is a subclass of uv_req_t. - * - * Shutdown the outgoing (write) side of a duplex stream. It waits for pending - * write requests to complete. The handle should refer to a initialized stream. - * req should be an uninitialized shutdown request struct. The cb is called - * after shutdown is complete. - */ UV_EXTERN int uv_shutdown(uv_shutdown_t* req, uv_stream_t* handle, uv_shutdown_cb cb); @@ -543,6 +391,7 @@ struct uv_shutdown_s { /* private */ \ uv_close_cb close_cb; \ void* handle_queue[2]; \ + void* reserved[4]; \ UV_HANDLE_PRIVATE_FIELDS \ /* The abstract base class of all handles. */ @@ -550,66 +399,20 @@ struct uv_handle_s { UV_HANDLE_FIELDS }; -/* - * Returns size of various handle types, useful for FFI bindings to allocate - * correct memory without copying struct definitions. - */ UV_EXTERN size_t uv_handle_size(uv_handle_type type); - -/* - * Returns size of request types, useful for dynamic lookup with FFI. - */ UV_EXTERN size_t uv_req_size(uv_req_type type); -/* - * Returns non-zero if the handle is active, zero if it's inactive. - * - * What "active" means depends on the type of handle: - * - * - A uv_async_t handle is always active and cannot be deactivated, except - * by closing it with uv_close(). - * - * - A uv_pipe_t, uv_tcp_t, uv_udp_t, etc. handle - basically any handle that - * deals with i/o - is active when it is doing something that involves i/o, - * like reading, writing, connecting, accepting new connections, etc. - * - * - A uv_check_t, uv_idle_t, uv_timer_t, etc. handle is active when it has - * been started with a call to uv_check_start(), uv_idle_start(), etc. - * - * Rule of thumb: if a handle of type uv_foo_t has a uv_foo_start() - * function, then it's active from the moment that function is called. - * Likewise, uv_foo_stop() deactivates the handle again. - * - */ UV_EXTERN int uv_is_active(const uv_handle_t* handle); -/* - * Walk the list of open handles. - */ UV_EXTERN void uv_walk(uv_loop_t* loop, uv_walk_cb walk_cb, void* arg); - -/* - * Request handle to be closed. close_cb will be called asynchronously after - * this call. This MUST be called on each handle before memory is released. - * - * Note that handles that wrap file descriptors are closed immediately but - * close_cb will still be deferred to the next iteration of the event loop. - * It gives you a chance to free up any resources associated with the handle. - * - * In-progress requests, like uv_connect_t or uv_write_t, are cancelled and - * have their callbacks called asynchronously with status=UV_ECANCELED. - */ UV_EXTERN void uv_close(uv_handle_t* handle, uv_close_cb close_cb); +UV_EXTERN int uv_send_buffer_size(uv_handle_t* handle, int* value); +UV_EXTERN int uv_recv_buffer_size(uv_handle_t* handle, int* value); + +UV_EXTERN int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd); -/* - * Constructor for uv_buf_t. - * - * Due to platform differences the user cannot rely on the ordering of the - * base and len members of the uv_buf_t struct. The user is responsible for - * freeing base after the uv_buf_t is done. Return struct passed by value. - */ UV_EXTERN uv_buf_t uv_buf_init(char* base, unsigned int len); @@ -634,89 +437,24 @@ struct uv_stream_s { }; UV_EXTERN int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb); - -/* - * This call is used in conjunction with uv_listen() to accept incoming - * connections. Call uv_accept after receiving a uv_connection_cb to accept - * the connection. Before calling uv_accept use uv_*_init() must be - * called on the client. Non-zero return value indicates an error. - * - * When the uv_connection_cb is called it is guaranteed that uv_accept() will - * complete successfully the first time. If you attempt to use it more than - * once, it may fail. It is suggested to only call uv_accept() once per - * uv_connection_cb call. - */ UV_EXTERN int uv_accept(uv_stream_t* server, uv_stream_t* client); -/* - * Read data from an incoming stream. The callback will be made several - * times until there is no more data to read or uv_read_stop() is called. - * When we've reached EOF nread will be set to UV_EOF. - * - * When nread < 0, the buf parameter might not point to a valid buffer; - * in that case buf.len and buf.base are both set to 0. - * - * Note that nread might also be 0, which does *not* indicate an error or - * eof; it happens when libuv requested a buffer through the alloc callback - * but then decided that it didn't need that buffer. - */ UV_EXTERN int uv_read_start(uv_stream_t*, uv_alloc_cb alloc_cb, uv_read_cb read_cb); - UV_EXTERN int uv_read_stop(uv_stream_t*); - -/* - * Write data to stream. Buffers are written in order. Example: - * - * uv_buf_t a[] = { - * { .base = "1", .len = 1 }, - * { .base = "2", .len = 1 } - * }; - * - * uv_buf_t b[] = { - * { .base = "3", .len = 1 }, - * { .base = "4", .len = 1 } - * }; - * - * uv_write_t req1; - * uv_write_t req2; - * - * // writes "1234" - * uv_write(&req1, stream, a, 2); - * uv_write(&req2, stream, b, 2); - * - */ UV_EXTERN int uv_write(uv_write_t* req, uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb); - -/* - * Extended write function for sending handles over a pipe. The pipe must be - * initialized with ipc == 1. - * send_handle must be a TCP socket or pipe, which is a server or a connection - * (listening or connected state). Bound sockets or pipes will be assumed to - * be servers. - */ UV_EXTERN int uv_write2(uv_write_t* req, uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_stream_t* send_handle, uv_write_cb cb); - -/* - * Same as uv_write(), but won't queue write request if it can't be completed - * immediately. - * - * Will return either: - * - > 0: number of bytes written (can be less than the supplied buffer size). - * - < 0: negative error code (UV_EAGAIN is returned if no data can be sent - * immediately). - */ UV_EXTERN int uv_try_write(uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs); @@ -731,40 +469,11 @@ struct uv_write_s { }; -/* - * Used to determine whether a stream is readable or writable. - */ UV_EXTERN int uv_is_readable(const uv_stream_t* handle); UV_EXTERN int uv_is_writable(const uv_stream_t* handle); - -/* - * Enable or disable blocking mode for a stream. - * - * When blocking mode is enabled all writes complete synchronously. The - * interface remains unchanged otherwise, e.g. completion or failure of the - * operation will still be reported through a callback which is made - * asychronously. - * - * Relying too much on this API is not recommended. It is likely to change - * significantly in the future. - * - * Currently this only works on Windows and only for uv_pipe_t handles. - * - * Also libuv currently makes no ordering guarantee when the blocking mode - * is changed after write requests have already been submitted. Therefore it is - * recommended to set the blocking mode immediately after opening or creating - * the stream. - */ UV_EXTERN int uv_stream_set_blocking(uv_stream_t* handle, int blocking); - -/* - * Used to determine whether a stream is closing or closed. - * - * N.B. is only valid between the initialization of the handle and the arrival - * of the close callback, and cannot be used to validate the handle. - */ UV_EXTERN int uv_is_closing(const uv_handle_t* handle); @@ -780,33 +489,11 @@ struct uv_tcp_s { }; UV_EXTERN int uv_tcp_init(uv_loop_t*, uv_tcp_t* handle); - -/* - * Opens an existing file descriptor or SOCKET as a tcp handle. - */ UV_EXTERN int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock); - -/* Enable/disable Nagle's algorithm. */ UV_EXTERN int uv_tcp_nodelay(uv_tcp_t* handle, int enable); - -/* - * Enable/disable TCP keep-alive. - * - * `delay` is the initial delay in seconds, ignored when `enable` is zero. - */ UV_EXTERN int uv_tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay); - -/* - * Enable/disable simultaneous asynchronous accept requests that are - * queued by the operating system when listening for new tcp connections. - * - * This setting is used to tune a tcp server for the desired performance. - * Having simultaneous accepts can significantly improve the rate of accepting - * connections (which is why it is enabled by default) but may lead to uneven - * load distribution in multi-process setups. - */ UV_EXTERN int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable); enum uv_tcp_flags { @@ -814,16 +501,6 @@ enum uv_tcp_flags { UV_TCP_IPV6ONLY = 1 }; -/* - * Bind the handle to an address and port. `addr` should point to an - * initialized struct sockaddr_in or struct sockaddr_in6. - * - * When the port is already taken, you can expect to see an UV_EADDRINUSE error - * from either uv_tcp_bind(), uv_listen() or uv_tcp_connect(). - * - * That is, a successful call to uv_tcp_bind() does not guarantee that the call - * to uv_listen() or uv_tcp_connect() will succeed as well. - */ UV_EXTERN int uv_tcp_bind(uv_tcp_t* handle, const struct sockaddr* addr, unsigned int flags); @@ -833,15 +510,6 @@ UV_EXTERN int uv_tcp_getsockname(const uv_tcp_t* handle, UV_EXTERN int uv_tcp_getpeername(const uv_tcp_t* handle, struct sockaddr* name, int* namelen); - -/* - * Establish an IPv4 or IPv6 TCP connection. Provide an initialized TCP handle - * and an uninitialized uv_connect_t*. `addr` should point to an initialized - * struct sockaddr_in or struct sockaddr_in6. - * - * The callback is made when the connection has been established or when a - * connection error happened. - */ UV_EXTERN int uv_tcp_connect(uv_connect_t* req, uv_tcp_t* handle, const struct sockaddr* addr, @@ -879,31 +547,7 @@ enum uv_udp_flags { UV_UDP_REUSEADDR = 4 }; -/* - * Called after uv_udp_send(). status 0 indicates success otherwise error. - */ typedef void (*uv_udp_send_cb)(uv_udp_send_t* req, int status); - -/* - * Callback that is invoked when a new UDP datagram is received. - * - * handle UDP handle. - * nread Number of bytes that have been received. - * - 0 if there is no more data to read. You may discard or repurpose - * the read buffer. Note that 0 may also mean that an empty datagram - * was received (in this case `addr` is not NULL). - * - < 0 if a transmission error was detected. - * buf uv_buf_t with the received data. - * addr struct sockaddr* containing the address of the sender. Can be NULL. - * Valid for the duration of the callback only. - * flags One or more OR'ed UV_UDP_* constants. Right now only UV_UDP_PARTIAL - * is used. - * - * NOTE: - * The receive callback will be called with nread == 0 and addr == NULL when - * there is nothing to read, and with nread == 0 and addr != NULL when an empty - * UDP packet is received. - */ typedef void (*uv_udp_recv_cb)(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, @@ -934,44 +578,8 @@ struct uv_udp_send_s { UV_UDP_SEND_PRIVATE_FIELDS }; -/* - * Initialize a new UDP handle. The actual socket is created lazily. - * Returns 0 on success. - */ UV_EXTERN int uv_udp_init(uv_loop_t*, uv_udp_t* handle); - -/* - * Opens an existing file descriptor or SOCKET as a udp handle. - * - * Unix only: - * The only requirement of the sock argument is that it follows the datagram - * contract (works in unconnected mode, supports sendmsg()/recvmsg(), etc). - * In other words, other datagram-type sockets like raw sockets or netlink - * sockets can also be passed to this function. - * - * This sets the SO_REUSEPORT socket flag on the BSDs and OS X. On other Unix - * platforms, it sets the SO_REUSEADDR flag. What that means is that multiple - * threads or processes can bind to the same address without error (provided - * they all set the flag) but only the last one to bind will receive any - * traffic, in effect "stealing" the port from the previous listener. - * This behavior is something of an anomaly and may be replaced by an explicit - * opt-in mechanism in future versions of libuv. - */ UV_EXTERN int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock); - -/* - * Bind to an IP address and port. - * - * Arguments: - * handle UDP handle. Should have been initialized with uv_udp_init(). - * addr struct sockaddr_in or struct sockaddr_in6 with the address and - * port to bind to. - * flags Indicate how the socket will be bound, UV_UDP_IPV6ONLY and - * UV_UDP_REUSEADDR are supported. - * - * Returns: - * 0 on success, or an error code < 0 on failure. - */ UV_EXTERN int uv_udp_bind(uv_udp_t* handle, const struct sockaddr* addr, unsigned int flags); @@ -979,155 +587,29 @@ UV_EXTERN int uv_udp_bind(uv_udp_t* handle, UV_EXTERN int uv_udp_getsockname(const uv_udp_t* handle, struct sockaddr* name, int* namelen); - -/* - * Set membership for a multicast address - * - * Arguments: - * handle UDP handle. Should have been initialized with - * uv_udp_init(). - * multicast_addr multicast address to set membership for. - * interface_addr interface address. - * membership Should be UV_JOIN_GROUP or UV_LEAVE_GROUP. - * - * Returns: - * 0 on success, or an error code < 0 on failure. - */ UV_EXTERN int uv_udp_set_membership(uv_udp_t* handle, const char* multicast_addr, const char* interface_addr, uv_membership membership); - -/* - * Set IP multicast loop flag. Makes multicast packets loop back to - * local sockets. - * - * Arguments: - * handle UDP handle. Should have been initialized with - * uv_udp_init(). - * on 1 for on, 0 for off. - * - * Returns: - * 0 on success, or an error code < 0 on failure. - */ UV_EXTERN int uv_udp_set_multicast_loop(uv_udp_t* handle, int on); - -/* - * Set the multicast ttl. - * - * Arguments: - * handle UDP handle. Should have been initialized with - * uv_udp_init(). - * ttl 1 through 255. - * - * Returns: - * 0 on success, or an error code < 0 on failure. - */ UV_EXTERN int uv_udp_set_multicast_ttl(uv_udp_t* handle, int ttl); - - -/* - * Set the multicast interface to send on. - * - * Arguments: - * handle UDP handle. Should have been initialized with - * uv_udp_init(). - * interface_addr interface address. - * - * Returns: - * 0 on success, or an error code < 0 on failure. - */ UV_EXTERN int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr); - -/* - * Set broadcast on or off. - * - * Arguments: - * handle UDP handle. Should have been initialized with - * uv_udp_init(). - * on 1 for on, 0 for off. - * - * Returns: - * 0 on success, or an error code < 0 on failure. - */ UV_EXTERN int uv_udp_set_broadcast(uv_udp_t* handle, int on); - -/* - * Set the time to live. - * - * Arguments: - * handle UDP handle. Should have been initialized with - * uv_udp_init(). - * ttl 1 through 255. - * - * Returns: - * 0 on success, or an error code < 0 on failure. - */ UV_EXTERN int uv_udp_set_ttl(uv_udp_t* handle, int ttl); - -/* - * Send data. If the socket has not previously been bound with uv_udp_bind() it - * is bound to 0.0.0.0 (the "all interfaces" address) and a random port number. - * - * Arguments: - * req UDP request handle. Need not be initialized. - * handle UDP handle. Should have been initialized with uv_udp_init(). - * bufs List of buffers to send. - * nbufs Number of buffers in `bufs`. - * addr struct sockaddr_in or struct sockaddr_in6 with the address and - * port of the remote peer. - * send_cb Callback to invoke when the data has been sent out. - * - * Returns: - * 0 on success, or an error code < 0 on failure. - */ UV_EXTERN int uv_udp_send(uv_udp_send_t* req, uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, uv_udp_send_cb send_cb); - -/* - * Same as uv_udp_send(), but won't queue a send request if it can't be completed - * immediately. - * - * Will return either: - * - >= 0: number of bytes sent (it matches the given buffer size). - * - < 0: negative error code (UV_EAGAIN is returned when the message can't be - * sent immediately). - */ UV_EXTERN int uv_udp_try_send(uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr); -/* - * Receive data. If the socket has not previously been bound with uv_udp_bind() - * it is bound to 0.0.0.0 (the "all interfaces" address) and a random port - * number. - * - * Arguments: - * handle UDP handle. Should have been initialized with uv_udp_init(). - * alloc_cb Callback to invoke when temporary storage is needed. - * recv_cb Callback to invoke with received data. - * - * Returns: - * 0 on success, or an error code < 0 on failure. - */ UV_EXTERN int uv_udp_recv_start(uv_udp_t* handle, uv_alloc_cb alloc_cb, uv_udp_recv_cb recv_cb); - -/* - * Stop listening for incoming datagrams. - * - * Arguments: - * handle UDP handle. Should have been initialized with uv_udp_init(). - * - * Returns: - * 0 on success, or an error code < 0 on failure. - */ UV_EXTERN int uv_udp_recv_stop(uv_udp_t* handle); @@ -1142,45 +624,11 @@ struct uv_tty_s { UV_TTY_PRIVATE_FIELDS }; -/* - * Initialize a new TTY stream with the given file descriptor. Usually the - * file descriptor will be: - * 0 = stdin - * 1 = stdout - * 2 = stderr - * The last argument, readable, specifies if you plan on calling - * uv_read_start() with this stream. stdin is readable, stdout is not. - * - * TTY streams which are not readable have blocking writes. - */ UV_EXTERN int uv_tty_init(uv_loop_t*, uv_tty_t*, uv_file fd, int readable); - -/* - * Set mode. 0 for normal, 1 for raw. - */ UV_EXTERN int uv_tty_set_mode(uv_tty_t*, int mode); - -/* - * To be called when the program exits. Resets TTY settings to default - * values for the next process to take over. - * - * This function is async signal-safe on Unix platforms but can fail with error - * code UV_EBUSY if you call it when execution is inside uv_tty_set_mode(). - */ UV_EXTERN int uv_tty_reset_mode(void); - -/* - * Gets the current Window size. On success zero is returned. - */ UV_EXTERN int uv_tty_get_winsize(uv_tty_t*, int* width, int* height); -/* - * Used to detect what type of stream should be used with a given file - * descriptor. Usually this will be used during initialization to guess the - * type of the stdio streams. - * - * For isatty() functionality use this function and test for UV_TTY. - */ UV_EXTERN uv_handle_type uv_guess_handle(uv_file file); /* @@ -1196,95 +644,21 @@ struct uv_pipe_s { UV_PIPE_PRIVATE_FIELDS }; -/* - * Initialize a pipe. The last argument is a boolean to indicate if - * this pipe will be used for handle passing between processes. - */ UV_EXTERN int uv_pipe_init(uv_loop_t*, uv_pipe_t* handle, int ipc); - -/* - * Opens an existing file descriptor or HANDLE as a pipe. - */ UV_EXTERN int uv_pipe_open(uv_pipe_t*, uv_file file); - -/* - * Bind the pipe to a file path (Unix) or a name (Windows). - * - * Paths on Unix get truncated to `sizeof(sockaddr_un.sun_path)` bytes, - * typically between 92 and 108 bytes. - */ UV_EXTERN int uv_pipe_bind(uv_pipe_t* handle, const char* name); - -/* - * Connect to the Unix domain socket or the named pipe. - * - * Paths on Unix get truncated to `sizeof(sockaddr_un.sun_path)` bytes, - * typically between 92 and 108 bytes. - */ UV_EXTERN void uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle, const char* name, uv_connect_cb cb); - -/* - * Get the name of the Unix domain socket or the named pipe. - * - * A preallocated buffer must be provided. The len parameter holds the length - * of the buffer and it's set to the number of bytes written to the buffer on - * output. If the buffer is not big enough UV_ENOBUFS will be returned and len - * will contain the required size. - */ UV_EXTERN int uv_pipe_getsockname(const uv_pipe_t* handle, char* buf, size_t* len); - -/* - * This setting applies to Windows only. - * - * Set the number of pending pipe instance handles when the pipe server is - * waiting for connections. - */ UV_EXTERN void uv_pipe_pending_instances(uv_pipe_t* handle, int count); - -/* - * Used to receive handles over ipc pipes. - * - * First - call uv_pipe_pending_count(), if it is > 0 - initialize handle - * using type, returned by uv_pipe_pending_type() and call - * uv_accept(pipe, handle). - */ UV_EXTERN int uv_pipe_pending_count(uv_pipe_t* handle); UV_EXTERN uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle); -/* - * uv_poll_t is a subclass of uv_handle_t. - * - * The uv_poll watcher is used to watch file descriptors for readability and - * writability, similar to the purpose of poll(2). - * - * The purpose of uv_poll is to enable integrating external libraries that - * rely on the event loop to signal it about the socket status changes, like - * c-ares or libssh2. Using uv_poll_t for any other purpose is not recommended; - * uv_tcp_t, uv_udp_t, etc. provide an implementation that is much faster and - * more scalable than what can be achieved with uv_poll_t, especially on - * Windows. - * - * It is possible that uv_poll occasionally signals that a file descriptor is - * readable or writable even when it isn't. The user should therefore always - * be prepared to handle EAGAIN or equivalent when it attempts to read from or - * write to the fd. - * - * It is not okay to have multiple active uv_poll watchers for the same socket. - * This can cause libuv to busyloop or otherwise malfunction. - * - * The user should not close a file descriptor while it is being polled by an - * active uv_poll watcher. This can cause the poll watcher to report an error, - * but it might also start polling another socket. However the fd can be safely - * closed immediately after a call to uv_poll_stop() or uv_close(). - * - * On windows only sockets can be polled with uv_poll. On Unix any file - * descriptor that would be accepted by poll(2) can be used with uv_poll. - */ + struct uv_poll_s { UV_HANDLE_FIELDS uv_poll_cb poll_cb; @@ -1296,124 +670,52 @@ enum uv_poll_event { UV_WRITABLE = 2 }; -/* Initialize the poll watcher using a file descriptor. */ UV_EXTERN int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd); - -/* - * Initialize the poll watcher using a socket descriptor. On Unix this is - * identical to uv_poll_init. On windows it takes a SOCKET handle. - */ UV_EXTERN int uv_poll_init_socket(uv_loop_t* loop, uv_poll_t* handle, uv_os_sock_t socket); - -/* - * Starts polling the file descriptor. `events` is a bitmask consisting made up - * of UV_READABLE and UV_WRITABLE. As soon as an event is detected the callback - * will be called with `status` set to 0, and the detected events set en the - * `events` field. - * - * If an error happens while polling status, `status` < 0 and corresponds - * with one of the UV_E* error codes. The user should not close the socket - * while uv_poll is active. If the user does that anyway, the callback *may* - * be called reporting an error status, but this is not guaranteed. - * - * Calling uv_poll_start on an uv_poll watcher that is already active is fine. - * Doing so will update the events mask that is being watched for. - */ UV_EXTERN int uv_poll_start(uv_poll_t* handle, int events, uv_poll_cb cb); - -/* Stops polling the file descriptor. */ UV_EXTERN int uv_poll_stop(uv_poll_t* handle); -/* - * uv_prepare_t is a subclass of uv_handle_t. - * - * Every active prepare handle gets its callback called exactly once per loop - * iteration, just before the system blocks to wait for completed i/o. - */ struct uv_prepare_s { UV_HANDLE_FIELDS UV_PREPARE_PRIVATE_FIELDS }; UV_EXTERN int uv_prepare_init(uv_loop_t*, uv_prepare_t* prepare); - UV_EXTERN int uv_prepare_start(uv_prepare_t* prepare, uv_prepare_cb cb); - UV_EXTERN int uv_prepare_stop(uv_prepare_t* prepare); -/* - * uv_check_t is a subclass of uv_handle_t. - * - * Every active check handle gets its callback called exactly once per loop - * iteration, just after the system returns from blocking. - */ struct uv_check_s { UV_HANDLE_FIELDS UV_CHECK_PRIVATE_FIELDS }; UV_EXTERN int uv_check_init(uv_loop_t*, uv_check_t* check); - UV_EXTERN int uv_check_start(uv_check_t* check, uv_check_cb cb); - UV_EXTERN int uv_check_stop(uv_check_t* check); -/* - * uv_idle_t is a subclass of uv_handle_t. - * - * Every active idle handle gets its callback called repeatedly until it is - * stopped. This happens after all other types of callbacks are processed. - * When there are multiple "idle" handles active, their callbacks are called - * in turn. - */ struct uv_idle_s { UV_HANDLE_FIELDS UV_IDLE_PRIVATE_FIELDS }; UV_EXTERN int uv_idle_init(uv_loop_t*, uv_idle_t* idle); - UV_EXTERN int uv_idle_start(uv_idle_t* idle, uv_idle_cb cb); - UV_EXTERN int uv_idle_stop(uv_idle_t* idle); -/* - * uv_async_t is a subclass of uv_handle_t. - * - * uv_async_send() wakes up the event loop and calls the async handle's callback. - * - * Unlike all other libuv functions, uv_async_send() can be called from another - * thread. - * - * NOTE: - * There is no guarantee that every uv_async_send() call leads to exactly one - * invocation of the callback; the only guarantee is that the callback - * function is called at least once after the call to async_send. - */ struct uv_async_s { UV_HANDLE_FIELDS UV_ASYNC_PRIVATE_FIELDS }; -/* - * Initialize the uv_async_t handle. A NULL callback is allowed. - * - * Note that uv_async_init(), unlike other libuv functions, immediately - * starts the handle. To stop the handle again, close it with uv_close(). - */ UV_EXTERN int uv_async_init(uv_loop_t*, uv_async_t* async, uv_async_cb async_cb); - -/* - * This can be called from other threads to wake up a libuv thread. - */ UV_EXTERN int uv_async_send(uv_async_t* async); @@ -1428,37 +730,13 @@ struct uv_timer_s { }; UV_EXTERN int uv_timer_init(uv_loop_t*, uv_timer_t* handle); - -/* - * Start the timer. `timeout` and `repeat` are in milliseconds. - * - * If timeout is zero, the callback fires on the next tick of the event loop. - * - * If repeat is non-zero, the callback fires first after timeout milliseconds - * and then repeatedly after repeat milliseconds. - */ UV_EXTERN int uv_timer_start(uv_timer_t* handle, uv_timer_cb cb, uint64_t timeout, uint64_t repeat); - UV_EXTERN int uv_timer_stop(uv_timer_t* handle); - -/* - * Stop the timer, and if it is repeating restart it using the repeat value - * as the timeout. If the timer has never been started before it returns - * UV_EINVAL. - */ UV_EXTERN int uv_timer_again(uv_timer_t* handle); - -/* - * Set the repeat value in milliseconds. Note that if the repeat value is set - * from a timer callback it does not immediately take effect. If the timer was - * non-repeating before, it will have been stopped. If it was repeating, then - * the old repeat value will have been used to schedule the next timeout. - */ UV_EXTERN void uv_timer_set_repeat(uv_timer_t* handle, uint64_t repeat); - UV_EXTERN uint64_t uv_timer_get_repeat(const uv_timer_t* handle); @@ -1475,34 +753,12 @@ struct uv_getaddrinfo_s { }; -/* - * Asynchronous getaddrinfo(3). - * - * Either node or service may be NULL but not both. - * - * hints is a pointer to a struct addrinfo with additional address type - * constraints, or NULL. Consult `man -s 3 getaddrinfo` for details. - * - * Returns 0 on success or an error code < 0 on failure. - * - * If successful, your callback gets called sometime in the future with the - * lookup result, which is either: - * - * a) err == 0, the res argument points to a valid struct addrinfo, or - * b) err < 0, the res argument is NULL. See the UV_EAI_* constants. - * - * Call uv_freeaddrinfo() to free the addrinfo structure. - */ UV_EXTERN int uv_getaddrinfo(uv_loop_t* loop, uv_getaddrinfo_t* req, uv_getaddrinfo_cb getaddrinfo_cb, const char* node, const char* service, const struct addrinfo* hints); - -/* - * Free the struct addrinfo. Passing NULL is allowed and is a no-op. - */ UV_EXTERN void uv_freeaddrinfo(struct addrinfo* ai); @@ -1518,14 +774,6 @@ struct uv_getnameinfo_s { UV_GETNAMEINFO_PRIVATE_FIELDS }; -/* - * Asynchronous getnameinfo. - * - * Returns 0 on success or an error code < 0 on failure. - * - * If successful, your callback gets called sometime in the future with the - * lookup result. - */ UV_EXTERN int uv_getnameinfo(uv_loop_t* loop, uv_getnameinfo_t* req, uv_getnameinfo_cb getnameinfo_cb, @@ -1651,46 +899,10 @@ struct uv_process_s { UV_PROCESS_PRIVATE_FIELDS }; -/* - * Initializes the uv_process_t and starts the process. If the process is - * successfully spawned, then this function will return 0. Otherwise, the - * negative error code corresponding to the reason it couldn't spawn is - * returned. - * - * Possible reasons for failing to spawn would include (but not be limited to) - * the file to execute not existing, not having permissions to use the setuid or - * setgid specified, or not having enough memory to allocate for the new - * process. - */ UV_EXTERN int uv_spawn(uv_loop_t* loop, uv_process_t* handle, const uv_process_options_t* options); - - -/* - * Kills the process with the specified signal. The user must still - * call uv_close() on the process. - * - * Emulates some aspects of Unix exit status on Windows, in that while the - * underlying process will be terminated with a status of `1`, - * `uv_process_t.exit_signal` will be set to signum, so the process will appear - * to have been killed by `signum`. - */ UV_EXTERN int uv_process_kill(uv_process_t*, int signum); - - -/* Kills the process with the specified signal. - * - * Emulates some aspects of Unix signals on Windows: - * - SIGTERM, SIGKILL, and SIGINT call TerminateProcess() to unconditionally - * cause the target to exit with status 1. Unlike Unix, this cannot be caught - * or ignored (but see uv_process_kill() and uv_signal_start()). - * - Signal number `0` causes a check for target existence, as in Unix. Return - * value is 0 on existence, UV_ESRCH on non-existence. - * - * Returns 0 on success, or an error code on failure. UV_ESRCH is portably used - * for non-existence of target process, other errors may be system specific. - */ UV_EXTERN int uv_kill(int pid, int signum); @@ -1705,34 +917,11 @@ struct uv_work_s { UV_WORK_PRIVATE_FIELDS }; -/* Queues a work request to execute asynchronously on the thread pool. */ UV_EXTERN int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb, uv_after_work_cb after_work_cb); -/* Cancel a pending request. Fails if the request is executing or has finished - * executing. - * - * Returns 0 on success, or an error code < 0 on failure. - * - * Only cancellation of uv_fs_t, uv_getaddrinfo_t and uv_work_t requests is - * currently supported. - * - * Cancelled requests have their callbacks invoked some time in the future. - * It's _not_ safe to free the memory associated with the request until your - * callback is called. - * - * Here is how cancellation is reported to your callback: - * - * - A uv_fs_t request has its req->result field set to UV_ECANCELED. - * - * - A uv_work_t or uv_getaddrinfo_t request has its callback invoked with - * status == UV_ECANCELED. - * - * This function is currently only implemented on Unix platforms. On Windows, - * it always returns UV_ENOSYS. - */ UV_EXTERN int uv_cancel(uv_req_t* req); @@ -1762,6 +951,22 @@ struct uv_interface_address_s { } netmask; }; +typedef enum { + UV_DIRENT_UNKNOWN, + UV_DIRENT_FILE, + UV_DIRENT_DIR, + UV_DIRENT_LINK, + UV_DIRENT_FIFO, + UV_DIRENT_SOCKET, + UV_DIRENT_CHAR, + UV_DIRENT_BLOCK +} uv_dirent_type_t; + +struct uv_dirent_s { + const char* name; + uv_dirent_type_t type; +}; + UV_EXTERN char** uv_setup_args(int argc, char** argv); UV_EXTERN int uv_get_process_title(char* buffer, size_t size); UV_EXTERN int uv_set_process_title(const char* title); @@ -1792,41 +997,16 @@ typedef struct { uint64_t ru_nivcsw; /* involuntary context switches */ } uv_rusage_t; -/* - * Get information about OS resource utilization for the current process. - * Please note that not all uv_rusage_t struct fields will be filled on Windows. - */ UV_EXTERN int uv_getrusage(uv_rusage_t* rusage); -/* - * This allocates cpu_infos array, and sets count. The array is freed - * using uv_free_cpu_info(). - */ UV_EXTERN int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count); UV_EXTERN void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count); -/* - * This allocates addresses array, and sets count. The array is freed - * using uv_free_interface_addresses(). - */ UV_EXTERN int uv_interface_addresses(uv_interface_address_t** addresses, - int* count); + int* count); UV_EXTERN void uv_free_interface_addresses(uv_interface_address_t* addresses, - int count); + int count); -/* - * File System Methods. - * - * The uv_fs_* functions execute a blocking system call asynchronously (in a - * thread pool) and call the specified callback in the specified loop after - * completion. If the user gives NULL as the callback the blocking system - * call will be called synchronously. req should be a pointer to an - * uninitialized uv_fs_t object. - * - * uv_fs_req_cleanup() must be called after completion of the uv_fs_ - * function to free any internal memory allocations associated with the - * request. - */ typedef enum { UV_FS_UNKNOWN = -1, @@ -1873,69 +1053,113 @@ struct uv_fs_s { }; UV_EXTERN void uv_fs_req_cleanup(uv_fs_t* req); - -UV_EXTERN int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file file, - uv_fs_cb cb); - -UV_EXTERN int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, - int flags, int mode, uv_fs_cb cb); - -UV_EXTERN int uv_fs_read(uv_loop_t* loop, uv_fs_t* req, uv_file file, - const uv_buf_t bufs[], unsigned int nbufs, int64_t offset, uv_fs_cb cb); - -UV_EXTERN int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path, - uv_fs_cb cb); - -UV_EXTERN int uv_fs_write(uv_loop_t* loop, uv_fs_t* req, uv_file file, - const uv_buf_t bufs[], unsigned int nbufs, int64_t offset, uv_fs_cb cb); - -UV_EXTERN int uv_fs_mkdir(uv_loop_t* loop, uv_fs_t* req, const char* path, - int mode, uv_fs_cb cb); - -UV_EXTERN int uv_fs_mkdtemp(uv_loop_t* loop, uv_fs_t* req, const char* tpl, - uv_fs_cb cb); - -UV_EXTERN int uv_fs_rmdir(uv_loop_t* loop, uv_fs_t* req, const char* path, - uv_fs_cb cb); - -UV_EXTERN int uv_fs_readdir(uv_loop_t* loop, uv_fs_t* req, - const char* path, int flags, uv_fs_cb cb); - -UV_EXTERN int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, - uv_fs_cb cb); - -UV_EXTERN int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file file, - uv_fs_cb cb); - -UV_EXTERN int uv_fs_rename(uv_loop_t* loop, uv_fs_t* req, const char* path, - const char* new_path, uv_fs_cb cb); - -UV_EXTERN int uv_fs_fsync(uv_loop_t* loop, uv_fs_t* req, uv_file file, - uv_fs_cb cb); - -UV_EXTERN int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file file, - uv_fs_cb cb); - -UV_EXTERN int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file file, - int64_t offset, uv_fs_cb cb); - -UV_EXTERN int uv_fs_sendfile(uv_loop_t* loop, uv_fs_t* req, uv_file out_fd, - uv_file in_fd, int64_t in_offset, size_t length, uv_fs_cb cb); - -UV_EXTERN int uv_fs_chmod(uv_loop_t* loop, uv_fs_t* req, const char* path, - int mode, uv_fs_cb cb); - -UV_EXTERN int uv_fs_utime(uv_loop_t* loop, uv_fs_t* req, const char* path, - double atime, double mtime, uv_fs_cb cb); - -UV_EXTERN int uv_fs_futime(uv_loop_t* loop, uv_fs_t* req, uv_file file, - double atime, double mtime, uv_fs_cb cb); - -UV_EXTERN int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, - uv_fs_cb cb); - -UV_EXTERN int uv_fs_link(uv_loop_t* loop, uv_fs_t* req, const char* path, - const char* new_path, uv_fs_cb cb); +UV_EXTERN int uv_fs_close(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_fs_cb cb); +UV_EXTERN int uv_fs_open(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int flags, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_read(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + const uv_buf_t bufs[], + unsigned int nbufs, + int64_t offset, + uv_fs_cb cb); +UV_EXTERN int uv_fs_unlink(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_write(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + const uv_buf_t bufs[], + unsigned int nbufs, + int64_t offset, + uv_fs_cb cb); +UV_EXTERN int uv_fs_mkdir(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_mkdtemp(uv_loop_t* loop, + uv_fs_t* req, + const char* tpl, + uv_fs_cb cb); +UV_EXTERN int uv_fs_rmdir(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_readdir(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int flags, + uv_fs_cb cb); +UV_EXTERN int uv_fs_readdir_next(uv_fs_t* req, + uv_dirent_t* ent); +UV_EXTERN int uv_fs_stat(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fstat(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_fs_cb cb); +UV_EXTERN int uv_fs_rename(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + const char* new_path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fsync(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fdatasync(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_fs_cb cb); +UV_EXTERN int uv_fs_ftruncate(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + int64_t offset, + uv_fs_cb cb); +UV_EXTERN int uv_fs_sendfile(uv_loop_t* loop, + uv_fs_t* req, + uv_file out_fd, + uv_file in_fd, + int64_t in_offset, + size_t length, + uv_fs_cb cb); +UV_EXTERN int uv_fs_chmod(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_utime(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + double atime, + double mtime, + uv_fs_cb cb); +UV_EXTERN int uv_fs_futime(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + double atime, + double mtime, + uv_fs_cb cb); +UV_EXTERN int uv_fs_lstat(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_link(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + const char* new_path, + uv_fs_cb cb); /* * This flag can be used with uv_fs_symlink() on Windows to specify whether @@ -1949,20 +1173,33 @@ UV_EXTERN int uv_fs_link(uv_loop_t* loop, uv_fs_t* req, const char* path, */ #define UV_FS_SYMLINK_JUNCTION 0x0002 -UV_EXTERN int uv_fs_symlink(uv_loop_t* loop, uv_fs_t* req, const char* path, - const char* new_path, int flags, uv_fs_cb cb); - -UV_EXTERN int uv_fs_readlink(uv_loop_t* loop, uv_fs_t* req, const char* path, - uv_fs_cb cb); - -UV_EXTERN int uv_fs_fchmod(uv_loop_t* loop, uv_fs_t* req, uv_file file, - int mode, uv_fs_cb cb); - -UV_EXTERN int uv_fs_chown(uv_loop_t* loop, uv_fs_t* req, const char* path, - uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb); - -UV_EXTERN int uv_fs_fchown(uv_loop_t* loop, uv_fs_t* req, uv_file file, - uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb); +UV_EXTERN int uv_fs_symlink(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + const char* new_path, + int flags, + uv_fs_cb cb); +UV_EXTERN int uv_fs_readlink(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fchmod(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_chown(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_uid_t uid, + uv_gid_t gid, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fchown(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_uid_t uid, + uv_gid_t gid, + uv_fs_cb cb); enum uv_fs_event { @@ -1989,77 +1226,14 @@ struct uv_fs_poll_s { }; UV_EXTERN int uv_fs_poll_init(uv_loop_t* loop, uv_fs_poll_t* handle); - -/* - * Check the file at `path` for changes every `interval` milliseconds. - * - * Your callback is invoked with `status < 0` if `path` does not exist - * or is inaccessible. The watcher is *not* stopped but your callback is - * not called again until something changes (e.g. when the file is created - * or the error reason changes). - * - * When `status == 0`, your callback receives pointers to the old and new - * `uv_stat_t` structs. They are valid for the duration of the callback - * only! - * - * For maximum portability, use multi-second intervals. Sub-second intervals - * will not detect all changes on many file systems. - */ UV_EXTERN int uv_fs_poll_start(uv_fs_poll_t* handle, uv_fs_poll_cb poll_cb, const char* path, unsigned int interval); - UV_EXTERN int uv_fs_poll_stop(uv_fs_poll_t* handle); - -/* - * Get the path being monitored by the handle. The buffer must be preallocated - * by the user. Returns 0 on success or an error code < 0 in case of failure. - * On sucess, `buf` will contain the path and `len` its length. If the buffer - * is not big enough UV_ENOBUFS will be returned and len will be set to the - * required size. - */ UV_EXTERN int uv_fs_poll_getpath(uv_fs_poll_t* handle, char* buf, size_t* len); -/* - * Unix signal handling on a per-event loop basis. The implementation is not - * ultra efficient so don't go creating a million event loops with a million - * signal watchers. - * - * Note to Linux users: SIGRT0 and SIGRT1 (signals 32 and 33) are used by the - * NPTL pthreads library to manage threads. Installing watchers for those - * signals will lead to unpredictable behavior and is strongly discouraged. - * Future versions of libuv may simply reject them. - * - * Reception of some signals is emulated on Windows: - * - * SIGINT is normally delivered when the user presses CTRL+C. However, like - * on Unix, it is not generated when terminal raw mode is enabled. - * - * SIGBREAK is delivered when the user pressed CTRL+BREAK. - * - * SIGHUP is generated when the user closes the console window. On SIGHUP the - * program is given approximately 10 seconds to perform cleanup. After that - * Windows will unconditionally terminate it. - * - * SIGWINCH is raised whenever libuv detects that the console has been - * resized. SIGWINCH is emulated by libuv when the program uses an uv_tty_t - * handle to write to the console. SIGWINCH may not always be delivered in a - * timely manner; libuv will only detect size changes when the cursor is - * being moved. When a readable uv_tty_handle is used in raw mode, resizing - * the console buffer will also trigger a SIGWINCH signal. - * - * Watchers for other signals can be successfully created, but these signals - * are never received. These signals are: SIGILL, SIGABRT, SIGFPE, SIGSEGV, - * SIGTERM and SIGKILL. - * - * Note that calls to raise() or abort() to programmatically raise a signal are - * not detected by libuv; these will not trigger a signal watcher. - * - * See uv_process_kill() and uv_kill() for information about support for sending - * signals. - */ struct uv_signal_s { UV_HANDLE_FIELDS uv_signal_cb signal_cb; @@ -2068,21 +1242,11 @@ struct uv_signal_s { }; UV_EXTERN int uv_signal_init(uv_loop_t* loop, uv_signal_t* handle); - UV_EXTERN int uv_signal_start(uv_signal_t* handle, uv_signal_cb signal_cb, int signum); - UV_EXTERN int uv_signal_stop(uv_signal_t* handle); - -/* - * Gets load average. - * - * See: http://en.wikipedia.org/wiki/Load_(computing) - * - * Returns [0,0,0] on Windows. - */ UV_EXTERN void uv_loadavg(double avg[3]); @@ -2118,118 +1282,48 @@ enum uv_fs_event_flags { UV_EXTERN int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle); - UV_EXTERN int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* path, unsigned int flags); - UV_EXTERN int uv_fs_event_stop(uv_fs_event_t* handle); - -/* - * Get the path being monitored by the handle. The buffer must be preallocated - * by the user. Returns 0 on success or an error code < 0 in case of failure. - * On sucess, `buf` will contain the path and `len` its length. If the buffer - * is not big enough UV_ENOBUFS will be returned and len will be set to the - * required size. - */ UV_EXTERN int uv_fs_event_getpath(uv_fs_event_t* handle, char* buf, size_t* len); - -/* Utilities. */ - -/* Convert string ip addresses to binary structures. */ UV_EXTERN int uv_ip4_addr(const char* ip, int port, struct sockaddr_in* addr); UV_EXTERN int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr); -/* Convert binary addresses to strings. */ UV_EXTERN int uv_ip4_name(const struct sockaddr_in* src, char* dst, size_t size); UV_EXTERN int uv_ip6_name(const struct sockaddr_in6* src, char* dst, size_t size); -/* - * Cross-platform IPv6-capable implementation of the 'standard' inet_ntop() and - * inet_pton() functions. On success they return 0. If an error the target of - * the `dst` pointer is unmodified. - */ UV_EXTERN int uv_inet_ntop(int af, const void* src, char* dst, size_t size); UV_EXTERN int uv_inet_pton(int af, const char* src, void* dst); -/* Gets the executable path. */ UV_EXTERN int uv_exepath(char* buffer, size_t* size); -/* Gets the current working directory. */ UV_EXTERN int uv_cwd(char* buffer, size_t* size); -/* Changes the current working directory. */ UV_EXTERN int uv_chdir(const char* dir); -/* Gets memory info in bytes. */ UV_EXTERN uint64_t uv_get_free_memory(void); UV_EXTERN uint64_t uv_get_total_memory(void); -/* - * Returns the current high-resolution real time. This is expressed in - * nanoseconds. It is relative to an arbitrary time in the past. It is not - * related to the time of day and therefore not subject to clock drift. The - * primary use is for measuring performance between intervals. - * - * Note not every platform can support nanosecond resolution; however, this - * value will always be in nanoseconds. - */ UV_EXTERN extern uint64_t uv_hrtime(void); - -/* - * Disables inheritance for file descriptors / handles that this process - * inherited from its parent. The effect is that child processes spawned by - * this process don't accidentally inherit these handles. - * - * It is recommended to call this function as early in your program as possible, - * before the inherited file descriptors can be closed or duplicated. - * - * Note that this function works on a best-effort basis: there is no guarantee - * that libuv can discover all file descriptors that were inherited. In general - * it does a better job on Windows than it does on Unix. - */ UV_EXTERN void uv_disable_stdio_inheritance(void); -/* - * Opens a shared library. The filename is in utf-8. Returns 0 on success and - * -1 on error. Call uv_dlerror(uv_lib_t*) to get the error message. - */ UV_EXTERN int uv_dlopen(const char* filename, uv_lib_t* lib); - -/* - * Close the shared library. - */ UV_EXTERN void uv_dlclose(uv_lib_t* lib); - -/* - * Retrieves a data pointer from a dynamic library. It is legal for a symbol to - * map to NULL. Returns 0 on success and -1 if the symbol was not found. - */ UV_EXTERN int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr); - -/* - * Returns the last uv_dlopen() or uv_dlsym() error message. - */ UV_EXTERN const char* uv_dlerror(const uv_lib_t* lib); -/* - * The mutex functions return 0 on success or an error code < 0 (unless the - * return type is void, of course). - */ UV_EXTERN int uv_mutex_init(uv_mutex_t* handle); UV_EXTERN void uv_mutex_destroy(uv_mutex_t* handle); UV_EXTERN void uv_mutex_lock(uv_mutex_t* handle); UV_EXTERN int uv_mutex_trylock(uv_mutex_t* handle); UV_EXTERN void uv_mutex_unlock(uv_mutex_t* handle); -/* - * Same goes for the read/write lock functions. - */ UV_EXTERN int uv_rwlock_init(uv_rwlock_t* rwlock); UV_EXTERN void uv_rwlock_destroy(uv_rwlock_t* rwlock); UV_EXTERN void uv_rwlock_rdlock(uv_rwlock_t* rwlock); @@ -2239,80 +1333,33 @@ UV_EXTERN void uv_rwlock_wrlock(uv_rwlock_t* rwlock); UV_EXTERN int uv_rwlock_trywrlock(uv_rwlock_t* rwlock); UV_EXTERN void uv_rwlock_wrunlock(uv_rwlock_t* rwlock); -/* - * Same goes for the semaphore functions. - */ UV_EXTERN int uv_sem_init(uv_sem_t* sem, unsigned int value); UV_EXTERN void uv_sem_destroy(uv_sem_t* sem); UV_EXTERN void uv_sem_post(uv_sem_t* sem); UV_EXTERN void uv_sem_wait(uv_sem_t* sem); UV_EXTERN int uv_sem_trywait(uv_sem_t* sem); -/* - * Same goes for the condition variable functions. - */ UV_EXTERN int uv_cond_init(uv_cond_t* cond); UV_EXTERN void uv_cond_destroy(uv_cond_t* cond); UV_EXTERN void uv_cond_signal(uv_cond_t* cond); UV_EXTERN void uv_cond_broadcast(uv_cond_t* cond); -/* - * Same goes for the barrier functions. Note that uv_barrier_wait() returns - * a value > 0 to an arbitrarily chosen "serializer" thread to facilitate - * cleanup, i.e.: - * - * if (uv_barrier_wait(&barrier) > 0) - * uv_barrier_destroy(&barrier); - */ UV_EXTERN int uv_barrier_init(uv_barrier_t* barrier, unsigned int count); UV_EXTERN void uv_barrier_destroy(uv_barrier_t* barrier); UV_EXTERN int uv_barrier_wait(uv_barrier_t* barrier); -/* - * Waits on a condition variable without a timeout. - * - * NOTE: - * 1. callers should be prepared to deal with spurious wakeups. - */ UV_EXTERN void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex); -/* - * Waits on a condition variable with a timeout in nano seconds. - * Returns 0 for success or UV_ETIMEDOUT on timeout, It aborts when other - * errors happen. - * - * NOTE: - * 1. callers should be prepared to deal with spurious wakeups. - * 2. the granularity of timeout on Windows is never less than one millisecond. - * 3. uv_cond_timedwait() takes a relative timeout, not an absolute time. - */ -UV_EXTERN int uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, - uint64_t timeout); +UV_EXTERN int uv_cond_timedwait(uv_cond_t* cond, + uv_mutex_t* mutex, + uint64_t timeout); -/* - * Runs a function once and only once. Concurrent calls to uv_once() with the - * same guard will block all callers except one (it's unspecified which one). - * The guard should be initialized statically with the UV_ONCE_INIT macro. - */ UV_EXTERN void uv_once(uv_once_t* guard, void (*callback)(void)); -/* - * Thread-local storage. These functions largely follow the semantics of - * pthread_key_create(), pthread_key_delete(), pthread_getspecific() and - * pthread_setspecific(). - * - * Note that the total thread-local storage size may be limited. - * That is, it may not be possible to create many TLS keys. - */ UV_EXTERN int uv_key_create(uv_key_t* key); UV_EXTERN void uv_key_delete(uv_key_t* key); UV_EXTERN void* uv_key_get(uv_key_t* key); UV_EXTERN void uv_key_set(uv_key_t* key, void* value); -/* - * Callback that is invoked to initialize thread execution. - * - * `arg` is the same value that was passed to uv_thread_create(). - */ typedef void (*uv_thread_cb)(void* arg); UV_EXTERN int uv_thread_create(uv_thread_t* tid, uv_thread_cb entry, void* arg); diff --git a/deps/uv/m4/.gitignore b/deps/uv/m4/.gitignore index bde78f43f99..9d0f4af88b3 100644 --- a/deps/uv/m4/.gitignore +++ b/deps/uv/m4/.gitignore @@ -1,2 +1,5 @@ # Ignore libtoolize-generated files. *.m4 +!as_case.m4 +!dtrace.m4 +!libuv-check-flags.m4 \ No newline at end of file diff --git a/deps/uv/m4/as_case.m4 b/deps/uv/m4/as_case.m4 new file mode 100644 index 00000000000..c7ae0f0f5ed --- /dev/null +++ b/deps/uv/m4/as_case.m4 @@ -0,0 +1,21 @@ +# AS_CASE(WORD, [PATTERN1], [IF-MATCHED1]...[DEFAULT]) +# ---------------------------------------------------- +# Expand into +# | case WORD in +# | PATTERN1) IF-MATCHED1 ;; +# | ... +# | *) DEFAULT ;; +# | esac +m4_define([_AS_CASE], +[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])], + [$#], 1, [ *) $1 ;;], + [$#], 2, [ $1) m4_default([$2], [:]) ;;], + [ $1) m4_default([$2], [:]) ;; +$0(m4_shiftn(2, $@))])dnl +]) +m4_defun([AS_CASE], +[m4_ifval([$2$3], +[case $1 in +_AS_CASE(m4_shift($@)) +esac])]) + diff --git a/deps/uv/m4/dtrace.m4 b/deps/uv/m4/dtrace.m4 new file mode 100644 index 00000000000..09f7dc89cf5 --- /dev/null +++ b/deps/uv/m4/dtrace.m4 @@ -0,0 +1,66 @@ +dnl Copyright (C) 2009 Sun Microsystems +dnl This file is free software; Sun Microsystems +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl --------------------------------------------------------------------------- +dnl Macro: PANDORA_ENABLE_DTRACE +dnl --------------------------------------------------------------------------- +AC_DEFUN([PANDORA_ENABLE_DTRACE],[ + AC_ARG_ENABLE([dtrace], + [AS_HELP_STRING([--disable-dtrace], + [enable DTrace USDT probes. @<:@default=yes@:>@])], + [ac_cv_enable_dtrace="$enableval"], + [ac_cv_enable_dtrace="yes"]) + + AS_IF([test "$ac_cv_enable_dtrace" = "yes"],[ + AC_CHECK_PROGS([DTRACE], [dtrace]) + AS_IF([test "x$ac_cv_prog_DTRACE" = "xdtrace"],[ + + AC_CACHE_CHECK([if dtrace works],[ac_cv_dtrace_works],[ + cat >conftest.d <<_ACEOF +provider Example { + probe increment(int); +}; +_ACEOF + $DTRACE -h -o conftest.h -s conftest.d 2>/dev/zero + AS_IF([test $? -eq 0],[ac_cv_dtrace_works=yes], + [ac_cv_dtrace_works=no]) + rm -f conftest.h conftest.d + ]) + AS_IF([test "x$ac_cv_dtrace_works" = "xyes"],[ + AC_DEFINE([HAVE_DTRACE], [1], [Enables DTRACE Support]) + AC_CACHE_CHECK([if dtrace should instrument object files], + [ac_cv_dtrace_needs_objects],[ + dnl DTrace on MacOSX does not use -G option + cat >conftest.d <<_ACEOF +provider Example { + probe increment(int); +}; +_ACEOF + cat > conftest.c <<_ACEOF +#include "conftest.h" +void foo() { + EXAMPLE_INCREMENT(1); +} +_ACEOF + $DTRACE -h -o conftest.h -s conftest.d 2>/dev/zero + $CC -c -o conftest.o conftest.c + $DTRACE -G -o conftest.d.o -s conftest.d conftest.o 2>/dev/zero + AS_IF([test $? -eq 0],[ac_cv_dtrace_needs_objects=yes], + [ac_cv_dtrace_needs_objects=no]) + rm -f conftest.d.o conftest.d conftest.h conftest.o conftest.c + ]) + ]) + AC_SUBST(DTRACEFLAGS) dnl TODO: test for -G on OSX + ac_cv_have_dtrace=yes + ])]) + +AM_CONDITIONAL([HAVE_DTRACE], [test "x$ac_cv_dtrace_works" = "xyes"]) +AM_CONDITIONAL([DTRACE_NEEDS_OBJECTS], + [test "x$ac_cv_dtrace_needs_objects" = "xyes"]) + +]) +dnl --------------------------------------------------------------------------- +dnl End Macro: PANDORA_ENABLE_DTRACE +dnl --------------------------------------------------------------------------- diff --git a/deps/uv/m4/libuv-check-flags.m4 b/deps/uv/m4/libuv-check-flags.m4 new file mode 100644 index 00000000000..59c30635577 --- /dev/null +++ b/deps/uv/m4/libuv-check-flags.m4 @@ -0,0 +1,319 @@ +dnl Macros to check the presence of generic (non-typed) symbols. +dnl Copyright (c) 2006-2008 Diego Pettenà +dnl Copyright (c) 2006-2008 xine project +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 3, or (at your option) +dnl any later version. +dnl +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +dnl 02110-1301, USA. +dnl +dnl As a special exception, the copyright owners of the +dnl macro gives unlimited permission to copy, distribute and modify the +dnl configure scripts that are the output of Autoconf when processing the +dnl Macro. You need not follow the terms of the GNU General Public +dnl License when using or distributing such scripts, even though portions +dnl of the text of the Macro appear in them. The GNU General Public +dnl License (GPL) does govern all other use of the material that +dnl constitutes the Autoconf Macro. +dnl +dnl This special exception to the GPL applies to versions of the +dnl Autoconf Macro released by this project. When you make and +dnl distribute a modified version of the Autoconf Macro, you may extend +dnl this special exception to the GPL to apply to your modified version as +dnl well. + +dnl Check if the flag is supported by compiler +dnl CC_CHECK_CFLAGS_SILENT([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) + +AC_DEFUN([CC_CHECK_CFLAGS_SILENT], [ + AC_CACHE_VAL(AS_TR_SH([cc_cv_cflags_$1]), + [ac_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $1" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([int a;])], + [eval "AS_TR_SH([cc_cv_cflags_$1])='yes'"], + [eval "AS_TR_SH([cc_cv_cflags_$1])='no'"]) + CFLAGS="$ac_save_CFLAGS" + ]) + + AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes], + [$2], [$3]) +]) + +dnl Check if the flag is supported by compiler (cacheable) +dnl CC_CHECK_CFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) + +AC_DEFUN([CC_CHECK_CFLAGS], [ + AC_CACHE_CHECK([if $CC supports $1 flag], + AS_TR_SH([cc_cv_cflags_$1]), + CC_CHECK_CFLAGS_SILENT([$1]) dnl Don't execute actions here! + ) + + AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes], + [$2], [$3]) +]) + +dnl CC_CHECK_CFLAG_APPEND(FLAG, [action-if-found], [action-if-not-found]) +dnl Check for CFLAG and appends them to CFLAGS if supported +AC_DEFUN([CC_CHECK_CFLAG_APPEND], [ + AC_CACHE_CHECK([if $CC supports $1 flag], + AS_TR_SH([cc_cv_cflags_$1]), + CC_CHECK_CFLAGS_SILENT([$1]) dnl Don't execute actions here! + ) + + AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes], + [CFLAGS="$CFLAGS $1"; DEBUG_CFLAGS="$DEBUG_CFLAGS $1"; $2], [$3]) +]) + +dnl CC_CHECK_CFLAGS_APPEND([FLAG1 FLAG2], [action-if-found], [action-if-not]) +AC_DEFUN([CC_CHECK_CFLAGS_APPEND], [ + for flag in $1; do + CC_CHECK_CFLAG_APPEND($flag, [$2], [$3]) + done +]) + +dnl Check if the flag is supported by linker (cacheable) +dnl CC_CHECK_LDFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) + +AC_DEFUN([CC_CHECK_LDFLAGS], [ + AC_CACHE_CHECK([if $CC supports $1 flag], + AS_TR_SH([cc_cv_ldflags_$1]), + [ac_save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $1" + AC_LANG_PUSH([C]) + AC_LINK_IFELSE([AC_LANG_SOURCE([int main() { return 1; }])], + [eval "AS_TR_SH([cc_cv_ldflags_$1])='yes'"], + [eval "AS_TR_SH([cc_cv_ldflags_$1])="]) + AC_LANG_POP([C]) + LDFLAGS="$ac_save_LDFLAGS" + ]) + + AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes], + [$2], [$3]) +]) + +dnl define the LDFLAGS_NOUNDEFINED variable with the correct value for +dnl the current linker to avoid undefined references in a shared object. +AC_DEFUN([CC_NOUNDEFINED], [ + dnl We check $host for which systems to enable this for. + AC_REQUIRE([AC_CANONICAL_HOST]) + + case $host in + dnl FreeBSD (et al.) does not complete linking for shared objects when pthreads + dnl are requested, as different implementations are present; to avoid problems + dnl use -Wl,-z,defs only for those platform not behaving this way. + *-freebsd* | *-openbsd*) ;; + *) + dnl First of all check for the --no-undefined variant of GNU ld. This allows + dnl for a much more readable commandline, so that people can understand what + dnl it does without going to look for what the heck -z defs does. + for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do + CC_CHECK_LDFLAGS([$possible_flags], [LDFLAGS_NOUNDEFINED="$possible_flags"]) + break + done + ;; + esac + + AC_SUBST([LDFLAGS_NOUNDEFINED]) +]) + +dnl Check for a -Werror flag or equivalent. -Werror is the GCC +dnl and ICC flag that tells the compiler to treat all the warnings +dnl as fatal. We usually need this option to make sure that some +dnl constructs (like attributes) are not simply ignored. +dnl +dnl Other compilers don't support -Werror per se, but they support +dnl an equivalent flag: +dnl - Sun Studio compiler supports -errwarn=%all +AC_DEFUN([CC_CHECK_WERROR], [ + AC_CACHE_CHECK( + [for $CC way to treat warnings as errors], + [cc_cv_werror], + [CC_CHECK_CFLAGS_SILENT([-Werror], [cc_cv_werror=-Werror], + [CC_CHECK_CFLAGS_SILENT([-errwarn=%all], [cc_cv_werror=-errwarn=%all])]) + ]) +]) + +AC_DEFUN([CC_CHECK_ATTRIBUTE], [ + AC_REQUIRE([CC_CHECK_WERROR]) + AC_CACHE_CHECK([if $CC supports __attribute__(( ifelse([$2], , [$1], [$2]) ))], + AS_TR_SH([cc_cv_attribute_$1]), + [ac_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cc_cv_werror" + AC_LANG_PUSH([C]) + AC_COMPILE_IFELSE([AC_LANG_SOURCE([$3])], + [eval "AS_TR_SH([cc_cv_attribute_$1])='yes'"], + [eval "AS_TR_SH([cc_cv_attribute_$1])='no'"]) + AC_LANG_POP([C]) + CFLAGS="$ac_save_CFLAGS" + ]) + + AS_IF([eval test x$]AS_TR_SH([cc_cv_attribute_$1])[ = xyes], + [AC_DEFINE( + AS_TR_CPP([SUPPORT_ATTRIBUTE_$1]), 1, + [Define this if the compiler supports __attribute__(( ifelse([$2], , [$1], [$2]) ))] + ) + $4], + [$5]) +]) + +AC_DEFUN([CC_ATTRIBUTE_CONSTRUCTOR], [ + CC_CHECK_ATTRIBUTE( + [constructor],, + [void __attribute__((constructor)) ctor() { int a; }], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_FORMAT], [ + CC_CHECK_ATTRIBUTE( + [format], [format(printf, n, n)], + [void __attribute__((format(printf, 1, 2))) printflike(const char *fmt, ...) { fmt = (void *)0; }], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_FORMAT_ARG], [ + CC_CHECK_ATTRIBUTE( + [format_arg], [format_arg(printf)], + [char *__attribute__((format_arg(1))) gettextlike(const char *fmt) { fmt = (void *)0; }], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_VISIBILITY], [ + CC_CHECK_ATTRIBUTE( + [visibility_$1], [visibility("$1")], + [void __attribute__((visibility("$1"))) $1_function() { }], + [$2], [$3]) +]) + +AC_DEFUN([CC_ATTRIBUTE_NONNULL], [ + CC_CHECK_ATTRIBUTE( + [nonnull], [nonnull()], + [void __attribute__((nonnull())) some_function(void *foo, void *bar) { foo = (void*)0; bar = (void*)0; }], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_UNUSED], [ + CC_CHECK_ATTRIBUTE( + [unused], , + [void some_function(void *foo, __attribute__((unused)) void *bar);], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_SENTINEL], [ + CC_CHECK_ATTRIBUTE( + [sentinel], , + [void some_function(void *foo, ...) __attribute__((sentinel));], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_DEPRECATED], [ + CC_CHECK_ATTRIBUTE( + [deprecated], , + [void some_function(void *foo, ...) __attribute__((deprecated));], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_ALIAS], [ + CC_CHECK_ATTRIBUTE( + [alias], [weak, alias], + [void other_function(void *foo) { } + void some_function(void *foo) __attribute__((weak, alias("other_function")));], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_MALLOC], [ + CC_CHECK_ATTRIBUTE( + [malloc], , + [void * __attribute__((malloc)) my_alloc(int n);], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_PACKED], [ + CC_CHECK_ATTRIBUTE( + [packed], , + [struct astructure { char a; int b; long c; void *d; } __attribute__((packed));], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_CONST], [ + CC_CHECK_ATTRIBUTE( + [const], , + [int __attribute__((const)) twopow(int n) { return 1 << n; } ], + [$1], [$2]) +]) + +AC_DEFUN([CC_FLAG_VISIBILITY], [ + AC_REQUIRE([CC_CHECK_WERROR]) + AC_CACHE_CHECK([if $CC supports -fvisibility=hidden], + [cc_cv_flag_visibility], + [cc_flag_visibility_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cc_cv_werror" + CC_CHECK_CFLAGS_SILENT([-fvisibility=hidden], + cc_cv_flag_visibility='yes', + cc_cv_flag_visibility='no') + CFLAGS="$cc_flag_visibility_save_CFLAGS"]) + + AS_IF([test "x$cc_cv_flag_visibility" = "xyes"], + [AC_DEFINE([SUPPORT_FLAG_VISIBILITY], 1, + [Define this if the compiler supports the -fvisibility flag]) + $1], + [$2]) +]) + +AC_DEFUN([CC_FUNC_EXPECT], [ + AC_REQUIRE([CC_CHECK_WERROR]) + AC_CACHE_CHECK([if compiler has __builtin_expect function], + [cc_cv_func_expect], + [ac_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cc_cv_werror" + AC_LANG_PUSH([C]) + AC_COMPILE_IFELSE([AC_LANG_SOURCE( + [int some_function() { + int a = 3; + return (int)__builtin_expect(a, 3); + }])], + [cc_cv_func_expect=yes], + [cc_cv_func_expect=no]) + AC_LANG_POP([C]) + CFLAGS="$ac_save_CFLAGS" + ]) + + AS_IF([test "x$cc_cv_func_expect" = "xyes"], + [AC_DEFINE([SUPPORT__BUILTIN_EXPECT], 1, + [Define this if the compiler supports __builtin_expect() function]) + $1], + [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_ALIGNED], [ + AC_REQUIRE([CC_CHECK_WERROR]) + AC_CACHE_CHECK([highest __attribute__ ((aligned ())) supported], + [cc_cv_attribute_aligned], + [ac_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cc_cv_werror" + AC_LANG_PUSH([C]) + for cc_attribute_align_try in 64 32 16 8 4 2; do + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ + int main() { + static char c __attribute__ ((aligned($cc_attribute_align_try))) = 0; + return c; + }])], [cc_cv_attribute_aligned=$cc_attribute_align_try; break]) + done + AC_LANG_POP([C]) + CFLAGS="$ac_save_CFLAGS" + ]) + + if test "x$cc_cv_attribute_aligned" != "x"; then + AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], [$cc_cv_attribute_aligned], + [Define the highest alignment supported]) + fi +]) \ No newline at end of file diff --git a/deps/uv/src/fs-poll.c b/deps/uv/src/fs-poll.c index 871228fc8de..0de15b1739f 100644 --- a/deps/uv/src/fs-poll.c +++ b/deps/uv/src/fs-poll.c @@ -60,6 +60,7 @@ int uv_fs_poll_start(uv_fs_poll_t* handle, struct poll_ctx* ctx; uv_loop_t* loop; size_t len; + int err; if (uv__is_active(handle)) return 0; @@ -78,19 +79,25 @@ int uv_fs_poll_start(uv_fs_poll_t* handle, ctx->parent_handle = handle; memcpy(ctx->path, path, len + 1); - if (uv_timer_init(loop, &ctx->timer_handle)) - abort(); + err = uv_timer_init(loop, &ctx->timer_handle); + if (err < 0) + goto error; ctx->timer_handle.flags |= UV__HANDLE_INTERNAL; uv__handle_unref(&ctx->timer_handle); - if (uv_fs_stat(loop, &ctx->fs_req, ctx->path, poll_cb)) - abort(); + err = uv_fs_stat(loop, &ctx->fs_req, ctx->path, poll_cb); + if (err < 0) + goto error; handle->poll_ctx = ctx; uv__handle_start(handle); return 0; + +error: + free(ctx); + return err; } diff --git a/deps/uv/src/unix/core.c b/deps/uv/src/unix/core.c index 4770d8d8c68..9dcc3935dcf 100644 --- a/deps/uv/src/unix/core.c +++ b/deps/uv/src/unix/core.c @@ -163,6 +163,33 @@ void uv_close(uv_handle_t* handle, uv_close_cb close_cb) { uv__make_close_pending(handle); } +int uv__socket_sockopt(uv_handle_t* handle, int optname, int* value) { + int r; + int fd; + socklen_t len; + + if (handle == NULL || value == NULL) + return -EINVAL; + + if (handle->type == UV_TCP || handle->type == UV_NAMED_PIPE) + fd = uv__stream_fd((uv_stream_t*) handle); + else if (handle->type == UV_UDP) + fd = ((uv_udp_t *) handle)->io_watcher.fd; + else + return -ENOTSUP; + + len = sizeof(*value); + + if (*value == 0) + r = getsockopt(fd, SOL_SOCKET, optname, value, &len); + else + r = setsockopt(fd, SOL_SOCKET, optname, (const void*) value, len); + + if (r < 0) + return -errno; + + return 0; +} void uv__make_close_pending(uv_handle_t* handle) { assert(handle->flags & UV_CLOSING); @@ -635,6 +662,36 @@ void uv_disable_stdio_inheritance(void) { } +int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd) { + int fd_out; + + switch (handle->type) { + case UV_TCP: + case UV_NAMED_PIPE: + case UV_TTY: + fd_out = uv__stream_fd((uv_stream_t*) handle); + break; + + case UV_UDP: + fd_out = ((uv_udp_t *) handle)->io_watcher.fd; + break; + + case UV_POLL: + fd_out = ((uv_poll_t *) handle)->io_watcher.fd; + break; + + default: + return -EINVAL; + } + + if (uv__is_closing(handle) || fd_out == -1) + return -EBADF; + + *fd = fd_out; + return 0; +} + + static void uv__run_pending(uv_loop_t* loop) { QUEUE* q; uv__io_t* w; diff --git a/deps/uv/src/unix/darwin-proctitle.c b/deps/uv/src/unix/darwin-proctitle.c index 8cd358bcf01..b7267caa99d 100644 --- a/deps/uv/src/unix/darwin-proctitle.c +++ b/deps/uv/src/unix/darwin-proctitle.c @@ -36,7 +36,7 @@ static int uv__pthread_setname_np(const char* name) { int err; /* pthread_setname_np() first appeared in OS X 10.6 and iOS 3.2. */ - dynamic_pthread_setname_np = dlsym(RTLD_DEFAULT, "pthread_setname_np"); + *(void **)(&dynamic_pthread_setname_np) = dlsym(RTLD_DEFAULT, "pthread_setname_np"); if (dynamic_pthread_setname_np == NULL) return -ENOSYS; @@ -94,13 +94,13 @@ int uv__set_process_title(const char* title) { if (application_services_handle == NULL || core_foundation_handle == NULL) goto out; - pCFStringCreateWithCString = + *(void **)(&pCFStringCreateWithCString) = dlsym(core_foundation_handle, "CFStringCreateWithCString"); - pCFBundleGetBundleWithIdentifier = + *(void **)(&pCFBundleGetBundleWithIdentifier) = dlsym(core_foundation_handle, "CFBundleGetBundleWithIdentifier"); - pCFBundleGetDataPointerForName = + *(void **)(&pCFBundleGetDataPointerForName) = dlsym(core_foundation_handle, "CFBundleGetDataPointerForName"); - pCFBundleGetFunctionPointerForName = + *(void **)(&pCFBundleGetFunctionPointerForName) = dlsym(core_foundation_handle, "CFBundleGetFunctionPointerForName"); if (pCFStringCreateWithCString == NULL || @@ -118,14 +118,14 @@ int uv__set_process_title(const char* title) { if (launch_services_bundle == NULL) goto out; - pLSGetCurrentApplicationASN = + *(void **)(&pLSGetCurrentApplicationASN) = pCFBundleGetFunctionPointerForName(launch_services_bundle, S("_LSGetCurrentApplicationASN")); if (pLSGetCurrentApplicationASN == NULL) goto out; - pLSSetApplicationInformationItem = + *(void **)(&pLSSetApplicationInformationItem) = pCFBundleGetFunctionPointerForName(launch_services_bundle, S("_LSSetApplicationInformationItem")); @@ -138,9 +138,9 @@ int uv__set_process_title(const char* title) { if (display_name_key == NULL || *display_name_key == NULL) goto out; - pCFBundleGetInfoDictionary = dlsym(core_foundation_handle, + *(void **)(&pCFBundleGetInfoDictionary) = dlsym(core_foundation_handle, "CFBundleGetInfoDictionary"); - pCFBundleGetMainBundle = dlsym(core_foundation_handle, + *(void **)(&pCFBundleGetMainBundle) = dlsym(core_foundation_handle, "CFBundleGetMainBundle"); if (pCFBundleGetInfoDictionary == NULL || pCFBundleGetMainBundle == NULL) goto out; @@ -152,13 +152,13 @@ int uv__set_process_title(const char* title) { if (hi_services_bundle == NULL) goto out; - pSetApplicationIsDaemon = pCFBundleGetFunctionPointerForName( + *(void **)(&pSetApplicationIsDaemon) = pCFBundleGetFunctionPointerForName( hi_services_bundle, S("SetApplicationIsDaemon")); - pLSApplicationCheckIn = pCFBundleGetFunctionPointerForName( + *(void **)(&pLSApplicationCheckIn) = pCFBundleGetFunctionPointerForName( launch_services_bundle, S("_LSApplicationCheckIn")); - pLSSetApplicationLaunchServicesServerConnectionStatus = + *(void **)(&pLSSetApplicationLaunchServicesServerConnectionStatus) = pCFBundleGetFunctionPointerForName( launch_services_bundle, S("_LSSetApplicationLaunchServicesServerConnectionStatus")); diff --git a/deps/uv/src/unix/fs.c b/deps/uv/src/unix/fs.c index 47f667229db..2dd0fe97cc7 100644 --- a/deps/uv/src/unix/fs.c +++ b/deps/uv/src/unix/fs.c @@ -38,7 +38,6 @@ #include #include #include -#include #include #include #include @@ -296,9 +295,9 @@ static ssize_t uv__fs_read(uv_fs_t* req) { #if defined(__OpenBSD__) || (defined(__APPLE__) && !defined(MAC_OS_X_VERSION_10_8)) -static int uv__fs_readdir_filter(struct dirent* dent) { +static int uv__fs_readdir_filter(uv__dirent_t* dent) { #else -static int uv__fs_readdir_filter(const struct dirent* dent) { +static int uv__fs_readdir_filter(const uv__dirent_t* dent) { #endif return strcmp(dent->d_name, ".") != 0 && strcmp(dent->d_name, "..") != 0; } @@ -306,12 +305,8 @@ static int uv__fs_readdir_filter(const struct dirent* dent) { /* This should have been called uv__fs_scandir(). */ static ssize_t uv__fs_readdir(uv_fs_t* req) { - struct dirent **dents; + uv__dirent_t **dents; int saved_errno; - size_t off; - size_t len; - char *buf; - int i; int n; dents = NULL; @@ -322,32 +317,17 @@ static ssize_t uv__fs_readdir(uv_fs_t* req) { else if (n == -1) return n; - len = 0; - - for (i = 0; i < n; i++) - len += strlen(dents[i]->d_name) + 1; - - buf = malloc(len); - - if (buf == NULL) { - errno = ENOMEM; - n = -1; - goto out; - } - - off = 0; - - for (i = 0; i < n; i++) { - len = strlen(dents[i]->d_name) + 1; - memcpy(buf + off, dents[i]->d_name, len); - off += len; - } + /* NOTE: We will use nbufs as an index field */ + req->ptr = dents; + req->nbufs = 0; - req->ptr = buf; + return n; out: saved_errno = errno; if (dents != NULL) { + int i; + for (i = 0; i < n; i++) free(dents[i]); free(dents); @@ -1184,6 +1164,9 @@ void uv_fs_req_cleanup(uv_fs_t* req) { req->path = NULL; req->new_path = NULL; + if (req->fs_type == UV_FS_READDIR && req->ptr != NULL) + uv__fs_readdir_cleanup(req); + if (req->ptr != &req->statbuf) free(req->ptr); req->ptr = NULL; diff --git a/deps/uv/src/unix/fsevents.c b/deps/uv/src/unix/fsevents.c index 1c7896d8d7c..49085306b90 100644 --- a/deps/uv/src/unix/fsevents.c +++ b/deps/uv/src/unix/fsevents.c @@ -525,7 +525,7 @@ static int uv__fsevents_global_init(void) { err = -ENOENT; #define V(handle, symbol) \ do { \ - p ## symbol = dlsym((handle), #symbol); \ + *(void **)(&p ## symbol) = dlsym((handle), #symbol); \ if (p ## symbol == NULL) \ goto out; \ } \ diff --git a/deps/uv/src/unix/getaddrinfo.c b/deps/uv/src/unix/getaddrinfo.c index 1db00680d1a..f6c2de9b438 100644 --- a/deps/uv/src/unix/getaddrinfo.c +++ b/deps/uv/src/unix/getaddrinfo.c @@ -18,6 +18,13 @@ * IN THE SOFTWARE. */ +/* Expose glibc-specific EAI_* error codes. Needs to be defined before we + * include any headers. + */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + #include "uv.h" #include "internal.h" @@ -26,6 +33,66 @@ #include #include +/* EAI_* constants. */ +#include + + +int uv__getaddrinfo_translate_error(int sys_err) { + switch (sys_err) { + case 0: return 0; +#if defined(EAI_ADDRFAMILY) + case EAI_ADDRFAMILY: return UV_EAI_ADDRFAMILY; +#endif +#if defined(EAI_AGAIN) + case EAI_AGAIN: return UV_EAI_AGAIN; +#endif +#if defined(EAI_BADFLAGS) + case EAI_BADFLAGS: return UV_EAI_BADFLAGS; +#endif +#if defined(EAI_BADHINTS) + case EAI_BADHINTS: return UV_EAI_BADHINTS; +#endif +#if defined(EAI_CANCELED) + case EAI_CANCELED: return UV_EAI_CANCELED; +#endif +#if defined(EAI_FAIL) + case EAI_FAIL: return UV_EAI_FAIL; +#endif +#if defined(EAI_FAMILY) + case EAI_FAMILY: return UV_EAI_FAMILY; +#endif +#if defined(EAI_MEMORY) + case EAI_MEMORY: return UV_EAI_MEMORY; +#endif +#if defined(EAI_NODATA) + case EAI_NODATA: return UV_EAI_NODATA; +#endif +#if defined(EAI_NONAME) +# if !defined(EAI_NODATA) || EAI_NODATA != EAI_NONAME + case EAI_NONAME: return UV_EAI_NONAME; +# endif +#endif +#if defined(EAI_OVERFLOW) + case EAI_OVERFLOW: return UV_EAI_OVERFLOW; +#endif +#if defined(EAI_PROTOCOL) + case EAI_PROTOCOL: return UV_EAI_PROTOCOL; +#endif +#if defined(EAI_SERVICE) + case EAI_SERVICE: return UV_EAI_SERVICE; +#endif +#if defined(EAI_SOCKTYPE) + case EAI_SOCKTYPE: return UV_EAI_SOCKTYPE; +#endif +#if defined(EAI_SYSTEM) + case EAI_SYSTEM: return -errno; +#endif + } + assert(!"unknown EAI_* error code"); + abort(); + return 0; /* Pacify compiler. */ +} + static void uv__getaddrinfo_work(struct uv__work* w) { uv_getaddrinfo_t* req; diff --git a/deps/uv/src/unix/internal.h b/deps/uv/src/unix/internal.h index 114cb696ee8..d5bc3109f02 100644 --- a/deps/uv/src/unix/internal.h +++ b/deps/uv/src/unix/internal.h @@ -143,7 +143,7 @@ enum { UV_TCP_NODELAY = 0x400, /* Disable Nagle. */ UV_TCP_KEEPALIVE = 0x800, /* Turn on keep-alive. */ UV_TCP_SINGLE_ACCEPT = 0x1000, /* Only accept() when idle. */ - UV_HANDLE_IPV6 = 0x2000 /* Handle is bound to a IPv6 socket. */ + UV_HANDLE_IPV6 = 0x10000 /* Handle is bound to a IPv6 socket. */ }; typedef enum { diff --git a/deps/uv/src/unix/linux-core.c b/deps/uv/src/unix/linux-core.c index 5f6215998c0..7a43630494d 100644 --- a/deps/uv/src/unix/linux-core.c +++ b/deps/uv/src/unix/linux-core.c @@ -149,6 +149,7 @@ 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(QUEUE_EMPTY(&loop->watcher_queue)); @@ -195,10 +196,22 @@ void uv__io_poll(uv_loop_t* loop, int timeout) { count = 48; /* Benchmarks suggest this gives the best throughput. */ for (;;) { - nfds = uv__epoll_wait(loop->backend_fd, - events, - ARRAY_SIZE(events), - timeout); + if (!no_epoll_wait) { + nfds = uv__epoll_wait(loop->backend_fd, + events, + ARRAY_SIZE(events), + timeout); + if (nfds == -1 && errno == ENOSYS) { + no_epoll_wait = 1; + continue; + } + } else { + nfds = uv__epoll_pwait(loop->backend_fd, + events, + ARRAY_SIZE(events), + timeout, + NULL); + } /* 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 diff --git a/deps/uv/src/unix/loop.c b/deps/uv/src/unix/loop.c index aa74be6455e..002224855c2 100644 --- a/deps/uv/src/unix/loop.c +++ b/deps/uv/src/unix/loop.c @@ -99,7 +99,6 @@ void uv_loop_delete(uv_loop_t* loop) { static int uv__loop_init(uv_loop_t* loop, int default_loop) { - unsigned int i; int err; uv__signal_global_once_init(); @@ -138,9 +137,7 @@ static int uv__loop_init(uv_loop_t* loop, int default_loop) { uv_signal_init(loop, &loop->child_watcher); uv__handle_unref(&loop->child_watcher); loop->child_watcher.flags |= UV__HANDLE_INTERNAL; - - for (i = 0; i < ARRAY_SIZE(loop->process_handles); i++) - QUEUE_INIT(loop->process_handles + i); + QUEUE_INIT(&loop->process_handles); if (uv_rwlock_init(&loop->cloexec_lock)) abort(); diff --git a/deps/uv/src/unix/netbsd.c b/deps/uv/src/unix/netbsd.c index 7423a71078f..5f1182f8b43 100644 --- a/deps/uv/src/unix/netbsd.c +++ b/deps/uv/src/unix/netbsd.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include diff --git a/deps/uv/src/unix/process.c b/deps/uv/src/unix/process.c index 52e4eb28130..0aff5fd31f5 100644 --- a/deps/uv/src/unix/process.c +++ b/deps/uv/src/unix/process.c @@ -45,77 +45,65 @@ extern char **environ; #endif -static QUEUE* uv__process_queue(uv_loop_t* loop, int pid) { - assert(pid > 0); - return loop->process_handles + pid % ARRAY_SIZE(loop->process_handles); -} - - static void uv__chld(uv_signal_t* handle, int signum) { uv_process_t* process; uv_loop_t* loop; int exit_status; int term_signal; - unsigned int i; int status; pid_t pid; QUEUE pending; - QUEUE* h; QUEUE* q; + QUEUE* h; assert(signum == SIGCHLD); QUEUE_INIT(&pending); loop = handle->loop; - for (i = 0; i < ARRAY_SIZE(loop->process_handles); i++) { - h = loop->process_handles + i; - q = QUEUE_HEAD(h); + h = &loop->process_handles; + q = QUEUE_HEAD(h); + while (q != h) { + process = QUEUE_DATA(q, uv_process_t, queue); + q = QUEUE_NEXT(q); - while (q != h) { - process = QUEUE_DATA(q, uv_process_t, queue); - q = QUEUE_NEXT(q); + do + pid = waitpid(process->pid, &status, WNOHANG); + while (pid == -1 && errno == EINTR); - do - pid = waitpid(process->pid, &status, WNOHANG); - while (pid == -1 && errno == EINTR); - - if (pid == 0) - continue; - - if (pid == -1) { - if (errno != ECHILD) - abort(); - continue; - } + if (pid == 0) + continue; - process->status = status; - QUEUE_REMOVE(&process->queue); - QUEUE_INSERT_TAIL(&pending, &process->queue); + if (pid == -1) { + if (errno != ECHILD) + abort(); + continue; } - while (!QUEUE_EMPTY(&pending)) { - q = QUEUE_HEAD(&pending); - QUEUE_REMOVE(q); - QUEUE_INIT(q); + process->status = status; + QUEUE_REMOVE(&process->queue); + QUEUE_INSERT_TAIL(&pending, &process->queue); + } - process = QUEUE_DATA(q, uv_process_t, queue); - uv__handle_stop(process); + QUEUE_FOREACH(q, &pending) { + process = QUEUE_DATA(q, uv_process_t, queue); + QUEUE_REMOVE(q); + uv__handle_stop(process); - if (process->exit_cb == NULL) - continue; + if (process->exit_cb == NULL) + continue; - exit_status = 0; - if (WIFEXITED(process->status)) - exit_status = WEXITSTATUS(process->status); + exit_status = 0; + if (WIFEXITED(process->status)) + exit_status = WEXITSTATUS(process->status); - term_signal = 0; - if (WIFSIGNALED(process->status)) - term_signal = WTERMSIG(process->status); + term_signal = 0; + if (WIFSIGNALED(process->status)) + term_signal = WTERMSIG(process->status); - process->exit_cb(process, exit_status, term_signal); - } + process->exit_cb(process, exit_status, term_signal); } + assert(QUEUE_EMPTY(&pending)); } @@ -369,7 +357,6 @@ int uv_spawn(uv_loop_t* loop, int signal_pipe[2] = { -1, -1 }; int (*pipes)[2]; int stdio_count; - QUEUE* q; ssize_t r; pid_t pid; int err; @@ -483,8 +470,7 @@ int uv_spawn(uv_loop_t* loop, /* Only activate this handle if exec() happened successfully */ if (exec_errorno == 0) { - q = uv__process_queue(loop, pid); - QUEUE_INSERT_TAIL(q, &process->queue); + QUEUE_INSERT_TAIL(&loop->process_handles, &process->queue); uv__handle_start(process); } @@ -526,7 +512,8 @@ int uv_kill(int pid, int signum) { void uv__process_close(uv_process_t* handle) { - /* TODO stop signal watcher when this is the last handle */ QUEUE_REMOVE(&handle->queue); uv__handle_stop(handle); + if (QUEUE_EMPTY(&handle->loop->process_handles)) + uv_signal_stop(&handle->loop->child_watcher); } diff --git a/deps/uv/src/unix/stream.c b/deps/uv/src/unix/stream.c index ae7880c33fa..9c7d28cbf4d 100644 --- a/deps/uv/src/unix/stream.c +++ b/deps/uv/src/unix/stream.c @@ -53,6 +53,10 @@ struct uv__stream_select_s { int fake_fd; int int_fd; int fd; + fd_set* sread; + size_t sread_sz; + fd_set* swrite; + size_t swrite_sz; }; #endif /* defined(__APPLE__) */ @@ -127,8 +131,6 @@ static void uv__stream_osx_select(void* arg) { uv_stream_t* stream; uv__stream_select_t* s; char buf[1024]; - fd_set sread; - fd_set swrite; int events; int fd; int r; @@ -149,17 +151,17 @@ static void uv__stream_osx_select(void* arg) { break; /* Watch fd using select(2) */ - FD_ZERO(&sread); - FD_ZERO(&swrite); + memset(s->sread, 0, s->sread_sz); + memset(s->swrite, 0, s->swrite_sz); if (uv__io_active(&stream->io_watcher, UV__POLLIN)) - FD_SET(fd, &sread); + FD_SET(fd, s->sread); if (uv__io_active(&stream->io_watcher, UV__POLLOUT)) - FD_SET(fd, &swrite); - FD_SET(s->int_fd, &sread); + FD_SET(fd, s->swrite); + FD_SET(s->int_fd, s->sread); /* Wait indefinitely for fd events */ - r = select(max_fd + 1, &sread, &swrite, NULL, NULL); + r = select(max_fd + 1, s->sread, s->swrite, NULL, NULL); if (r == -1) { if (errno == EINTR) continue; @@ -173,7 +175,7 @@ static void uv__stream_osx_select(void* arg) { continue; /* Empty socketpair's buffer in case of interruption */ - if (FD_ISSET(s->int_fd, &sread)) + if (FD_ISSET(s->int_fd, s->sread)) while (1) { r = read(s->int_fd, buf, sizeof(buf)); @@ -194,12 +196,12 @@ static void uv__stream_osx_select(void* arg) { /* Handle events */ events = 0; - if (FD_ISSET(fd, &sread)) + if (FD_ISSET(fd, s->sread)) events |= UV__POLLIN; - if (FD_ISSET(fd, &swrite)) + if (FD_ISSET(fd, s->swrite)) events |= UV__POLLOUT; - assert(events != 0 || FD_ISSET(s->int_fd, &sread)); + assert(events != 0 || FD_ISSET(s->int_fd, s->sread)); if (events != 0) { ACCESS_ONCE(int, s->events) = events; @@ -261,6 +263,9 @@ int uv__stream_try_select(uv_stream_t* stream, int* fd) { int ret; int kq; int old_fd; + int max_fd; + size_t sread_sz; + size_t swrite_sz; kq = kqueue(); if (kq == -1) { @@ -284,31 +289,48 @@ int uv__stream_try_select(uv_stream_t* stream, int* fd) { return 0; /* At this point we definitely know that this fd won't work with kqueue */ - s = malloc(sizeof(*s)); - if (s == NULL) - return -ENOMEM; + + /* + * Create fds for io watcher and to interrupt the select() loop. + * NOTE: do it ahead of malloc below to allocate enough space for fd_sets + */ + if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds)) + return -errno; + + max_fd = *fd; + if (fds[1] > max_fd) + max_fd = fds[1]; + + sread_sz = (max_fd + NBBY) / NBBY; + swrite_sz = sread_sz; + + s = malloc(sizeof(*s) + sread_sz + swrite_sz); + if (s == NULL) { + err = -ENOMEM; + goto failed_malloc; + } s->events = 0; s->fd = *fd; + s->sread = (fd_set*) ((char*) s + sizeof(*s)); + s->sread_sz = sread_sz; + s->swrite = (fd_set*) ((char*) s->sread + sread_sz); + s->swrite_sz = swrite_sz; err = uv_async_init(stream->loop, &s->async, uv__stream_osx_select_cb); - if (err) { - free(s); - return err; - } + if (err) + goto failed_async_init; s->async.flags |= UV__HANDLE_INTERNAL; uv__handle_unref(&s->async); - if (uv_sem_init(&s->close_sem, 0)) - goto fatal1; - - if (uv_sem_init(&s->async_sem, 0)) - goto fatal2; + err = uv_sem_init(&s->close_sem, 0); + if (err != 0) + goto failed_close_sem_init; - /* Create fds for io watcher and to interrupt the select() loop. */ - if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds)) - goto fatal3; + err = uv_sem_init(&s->async_sem, 0); + if (err != 0) + goto failed_async_sem_init; s->fake_fd = fds[0]; s->int_fd = fds[1]; @@ -318,26 +340,36 @@ int uv__stream_try_select(uv_stream_t* stream, int* fd) { stream->select = s; *fd = s->fake_fd; - if (uv_thread_create(&s->thread, uv__stream_osx_select, stream)) - goto fatal4; + err = uv_thread_create(&s->thread, uv__stream_osx_select, stream); + if (err != 0) + goto failed_thread_create; return 0; -fatal4: +failed_thread_create: s->stream = NULL; stream->select = NULL; *fd = old_fd; - uv__close(s->fake_fd); - uv__close(s->int_fd); - s->fake_fd = -1; - s->int_fd = -1; -fatal3: + uv_sem_destroy(&s->async_sem); -fatal2: + +failed_async_sem_init: uv_sem_destroy(&s->close_sem); -fatal1: + +failed_close_sem_init: + uv__close(fds[0]); + uv__close(fds[1]); uv_close((uv_handle_t*) &s->async, uv__stream_osx_cb_close); - return -errno; + return err; + +failed_async_init: + free(s); + +failed_malloc: + uv__close(fds[0]); + uv__close(fds[1]); + + return err; } #endif /* defined(__APPLE__) */ @@ -361,10 +393,22 @@ int uv__stream_open(uv_stream_t* stream, int fd, int flags) { } -void uv__stream_destroy(uv_stream_t* stream) { +void uv__stream_flush_write_queue(uv_stream_t* stream, int error) { uv_write_t* req; QUEUE* q; + while (!QUEUE_EMPTY(&stream->write_queue)) { + q = QUEUE_HEAD(&stream->write_queue); + QUEUE_REMOVE(q); + req = QUEUE_DATA(q, uv_write_t, queue); + req->error = error; + + QUEUE_INSERT_TAIL(&stream->write_completed_queue, &req->queue); + } +} + + +void uv__stream_destroy(uv_stream_t* stream) { assert(!uv__io_active(&stream->io_watcher, UV__POLLIN | UV__POLLOUT)); assert(stream->flags & UV_CLOSED); @@ -374,16 +418,7 @@ void uv__stream_destroy(uv_stream_t* stream) { stream->connect_req = NULL; } - while (!QUEUE_EMPTY(&stream->write_queue)) { - q = QUEUE_HEAD(&stream->write_queue); - QUEUE_REMOVE(q); - - req = QUEUE_DATA(q, uv_write_t, queue); - req->error = -ECANCELED; - - QUEUE_INSERT_TAIL(&stream->write_completed_queue, &req->queue); - } - + uv__stream_flush_write_queue(stream, -ECANCELED); uv__write_callbacks(stream); if (stream->shutdown_req) { @@ -537,7 +572,7 @@ int uv_accept(uv_stream_t* server, uv_stream_t* client) { break; default: - assert(0); + return -EINVAL; } done: @@ -573,7 +608,6 @@ int uv_accept(uv_stream_t* server, uv_stream_t* client) { int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb) { int err; - err = -EINVAL; switch (stream->type) { case UV_TCP: err = uv_tcp_listen((uv_tcp_t*)stream, backlog, cb); @@ -584,7 +618,7 @@ int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb) { break; default: - assert(0); + err = -EINVAL; } if (err == 0) @@ -1163,7 +1197,7 @@ static void uv__stream_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { assert(uv__stream_fd(stream) >= 0); /* Ignore POLLHUP here. Even it it's set, there may still be data to read. */ - if (events & (UV__POLLIN | UV__POLLERR)) + if (events & (UV__POLLIN | UV__POLLERR | UV__POLLHUP)) uv__read(stream); if (uv__stream_fd(stream) == -1) @@ -1233,10 +1267,21 @@ static void uv__stream_connect(uv_stream_t* stream) { stream->connect_req = NULL; uv__req_unregister(stream->loop, req); - uv__io_stop(stream->loop, &stream->io_watcher, UV__POLLOUT); + + if (error < 0 || QUEUE_EMPTY(&stream->write_queue)) { + uv__io_stop(stream->loop, &stream->io_watcher, UV__POLLOUT); + } if (req->cb) req->cb(req, error); + + if (uv__stream_fd(stream) == -1) + return; + + if (error < 0) { + uv__stream_flush_write_queue(stream, -ECANCELED); + uv__write_callbacks(stream); + } } diff --git a/deps/uv/src/unix/timer.c b/deps/uv/src/unix/timer.c index 9bd0423b5d3..ca3ec3db957 100644 --- a/deps/uv/src/unix/timer.c +++ b/deps/uv/src/unix/timer.c @@ -65,6 +65,9 @@ int uv_timer_start(uv_timer_t* handle, uint64_t repeat) { uint64_t clamped_timeout; + if (cb == NULL) + return -EINVAL; + if (uv__is_active(handle)) uv_timer_stop(handle); diff --git a/deps/uv/src/unix/udp.c b/deps/uv/src/unix/udp.c index bf91cbdf9f2..7cafea1d089 100644 --- a/deps/uv/src/unix/udp.c +++ b/deps/uv/src/unix/udp.c @@ -340,8 +340,6 @@ static int uv__udp_maybe_deferred_bind(uv_udp_t* handle, unsigned char taddr[sizeof(struct sockaddr_in6)]; socklen_t addrlen; - assert(domain == AF_INET || domain == AF_INET6); - if (handle->io_watcher.fd != -1) return 0; diff --git a/deps/uv/src/uv-common.c b/deps/uv/src/uv-common.c index 4e3968cb448..13e732dd362 100644 --- a/deps/uv/src/uv-common.c +++ b/deps/uv/src/uv-common.c @@ -19,13 +19,6 @@ * IN THE SOFTWARE. */ -/* Expose glibc-specific EAI_* error codes. Needs to be defined before we - * include any headers. - */ -#ifndef _GNU_SOURCE -# define _GNU_SOURCE -#endif - #include "uv.h" #include "uv-common.h" @@ -39,13 +32,6 @@ # include /* if_nametoindex */ #endif -/* EAI_* constants. */ -#if !defined(_WIN32) -# include -# include -# include -#endif - #define XX(uc, lc) case UV_##uc: return sizeof(uv_##lc##_t); size_t uv_handle_size(uv_handle_type type) { @@ -410,62 +396,6 @@ uint64_t uv_now(const uv_loop_t* loop) { } -int uv__getaddrinfo_translate_error(int sys_err) { - switch (sys_err) { - case 0: return 0; -#if defined(EAI_ADDRFAMILY) - case EAI_ADDRFAMILY: return UV_EAI_ADDRFAMILY; -#endif -#if defined(EAI_AGAIN) - case EAI_AGAIN: return UV_EAI_AGAIN; -#endif -#if defined(EAI_BADFLAGS) - case EAI_BADFLAGS: return UV_EAI_BADFLAGS; -#endif -#if defined(EAI_BADHINTS) - case EAI_BADHINTS: return UV_EAI_BADHINTS; -#endif -#if defined(EAI_CANCELED) - case EAI_CANCELED: return UV_EAI_CANCELED; -#endif -#if defined(EAI_FAIL) - case EAI_FAIL: return UV_EAI_FAIL; -#endif -#if defined(EAI_FAMILY) - case EAI_FAMILY: return UV_EAI_FAMILY; -#endif -#if defined(EAI_MEMORY) - case EAI_MEMORY: return UV_EAI_MEMORY; -#endif -#if defined(EAI_NODATA) - case EAI_NODATA: return UV_EAI_NODATA; -#endif -#if defined(EAI_NONAME) -# if !defined(EAI_NODATA) || EAI_NODATA != EAI_NONAME - case EAI_NONAME: return UV_EAI_NONAME; -# endif -#endif -#if defined(EAI_OVERFLOW) - case EAI_OVERFLOW: return UV_EAI_OVERFLOW; -#endif -#if defined(EAI_PROTOCOL) - case EAI_PROTOCOL: return UV_EAI_PROTOCOL; -#endif -#if defined(EAI_SERVICE) - case EAI_SERVICE: return UV_EAI_SERVICE; -#endif -#if defined(EAI_SOCKTYPE) - case EAI_SOCKTYPE: return UV_EAI_SOCKTYPE; -#endif -#if defined(EAI_SYSTEM) - case EAI_SYSTEM: return -errno; -#endif - } - assert(!"unknown EAI_* error code"); - abort(); - return 0; /* Pacify compiler. */ -} - size_t uv__count_bufs(const uv_buf_t bufs[], unsigned int nbufs) { unsigned int i; @@ -478,6 +408,13 @@ size_t uv__count_bufs(const uv_buf_t bufs[], unsigned int nbufs) { return bytes; } +int uv_recv_buffer_size(uv_handle_t* handle, int* value) { + return uv__socket_sockopt(handle, SO_RCVBUF, value); +} + +int uv_send_buffer_size(uv_handle_t* handle, int *value) { + return uv__socket_sockopt(handle, SO_SNDBUF, value); +} int uv_fs_event_getpath(uv_fs_event_t* handle, char* buf, size_t* len) { size_t required_len; @@ -498,3 +435,68 @@ int uv_fs_event_getpath(uv_fs_event_t* handle, char* buf, size_t* len) { return 0; } + + +void uv__fs_readdir_cleanup(uv_fs_t* req) { + uv__dirent_t** dents; + + dents = req->ptr; + if (req->nbufs > 0 && req->nbufs != (unsigned int) req->result) + req->nbufs--; + for (; req->nbufs < (unsigned int) req->result; req->nbufs++) + free(dents[req->nbufs]); +} + + +int uv_fs_readdir_next(uv_fs_t* req, uv_dirent_t* ent) { + uv__dirent_t** dents; + uv__dirent_t* dent; + + dents = req->ptr; + + /* Free previous entity */ + if (req->nbufs > 0) + free(dents[req->nbufs - 1]); + + /* End was already reached */ + if (req->nbufs == (unsigned int) req->result) { + free(dents); + req->ptr = NULL; + return UV_EOF; + } + + dent = dents[req->nbufs++]; + + ent->name = dent->d_name; +#ifdef HAVE_DIRENT_TYPES + switch (dent->d_type) { + case UV__DT_DIR: + ent->type = UV_DIRENT_DIR; + break; + case UV__DT_FILE: + ent->type = UV_DIRENT_FILE; + break; + case UV__DT_LINK: + ent->type = UV_DIRENT_LINK; + break; + case UV__DT_FIFO: + ent->type = UV_DIRENT_FIFO; + break; + case UV__DT_SOCKET: + ent->type = UV_DIRENT_SOCKET; + break; + case UV__DT_CHAR: + ent->type = UV_DIRENT_CHAR; + break; + case UV__DT_BLOCK: + ent->type = UV_DIRENT_BLOCK; + break; + default: + ent->type = UV_DIRENT_UNKNOWN; + } +#else + ent->type = UV_DIRENT_UNKNOWN; +#endif + + return 0; +} diff --git a/deps/uv/src/uv-common.h b/deps/uv/src/uv-common.h index 34c287898cd..c9bad2f16bd 100644 --- a/deps/uv/src/uv-common.h +++ b/deps/uv/src/uv-common.h @@ -107,6 +107,10 @@ void uv__work_done(uv_async_t* handle); size_t uv__count_bufs(const uv_buf_t bufs[], unsigned int nbufs); +int uv__socket_sockopt(uv_handle_t* handle, int optname, int* value); + +void uv__fs_readdir_cleanup(uv_fs_t* req); + #define uv__has_active_reqs(loop) \ (QUEUE_EMPTY(&(loop)->active_reqs) == 0) diff --git a/deps/uv/src/version.c b/deps/uv/src/version.c index 02de6de305c..ff91a460904 100644 --- a/deps/uv/src/version.c +++ b/deps/uv/src/version.c @@ -35,7 +35,7 @@ #if UV_VERSION_IS_RELEASE # define UV_VERSION_STRING UV_VERSION_STRING_BASE #else -# define UV_VERSION_STRING UV_VERSION_STRING_BASE "-pre" +# define UV_VERSION_STRING UV_VERSION_STRING_BASE "-" UV_VERSION_SUFFIX #endif diff --git a/deps/uv/src/win/core.c b/deps/uv/src/win/core.c index c39597561dd..c9e4c88fa73 100644 --- a/deps/uv/src/win/core.c +++ b/deps/uv/src/win/core.c @@ -36,12 +36,11 @@ #include "req-inl.h" -/* The only event loop we support right now */ -static uv_loop_t uv_default_loop_; +static uv_loop_t default_loop_struct; +static uv_loop_t* default_loop_ptr; /* uv_once intialization guards */ static uv_once_t uv_init_guard_ = UV_ONCE_INIT; -static uv_once_t uv_default_loop_init_guard_ = UV_ONCE_INIT; #if defined(_DEBUG) && (defined(_MSC_VER) || defined(__MINGW64_VERSION_MAJOR)) @@ -138,7 +137,6 @@ int uv_loop_init(uv_loop_t* loop) { * to zero before calling uv_update_time for the first time. */ loop->time = 0; - loop->last_tick_count = 0; uv_update_time(loop); QUEUE_INIT(&loop->wq); @@ -181,48 +179,45 @@ int uv_loop_init(uv_loop_t* loop) { } -static void uv_default_loop_init(void) { - /* Initialize libuv itself first */ - uv__once_init(); - - /* Initialize the main loop */ - uv_loop_init(&uv_default_loop_); -} - - void uv__once_init(void) { uv_once(&uv_init_guard_, uv_init); } uv_loop_t* uv_default_loop(void) { - uv_once(&uv_default_loop_init_guard_, uv_default_loop_init); - return &uv_default_loop_; + if (default_loop_ptr != NULL) + return default_loop_ptr; + + if (uv_loop_init(&default_loop_struct)) + return NULL; + + default_loop_ptr = &default_loop_struct; + return default_loop_ptr; } static void uv__loop_close(uv_loop_t* loop) { + size_t i; + /* close the async handle without needeing an extra loop iteration */ assert(!loop->wq_async.async_sent); loop->wq_async.close_cb = NULL; uv__handle_closing(&loop->wq_async); uv__handle_close(&loop->wq_async); - if (loop != &uv_default_loop_) { - size_t i; - for (i = 0; i < ARRAY_SIZE(loop->poll_peer_sockets); i++) { - SOCKET sock = loop->poll_peer_sockets[i]; - if (sock != 0 && sock != INVALID_SOCKET) - closesocket(sock); - } + for (i = 0; i < ARRAY_SIZE(loop->poll_peer_sockets); i++) { + SOCKET sock = loop->poll_peer_sockets[i]; + if (sock != 0 && sock != INVALID_SOCKET) + closesocket(sock); } - /* TODO: cleanup default loop*/ uv_mutex_lock(&loop->wq_mutex); assert(QUEUE_EMPTY(&loop->wq) && "thread pool work queue not empty!"); assert(!uv__has_active_reqs(loop)); uv_mutex_unlock(&loop->wq_mutex); uv_mutex_destroy(&loop->wq_mutex); + + CloseHandle(loop->iocp); } @@ -242,6 +237,8 @@ int uv_loop_close(uv_loop_t* loop) { #ifndef NDEBUG memset(loop, -1, sizeof(*loop)); #endif + if (loop == default_loop_ptr) + default_loop_ptr = NULL; return 0; } @@ -265,9 +262,12 @@ uv_loop_t* uv_loop_new(void) { void uv_loop_delete(uv_loop_t* loop) { - int err = uv_loop_close(loop); + uv_loop_t* default_loop; + int err; + default_loop = default_loop_ptr; + err = uv_loop_close(loop); assert(err == 0); - if (loop != &uv_default_loop_) + if (loop != default_loop) free(loop); } @@ -313,13 +313,17 @@ static void uv_poll(uv_loop_t* loop, DWORD timeout) { /* Package was dequeued */ req = uv_overlapped_to_req(overlapped); uv_insert_pending_req(loop, req); + + /* Some time might have passed waiting for I/O, + * so update the loop time here. + */ + uv_update_time(loop); } else if (GetLastError() != WAIT_TIMEOUT) { /* Serious error */ uv_fatal_error(GetLastError(), "GetQueuedCompletionStatus"); - } else { - /* We're sure that at least `timeout` milliseconds have expired, but - * this may not be reflected yet in the GetTickCount() return value. - * Therefore we ensure it's taken into account here. + } else if (timeout > 0) { + /* GetQueuedCompletionStatus can occasionally return a little early. + * Make sure that the desired timeout is reflected in the loop time. */ uv__time_forward(loop, timeout); } @@ -346,13 +350,17 @@ static void uv_poll_ex(uv_loop_t* loop, DWORD timeout) { req = uv_overlapped_to_req(overlappeds[i].lpOverlapped); uv_insert_pending_req(loop, req); } + + /* Some time might have passed waiting for I/O, + * so update the loop time here. + */ + uv_update_time(loop); } else if (GetLastError() != WAIT_TIMEOUT) { /* Serious error */ uv_fatal_error(GetLastError(), "GetQueuedCompletionStatusEx"); } else if (timeout > 0) { - /* We're sure that at least `timeout` milliseconds have expired, but - * this may not be reflected yet in the GetTickCount() return value. - * Therefore we ensure it's taken into account here. + /* GetQueuedCompletionStatus can occasionally return a little early. + * Make sure that the desired timeout is reflected in the loop time. */ uv__time_forward(loop, timeout); } @@ -411,7 +419,6 @@ int uv_run(uv_loop_t *loop, uv_run_mode mode) { * UV_RUN_NOWAIT makes no guarantees about progress so it's omitted from * the check. */ - uv_update_time(loop); uv_process_timers(loop); } @@ -428,3 +435,68 @@ int uv_run(uv_loop_t *loop, uv_run_mode mode) { return r; } + + +int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd) { + uv_os_fd_t fd_out; + + switch (handle->type) { + case UV_TCP: + fd_out = (uv_os_fd_t)((uv_tcp_t*) handle)->socket; + break; + + case UV_NAMED_PIPE: + fd_out = ((uv_pipe_t*) handle)->handle; + break; + + case UV_TTY: + fd_out = ((uv_tty_t*) handle)->handle; + break; + + case UV_UDP: + fd_out = (uv_os_fd_t)((uv_udp_t*) handle)->socket; + break; + + case UV_POLL: + fd_out = (uv_os_fd_t)((uv_poll_t*) handle)->socket; + break; + + default: + return UV_EINVAL; + } + + if (uv_is_closing(handle) || fd_out == INVALID_HANDLE_VALUE) + return UV_EBADF; + + *fd = fd_out; + return 0; +} + + +int uv__socket_sockopt(uv_handle_t* handle, int optname, int* value) { + int r; + int len; + SOCKET socket; + + if (handle == NULL || value == NULL) + return UV_EINVAL; + + if (handle->type == UV_TCP) + socket = ((uv_tcp_t*) handle)->socket; + else if (handle->type == UV_UDP) + socket = ((uv_udp_t*) handle)->socket; + else + return UV_ENOTSUP; + + len = sizeof(*value); + + if (*value == 0) + r = getsockopt(socket, SOL_SOCKET, optname, (char*) value, &len); + else + r = setsockopt(socket, SOL_SOCKET, optname, (const char*) value, len); + + if (r == SOCKET_ERROR) + return uv_translate_sys_error(WSAGetLastError()); + + return 0; +} diff --git a/deps/uv/src/win/fs.c b/deps/uv/src/win/fs.c index 8b52e610f42..d3801460e89 100644 --- a/deps/uv/src/win/fs.c +++ b/deps/uv/src/win/fs.c @@ -36,11 +36,15 @@ #include "req-inl.h" #include "handle-inl.h" +#include + #define UV_FS_FREE_PATHS 0x0002 #define UV_FS_FREE_PTR 0x0008 #define UV_FS_CLEANEDUP 0x0010 +static const int uv__fs_dirent_slide = 0x20; + #define QUEUE_FS_TP_JOB(loop, req) \ do { \ @@ -721,88 +725,75 @@ void fs__mkdir(uv_fs_t* req) { } -/* Some parts of the implementation were borrowed from glibc. */ +/* OpenBSD original: lib/libc/stdio/mktemp.c */ void fs__mkdtemp(uv_fs_t* req) { - static const WCHAR letters[] = + static const WCHAR *tempchars = L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + static const size_t num_chars = 62; + static const size_t num_x = 6; + WCHAR *cp, *ep; + unsigned int tries, i; size_t len; - WCHAR* template_part; - static uint64_t value; - unsigned int count; - int fd; - - /* A lower bound on the number of temporary files to attempt to - generate. The maximum total number of temporary file names that - can exist for a given template is 62**6. It should never be - necessary to try all these combinations. Instead if a reasonable - number of names is tried (we define reasonable as 62**3) fail to - give the system administrator the chance to remove the problems. */ -#define ATTEMPTS_MIN (62 * 62 * 62) - - /* The number of times to attempt to generate a temporary file. To - conform to POSIX, this must be no smaller than TMP_MAX. */ -#if ATTEMPTS_MIN < TMP_MAX - unsigned int attempts = TMP_MAX; -#else - unsigned int attempts = ATTEMPTS_MIN; -#endif + HCRYPTPROV h_crypt_prov; + uint64_t v; + BOOL released; len = wcslen(req->pathw); - if (len < 6 || wcsncmp(&req->pathw[len - 6], L"XXXXXX", 6)) { + ep = req->pathw + len; + if (len < num_x || wcsncmp(ep - num_x, L"XXXXXX", num_x)) { SET_REQ_UV_ERROR(req, UV_EINVAL, ERROR_INVALID_PARAMETER); return; } - /* This is where the Xs start. */ - template_part = &req->pathw[len - 6]; - - /* Get some random data. */ - value += uv_hrtime() ^ _getpid(); - - for (count = 0; count < attempts; value += 7777, ++count) { - uint64_t v = value; + if (!CryptAcquireContext(&h_crypt_prov, NULL, NULL, PROV_RSA_FULL, + CRYPT_VERIFYCONTEXT)) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + return; + } - /* Fill in the random bits. */ - template_part[0] = letters[v % 62]; - v /= 62; - template_part[1] = letters[v % 62]; - v /= 62; - template_part[2] = letters[v % 62]; - v /= 62; - template_part[3] = letters[v % 62]; - v /= 62; - template_part[4] = letters[v % 62]; - v /= 62; - template_part[5] = letters[v % 62]; + tries = TMP_MAX; + do { + if (!CryptGenRandom(h_crypt_prov, sizeof(v), (BYTE*) &v)) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + break; + } - fd = _wmkdir(req->pathw); + cp = ep - num_x; + for (i = 0; i < num_x; i++) { + *cp++ = tempchars[v % num_chars]; + v /= num_chars; + } - if (fd >= 0) { + if (_wmkdir(req->pathw) == 0) { len = strlen(req->path); - wcstombs((char*) req->path + len - 6, template_part, 6); + wcstombs((char*) req->path + len - num_x, ep - num_x, num_x); SET_REQ_RESULT(req, 0); - return; + break; } else if (errno != EEXIST) { SET_REQ_RESULT(req, -1); - return; + break; } - } + } while (--tries); - /* We got out of the loop because we ran out of combinations to try. */ - SET_REQ_RESULT(req, -1); + released = CryptReleaseContext(h_crypt_prov, 0); + assert(released); + if (tries == 0) { + SET_REQ_RESULT(req, -1); + } } void fs__readdir(uv_fs_t* req) { WCHAR* pathw = req->pathw; size_t len = wcslen(pathw); - int result, size; - WCHAR* buf = NULL, *ptr, *name; + int result; + WCHAR* name; HANDLE dir; WIN32_FIND_DATAW ent = { 0 }; - size_t buf_char_len = 4096; WCHAR* path2; const WCHAR* fmt; + uv__dirent_t** dents; + int dent_size; if (len == 0) { fmt = L"./*"; @@ -821,7 +812,8 @@ void fs__readdir(uv_fs_t* req) { path2 = (WCHAR*)malloc(sizeof(WCHAR) * (len + 4)); if (!path2) { - uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); + SET_REQ_UV_ERROR(req, UV_ENOMEM, ERROR_OUTOFMEMORY); + return; } _snwprintf(path2, len + 3, fmt, pathw); @@ -834,71 +826,81 @@ void fs__readdir(uv_fs_t* req) { } result = 0; + dents = NULL; + dent_size = 0; do { - name = ent.cFileName; - - if (name[0] != L'.' || (name[1] && (name[1] != L'.' || name[2]))) { - len = wcslen(name); + uv__dirent_t* dent; + int utf8_len; - if (!buf) { - buf = (WCHAR*)malloc(buf_char_len * sizeof(WCHAR)); - if (!buf) { - uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); - } + name = ent.cFileName; - ptr = buf; - } + if (!(name[0] != L'.' || (name[1] && (name[1] != L'.' || name[2])))) + continue; - while ((ptr - buf) + len + 1 > buf_char_len) { - buf_char_len *= 2; - path2 = buf; - buf = (WCHAR*)realloc(buf, buf_char_len * sizeof(WCHAR)); - if (!buf) { - uv_fatal_error(ERROR_OUTOFMEMORY, "realloc"); - } + /* Grow dents buffer, if needed */ + if (result >= dent_size) { + uv__dirent_t** tmp; - ptr = buf + (ptr - path2); + dent_size += uv__fs_dirent_slide; + tmp = realloc(dents, dent_size * sizeof(*dents)); + if (tmp == NULL) { + SET_REQ_UV_ERROR(req, UV_ENOMEM, ERROR_OUTOFMEMORY); + goto fatal; } - - wcscpy(ptr, name); - ptr += len + 1; - result++; + dents = tmp; } - } while(FindNextFileW(dir, &ent)); - FindClose(dir); - - if (buf) { - /* Convert result to UTF8. */ - size = uv_utf16_to_utf8(buf, buf_char_len, NULL, 0); - if (!size) { + /* Allocate enough space to fit utf8 encoding of file name */ + len = wcslen(name); + utf8_len = uv_utf16_to_utf8(name, len, NULL, 0); + if (!utf8_len) { SET_REQ_WIN32_ERROR(req, GetLastError()); - return; + goto fatal; } - req->ptr = (char*)malloc(size + 1); - if (!req->ptr) { - uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); + dent = malloc(sizeof(*dent) + utf8_len + 1); + if (dent == NULL) { + SET_REQ_UV_ERROR(req, UV_ENOMEM, ERROR_OUTOFMEMORY); + goto fatal; } - size = uv_utf16_to_utf8(buf, buf_char_len, (char*)req->ptr, size); - if (!size) { - free(buf); - free(req->ptr); - req->ptr = NULL; + /* Copy file name */ + utf8_len = uv_utf16_to_utf8(name, len, dent->d_name, utf8_len); + if (!utf8_len) { + free(dent); SET_REQ_WIN32_ERROR(req, GetLastError()); - return; + goto fatal; } - free(buf); + dent->d_name[utf8_len] = '\0'; - ((char*)req->ptr)[size] = '\0'; + /* Copy file type */ + if ((ent.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) + dent->d_type = UV__DT_DIR; + else if ((ent.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) + dent->d_type = UV__DT_LINK; + else + dent->d_type = UV__DT_FILE; + + dents[result++] = dent; + } while(FindNextFileW(dir, &ent)); + + FindClose(dir); + + if (dents != NULL) req->flags |= UV_FS_FREE_PTR; - } else { - req->ptr = NULL; - } + /* NOTE: nbufs will be used as index */ + req->nbufs = 0; + req->ptr = dents; SET_REQ_RESULT(req, result); + return; + +fatal: + /* Deallocate dents */ + for (result--; result >= 0; result--) + free(dents[result]); + free(dents); } diff --git a/deps/uv/src/win/getaddrinfo.c b/deps/uv/src/win/getaddrinfo.c index 086200a9ea3..787cfd53664 100644 --- a/deps/uv/src/win/getaddrinfo.c +++ b/deps/uv/src/win/getaddrinfo.c @@ -26,6 +26,25 @@ #include "internal.h" #include "req-inl.h" +/* EAI_* constants. */ +#include + + +int uv__getaddrinfo_translate_error(int sys_err) { + switch (sys_err) { + case 0: return 0; + case WSATRY_AGAIN: return UV_EAI_AGAIN; + case WSAEINVAL: return UV_EAI_BADFLAGS; + case WSANO_RECOVERY: return UV_EAI_FAIL; + case WSAEAFNOSUPPORT: return UV_EAI_FAMILY; + case WSA_NOT_ENOUGH_MEMORY: return UV_EAI_MEMORY; + case WSAHOST_NOT_FOUND: return UV_EAI_NONAME; + case WSATYPE_NOT_FOUND: return UV_EAI_SERVICE; + case WSAESOCKTNOSUPPORT: return UV_EAI_SOCKTYPE; + default: return uv_translate_sys_error(sys_err); + } +} + /* * MinGW is missing this diff --git a/deps/uv/src/win/getnameinfo.c b/deps/uv/src/win/getnameinfo.c index 45608dae85d..52cc7908892 100644 --- a/deps/uv/src/win/getnameinfo.c +++ b/deps/uv/src/win/getnameinfo.c @@ -46,13 +46,15 @@ static void uv__getnameinfo_work(struct uv__work* w) { int ret = 0; req = container_of(w, uv_getnameinfo_t, work_req); - ret = GetNameInfoW((struct sockaddr*)&req->storage, - sizeof(req->storage), - host, - ARRAY_SIZE(host), - service, - ARRAY_SIZE(service), - req->flags); + if (GetNameInfoW((struct sockaddr*)&req->storage, + sizeof(req->storage), + host, + ARRAY_SIZE(host), + service, + ARRAY_SIZE(service), + req->flags)) { + ret = WSAGetLastError(); + } req->retcode = uv__getaddrinfo_translate_error(ret); /* convert results to UTF-8 */ diff --git a/deps/uv/src/win/internal.h b/deps/uv/src/win/internal.h index 9eadb71235c..d87402b73a0 100644 --- a/deps/uv/src/win/internal.h +++ b/deps/uv/src/win/internal.h @@ -65,7 +65,6 @@ extern UV_THREAD_LOCAL int uv__crt_assert_enabled; /* Used by all handles. */ #define UV_HANDLE_CLOSED 0x00000002 #define UV_HANDLE_ENDGAME_QUEUED 0x00000004 -#define UV_HANDLE_ACTIVE 0x00000010 /* uv-common.h: #define UV__HANDLE_CLOSING 0x00000001 */ /* uv-common.h: #define UV__HANDLE_ACTIVE 0x00000040 */ @@ -100,6 +99,7 @@ extern UV_THREAD_LOCAL int uv__crt_assert_enabled; /* Only used by uv_pipe_t handles. */ #define UV_HANDLE_NON_OVERLAPPED_PIPE 0x01000000 #define UV_HANDLE_PIPESERVER 0x02000000 +#define UV_HANDLE_PIPE_READ_CANCELABLE 0x04000000 /* Only used by uv_tty_t handles. */ #define UV_HANDLE_TTY_READABLE 0x01000000 @@ -181,6 +181,9 @@ int uv_pipe_write(uv_loop_t* loop, uv_write_t* req, uv_pipe_t* handle, int uv_pipe_write2(uv_loop_t* loop, uv_write_t* req, uv_pipe_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_stream_t* send_handle, uv_write_cb cb); +void uv__pipe_pause_read(uv_pipe_t* handle); +void uv__pipe_unpause_read(uv_pipe_t* handle); +void uv__pipe_stop_read(uv_pipe_t* handle); void uv_process_pipe_read_req(uv_loop_t* loop, uv_pipe_t* handle, uv_req_t* req); @@ -319,6 +322,7 @@ void uv__fs_poll_endgame(uv_loop_t* loop, uv_fs_poll_t* handle); */ void uv__util_init(); +uint64_t uv__hrtime(double scale); int uv_parent_pid(); __declspec(noreturn) void uv_fatal_error(const int errorno, const char* syscall); diff --git a/deps/uv/src/win/loop-watcher.c b/deps/uv/src/win/loop-watcher.c index eb49f7cbc55..20e4509f838 100644 --- a/deps/uv/src/win/loop-watcher.c +++ b/deps/uv/src/win/loop-watcher.c @@ -49,7 +49,7 @@ void uv_loop_watcher_endgame(uv_loop_t* loop, uv_handle_t* handle) { \ assert(handle->type == UV_##NAME); \ \ - if (handle->flags & UV_HANDLE_ACTIVE) \ + if (uv__is_active(handle)) \ return 0; \ \ if (cb == NULL) \ @@ -67,7 +67,6 @@ void uv_loop_watcher_endgame(uv_loop_t* loop, uv_handle_t* handle) { loop->name##_handles = handle; \ \ handle->name##_cb = cb; \ - handle->flags |= UV_HANDLE_ACTIVE; \ uv__handle_start(handle); \ \ return 0; \ @@ -79,7 +78,7 @@ void uv_loop_watcher_endgame(uv_loop_t* loop, uv_handle_t* handle) { \ assert(handle->type == UV_##NAME); \ \ - if (!(handle->flags & UV_HANDLE_ACTIVE)) \ + if (!uv__is_active(handle)) \ return 0; \ \ /* Update loop head if needed */ \ @@ -99,7 +98,6 @@ void uv_loop_watcher_endgame(uv_loop_t* loop, uv_handle_t* handle) { handle->name##_next->name##_prev = handle->name##_prev; \ } \ \ - handle->flags &= ~UV_HANDLE_ACTIVE; \ uv__handle_stop(handle); \ \ return 0; \ diff --git a/deps/uv/src/win/pipe.c b/deps/uv/src/win/pipe.c index 3bf2a220d0c..c78051db7c9 100644 --- a/deps/uv/src/win/pipe.c +++ b/deps/uv/src/win/pipe.c @@ -101,6 +101,7 @@ int uv_pipe_init(uv_loop_t* loop, uv_pipe_t* handle, int ipc) { handle->pending_ipc_info.queue_len = 0; handle->ipc = ipc; handle->non_overlapped_writes_tail = NULL; + handle->readfile_thread = NULL; uv_req_init(loop, (uv_req_t*) &handle->ipc_header_write_req); @@ -112,6 +113,12 @@ static void uv_pipe_connection_init(uv_pipe_t* handle) { uv_connection_init((uv_stream_t*) handle); handle->read_req.data = handle; handle->eof_timer = NULL; + assert(!(handle->flags & UV_HANDLE_PIPESERVER)); + if (pCancelSynchronousIo && + handle->flags & UV_HANDLE_NON_OVERLAPPED_PIPE) { + uv_mutex_init(&handle->readfile_mutex); + handle->flags |= UV_HANDLE_PIPE_READ_CANCELABLE; + } } @@ -321,6 +328,11 @@ void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle) { FILE_PIPE_LOCAL_INFORMATION pipe_info; uv__ipc_queue_item_t* item; + if (handle->flags & UV_HANDLE_PIPE_READ_CANCELABLE) { + handle->flags &= ~UV_HANDLE_PIPE_READ_CANCELABLE; + uv_mutex_destroy(&handle->readfile_mutex); + } + if ((handle->flags & UV_HANDLE_CONNECTION) && handle->shutdown_req != NULL && handle->write_reqs_pending == 0) { @@ -658,12 +670,49 @@ void uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle, } +void uv__pipe_pause_read(uv_pipe_t* handle) { + if (handle->flags & UV_HANDLE_PIPE_READ_CANCELABLE) { + /* Pause the ReadFile task briefly, to work + around the Windows kernel bug that causes + any access to a NamedPipe to deadlock if + any process has called ReadFile */ + HANDLE h; + uv_mutex_lock(&handle->readfile_mutex); + h = handle->readfile_thread; + while (h) { + /* spinlock: we expect this to finish quickly, + or we are probably about to deadlock anyways + (in the kernel), so it doesn't matter */ + pCancelSynchronousIo(h); + SwitchToThread(); /* yield thread control briefly */ + h = handle->readfile_thread; + } + } +} + + +void uv__pipe_unpause_read(uv_pipe_t* handle) { + if (handle->flags & UV_HANDLE_PIPE_READ_CANCELABLE) { + uv_mutex_unlock(&handle->readfile_mutex); + } +} + + +void uv__pipe_stop_read(uv_pipe_t* handle) { + handle->flags &= ~UV_HANDLE_READING; + uv__pipe_pause_read((uv_pipe_t*)handle); + uv__pipe_unpause_read((uv_pipe_t*)handle); +} + + /* Cleans up uv_pipe_t (server or connection) and all resources associated */ /* with it. */ void uv_pipe_cleanup(uv_loop_t* loop, uv_pipe_t* handle) { int i; HANDLE pipeHandle; + uv__pipe_stop_read(handle); + if (handle->name) { free(handle->name); handle->name = NULL; @@ -689,6 +738,7 @@ void uv_pipe_cleanup(uv_loop_t* loop, uv_pipe_t* handle) { CloseHandle(handle->handle); handle->handle = INVALID_HANDLE_VALUE; } + } @@ -867,19 +917,61 @@ static DWORD WINAPI uv_pipe_zero_readfile_thread_proc(void* parameter) { uv_read_t* req = (uv_read_t*) parameter; uv_pipe_t* handle = (uv_pipe_t*) req->data; uv_loop_t* loop = handle->loop; + HANDLE hThread = NULL; + DWORD err; + uv_mutex_t *m = &handle->readfile_mutex; assert(req != NULL); assert(req->type == UV_READ); assert(handle->type == UV_NAMED_PIPE); + if (handle->flags & UV_HANDLE_PIPE_READ_CANCELABLE) { + uv_mutex_lock(m); /* mutex controls *setting* of readfile_thread */ + if (DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), + GetCurrentProcess(), &hThread, + 0, TRUE, DUPLICATE_SAME_ACCESS)) { + handle->readfile_thread = hThread; + } else { + hThread = NULL; + } + uv_mutex_unlock(m); + } +restart_readfile: result = ReadFile(handle->handle, &uv_zero_, 0, &bytes, NULL); + if (!result) { + err = GetLastError(); + if (err == ERROR_OPERATION_ABORTED && + handle->flags & UV_HANDLE_PIPE_READ_CANCELABLE) { + if (handle->flags & UV_HANDLE_READING) { + /* just a brief break to do something else */ + handle->readfile_thread = NULL; + /* resume after it is finished */ + uv_mutex_lock(m); + handle->readfile_thread = hThread; + uv_mutex_unlock(m); + goto restart_readfile; + } else { + result = 1; /* successfully stopped reading */ + } + } + } + if (hThread) { + assert(hThread == handle->readfile_thread); + /* mutex does not control clearing readfile_thread */ + handle->readfile_thread = NULL; + uv_mutex_lock(m); + /* only when we hold the mutex lock is it safe to + open or close the handle */ + CloseHandle(hThread); + uv_mutex_unlock(m); + } if (!result) { - SET_REQ_ERROR(req, GetLastError()); + SET_REQ_ERROR(req, err); } POST_COMPLETION_FOR_REQ(loop, req); @@ -1836,6 +1928,8 @@ int uv_pipe_getsockname(const uv_pipe_t* handle, char* buf, size_t* len) { return UV_EINVAL; } + uv__pipe_pause_read((uv_pipe_t*)handle); /* cast away const warning */ + nt_status = pNtQueryInformationFile(handle->handle, &io_status, &tmp_name_info, @@ -1846,7 +1940,8 @@ int uv_pipe_getsockname(const uv_pipe_t* handle, char* buf, size_t* len) { name_info = malloc(name_size); if (!name_info) { *len = 0; - return UV_ENOMEM; + err = UV_ENOMEM; + goto cleanup; } nt_status = pNtQueryInformationFile(handle->handle, @@ -1918,10 +2013,14 @@ int uv_pipe_getsockname(const uv_pipe_t* handle, char* buf, size_t* len) { buf[addrlen++] = '\0'; *len = addrlen; - return 0; + err = 0; + goto cleanup; error: free(name_info); + +cleanup: + uv__pipe_unpause_read((uv_pipe_t*)handle); /* cast away const warning */ return err; } diff --git a/deps/uv/src/win/process.c b/deps/uv/src/win/process.c index 40023e55723..4d04a0e9061 100644 --- a/deps/uv/src/win/process.c +++ b/deps/uv/src/win/process.c @@ -171,8 +171,10 @@ static WCHAR* search_path_join_test(const WCHAR* dir, size_t cwd_len) { WCHAR *result, *result_pos; DWORD attrs; - - if (dir_len >= 1 && (dir[0] == L'/' || dir[0] == L'\\')) { + if (dir_len > 2 && dir[0] == L'\\' && dir[1] == L'\\') { + /* It's a UNC path so ignore cwd */ + cwd_len = 0; + } else if (dir_len >= 1 && (dir[0] == L'/' || dir[0] == L'\\')) { /* It's a full path without drive letter, use cwd's drive letter only */ cwd_len = 2; } else if (dir_len >= 2 && dir[1] == L':' && @@ -331,7 +333,11 @@ static WCHAR* path_search_walk_ext(const WCHAR *dir, * file that is not readable/executable; if the spawn fails it will not * continue searching. * - * TODO: correctly interpret UNC paths + * UNC path support: we are dealing with UNC paths in both the path and the + * filename. This is a deviation from what cmd.exe does (it does not let you + * start a program by specifying an UNC path on the command line) but this is + * really a pointless restriction. + * */ static WCHAR* search_path(const WCHAR *file, WCHAR *cwd, @@ -794,10 +800,8 @@ int make_program_env(char* env_block[], WCHAR** dst_ptr) { i++; } else { /* copy var from env_block */ - DWORD r; len = wcslen(*ptr_copy) + 1; - r = wmemcpy_s(ptr, (env_len - (ptr - dst)), *ptr_copy, len); - assert(!r); + wmemcpy(ptr, *ptr_copy, len); ptr_copy++; if (cmp == 0) i++; diff --git a/deps/uv/src/win/stream.c b/deps/uv/src/win/stream.c index 6553ab11d72..057f72ecad8 100644 --- a/deps/uv/src/win/stream.c +++ b/deps/uv/src/win/stream.c @@ -106,7 +106,11 @@ int uv_read_stop(uv_stream_t* handle) { if (handle->type == UV_TTY) { err = uv_tty_read_stop((uv_tty_t*) handle); } else { - handle->flags &= ~UV_HANDLE_READING; + if (handle->type == UV_NAMED_PIPE) { + uv__pipe_stop_read((uv_pipe_t*) handle); + } else { + handle->flags &= ~UV_HANDLE_READING; + } DECREASE_ACTIVE_COUNT(handle->loop, handle); } diff --git a/deps/uv/src/win/tcp.c b/deps/uv/src/win/tcp.c index a213ad63e77..23fadc220da 100644 --- a/deps/uv/src/win/tcp.c +++ b/deps/uv/src/win/tcp.c @@ -196,6 +196,7 @@ void uv_tcp_endgame(uv_loop_t* loop, uv_tcp_t* handle) { if (!(handle->flags & UV_HANDLE_TCP_SOCKET_CLOSED)) { closesocket(handle->socket); + handle->socket = INVALID_SOCKET; handle->flags |= UV_HANDLE_TCP_SOCKET_CLOSED; } @@ -1368,6 +1369,7 @@ void uv_tcp_close(uv_loop_t* loop, uv_tcp_t* tcp) { if (close_socket) { closesocket(tcp->socket); + tcp->socket = INVALID_SOCKET; tcp->flags |= UV_HANDLE_TCP_SOCKET_CLOSED; } diff --git a/deps/uv/src/win/timer.c b/deps/uv/src/win/timer.c index c229d4c897f..0da541a2c86 100644 --- a/deps/uv/src/win/timer.c +++ b/deps/uv/src/win/timer.c @@ -28,39 +28,17 @@ #include "handle-inl.h" -void uv_update_time(uv_loop_t* loop) { - DWORD ticks; - ULARGE_INTEGER time; - - ticks = GetTickCount(); +/* The number of milliseconds in one second. */ +#define UV__MILLISEC 1000 - time.QuadPart = loop->time; - /* GetTickCount() can conceivably wrap around, so when the current tick - * count is lower than the last tick count, we'll assume it has wrapped. - * uv_poll must make sure that the timer can never overflow more than - * once between two subsequent uv_update_time calls. - */ - time.LowPart = ticks; - if (ticks < loop->last_tick_count) - time.HighPart++; - - /* Remember the last tick count. */ - loop->last_tick_count = ticks; - - /* The GetTickCount() resolution isn't too good. Sometimes it'll happen - * that GetQueuedCompletionStatus() or GetQueuedCompletionStatusEx() has - * waited for a couple of ms but this is not reflected in the GetTickCount - * result yet. Therefore whenever GetQueuedCompletionStatus times out - * we'll add the number of ms that it has waited to the current loop time. - * When that happened the loop time might be a little ms farther than what - * we've just computed, and we shouldn't update the loop time. - */ - if (loop->time < time.QuadPart) - loop->time = time.QuadPart; +void uv_update_time(uv_loop_t* loop) { + uint64_t new_time = uv__hrtime(UV__MILLISEC); + if (new_time > loop->time) { + loop->time = new_time; + } } - void uv__time_forward(uv_loop_t* loop, uint64_t msecs) { loop->time += msecs; } @@ -119,14 +97,15 @@ int uv_timer_start(uv_timer_t* handle, uv_timer_cb timer_cb, uint64_t timeout, uv_loop_t* loop = handle->loop; uv_timer_t* old; - if (handle->flags & UV_HANDLE_ACTIVE) { - RB_REMOVE(uv_timer_tree_s, &loop->timers, handle); - } + if (timer_cb == NULL) + return UV_EINVAL; + + if (uv__is_active(handle)) + uv_timer_stop(handle); handle->timer_cb = timer_cb; handle->due = get_clamped_due_time(loop->time, timeout); handle->repeat = repeat; - handle->flags |= UV_HANDLE_ACTIVE; uv__handle_start(handle); /* start_id is the second index to be compared in uv__timer_cmp() */ @@ -142,12 +121,10 @@ int uv_timer_start(uv_timer_t* handle, uv_timer_cb timer_cb, uint64_t timeout, int uv_timer_stop(uv_timer_t* handle) { uv_loop_t* loop = handle->loop; - if (!(handle->flags & UV_HANDLE_ACTIVE)) + if (!uv__is_active(handle)) return 0; RB_REMOVE(uv_timer_tree_s, &loop->timers, handle); - - handle->flags &= ~UV_HANDLE_ACTIVE; uv__handle_stop(handle); return 0; @@ -155,28 +132,14 @@ int uv_timer_stop(uv_timer_t* handle) { int uv_timer_again(uv_timer_t* handle) { - uv_loop_t* loop = handle->loop; - /* If timer_cb is NULL that means that the timer was never started. */ if (!handle->timer_cb) { return UV_EINVAL; } - if (handle->flags & UV_HANDLE_ACTIVE) { - RB_REMOVE(uv_timer_tree_s, &loop->timers, handle); - handle->flags &= ~UV_HANDLE_ACTIVE; - uv__handle_stop(handle); - } - if (handle->repeat) { - handle->due = get_clamped_due_time(loop->time, handle->repeat); - - if (RB_INSERT(uv_timer_tree_s, &loop->timers, handle) != NULL) { - uv_fatal_error(ERROR_INVALID_DATA, "RB_INSERT"); - } - - handle->flags |= UV_HANDLE_ACTIVE; - uv__handle_start(handle); + uv_timer_stop(handle); + uv_timer_start(handle, handle->timer_cb, handle->repeat, handle->repeat); } return 0; @@ -206,16 +169,9 @@ DWORD uv__next_timeout(const uv_loop_t* loop) { timer = RB_MIN(uv_timer_tree_s, &((uv_loop_t*)loop)->timers); if (timer) { delta = timer->due - loop->time; - if (delta >= UINT_MAX >> 1) { - /* A timeout value of UINT_MAX means infinite, so that's no good. But - * more importantly, there's always the risk that GetTickCount wraps. - * uv_update_time can detect this, but we must make sure that the - * tick counter never overflows twice between two subsequent - * uv_update_time calls. We do this by never sleeping more than half - * the time it takes to wrap the counter - which is huge overkill, - * but hey, it's not so bad to wake up every 25 days. - */ - return UINT_MAX >> 1; + if (delta >= UINT_MAX - 1) { + /* A timeout value of UINT_MAX means infinite, so that's no good. */ + return UINT_MAX - 1; } else if (delta < 0) { /* Negative timeout values are not allowed */ return 0; @@ -236,23 +192,9 @@ void uv_process_timers(uv_loop_t* loop) { for (timer = RB_MIN(uv_timer_tree_s, &loop->timers); timer != NULL && timer->due <= loop->time; timer = RB_MIN(uv_timer_tree_s, &loop->timers)) { - RB_REMOVE(uv_timer_tree_s, &loop->timers, timer); - - if (timer->repeat != 0) { - /* If it is a repeating timer, reschedule with repeat timeout. */ - timer->due = get_clamped_due_time(timer->due, timer->repeat); - if (timer->due < loop->time) { - timer->due = loop->time; - } - if (RB_INSERT(uv_timer_tree_s, &loop->timers, timer) != NULL) { - uv_fatal_error(ERROR_INVALID_DATA, "RB_INSERT"); - } - } else { - /* If non-repeating, mark the timer as inactive. */ - timer->flags &= ~UV_HANDLE_ACTIVE; - uv__handle_stop(timer); - } + uv_timer_stop(timer); + uv_timer_again(timer); timer->timer_cb((uv_timer_t*) timer); } } diff --git a/deps/uv/src/win/tty.c b/deps/uv/src/win/tty.c index 6b8297cbd9a..6d6709f79e1 100644 --- a/deps/uv/src/win/tty.c +++ b/deps/uv/src/win/tty.c @@ -1903,6 +1903,7 @@ void uv_tty_close(uv_tty_t* handle) { if (handle->flags & UV_HANDLE_READING) uv_tty_read_stop(handle); + handle->handle = INVALID_HANDLE_VALUE; handle->flags &= ~(UV_HANDLE_READABLE | UV_HANDLE_WRITABLE); uv__handle_closing(handle); diff --git a/deps/uv/src/win/udp.c b/deps/uv/src/win/udp.c index ef63dd73dfd..99fd80fce9d 100644 --- a/deps/uv/src/win/udp.c +++ b/deps/uv/src/win/udp.c @@ -144,6 +144,7 @@ int uv_udp_init(uv_loop_t* loop, uv_udp_t* handle) { void uv_udp_close(uv_loop_t* loop, uv_udp_t* handle) { uv_udp_recv_stop(handle); closesocket(handle->socket); + handle->socket = INVALID_SOCKET; uv__handle_closing(handle); @@ -505,9 +506,13 @@ void uv_process_udp_recv_req(uv_loop_t* loop, uv_udp_t* handle, } else if (err == WSAEWOULDBLOCK) { /* Kernel buffer empty */ handle->recv_cb(handle, 0, &buf, NULL, 0); - } else if (err != WSAECONNRESET && err != WSAENETRESET) { - /* Serious error. WSAECONNRESET/WSANETRESET is ignored because this */ - /* just indicates that a previous sendto operation failed. */ + } else if (err == WSAECONNRESET || err == WSAENETRESET) { + /* WSAECONNRESET/WSANETRESET is ignored because this just indicates + * that a previous sendto operation failed. + */ + handle->recv_cb(handle, 0, &buf, NULL, 0); + } else { + /* Any other error that we want to report back to the user. */ uv_udp_recv_stop(handle); handle->recv_cb(handle, uv_translate_sys_error(err), &buf, NULL, 0); } @@ -572,7 +577,9 @@ static int uv__udp_set_membership4(uv_udp_t* handle, memset(&mreq, 0, sizeof mreq); if (interface_addr) { - mreq.imr_interface.s_addr = inet_addr(interface_addr); + err = uv_inet_pton(AF_INET, interface_addr, &mreq.imr_interface.s_addr); + if (err) + return err; } else { mreq.imr_interface.s_addr = htonl(INADDR_ANY); } diff --git a/deps/uv/src/win/util.c b/deps/uv/src/win/util.c index a56fbea500d..8d1aefc5386 100644 --- a/deps/uv/src/win/util.c +++ b/deps/uv/src/win/util.c @@ -52,16 +52,15 @@ #define MAX_TITLE_LENGTH 8192 /* The number of nanoseconds in one second. */ -#undef NANOSEC -#define NANOSEC 1000000000 +#define UV__NANOSEC 1000000000 /* Cached copy of the process title, plus a mutex guarding it. */ static char *process_title; static CRITICAL_SECTION process_title_lock; -/* Frequency (ticks per nanosecond) of the high-resolution clock. */ -static double hrtime_frequency_ = 0; +/* Interval (in seconds) of the high-resolution clock. */ +static double hrtime_interval_ = 0; /* @@ -73,11 +72,14 @@ void uv__util_init() { /* Initialize process title access mutex. */ InitializeCriticalSection(&process_title_lock); - /* Retrieve high-resolution timer frequency. */ - if (QueryPerformanceFrequency(&perf_frequency)) - hrtime_frequency_ = (double) perf_frequency.QuadPart / (double) NANOSEC; - else - hrtime_frequency_= 0; + /* Retrieve high-resolution timer frequency + * and precompute its reciprocal. + */ + if (QueryPerformanceFrequency(&perf_frequency)) { + hrtime_interval_ = 1.0 / perf_frequency.QuadPart; + } else { + hrtime_interval_= 0; + } } @@ -463,26 +465,27 @@ int uv_get_process_title(char* buffer, size_t size) { uint64_t uv_hrtime(void) { - LARGE_INTEGER counter; - uv__once_init(); + return uv__hrtime(UV__NANOSEC); +} + +uint64_t uv__hrtime(double scale) { + LARGE_INTEGER counter; - /* If the performance frequency is zero, there's no support. */ - if (hrtime_frequency_ == 0) { - /* uv__set_sys_error(loop, ERROR_NOT_SUPPORTED); */ + /* If the performance interval is zero, there's no support. */ + if (hrtime_interval_ == 0) { return 0; } if (!QueryPerformanceCounter(&counter)) { - /* uv__set_sys_error(loop, GetLastError()); */ return 0; } /* Because we have no guarantee about the order of magnitude of the - * performance counter frequency, integer math could cause this computation + * performance counter interval, integer math could cause this computation * to overflow. Therefore we resort to floating point math. */ - return (uint64_t) ((double) counter.QuadPart / hrtime_frequency_); + return (uint64_t) ((double) counter.QuadPart * hrtime_interval_ * scale); } diff --git a/deps/uv/src/win/winapi.c b/deps/uv/src/win/winapi.c index 3e439ea5b2a..84ce73e3a02 100644 --- a/deps/uv/src/win/winapi.c +++ b/deps/uv/src/win/winapi.c @@ -51,6 +51,7 @@ sSleepConditionVariableCS pSleepConditionVariableCS; sSleepConditionVariableSRW pSleepConditionVariableSRW; sWakeAllConditionVariable pWakeAllConditionVariable; sWakeConditionVariable pWakeConditionVariable; +sCancelSynchronousIo pCancelSynchronousIo; void uv_winapi_init() { @@ -156,4 +157,7 @@ void uv_winapi_init() { pWakeConditionVariable = (sWakeConditionVariable) GetProcAddress(kernel32_module, "WakeConditionVariable"); + + pCancelSynchronousIo = (sCancelSynchronousIo) + GetProcAddress(kernel32_module, "CancelSynchronousIo"); } diff --git a/deps/uv/src/win/winapi.h b/deps/uv/src/win/winapi.h index 21d7fe4ac33..1bb0e9aae1e 100644 --- a/deps/uv/src/win/winapi.h +++ b/deps/uv/src/win/winapi.h @@ -4617,6 +4617,8 @@ typedef VOID (WINAPI* sWakeAllConditionVariable) typedef VOID (WINAPI* sWakeConditionVariable) (PCONDITION_VARIABLE ConditionVariable); +typedef BOOL (WINAPI* sCancelSynchronousIo) + (HANDLE hThread); /* Ntdll function pointers */ extern sRtlNtStatusToDosError pRtlNtStatusToDosError; @@ -4644,5 +4646,6 @@ extern sSleepConditionVariableCS pSleepConditionVariableCS; extern sSleepConditionVariableSRW pSleepConditionVariableSRW; extern sWakeAllConditionVariable pWakeAllConditionVariable; extern sWakeConditionVariable pWakeConditionVariable; +extern sCancelSynchronousIo pCancelSynchronousIo; #endif /* UV_WIN_WINAPI_H_ */ diff --git a/deps/uv/test/echo-server.c b/deps/uv/test/echo-server.c index f0937ccaac3..f223981c261 100644 --- a/deps/uv/test/echo-server.c +++ b/deps/uv/test/echo-server.c @@ -51,20 +51,21 @@ static void after_write(uv_write_t* req, int status) { /* Free the read/write buffer and the request */ wr = (write_req_t*) req; free(wr->buf.base); + free(wr); - if (status == 0) { - free(wr); + if (status == 0) return; - } fprintf(stderr, "uv_write error: %s - %s\n", uv_err_name(status), uv_strerror(status)); +} - if (!uv_is_closing((uv_handle_t*) req->handle)) - uv_close((uv_handle_t*) req->handle, on_close); - free(wr); + +static void after_shutdown(uv_shutdown_t* req, int status) { + uv_close((uv_handle_t*) req->handle, on_close); + free(req); } @@ -73,16 +74,15 @@ static void after_read(uv_stream_t* handle, const uv_buf_t* buf) { int i; write_req_t *wr; + uv_shutdown_t* sreq; if (nread < 0) { /* Error or EOF */ ASSERT(nread == UV_EOF); - if (buf->base) { - free(buf->base); - } - - uv_close((uv_handle_t*) handle, on_close); + free(buf->base); + sreq = malloc(sizeof* sreq); + ASSERT(0 == uv_shutdown(sreq, handle, after_shutdown)); return; } diff --git a/deps/uv/test/test-default-loop-close.c b/deps/uv/test/test-default-loop-close.c new file mode 100644 index 00000000000..fd11cfa8c12 --- /dev/null +++ b/deps/uv/test/test-default-loop-close.c @@ -0,0 +1,59 @@ +/* Copyright Joyent, Inc. and other Node 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. + */ + +#include "uv.h" +#include "task.h" + + +static int timer_cb_called; + + +static void timer_cb(uv_timer_t* timer) { + timer_cb_called++; + uv_close((uv_handle_t*) timer, NULL); +} + + +TEST_IMPL(default_loop_close) { + uv_loop_t* loop; + uv_timer_t timer_handle; + + loop = uv_default_loop(); + ASSERT(loop != NULL); + + ASSERT(0 == uv_timer_init(loop, &timer_handle)); + ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 1, 0)); + ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); + ASSERT(1 == timer_cb_called); + ASSERT(0 == uv_loop_close(loop)); + + loop = uv_default_loop(); + ASSERT(loop != NULL); + + ASSERT(0 == uv_timer_init(loop, &timer_handle)); + ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 1, 0)); + ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); + ASSERT(2 == timer_cb_called); + ASSERT(0 == uv_loop_close(loop)); + + MAKE_VALGRIND_HAPPY(); + return 0; +} diff --git a/deps/uv/test/test-fs.c b/deps/uv/test/test-fs.c index 4c6ccfab2cf..a06ddada8e9 100644 --- a/deps/uv/test/test-fs.c +++ b/deps/uv/test/test-fs.c @@ -417,12 +417,16 @@ static void rmdir_cb(uv_fs_t* req) { static void readdir_cb(uv_fs_t* req) { + uv_dirent_t dent; ASSERT(req == &readdir_req); ASSERT(req->fs_type == UV_FS_READDIR); ASSERT(req->result == 2); ASSERT(req->ptr); - ASSERT(memcmp(req->ptr, "file1\0file2\0", 12) == 0 - || memcmp(req->ptr, "file2\0file1\0", 12) == 0); + + while (UV_EOF != uv_fs_readdir_next(req, &dent)) { + ASSERT(strcmp(dent.name, "file1") == 0 || strcmp(dent.name, "file2") == 0); + ASSERT(dent.type == UV_DIRENT_FILE || dent.type == UV_DIRENT_UNKNOWN); + } readdir_cb_count++; ASSERT(req->path); ASSERT(memcmp(req->path, "test_dir\0", 9) == 0); @@ -802,6 +806,7 @@ TEST_IMPL(fs_file_write_null_buffer) { TEST_IMPL(fs_async_dir) { int r; + uv_dirent_t dent; /* Setup */ unlink("test_dir/file1"); @@ -844,8 +849,10 @@ TEST_IMPL(fs_async_dir) { ASSERT(r == 2); ASSERT(readdir_req.result == 2); ASSERT(readdir_req.ptr); - ASSERT(memcmp(readdir_req.ptr, "file1\0file2\0", 12) == 0 - || memcmp(readdir_req.ptr, "file2\0file1\0", 12) == 0); + while (UV_EOF != uv_fs_readdir_next(&readdir_req, &dent)) { + ASSERT(strcmp(dent.name, "file1") == 0 || strcmp(dent.name, "file2") == 0); + ASSERT(dent.type == UV_DIRENT_FILE || dent.type == UV_DIRENT_UNKNOWN); + } uv_fs_req_cleanup(&readdir_req); ASSERT(!readdir_req.ptr); @@ -1521,6 +1528,7 @@ TEST_IMPL(fs_symlink_dir) { uv_fs_t req; int r; char* test_dir; + uv_dirent_t dent; /* set-up */ unlink("test_dir/file1"); @@ -1597,8 +1605,10 @@ TEST_IMPL(fs_symlink_dir) { ASSERT(r == 2); ASSERT(readdir_req.result == 2); ASSERT(readdir_req.ptr); - ASSERT(memcmp(readdir_req.ptr, "file1\0file2\0", 12) == 0 - || memcmp(readdir_req.ptr, "file2\0file1\0", 12) == 0); + while (UV_EOF != uv_fs_readdir_next(&readdir_req, &dent)) { + ASSERT(strcmp(dent.name, "file1") == 0 || strcmp(dent.name, "file2") == 0); + ASSERT(dent.type == UV_DIRENT_FILE || dent.type == UV_DIRENT_UNKNOWN); + } uv_fs_req_cleanup(&readdir_req); ASSERT(!readdir_req.ptr); @@ -1615,8 +1625,10 @@ TEST_IMPL(fs_symlink_dir) { ASSERT(r == 2); ASSERT(readdir_req.result == 2); ASSERT(readdir_req.ptr); - ASSERT(memcmp(readdir_req.ptr, "file1\0file2\0", 12) == 0 - || memcmp(readdir_req.ptr, "file2\0file1\0", 12) == 0); + while (UV_EOF != uv_fs_readdir_next(&readdir_req, &dent)) { + ASSERT(strcmp(dent.name, "file1") == 0 || strcmp(dent.name, "file2") == 0); + ASSERT(dent.type == UV_DIRENT_FILE || dent.type == UV_DIRENT_UNKNOWN); + } uv_fs_req_cleanup(&readdir_req); ASSERT(!readdir_req.ptr); diff --git a/deps/uv/test/test-handle-fileno.c b/deps/uv/test/test-handle-fileno.c new file mode 100644 index 00000000000..df5e984ab74 --- /dev/null +++ b/deps/uv/test/test-handle-fileno.c @@ -0,0 +1,120 @@ +/* Copyright Joyent, Inc. and other Node 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. + */ + +#include "uv.h" +#include "task.h" + + +static int get_tty_fd(void) { + /* Make sure we have an FD that refers to a tty */ +#ifdef _WIN32 + HANDLE handle; + handle = CreateFileA("conout$", + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + if (handle == INVALID_HANDLE_VALUE) + return -1; + return _open_osfhandle((intptr_t) handle, 0); +#else /* unix */ + return open("/dev/tty", O_RDONLY, 0); +#endif +} + + +TEST_IMPL(handle_fileno) { + int r; + int tty_fd; + struct sockaddr_in addr; + uv_os_fd_t fd; + uv_tcp_t tcp; + uv_udp_t udp; + uv_pipe_t pipe; + uv_tty_t tty; + uv_idle_t idle; + uv_loop_t* loop; + + loop = uv_default_loop(); + ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); + + r = uv_idle_init(loop, &idle); + ASSERT(r == 0); + r = uv_fileno((uv_handle_t*) &idle, &fd); + ASSERT(r == UV_EINVAL); + uv_close((uv_handle_t*) &idle, NULL); + + r = uv_tcp_init(loop, &tcp); + ASSERT(r == 0); + r = uv_fileno((uv_handle_t*) &tcp, &fd); + ASSERT(r == UV_EBADF); + r = uv_tcp_bind(&tcp, (const struct sockaddr*) &addr, 0); + ASSERT(r == 0); + r = uv_fileno((uv_handle_t*) &tcp, &fd); + ASSERT(r == 0); + uv_close((uv_handle_t*) &tcp, NULL); + r = uv_fileno((uv_handle_t*) &tcp, &fd); + ASSERT(r == UV_EBADF); + + r = uv_udp_init(loop, &udp); + ASSERT(r == 0); + r = uv_fileno((uv_handle_t*) &udp, &fd); + ASSERT(r == UV_EBADF); + r = uv_udp_bind(&udp, (const struct sockaddr*) &addr, 0); + ASSERT(r == 0); + r = uv_fileno((uv_handle_t*) &udp, &fd); + ASSERT(r == 0); + uv_close((uv_handle_t*) &udp, NULL); + r = uv_fileno((uv_handle_t*) &udp, &fd); + ASSERT(r == UV_EBADF); + + r = uv_pipe_init(loop, &pipe, 0); + ASSERT(r == 0); + r = uv_fileno((uv_handle_t*) &pipe, &fd); + ASSERT(r == UV_EBADF); + r = uv_pipe_bind(&pipe, TEST_PIPENAME); + ASSERT(r == 0); + r = uv_fileno((uv_handle_t*) &pipe, &fd); + ASSERT(r == 0); + uv_close((uv_handle_t*) &pipe, NULL); + r = uv_fileno((uv_handle_t*) &pipe, &fd); + ASSERT(r == UV_EBADF); + + tty_fd = get_tty_fd(); + if (tty_fd < 0) { + LOGF("Cannot open a TTY fd"); + } else { + r = uv_tty_init(loop, &tty, tty_fd, 0); + ASSERT(r == 0); + r = uv_fileno((uv_handle_t*) &tty, &fd); + ASSERT(r == 0); + uv_close((uv_handle_t*) &tty, NULL); + r = uv_fileno((uv_handle_t*) &tty, &fd); + ASSERT(r == UV_EBADF); + } + + uv_run(loop, UV_RUN_DEFAULT); + + MAKE_VALGRIND_HAPPY(); + return 0; +} diff --git a/deps/uv/test/test-list.h b/deps/uv/test/test-list.h index 6dbe22307eb..9cb65c393f0 100644 --- a/deps/uv/test/test-list.h +++ b/deps/uv/test/test-list.h @@ -29,6 +29,7 @@ TEST_DECLARE (loop_close) TEST_DECLARE (loop_stop) TEST_DECLARE (loop_update_time) TEST_DECLARE (loop_backend_timeout) +TEST_DECLARE (default_loop_close) TEST_DECLARE (barrier_1) TEST_DECLARE (barrier_2) TEST_DECLARE (barrier_3) @@ -55,6 +56,9 @@ TEST_DECLARE (tcp_ping_pong_v6) TEST_DECLARE (pipe_ping_pong) TEST_DECLARE (delayed_accept) TEST_DECLARE (multiple_listen) +#ifndef _WIN32 +TEST_DECLARE (tcp_write_after_connect) +#endif TEST_DECLARE (tcp_writealot) TEST_DECLARE (tcp_try_write) TEST_DECLARE (tcp_write_queue_order) @@ -89,6 +93,7 @@ TEST_DECLARE (udp_bind) TEST_DECLARE (udp_bind_reuseaddr) TEST_DECLARE (udp_send_and_recv) TEST_DECLARE (udp_send_immediate) +TEST_DECLARE (udp_send_unreachable) TEST_DECLARE (udp_multicast_join) TEST_DECLARE (udp_multicast_join6) TEST_DECLARE (udp_multicast_ttl) @@ -109,6 +114,7 @@ TEST_DECLARE (pipe_connect_bad_name) TEST_DECLARE (pipe_connect_to_file) TEST_DECLARE (pipe_getsockname) TEST_DECLARE (pipe_getsockname_abstract) +TEST_DECLARE (pipe_getsockname_blocking) TEST_DECLARE (pipe_sendmsg) TEST_DECLARE (pipe_server_close) TEST_DECLARE (connection_fail) @@ -128,6 +134,7 @@ TEST_DECLARE (timer_huge_timeout) TEST_DECLARE (timer_huge_repeat) TEST_DECLARE (timer_run_once) TEST_DECLARE (timer_from_check) +TEST_DECLARE (timer_null_callback) TEST_DECLARE (idle_starvation) TEST_DECLARE (loop_handles) TEST_DECLARE (get_loadavg) @@ -155,6 +162,9 @@ TEST_DECLARE (pipe_ref) TEST_DECLARE (pipe_ref2) TEST_DECLARE (pipe_ref3) TEST_DECLARE (pipe_ref4) +#ifndef _WIN32 +TEST_DECLARE (pipe_close_stdout_read_stdin) +#endif TEST_DECLARE (process_ref) TEST_DECLARE (has_ref) TEST_DECLARE (active) @@ -165,6 +175,7 @@ TEST_DECLARE (get_currentexe) TEST_DECLARE (process_title) TEST_DECLARE (cwd_and_chdir) TEST_DECLARE (get_memory) +TEST_DECLARE (handle_fileno) TEST_DECLARE (hrtime) TEST_DECLARE (getaddrinfo_fail) TEST_DECLARE (getaddrinfo_basic) @@ -175,6 +186,7 @@ TEST_DECLARE (getsockname_tcp) TEST_DECLARE (getsockname_udp) TEST_DECLARE (fail_always) TEST_DECLARE (pass_always) +TEST_DECLARE (socket_buffer_size) TEST_DECLARE (spawn_fails) TEST_DECLARE (spawn_exit_code) TEST_DECLARE (spawn_stdout) @@ -275,6 +287,7 @@ TEST_DECLARE (closed_fd_events) #endif #ifdef __APPLE__ TEST_DECLARE (osx_select) +TEST_DECLARE (osx_select_many_fds) #endif HELPER_DECLARE (tcp4_echo_server) HELPER_DECLARE (tcp6_echo_server) @@ -296,6 +309,7 @@ TASK_LIST_START TEST_ENTRY (loop_stop) TEST_ENTRY (loop_update_time) TEST_ENTRY (loop_backend_timeout) + TEST_ENTRY (default_loop_close) TEST_ENTRY (barrier_1) TEST_ENTRY (barrier_2) TEST_ENTRY (barrier_3) @@ -312,6 +326,9 @@ TASK_LIST_START TEST_ENTRY (pipe_connect_to_file) TEST_ENTRY (pipe_server_close) +#ifndef _WIN32 + TEST_ENTRY (pipe_close_stdout_read_stdin) +#endif TEST_ENTRY (tty) TEST_ENTRY (stdio_over_pipes) TEST_ENTRY (ip6_pton) @@ -335,6 +352,10 @@ TASK_LIST_START TEST_ENTRY (delayed_accept) TEST_ENTRY (multiple_listen) +#ifndef _WIN32 + TEST_ENTRY (tcp_write_after_connect) +#endif + TEST_ENTRY (tcp_writealot) TEST_HELPER (tcp_writealot, tcp4_echo_server) @@ -381,6 +402,7 @@ TASK_LIST_START TEST_ENTRY (udp_bind_reuseaddr) TEST_ENTRY (udp_send_and_recv) TEST_ENTRY (udp_send_immediate) + TEST_ENTRY (udp_send_unreachable) TEST_ENTRY (udp_dgram_too_big) TEST_ENTRY (udp_dual_stack) TEST_ENTRY (udp_ipv6_only) @@ -402,6 +424,7 @@ TASK_LIST_START TEST_ENTRY (pipe_listen_without_bind) TEST_ENTRY (pipe_getsockname) TEST_ENTRY (pipe_getsockname_abstract) + TEST_ENTRY (pipe_getsockname_blocking) TEST_ENTRY (pipe_sendmsg) TEST_ENTRY (connection_fail) @@ -432,6 +455,7 @@ TASK_LIST_START TEST_ENTRY (timer_huge_repeat) TEST_ENTRY (timer_run_once) TEST_ENTRY (timer_from_check) + TEST_ENTRY (timer_null_callback) TEST_ENTRY (idle_starvation) @@ -487,6 +511,8 @@ TASK_LIST_START TEST_ENTRY (get_loadavg) + TEST_ENTRY (handle_fileno) + TEST_ENTRY (hrtime) TEST_ENTRY_CUSTOM (getaddrinfo_fail, 0, 0, 10000) @@ -504,6 +530,8 @@ TASK_LIST_START TEST_ENTRY (poll_unidirectional) TEST_ENTRY (poll_close) + TEST_ENTRY (socket_buffer_size) + TEST_ENTRY (spawn_fails) TEST_ENTRY (spawn_exit_code) TEST_ENTRY (spawn_stdout) @@ -549,6 +577,7 @@ TASK_LIST_START #ifdef __APPLE__ TEST_ENTRY (osx_select) + TEST_ENTRY (osx_select_many_fds) #endif TEST_ENTRY (fs_file_noent) diff --git a/deps/uv/test/test-osx-select.c b/deps/uv/test/test-osx-select.c index e5e1bf8b469..68e5a841678 100644 --- a/deps/uv/test/test-osx-select.c +++ b/deps/uv/test/test-osx-select.c @@ -79,4 +79,52 @@ TEST_IMPL(osx_select) { return 0; } + +TEST_IMPL(osx_select_many_fds) { + int r; + int fd; + size_t i; + size_t len; + const char* str; + struct sockaddr_in addr; + uv_tty_t tty; + uv_tcp_t tcps[1500]; + + r = uv_ip4_addr("127.0.0.1", 0, &addr); + ASSERT(r == 0); + + for (i = 0; i < ARRAY_SIZE(tcps); i++) { + r = uv_tcp_init(uv_default_loop(), &tcps[i]); + ASSERT(r == 0); + r = uv_tcp_bind(&tcps[i], (const struct sockaddr *) &addr, 0); + ASSERT(r == 0); + uv_unref((uv_handle_t*) &tcps[i]); + } + + fd = open("/dev/tty", O_RDONLY); + ASSERT(fd >= 0); + + r = uv_tty_init(uv_default_loop(), &tty, fd, 1); + ASSERT(r == 0); + + r = uv_read_start((uv_stream_t*) &tty, alloc_cb, read_cb); + ASSERT(r == 0); + + /* Emulate user-input */ + str = "got some input\n" + "with a couple of lines\n" + "feel pretty happy\n"; + for (i = 0, len = strlen(str); i < len; i++) { + r = ioctl(fd, TIOCSTI, str + i); + ASSERT(r == 0); + } + + uv_run(uv_default_loop(), UV_RUN_DEFAULT); + + ASSERT(read_count == 3); + + MAKE_VALGRIND_HAPPY(); + return 0; +} + #endif /* __APPLE__ */ diff --git a/deps/uv/test/test-pipe-close-stdout-read-stdin.c b/deps/uv/test/test-pipe-close-stdout-read-stdin.c new file mode 100644 index 00000000000..26a1ee76c93 --- /dev/null +++ b/deps/uv/test/test-pipe-close-stdout-read-stdin.c @@ -0,0 +1,103 @@ +/* Copyright Joyent, Inc. and other Node 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. + */ + +#ifndef _WIN32 + +#include +#include +#include +#include + +#include "uv.h" +#include "task.h" + +void alloc_buffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t* buf) +{ + static char buffer[1024]; + + buf->base = buffer; + buf->len = sizeof(buffer); +} + +void read_stdin(uv_stream_t *stream, ssize_t nread, const uv_buf_t* buf) +{ + if (nread < 0) { + uv_close((uv_handle_t*)stream, NULL); + return; + } +} + +/* + * This test is a reproduction of joyent/libuv#1419 . + */ +TEST_IMPL(pipe_close_stdout_read_stdin) { + int r = -1; + int pid; + int fd[2]; + int status; + + pipe(fd); + + if ((pid = fork()) == 0) { + /* + * Make the read side of the pipe our stdin. + * The write side will be closed by the parent process. + */ + close(fd[1]); + close(0); + dup(fd[0]); + + /* Create a stream that reads from the pipe. */ + uv_pipe_t stdin_pipe; + + r = uv_pipe_init(uv_default_loop(), (uv_pipe_t *)&stdin_pipe, 0); + ASSERT(r == 0); + + r = uv_pipe_open((uv_pipe_t *)&stdin_pipe, 0); + ASSERT(r == 0); + + r = uv_read_start((uv_stream_t *)&stdin_pipe, alloc_buffer, read_stdin); + ASSERT(r == 0); + + /* + * Because the other end of the pipe was closed, there should + * be no event left to process after one run of the event loop. + * Otherwise, it means that events were not processed correctly. + */ + ASSERT(uv_run(uv_default_loop(), UV_RUN_NOWAIT) == 0); + } else { + /* + * Close both ends of the pipe so that the child + * get a POLLHUP event when it tries to read from + * the other end. + */ + close(fd[1]); + close(fd[0]); + + waitpid(pid, &status, 0); + ASSERT(WIFEXITED(status) && WEXITSTATUS(status) == 0); + } + + MAKE_VALGRIND_HAPPY(); + return 0; +} + +#endif /* ifndef _WIN32 */ diff --git a/deps/uv/test/test-pipe-getsockname.c b/deps/uv/test/test-pipe-getsockname.c index 396f72577db..d4010f3b507 100644 --- a/deps/uv/test/test-pipe-getsockname.c +++ b/deps/uv/test/test-pipe-getsockname.c @@ -32,6 +32,8 @@ #ifndef _WIN32 # include /* close */ +#else +# include #endif @@ -120,3 +122,59 @@ TEST_IMPL(pipe_getsockname_abstract) { #endif } +TEST_IMPL(pipe_getsockname_blocking) { +#ifdef _WIN32 + uv_pipe_t reader; + HANDLE readh, writeh; + int readfd; + char buf1[1024], buf2[1024]; + size_t len1, len2; + int r; + + r = CreatePipe(&readh, &writeh, NULL, 65536); + ASSERT(r != 0); + + r = uv_pipe_init(uv_default_loop(), &reader, 0); + ASSERT(r == 0); + readfd = _open_osfhandle((intptr_t)readh, _O_RDONLY); + ASSERT(r != -1); + r = uv_pipe_open(&reader, readfd); + ASSERT(r == 0); + r = uv_read_start((uv_stream_t*)&reader, NULL, NULL); + ASSERT(r == 0); + Sleep(100); + r = uv_read_stop((uv_stream_t*)&reader); + ASSERT(r == 0); + + len1 = sizeof buf1; + r = uv_pipe_getsockname(&reader, buf1, &len1); + ASSERT(r == 0); + + r = uv_read_start((uv_stream_t*)&reader, NULL, NULL); + ASSERT(r == 0); + Sleep(100); + + len2 = sizeof buf2; + r = uv_pipe_getsockname(&reader, buf2, &len2); + ASSERT(r == 0); + + r = uv_read_stop((uv_stream_t*)&reader); + ASSERT(r == 0); + + ASSERT(len1 == len2); + ASSERT(memcmp(buf1, buf2, len1) == 0); + + close_cb_called = 0; + uv_close((uv_handle_t*)&reader, close_cb); + + uv_run(uv_default_loop(), UV_RUN_DEFAULT); + + ASSERT(close_cb_called == 1); + + _close(readfd); + CloseHandle(writeh); +#endif + + MAKE_VALGRIND_HAPPY(); + return 0; +} diff --git a/deps/uv/test/test-socket-buffer-size.c b/deps/uv/test/test-socket-buffer-size.c new file mode 100644 index 00000000000..72f8c2524c0 --- /dev/null +++ b/deps/uv/test/test-socket-buffer-size.c @@ -0,0 +1,77 @@ +/* Copyright Joyent, Inc. and other Node 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. + */ + +#include "uv.h" +#include "task.h" + +#include +#include +#include + +static uv_udp_t udp; +static uv_tcp_t tcp; +static int close_cb_called; + + +static void close_cb(uv_handle_t* handle) { + close_cb_called++; +} + + +static void check_buffer_size(uv_handle_t* handle) { + int value; + + value = 0; + ASSERT(0 == uv_recv_buffer_size(handle, &value)); + ASSERT(value > 0); + + value = 10000; + ASSERT(0 == uv_recv_buffer_size(handle, &value)); + + value = 0; + ASSERT(0 == uv_recv_buffer_size(handle, &value)); + /* linux sets double the value */ + ASSERT(value == 10000 || value == 20000); +} + + +TEST_IMPL(socket_buffer_size) { + struct sockaddr_in addr; + + ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); + + ASSERT(0 == uv_tcp_init(uv_default_loop(), &tcp)); + ASSERT(0 == uv_tcp_bind(&tcp, (struct sockaddr*) &addr, 0)); + check_buffer_size((uv_handle_t*) &tcp); + uv_close((uv_handle_t*) &tcp, close_cb); + + ASSERT(0 == uv_udp_init(uv_default_loop(), &udp)); + ASSERT(0 == uv_udp_bind(&udp, (struct sockaddr*) &addr, 0)); + check_buffer_size((uv_handle_t*) &udp); + uv_close((uv_handle_t*) &udp, close_cb); + + ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); + + ASSERT(close_cb_called == 2); + + MAKE_VALGRIND_HAPPY(); + return 0; +} diff --git a/deps/uv/test/test-spawn.c b/deps/uv/test/test-spawn.c index 57f0862f944..11f43bdf134 100644 --- a/deps/uv/test/test-spawn.c +++ b/deps/uv/test/test-spawn.c @@ -1295,23 +1295,25 @@ TEST_IMPL(closed_fd_events) { TEST_IMPL(spawn_reads_child_path) { int r; int len; + char file[64]; char path[1024]; char *env[2] = {path, NULL}; /* Set up the process, but make sure that the file to run is relative and */ /* requires a lookup into PATH */ init_process_options("spawn_helper1", exit_cb); - options.file = "run-tests"; - args[0] = "run-tests"; /* Set up the PATH env variable */ for (len = strlen(exepath); exepath[len - 1] != '/' && exepath[len - 1] != '\\'; len--); + strcpy(file, exepath + len); exepath[len] = 0; strcpy(path, "PATH="); strcpy(path + 5, exepath); + options.file = file; + options.args[0] = file; options.env = env; r = uv_spawn(uv_default_loop(), &process, &options); diff --git a/deps/uv/test/test-tcp-write-after-connect.c b/deps/uv/test/test-tcp-write-after-connect.c new file mode 100644 index 00000000000..aa03228f134 --- /dev/null +++ b/deps/uv/test/test-tcp-write-after-connect.c @@ -0,0 +1,68 @@ +/* Copyright Joyent, Inc. and other Node 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. + */ + +#ifndef _WIN32 + +#include "uv.h" +#include "task.h" + +uv_loop_t loop; +uv_tcp_t tcp_client; +uv_connect_t connection_request; +uv_write_t write_request; +uv_buf_t buf = { "HELLO", 4 }; + + +static void write_cb(uv_write_t *req, int status) { + ASSERT(status == UV_ECANCELED); + uv_close((uv_handle_t*) req->handle, NULL); +} + + +static void connect_cb(uv_connect_t *req, int status) { + ASSERT(status == UV_ECONNREFUSED); +} + + +TEST_IMPL(tcp_write_after_connect) { + struct sockaddr_in sa; + ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &sa)); + ASSERT(0 == uv_loop_init(&loop)); + ASSERT(0 == uv_tcp_init(&loop, &tcp_client)); + + ASSERT(0 == uv_tcp_connect(&connection_request, + &tcp_client, + (const struct sockaddr *) + &sa, + connect_cb)); + + ASSERT(0 == uv_write(&write_request, + (uv_stream_t *)&tcp_client, + &buf, 1, + write_cb)); + + uv_run(&loop, UV_RUN_DEFAULT); + + MAKE_VALGRIND_HAPPY(); + return 0; +} + +#endif diff --git a/deps/uv/test/test-tcp-write-queue-order.c b/deps/uv/test/test-tcp-write-queue-order.c index 18e1f192b62..aa4d2acc24a 100644 --- a/deps/uv/test/test-tcp-write-queue-order.c +++ b/deps/uv/test/test-tcp-write-queue-order.c @@ -26,7 +26,7 @@ #include "uv.h" #include "task.h" -#define REQ_COUNT 100000 +#define REQ_COUNT 10000 static uv_timer_t timer; static uv_tcp_t server; diff --git a/deps/uv/test/test-timer.c b/deps/uv/test/test-timer.c index f26dae577ff..aba050fd64c 100644 --- a/deps/uv/test/test-timer.c +++ b/deps/uv/test/test-timer.c @@ -290,3 +290,14 @@ TEST_IMPL(timer_run_once) { MAKE_VALGRIND_HAPPY(); return 0; } + + +TEST_IMPL(timer_null_callback) { + uv_timer_t handle; + + ASSERT(0 == uv_timer_init(uv_default_loop(), &handle)); + ASSERT(UV_EINVAL == uv_timer_start(&handle, NULL, 100, 100)); + + MAKE_VALGRIND_HAPPY(); + return 0; +} diff --git a/deps/uv/test/test-udp-ipv6.c b/deps/uv/test/test-udp-ipv6.c index 0e2fe2dcf2d..0ca9f4dcff6 100644 --- a/deps/uv/test/test-udp-ipv6.c +++ b/deps/uv/test/test-udp-ipv6.c @@ -147,12 +147,19 @@ static void do_test(uv_udp_recv_cb recv_cb, int bind_flags) { TEST_IMPL(udp_dual_stack) { +#if defined(__DragonFly__) || \ + defined(__FreeBSD__) || \ + defined(__OpenBSD__) || \ + defined(__NetBSD__) + RETURN_SKIP("dual stack not enabled by default in this OS."); +#else do_test(ipv6_recv_ok, 0); ASSERT(recv_cb_called == 1); ASSERT(send_cb_called == 1); return 0; +#endif } diff --git a/deps/uv/test/test-udp-multicast-interface6.c b/deps/uv/test/test-udp-multicast-interface6.c index e58d7711974..e54e738b0be 100644 --- a/deps/uv/test/test-udp-multicast-interface6.c +++ b/deps/uv/test/test-udp-multicast-interface6.c @@ -69,7 +69,7 @@ TEST_IMPL(udp_multicast_interface6) { r = uv_udp_bind(&server, (const struct sockaddr*)&baddr, 0); ASSERT(r == 0); -#if defined(__APPLE__) +#if defined(__APPLE__) || defined(__FreeBSD__) r = uv_udp_set_multicast_interface(&server, "::1%lo0"); #else r = uv_udp_set_multicast_interface(&server, NULL); diff --git a/deps/uv/test/test-udp-send-unreachable.c b/deps/uv/test/test-udp-send-unreachable.c new file mode 100644 index 00000000000..c6500320d78 --- /dev/null +++ b/deps/uv/test/test-udp-send-unreachable.c @@ -0,0 +1,150 @@ +/* Copyright Joyent, Inc. and other Node 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. + */ + +#include "uv.h" +#include "task.h" + +#include +#include +#include + +#define CHECK_HANDLE(handle) \ + ASSERT((uv_udp_t*)(handle) == &client) + +static uv_udp_t client; +static uv_timer_t timer; + +static int send_cb_called; +static int recv_cb_called; +static int close_cb_called; +static int alloc_cb_called; +static int timer_cb_called; + + +static void alloc_cb(uv_handle_t* handle, + size_t suggested_size, + uv_buf_t* buf) { + static char slab[65536]; + CHECK_HANDLE(handle); + ASSERT(suggested_size <= sizeof(slab)); + buf->base = slab; + buf->len = sizeof(slab); + alloc_cb_called++; +} + + +static void close_cb(uv_handle_t* handle) { + ASSERT(1 == uv_is_closing(handle)); + close_cb_called++; +} + + +static void send_cb(uv_udp_send_t* req, int status) { + ASSERT(req != NULL); + ASSERT(status == 0); + CHECK_HANDLE(req->handle); + send_cb_called++; +} + + +static void recv_cb(uv_udp_t* handle, + ssize_t nread, + const uv_buf_t* rcvbuf, + const struct sockaddr* addr, + unsigned flags) { + CHECK_HANDLE(handle); + recv_cb_called++; + + if (nread < 0) { + ASSERT(0 && "unexpected error"); + } else if (nread == 0) { + /* Returning unused buffer */ + ASSERT(addr == NULL); + } else { + ASSERT(addr != NULL); + } +} + + +static void timer_cb(uv_timer_t* h) { + ASSERT(h == &timer); + timer_cb_called++; + uv_close((uv_handle_t*) &client, close_cb); + uv_close((uv_handle_t*) h, close_cb); +} + + +TEST_IMPL(udp_send_unreachable) { + struct sockaddr_in addr; + struct sockaddr_in addr2; + uv_udp_send_t req1, req2; + uv_buf_t buf; + int r; + + ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); + ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT_2, &addr2)); + + r = uv_timer_init( uv_default_loop(), &timer ); + ASSERT(r == 0); + + r = uv_timer_start( &timer, timer_cb, 1000, 0 ); + ASSERT(r == 0); + + r = uv_udp_init(uv_default_loop(), &client); + ASSERT(r == 0); + + r = uv_udp_bind(&client, (const struct sockaddr*) &addr2, 0); + ASSERT(r == 0); + + r = uv_udp_recv_start(&client, alloc_cb, recv_cb); + ASSERT(r == 0); + + /* client sends "PING", then "PANG" */ + buf = uv_buf_init("PING", 4); + + r = uv_udp_send(&req1, + &client, + &buf, + 1, + (const struct sockaddr*) &addr, + send_cb); + ASSERT(r == 0); + + buf = uv_buf_init("PANG", 4); + + r = uv_udp_send(&req2, + &client, + &buf, + 1, + (const struct sockaddr*) &addr, + send_cb); + ASSERT(r == 0); + + uv_run(uv_default_loop(), UV_RUN_DEFAULT); + + ASSERT(send_cb_called == 2); + ASSERT(recv_cb_called == alloc_cb_called); + ASSERT(timer_cb_called == 1); + ASSERT(close_cb_called == 2); + + MAKE_VALGRIND_HAPPY(); + return 0; +} diff --git a/deps/uv/test/test-watcher-cross-stop.c b/deps/uv/test/test-watcher-cross-stop.c index bf765cb00cd..910ed0fb613 100644 --- a/deps/uv/test/test-watcher-cross-stop.c +++ b/deps/uv/test/test-watcher-cross-stop.c @@ -92,10 +92,10 @@ TEST_IMPL(watcher_cross_stop) { uv_close((uv_handle_t*) &sockets[i], close_cb); ASSERT(recv_cb_called > 0); - ASSERT(ARRAY_SIZE(sockets) == send_cb_called); uv_run(loop, UV_RUN_DEFAULT); + ASSERT(ARRAY_SIZE(sockets) == send_cb_called); ASSERT(ARRAY_SIZE(sockets) == close_cb_called); MAKE_VALGRIND_HAPPY(); diff --git a/deps/uv/uv.gyp b/deps/uv/uv.gyp index 5b4d69a9241..444182b62d7 100644 --- a/deps/uv/uv.gyp +++ b/deps/uv/uv.gyp @@ -26,6 +26,30 @@ ], }], ], + 'xcode_settings': { + 'conditions': [ + [ 'clang==1', { + 'WARNING_CFLAGS': [ + '-Wall', + '-Wextra', + '-Wno-unused-parameter', + '-Wno-dollar-in-identifier-extension' + ]}, { + 'WARNING_CFLAGS': [ + '-Wall', + '-Wextra', + '-Wno-unused-parameter' + ]} + ] + ], + 'OTHER_LDFLAGS': [ + ], + 'OTHER_CFLAGS': [ + '-g', + '--std=gnu89', + '-pedantic' + ], + } }, 'targets': [ @@ -53,9 +77,6 @@ }], ], }, - 'defines': [ - 'HAVE_CONFIG_H' - ], 'sources': [ 'common.gypi', 'include/uv.h', @@ -179,7 +200,7 @@ 'link_settings': { # Must correspond with UV_VERSION_MAJOR and UV_VERSION_MINOR # in src/version.c - 'libraries': [ '-Wl,-soname,libuv.so.0.11' ], + 'libraries': [ '-Wl,-soname,libuv.so.1.0' ], }, }], ], @@ -195,6 +216,7 @@ ], 'defines': [ '_DARWIN_USE_64_BIT_INODE=1', + '_DARWIN_UNLIMITED_SELECT=1', ] }], [ 'OS!="mac"', { @@ -312,6 +334,7 @@ 'test/test-close-order.c', 'test/test-connection-fail.c', 'test/test-cwd-and-chdir.c', + 'test/test-default-loop-close.c', 'test/test-delayed-accept.c', 'test/test-error.c', 'test/test-embed.c', @@ -324,6 +347,7 @@ 'test/test-getaddrinfo.c', 'test/test-getnameinfo.c', 'test/test-getsockname.c', + 'test/test-handle-fileno.c', 'test/test-hrtime.c', 'test/test-idle.c', 'test/test-ip6-addr.c', @@ -346,6 +370,7 @@ 'test/test-pipe-getsockname.c', 'test/test-pipe-sendmsg.c', 'test/test-pipe-server-close.c', + 'test/test-pipe-close-stdout-read-stdin.c', 'test/test-platform-output.c', 'test/test-poll.c', 'test/test-poll-close.c', @@ -360,6 +385,7 @@ 'test/test-shutdown-twice.c', 'test/test-signal.c', 'test/test-signal-multiple-loops.c', + 'test/test-socket-buffer-size.c', 'test/test-spawn.c', 'test/test-fs-poll.c', 'test/test-stdio-over-pipes.c', @@ -376,6 +402,7 @@ 'test/test-tcp-connect6-error.c', 'test/test-tcp-open.c', 'test/test-tcp-write-to-half-open-connection.c', + 'test/test-tcp-write-after-connect.c', 'test/test-tcp-writealot.c', 'test/test-tcp-try-write.c', 'test/test-tcp-unexpected-read.c', @@ -398,6 +425,7 @@ 'test/test-udp-options.c', 'test/test-udp-send-and-recv.c', 'test/test-udp-send-immediate.c', + 'test/test-udp-send-unreachable.c', 'test/test-udp-multicast-join.c', 'test/test-udp-multicast-join6.c', 'test/test-dlerror.c', diff --git a/src/node_file.cc b/src/node_file.cc index 3b287ec1cc8..8962f8680ad 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -207,21 +207,26 @@ static void After(uv_fs_t *req) { case UV_FS_READDIR: { - char *namebuf = static_cast(req->ptr); - int nnames = req->result; - - Local names = Array::New(env->isolate(), nnames); - - for (int i = 0; i < nnames; i++) { - Local name = String::NewFromUtf8(env->isolate(), namebuf); + int r; + Local names = Array::New(env->isolate(), 0); + + for (int i = 0; ; i++) { + uv_dirent_t ent; + + r = uv_fs_readdir_next(req, &ent); + if (r == UV_EOF) + break; + if (r != 0) { + argv[0] = UVException(r, + NULL, + req_wrap->syscall(), + static_cast(req->path)); + break; + } + + Local name = String::NewFromUtf8(env->isolate(), + ent.name); names->Set(i, name); -#ifndef NDEBUG - namebuf += strlen(namebuf); - assert(*namebuf == '\0'); - namebuf += 1; -#else - namebuf += strlen(namebuf) + 1; -#endif } argv[1] = names; @@ -710,19 +715,21 @@ static void ReadDir(const FunctionCallbackInfo& args) { SYNC_CALL(readdir, *path, *path, 0 /*flags*/) assert(SYNC_REQ.result >= 0); - char* namebuf = static_cast(SYNC_REQ.ptr); - uint32_t nnames = SYNC_REQ.result; - Local names = Array::New(env->isolate(), nnames); - - for (uint32_t i = 0; i < nnames; ++i) { - names->Set(i, String::NewFromUtf8(env->isolate(), namebuf)); -#ifndef NDEBUG - namebuf += strlen(namebuf); - assert(*namebuf == '\0'); - namebuf += 1; -#else - namebuf += strlen(namebuf) + 1; -#endif + int r; + Local names = Array::New(env->isolate(), 0); + + for (int i = 0; ; i++) { + uv_dirent_t ent; + + r = uv_fs_readdir_next(&SYNC_REQ, &ent); + if (r == UV_EOF) + break; + if (r != 0) + return env->ThrowUVException(r, "readdir", "", *path); + + Local name = String::NewFromUtf8(env->isolate(), + ent.name); + names->Set(i, name); } args.GetReturnValue().Set(names); From 7fd35e6ea43ece7ef40d50820a80d798eceaa362 Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Wed, 24 Sep 2014 00:19:39 +0400 Subject: [PATCH 013/144] uv: apply floating patch 2f54947b --- deps/uv/src/unix/fs.c | 7 +++++-- deps/uv/test/test-fs.c | 8 ++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/deps/uv/src/unix/fs.c b/deps/uv/src/unix/fs.c index 2dd0fe97cc7..9bb7baf774c 100644 --- a/deps/uv/src/unix/fs.c +++ b/deps/uv/src/unix/fs.c @@ -312,14 +312,15 @@ static ssize_t uv__fs_readdir(uv_fs_t* req) { dents = NULL; n = scandir(req->path, &dents, uv__fs_readdir_filter, alphasort); + /* NOTE: We will use nbufs as an index field */ + req->nbufs = 0; + if (n == 0) goto out; /* osx still needs to deallocate some memory */ else if (n == -1) return n; - /* NOTE: We will use nbufs as an index field */ req->ptr = dents; - req->nbufs = 0; return n; @@ -334,6 +335,8 @@ static ssize_t uv__fs_readdir(uv_fs_t* req) { } errno = saved_errno; + req->ptr = NULL; + return n; } diff --git a/deps/uv/test/test-fs.c b/deps/uv/test/test-fs.c index a06ddada8e9..a514801b9bc 100644 --- a/deps/uv/test/test-fs.c +++ b/deps/uv/test/test-fs.c @@ -436,10 +436,13 @@ static void readdir_cb(uv_fs_t* req) { static void empty_readdir_cb(uv_fs_t* req) { + uv_dirent_t dent; + ASSERT(req == &readdir_req); ASSERT(req->fs_type == UV_FS_READDIR); ASSERT(req->result == 0); ASSERT(req->ptr == NULL); + ASSERT(UV_EOF == uv_fs_readdir_next(req, &dent)); uv_fs_req_cleanup(req); readdir_cb_count++; } @@ -1805,6 +1808,7 @@ TEST_IMPL(fs_stat_missing_path) { TEST_IMPL(fs_readdir_empty_dir) { const char* path; uv_fs_t req; + uv_dirent_t dent; int r; path = "./empty_dir/"; @@ -1813,10 +1817,14 @@ TEST_IMPL(fs_readdir_empty_dir) { uv_fs_mkdir(loop, &req, path, 0777, NULL); uv_fs_req_cleanup(&req); + /* Fill the req to ensure that required fields are cleaned up */ + memset(&req, 0xdb, sizeof(req)); + r = uv_fs_readdir(loop, &req, path, 0, NULL); ASSERT(r == 0); ASSERT(req.result == 0); ASSERT(req.ptr == NULL); + ASSERT(UV_EOF == uv_fs_readdir_next(&req, &dent)); uv_fs_req_cleanup(&req); r = uv_fs_readdir(loop, &readdir_req, path, 0, empty_readdir_cb); From 7c3c51b8ff3d41a2714e6d3a1379f2357b5bebc7 Mon Sep 17 00:00:00 2001 From: Trevor Norris Date: Tue, 23 Sep 2014 13:19:31 -0700 Subject: [PATCH 014/144] buffer: fix map and set parent to undefined In 4c9b30d removal of the prototype attributes meant NativeBuffer() no longer had the same object map as Buffer(). By now setting the same properties in the same order both constructors will produce the same map. The same commit changed "parent" from undefined to null. This caused a failure in Buffer#slice() where it was checked if parent === undefined. Causing the incorrect parent to be set. Signed-off-by: Trevor Norris --- lib/buffer.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/buffer.js b/lib/buffer.js index adb551a9e4e..ed159158415 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -66,7 +66,7 @@ function Buffer(subject, encoding) { 'size: 0x' + kMaxLength.toString(16) + ' bytes'); } - this.parent = null; + this.parent = undefined; if (this.length <= (Buffer.poolSize >>> 1) && this.length > 0) { if (this.length > poolSize - poolOffset) createPool(); @@ -118,7 +118,9 @@ function SlowBuffer(length) { // Objects created in C++. Significantly faster than calling the Buffer // function. function NativeBuffer(length) { - this.length = length; + this.length = length >>> 0; + // Set this to keep the object map the same. + this.parent = undefined; } NativeBuffer.prototype = Buffer.prototype; From 4dbb84fc52645cd4f1ab6983f5fc268d9749229a Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Tue, 23 Sep 2014 13:49:42 +0400 Subject: [PATCH 015/144] tls_wrap: ensure that TLSCallbacks are gc-able Call `MakeWeak()` to destruct TLSCallbacks when the js-object dies. fix #8416 Reviewed-By: Fedor Indutny --- src/tls_wrap.cc | 1 + src/tls_wrap.h | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/tls_wrap.cc b/src/tls_wrap.cc index 8e70b88d31e..c65492cf315 100644 --- a/src/tls_wrap.cc +++ b/src/tls_wrap.cc @@ -79,6 +79,7 @@ TLSCallbacks::TLSCallbacks(Environment* env, cycle_depth_(0), eof_(false) { node::Wrap(object(), this); + MakeWeak(this); // Initialize queue for clearIn writes QUEUE_INIT(&write_item_queue_); diff --git a/src/tls_wrap.h b/src/tls_wrap.h index 13a53bfb307..34ae3ccbf65 100644 --- a/src/tls_wrap.h +++ b/src/tls_wrap.h @@ -46,6 +46,8 @@ class TLSCallbacks : public crypto::SSLWrap, public StreamWrapCallbacks, public AsyncWrap { public: + ~TLSCallbacks(); + static void Initialize(v8::Handle target, v8::Handle unused, v8::Handle context); @@ -94,7 +96,6 @@ class TLSCallbacks : public crypto::SSLWrap, Kind kind, v8::Handle sc, StreamWrapCallbacks* old); - ~TLSCallbacks(); static void SSLInfoCallback(const SSL* ssl_, int where, int ret); void InitSSL(); From 2f7234d89c3b7e17d6cf341ab12aaffebb337470 Mon Sep 17 00:00:00 2001 From: Julien Gilli Date: Wed, 24 Sep 2014 09:36:25 -0700 Subject: [PATCH 016/144] tests: add test for buffer.slice. 4c9b30d introduced a regression in buffer.slice that 7c3c51b fixed, but no test had been added to make sure that a similar regression is caught by the tests suite in the future. --- test/simple/test-buffer-slice.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 test/simple/test-buffer-slice.js diff --git a/test/simple/test-buffer-slice.js b/test/simple/test-buffer-slice.js new file mode 100644 index 00000000000..1a462bd0be3 --- /dev/null +++ b/test/simple/test-buffer-slice.js @@ -0,0 +1,32 @@ +// 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 common = require('../common'); +var assert = require('assert'); + +var Buffer = require('buffer').Buffer; + +var buff = new Buffer(Buffer.poolSize + 1); +var slicedBuffer = buff.slice(); +assert.equal(slicedBuffer.parent, + buff, + "slicedBufffer should have its parent set to the original " + + " buffer"); From f773fb41cc2a59f981146763e9f378f9a8586714 Mon Sep 17 00:00:00 2001 From: Timothy J Fontaine Date: Wed, 24 Sep 2014 14:13:58 -0700 Subject: [PATCH 017/144] test: disable dgram-bind-shared-ports on win32 Windows currently doesn't support clustered dgram sockets, when it does re-enable this test --- test/simple/test-dgram-bind-shared-ports.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/simple/test-dgram-bind-shared-ports.js b/test/simple/test-dgram-bind-shared-ports.js index 709d3ad5518..c9e22b5921f 100644 --- a/test/simple/test-dgram-bind-shared-ports.js +++ b/test/simple/test-dgram-bind-shared-ports.js @@ -24,6 +24,11 @@ var assert = require('assert'); var cluster = require('cluster'); var dgram = require('dgram'); +// TODO XXX FIXME when windows supports clustered dgram ports re-enable this +// test +if (process.platform == 'win32') + process.exit(0); + function noop() {} if (cluster.isMaster) { From efa47e593d0fe63127b39b5c0ef67ac534af5eb4 Mon Sep 17 00:00:00 2001 From: Robert Kowalski Date: Sat, 13 Sep 2014 11:06:28 +0200 Subject: [PATCH 018/144] benchmark: add test for module loader Adds a test for benchmarking the module loader, needed for benchmarking changes / refacortings in the module loader. Reviewed-by: Trevor Norris Reviewed-by: Timothy J Fontaine --- benchmark/misc/module-loader.js | 72 +++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 benchmark/misc/module-loader.js diff --git a/benchmark/misc/module-loader.js b/benchmark/misc/module-loader.js new file mode 100644 index 00000000000..96f8e7df1ea --- /dev/null +++ b/benchmark/misc/module-loader.js @@ -0,0 +1,72 @@ +// 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 fs = require('fs'); +var path = require('path'); +var common = require('../common.js'); +var packageJson = '{"main": "index.js"}'; + +var tmpDirectory = path.join(__dirname, '..', 'tmp'); +var benchmarkDirectory = path.join(tmpDirectory, 'nodejs-benchmark-module'); + +var bench = common.createBenchmark(main, { + thousands: [50] +}); + +function main(conf) { + rmrf(tmpDirectory); + try { fs.mkdirSync(tmpDirectory); } catch (e) {} + try { fs.mkdirSync(benchmarkDirectory); } catch (e) {} + + var n = +conf.thousands * 1e3; + for (var i = 0; i <= n; i++) { + fs.mkdirSync(benchmarkDirectory + i); + fs.writeFileSync(benchmarkDirectory + i + '/package.json', '{"main": "index.js"}'); + fs.writeFileSync(benchmarkDirectory + i + '/index.js', 'module.exports = "";'); + } + + measure(n); +} + +function measure(n) { + bench.start(); + for (var i = 0; i <= n; i++) { + require(benchmarkDirectory + i); + } + bench.end(n / 1e3); +} + +function rmrf(location) { + if (fs.existsSync(location)) { + var things = fs.readdirSync(location); + things.forEach(function(thing) { + var cur = path.join(location, thing), + isDirectory = fs.statSync(cur).isDirectory(); + if (isDirectory) { + rmrf(cur); + return; + } + fs.unlinkSync(cur); + }); + fs.rmdirSync(location); + } +} From b26dd4e5ab9192bad72b9dc61fa4ad2d8f215da2 Mon Sep 17 00:00:00 2001 From: Patrick Mooney Date: Wed, 17 Sep 2014 13:54:24 -0500 Subject: [PATCH 019/144] net: Make server.connections un-enumerable The property server.connections should no longer be enumerable because it has been deprecated. This will prevent deprecation warnings when server objects are accessed by functions such as JSON.stringify. Fixes: https://github.com/joyent/node/issues/8373 Reviewed-by: Trevor Norris --- lib/net.js | 2 +- test/simple/test-net-server-connections.js | 32 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 test/simple/test-net-server-connections.js diff --git a/lib/net.js b/lib/net.js index 478c04a1f83..005f339c28d 100644 --- a/lib/net.js +++ b/lib/net.js @@ -1016,7 +1016,7 @@ function Server(/* [ options, ] listener */) { set: util.deprecate(function(val) { return (self._connections = val); }, 'connections property is deprecated. Use getConnections() method'), - configurable: true, enumerable: true + configurable: true, enumerable: false }); this._handle = null; diff --git a/test/simple/test-net-server-connections.js b/test/simple/test-net-server-connections.js new file mode 100644 index 00000000000..423fcb8e382 --- /dev/null +++ b/test/simple/test-net-server-connections.js @@ -0,0 +1,32 @@ +// 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 common = require('../common'); +var assert = require('assert'); + +var net = require('net'); + +// test that server.connections property is no longer enumerable now that it +// has been marked as deprecated + +var server = new net.Server(); + +assert.equal(Object.keys(server).indexOf('connections'), -1); From 9fad8958df671c0e894506ef59b4c781c3dfb349 Mon Sep 17 00:00:00 2001 From: Timothy J Fontaine Date: Wed, 24 Sep 2014 14:41:07 -0700 Subject: [PATCH 020/144] deps: upgrade npm to 2.0.0 --- deps/npm/.travis.yml | 8 +- deps/npm/CHANGELOG.md | 256 ++- deps/npm/Makefile | 16 +- deps/npm/README.md | 6 +- deps/npm/bin/npm-cli.js | 13 +- deps/npm/doc/cli/npm-adduser.md | 27 +- deps/npm/doc/cli/npm-install.md | 45 +- deps/npm/doc/cli/npm-link.md | 18 +- deps/npm/doc/cli/npm-ls.md | 8 +- deps/npm/doc/cli/npm-prefix.md | 8 +- deps/npm/doc/cli/npm-publish.md | 6 +- deps/npm/doc/cli/npm-restart.md | 2 +- deps/npm/doc/cli/npm-run-script.md | 4 +- deps/npm/doc/cli/npm-start.md | 2 +- deps/npm/doc/cli/npm-stop.md | 2 +- deps/npm/doc/cli/npm-test.md | 4 +- deps/npm/doc/cli/npm-uninstall.md | 5 +- deps/npm/doc/cli/npm-unpublish.md | 4 +- deps/npm/doc/cli/npm-update.md | 7 +- deps/npm/doc/cli/npm-view.md | 4 +- deps/npm/doc/files/npm-folders.md | 6 + deps/npm/doc/files/package.json.md | 22 + deps/npm/doc/misc/npm-config.md | 39 +- deps/npm/doc/misc/npm-faq.md | 20 +- deps/npm/doc/misc/npm-index.md | 4 + deps/npm/doc/misc/npm-registry.md | 17 +- deps/npm/doc/misc/npm-scope.md | 84 + deps/npm/doc/misc/npm-scripts.md | 5 +- deps/npm/doc/misc/semver.md | 209 ++- deps/npm/html/doc/README.html | 12 +- 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-submodule.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 | 2 +- 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-adduser.html | 23 +- 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-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 | 2 +- deps/npm/html/doc/cli/npm-install.html | 41 +- deps/npm/html/doc/cli/npm-link.html | 19 +- deps/npm/html/doc/cli/npm-ls.html | 12 +- 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 | 9 +- deps/npm/html/doc/cli/npm-prune.html | 2 +- deps/npm/html/doc/cli/npm-publish.html | 7 +- 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 | 4 +- 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 | 6 +- 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 | 4 +- deps/npm/html/doc/cli/npm-stop.html | 4 +- deps/npm/html/doc/cli/npm-submodule.html | 2 +- deps/npm/html/doc/cli/npm-tag.html | 2 +- deps/npm/html/doc/cli/npm-test.html | 6 +- deps/npm/html/doc/cli/npm-uninstall.html | 6 +- deps/npm/html/doc/cli/npm-unpublish.html | 5 +- deps/npm/html/doc/cli/npm-update.html | 8 +- deps/npm/html/doc/cli/npm-version.html | 2 +- deps/npm/html/doc/cli/npm-view.html | 6 +- 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 | 7 +- deps/npm/html/doc/files/npm-global.html | 7 +- deps/npm/html/doc/files/npm-json.html | 21 +- deps/npm/html/doc/files/npmrc.html | 2 +- deps/npm/html/doc/files/package.json.html | 21 +- deps/npm/html/doc/index.html | 4 +- deps/npm/html/doc/misc/index.html | 438 ----- deps/npm/html/doc/misc/npm-coding-style.html | 2 +- deps/npm/html/doc/misc/npm-config.html | 36 +- 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 | 25 +- deps/npm/html/doc/misc/npm-index.html | 4 +- deps/npm/html/doc/misc/npm-registry.html | 17 +- deps/npm/html/doc/misc/npm-scope.html | 2 +- deps/npm/html/doc/misc/npm-scripts.html | 7 +- deps/npm/html/doc/misc/removing-npm.html | 2 +- deps/npm/html/doc/misc/semver.html | 186 +- deps/npm/lib/adduser.js | 45 +- deps/npm/lib/bugs.js | 24 +- deps/npm/lib/build.js | 4 +- deps/npm/lib/cache.js | 177 +- deps/npm/lib/cache/add-local-tarball.js | 13 +- deps/npm/lib/cache/add-local.js | 22 +- deps/npm/lib/cache/add-named.js | 59 +- deps/npm/lib/cache/add-remote-git.js | 65 +- deps/npm/lib/cache/add-remote-tarball.js | 43 +- deps/npm/lib/cache/get-stat.js | 4 +- deps/npm/lib/cache/maybe-github.js | 19 +- deps/npm/lib/dedupe.js | 18 +- deps/npm/lib/deprecate.js | 39 +- deps/npm/lib/docs.js | 26 +- deps/npm/lib/install.js | 276 +-- deps/npm/lib/link.js | 20 +- deps/npm/lib/ls.js | 23 +- deps/npm/lib/npm.js | 11 +- deps/npm/lib/outdated.js | 35 +- deps/npm/lib/owner.js | 213 ++- deps/npm/lib/pack.js | 9 +- deps/npm/lib/publish.js | 84 +- deps/npm/lib/rebuild.js | 7 +- deps/npm/lib/repo.js | 28 +- deps/npm/lib/run-script.js | 34 +- deps/npm/lib/search.js | 13 +- deps/npm/lib/star.js | 30 +- deps/npm/lib/stars.js | 21 +- deps/npm/lib/submodule.js | 5 +- deps/npm/lib/tag.js | 28 +- deps/npm/lib/unbuild.js | 11 +- deps/npm/lib/unpublish.js | 84 +- deps/npm/lib/utils/error-handler.js | 122 +- deps/npm/lib/utils/fetch.js | 106 -- deps/npm/lib/utils/gently-rm.js | 173 +- deps/npm/lib/utils/is-git-url.js | 13 - deps/npm/lib/utils/lifecycle.js | 13 +- deps/npm/lib/utils/map-to-registry.js | 54 + deps/npm/lib/version.js | 6 +- deps/npm/lib/view.js | 115 +- deps/npm/lib/whoami.js | 40 +- deps/npm/man/man1/npm-README.1 | 337 ++-- deps/npm/man/man1/npm-adduser.1 | 90 +- deps/npm/man/man1/npm-bin.1 | 48 +- deps/npm/man/man1/npm-bugs.1 | 89 +- deps/npm/man/man1/npm-build.1 | 51 +- deps/npm/man/man1/npm-bundle.1 | 22 +- deps/npm/man/man1/npm-cache.1 | 98 +- deps/npm/man/man1/npm-completion.1 | 42 +- deps/npm/man/man1/npm-config.1 | 118 +- deps/npm/man/man1/npm-dedupe.1 | 76 +- deps/npm/man/man1/npm-deprecate.1 | 55 +- deps/npm/man/man1/npm-docs.1 | 86 +- deps/npm/man/man1/npm-edit.1 | 70 +- deps/npm/man/man1/npm-explore.1 | 85 +- deps/npm/man/man1/npm-help-search.1 | 60 +- deps/npm/man/man1/npm-help.1 | 80 +- deps/npm/man/man1/npm-init.1 | 48 +- deps/npm/man/man1/npm-install.1 | 552 +++--- deps/npm/man/man1/npm-link.1 | 127 +- deps/npm/man/man1/npm-ls.1 | 161 +- deps/npm/man/man1/npm-outdated.1 | 119 +- deps/npm/man/man1/npm-owner.1 | 59 +- deps/npm/man/man1/npm-pack.1 | 49 +- deps/npm/man/man1/npm-prefix.1 | 56 +- deps/npm/man/man1/npm-prune.1 | 43 +- deps/npm/man/man1/npm-publish.1 | 67 +- deps/npm/man/man1/npm-rebuild.1 | 44 +- deps/npm/man/man1/npm-repo.1 | 56 +- deps/npm/man/man1/npm-restart.1 | 52 +- deps/npm/man/man1/npm-rm.1 | 48 +- deps/npm/man/man1/npm-root.1 | 48 +- deps/npm/man/man1/npm-run-script.1 | 52 +- deps/npm/man/man1/npm-search.1 | 66 +- deps/npm/man/man1/npm-shrinkwrap.1 | 229 +-- deps/npm/man/man1/npm-star.1 | 45 +- deps/npm/man/man1/npm-stars.1 | 45 +- deps/npm/man/man1/npm-start.1 | 49 +- deps/npm/man/man1/npm-stop.1 | 49 +- deps/npm/man/man1/npm-submodule.1 | 43 +- deps/npm/man/man1/npm-tag.1 | 84 +- deps/npm/man/man1/npm-test.1 | 52 +- deps/npm/man/man1/npm-uninstall.1 | 97 +- deps/npm/man/man1/npm-unpublish.1 | 57 +- deps/npm/man/man1/npm-update.1 | 54 +- deps/npm/man/man1/npm-version.1 | 74 +- deps/npm/man/man1/npm-view.1 | 188 +- deps/npm/man/man1/npm-whoami.1 | 42 +- deps/npm/man/man1/npm.1 | 266 ++- deps/npm/man/man3/npm-bin.3 | 24 +- deps/npm/man/man3/npm-bugs.3 | 27 +- deps/npm/man/man3/npm-cache.3 | 28 +- deps/npm/man/man3/npm-commands.3 | 35 +- deps/npm/man/man3/npm-config.3 | 82 +- deps/npm/man/man3/npm-deprecate.3 | 70 +- deps/npm/man/man3/npm-docs.3 | 27 +- deps/npm/man/man3/npm-edit.3 | 29 +- deps/npm/man/man3/npm-explore.3 | 28 +- deps/npm/man/man3/npm-help-search.3 | 46 +- deps/npm/man/man3/npm-init.3 | 41 +- deps/npm/man/man3/npm-install.3 | 32 +- deps/npm/man/man3/npm-link.3 | 44 +- deps/npm/man/man3/npm-load.3 | 40 +- deps/npm/man/man3/npm-ls.3 | 78 +- deps/npm/man/man3/npm-outdated.3 | 26 +- deps/npm/man/man3/npm-owner.3 | 55 +- deps/npm/man/man3/npm-pack.3 | 27 +- deps/npm/man/man3/npm-prefix.3 | 29 +- deps/npm/man/man3/npm-prune.3 | 28 +- deps/npm/man/man3/npm-publish.3 | 54 +- deps/npm/man/man3/npm-rebuild.3 | 29 +- deps/npm/man/man3/npm-repo.3 | 27 +- deps/npm/man/man3/npm-restart.3 | 42 +- deps/npm/man/man3/npm-root.3 | 29 +- deps/npm/man/man3/npm-run-script.3 | 51 +- deps/npm/man/man3/npm-search.3 | 64 +- deps/npm/man/man3/npm-shrinkwrap.3 | 32 +- deps/npm/man/man3/npm-start.3 | 26 +- deps/npm/man/man3/npm-stop.3 | 26 +- deps/npm/man/man3/npm-submodule.3 | 43 +- deps/npm/man/man3/npm-tag.3 | 34 +- deps/npm/man/man3/npm-test.3 | 27 +- deps/npm/man/man3/npm-uninstall.3 | 29 +- deps/npm/man/man3/npm-unpublish.3 | 26 +- deps/npm/man/man3/npm-update.3 | 26 +- deps/npm/man/man3/npm-version.3 | 25 +- deps/npm/man/man3/npm-view.3 | 167 +- deps/npm/man/man3/npm-whoami.3 | 29 +- deps/npm/man/man3/npm.3 | 169 +- deps/npm/man/man5/npm-folders.5 | 225 +-- deps/npm/man/man5/npm-global.5 | 225 +-- deps/npm/man/man5/npm-json.5 | 822 ++++---- deps/npm/man/man5/npmrc.5 | 96 +- deps/npm/man/man5/package.json.5 | 822 ++++---- deps/npm/man/man7/index.7 | 298 --- deps/npm/man/man7/npm-coding-style.7 | 234 +-- deps/npm/man/man7/npm-config.7 | 1668 +++++++---------- deps/npm/man/man7/npm-developers.7 | 317 ++-- deps/npm/man/man7/npm-disputes.7 | 142 +- deps/npm/man/man7/npm-faq.7 | 486 ++--- deps/npm/man/man7/npm-index.7 | 434 ++--- deps/npm/man/man7/npm-registry.7 | 88 +- deps/npm/man/man7/npm-scripts.7 | 344 ++-- deps/npm/man/man7/removing-npm.7 | 115 +- deps/npm/man/man7/semver.7 | 478 +++-- deps/npm/node_modules/async-some/.eslintrc | 18 + deps/npm/node_modules/async-some/.npmignore | 1 + deps/npm/node_modules/async-some/README.md | 62 + deps/npm/node_modules/async-some/package.json | 57 + deps/npm/node_modules/async-some/some.js | 47 + .../node_modules/async-some/test/base-case.js | 35 + .../async-some/test/parameters.js | 37 + .../node_modules/async-some/test/simple.js | 60 + deps/npm/node_modules/cmd-shim/index.js | 6 +- deps/npm/node_modules/cmd-shim/package.json | 37 +- .../node_modules/ansi-regex/package.json | 5 +- .../node_modules/strip-ansi/package.json | 5 +- .../defaults/node_modules/clone/package.json | 5 +- .../node_modules/defaults/package.json | 8 +- .../node_modules/wcwidth/package.json | 5 +- deps/npm/node_modules/columnify/package.json | 5 +- deps/npm/node_modules/dezalgo/README.md | 29 + deps/npm/node_modules/dezalgo/dezalgo.js | 21 + .../dezalgo/node_modules/asap/LICENSE.md | 20 + .../dezalgo/node_modules/asap/README.md | 81 + .../dezalgo/node_modules/asap/asap.js | 113 ++ .../dezalgo/node_modules/asap/package.json | 39 + deps/npm/node_modules/dezalgo/package.json | 66 + deps/npm/node_modules/dezalgo/test/basic.js | 25 + deps/npm/node_modules/fs-vacuum/.eslintrc | 18 + deps/npm/node_modules/fs-vacuum/.npmignore | 1 + deps/npm/node_modules/fs-vacuum/README.md | 33 + deps/npm/node_modules/fs-vacuum/package.json | 42 + .../node_modules/fs-vacuum/test/arguments.js | 24 + .../fs-vacuum/test/base-leaf-mismatch.js | 16 + .../test/no-entries-file-no-purge.js | 78 + .../test/no-entries-link-no-purge.js | 78 + .../fs-vacuum/test/no-entries-no-purge.js | 61 + .../test/no-entries-with-link-purge.js | 78 + .../fs-vacuum/test/no-entries-with-purge.js | 67 + .../test/other-directories-no-purge.js | 76 + deps/npm/node_modules/fs-vacuum/vacuum.js | 104 + deps/npm/node_modules/fstream/package.json | 22 +- .../github-url-from-git/package.json | 5 +- .../github-url-from-username-repo/index.js | 11 +- .../package.json | 37 +- .../test/index.js | 12 + .../node_modules/promzard/package.json | 5 +- .../init-package-json/package.json | 20 +- deps/npm/node_modules/lockfile/package.json | 25 +- deps/npm/node_modules/node-gyp/package.json | 39 +- .../normalize-package-data/.npmignore | 0 .../normalize-package-data/.travis.yml | 0 .../normalize-package-data/AUTHORS | 0 .../normalize-package-data/LICENSE | 0 .../normalize-package-data/README.md | 0 .../lib/core_module_names.json | 0 .../lib/extract_description.js | 0 .../normalize-package-data/lib/fixer.js | 0 .../lib/make_warning.js | 0 .../normalize-package-data/lib/normalize.js | 0 .../normalize-package-data/lib/safe_format.js | 0 .../normalize-package-data/lib/typos.json | 0 .../lib/warning_messages.json | 0 .../normalize-package-data/package.json | 24 +- .../normalize-package-data/test/basic.js | 0 .../test/consistency.js | 0 .../test/dependencies.js | 0 .../test/fixtures/async.json | 0 .../test/fixtures/bcrypt.json | 0 .../test/fixtures/coffee-script.json | 0 .../test/fixtures/http-server.json | 0 .../test/fixtures/movefile.json | 0 .../test/fixtures/no-description.json | 0 .../test/fixtures/node-module_exist.json | 0 .../test/fixtures/npm.json | 0 .../test/fixtures/read-package-json.json | 0 .../test/fixtures/request.json | 0 .../test/fixtures/underscore.json | 0 .../test/github-urls.js | 0 .../normalize-package-data/test/normalize.js | 0 .../normalize-package-data/test/scoped.js | 0 .../normalize-package-data/test/strict.js | 0 .../normalize-package-data/test/typo.js | 0 .../npm-install-checks/package.json | 35 +- deps/npm/node_modules/npm-package-arg/LICENSE | 15 + .../node_modules/npm-package-arg/README.md | 55 + deps/npm/node_modules/npm-package-arg/npa.js | 187 ++ .../node_modules/npm-package-arg/package.json | 38 + .../npm-package-arg/test/basic.js | 203 ++ .../npm-package-arg/test/windows.js | 41 + .../npm-registry-client/.npmignore | 2 + .../npm-registry-client/lib/adduser.js | 92 +- .../npm-registry-client/lib/attempt.js | 22 + .../npm-registry-client/lib/authify.js | 27 + .../npm-registry-client/lib/deprecate.js | 3 +- .../npm-registry-client/lib/fetch.js | 85 + .../npm-registry-client/lib/initialize.js | 41 + .../npm-registry-client/lib/publish.js | 53 +- .../npm-registry-client/lib/request.js | 215 +-- .../npm-registry-client/lib/star.js | 15 +- .../npm-registry-client/lib/unpublish.js | 11 +- .../npm-registry-client/lib/util/nerf-dart.js | 21 + .../npm-registry-client/lib/whoami.js | 15 + .../npm-registry-client/package.json | 19 +- .../npm-registry-client/test/bugs.js | 11 +- .../npm-registry-client/test/deprecate.js | 18 +- .../npm-registry-client/test/fetch-404.js | 44 + .../npm-registry-client/test/fetch-408.js | 52 + .../npm-registry-client/test/fetch-503.js | 52 + .../npm-registry-client/test/fetch-basic.js | 44 + .../npm-registry-client/test/get-all.js | 2 +- .../npm-registry-client/test/get-basic.js | 10 +- .../npm-registry-client/test/get-error-403.js | 33 + .../npm-registry-client/test/lib/common.js | 72 +- .../npm-registry-client/test/lib/server.js | 2 +- .../test/publish-again-scoped.js | 82 + .../npm-registry-client/test/publish-again.js | 26 +- .../test/publish-scoped-auth-token.js | 52 + .../test/publish-scoped.js | 57 + .../npm-registry-client/test/publish.js | 24 +- .../test/request-gzip-content.js | 8 +- .../npm-registry-client/test/star.js | 22 +- .../npm-registry-client/test/stars.js | 10 +- .../npm-registry-client/test/tag.js | 18 +- .../test/unpublish-scoped.js | 59 + .../npm-registry-client/test/unpublish.js | 16 +- .../npm-registry-client/test/upload.js | 17 +- .../npm-registry-client/test/whoami.js | 30 + deps/npm/node_modules/npmconf/.npmignore | 2 + deps/npm/node_modules/npmconf/LICENSE | 36 +- deps/npm/node_modules/npmconf/config-defs.js | 29 +- .../npmconf/lib/get-credentials-by-uri.js | 57 + .../npm/node_modules/npmconf/lib/nerf-dart.js | 21 + .../npmconf/lib/set-credentials-by-uri.js | 34 + .../node_modules/proto-list/package.json | 5 +- .../node_modules/config-chain/package.json | 2 +- deps/npm/node_modules/npmconf/npmconf.js | 39 +- deps/npm/node_modules/npmconf/package.json | 36 +- .../npm/node_modules/npmconf/test/00-setup.js | 24 + deps/npm/node_modules/npmconf/test/basic.js | 27 +- deps/npm/node_modules/npmconf/test/builtin.js | 26 +- .../node_modules/npmconf/test/credentials.js | 166 ++ .../npmconf/test/fixtures/userconfig | 3 +- deps/npm/node_modules/npmconf/test/project.js | 27 +- deps/npm/node_modules/npmconf/test/save.js | 8 +- .../node_modules/npmconf/test/semver-tag.js | 65 + .../node_modules/debuglog/LICENSE | 19 + .../node_modules/debuglog/README.md | 40 + .../node_modules/debuglog/debuglog.js | 22 + .../node_modules/debuglog/package.json | 45 + .../readdir-scoped-modules/LICENSE | 15 + .../readdir-scoped-modules/README.md | 17 + .../readdir-scoped-modules/package.json | 54 + .../readdir-scoped-modules/readdir.js | 71 + .../readdir-scoped-modules/test/basic.js | 14 + .../test/fixtures/@org/x/.keep | 0 .../test/fixtures/@org/y/.keep | 0 .../test/fixtures/@scope/x/.keep | 0 .../test/fixtures/@scope/y/.keep | 0 .../test/fixtures/a/x/.keep | 0 .../test/fixtures/a/y/.keep | 0 .../test/fixtures/b/x/.keep | 0 .../test/fixtures/b/y/.keep | 0 .../node_modules/util-extend/package.json | 2 +- .../node_modules/read-installed/package.json | 39 +- .../read-installed/read-installed.js | 154 +- .../node_modules/read-installed/test/basic.js | 11 +- .../test/cyclic-extraneous-peer-deps.js | 81 + .../node_modules/read-installed/test/dev.js | 4 +- .../read-installed/test/extraneous-dev.js | 20 + .../read-installed/test/extraneous.js | 4 +- .../fixtures/extraneous-dev-dep/package.json | 7 + .../grandparent-peer-dev/package.json | 8 + .../test/grandparent-peer-dev.js | 20 + .../test/linked-dep-dev-deps-extraneous.js | 59 + .../read-installed/test/noargs.js | 2 +- .../read-package-json/package.json | 2 +- .../node_modules/aws-sign2/package.json | 2 +- .../request/node_modules/bl/.jshintrc | 59 - .../node_modules/core-util-is/package.json | 2 +- .../node_modules/string_decoder/package.json | 2 +- .../node_modules/readable-stream/package.json | 2 +- .../request/node_modules/bl/package.json | 2 +- .../node_modules/caseless/package.json | 2 +- .../node_modules/forever-agent/package.json | 2 +- .../form-data/node_modules/async/package.json | 2 +- .../node_modules/combined-stream/package.json | 2 +- .../form-data/node_modules/mime/package.json | 2 +- .../node_modules/form-data/package.json | 2 +- .../hawk/node_modules/boom/package.json | 2 +- .../hawk/node_modules/cryptiles/package.json | 2 +- .../hawk/node_modules/hoek/package.json | 2 +- .../hawk/node_modules/sntp/package.json | 2 +- .../node_modules/http-signature/package.json | 2 +- .../json-stringify-safe/package.json | 2 +- .../node_modules/mime-types/package.json | 2 +- .../node_modules/node-uuid/package.json | 2 +- .../node_modules/oauth-sign/package.json | 2 +- .../request/node_modules/qs/.jshintrc | 10 - .../request/node_modules/qs/package.json | 2 +- .../node_modules/stringstream/package.json | 2 +- .../node_modules/tunnel-agent/.jshintrc | 5 - .../node_modules/tunnel-agent/package.json | 2 +- deps/npm/node_modules/request/package.json | 2 +- deps/npm/node_modules/semver/Makefile | 6 +- deps/npm/node_modules/semver/README.md | 209 ++- deps/npm/node_modules/semver/bin/semver | 4 +- .../semver/{foot.js => foot.js.txt} | 0 .../semver/{head.js => head.js.txt} | 0 deps/npm/node_modules/semver/package.json | 29 +- .../npm/node_modules/semver/semver.browser.js | 191 +- .../node_modules/semver/semver.browser.js.gz | Bin 7180 -> 7391 bytes deps/npm/node_modules/semver/semver.js | 191 +- deps/npm/node_modules/semver/semver.min.js | 2 +- deps/npm/node_modules/semver/semver.min.js.gz | Bin 3295 -> 3397 bytes deps/npm/node_modules/semver/test/clean.js | 25 + deps/npm/node_modules/semver/test/gtr.js | 2 +- deps/npm/node_modules/semver/test/index.js | 219 ++- deps/npm/node_modules/semver/test/ltr.js | 17 +- .../npm/node_modules/semver/test/no-module.js | 4 +- .../readable-stream/lib/_stream_readable.js | 35 +- .../readable-stream/lib/_stream_writable.js | 1 - .../node_modules/core-util-is/package.json | 5 +- .../node_modules/isarray/package.json | 5 +- .../node_modules/string_decoder/index.js | 75 +- .../node_modules/string_decoder/package.json | 22 +- .../node_modules/readable-stream/package.json | 21 +- deps/npm/node_modules/sha/package.json | 2 +- deps/npm/node_modules/slide/package.json | 5 +- deps/npm/node_modules/tar/package.json | 22 +- deps/npm/package.json | 35 +- deps/npm/scripts/doc-build.sh | 24 +- deps/npm/test/common-tap.js | 2 +- .../npm-test-optional-deps/package.json | 1 - deps/npm/test/run.js | 45 +- deps/npm/test/tap/00-verify-ls-ok.js | 15 + .../test/tap/cache-add-localdir-fallback.js | 76 + deps/npm/test/tap/cache-shasum.js | 3 +- deps/npm/test/tap/config-meta.js | 13 +- deps/npm/test/tap/git-cache-permissions.js | 80 + deps/npm/test/tap/ignore-install-link.js | 17 +- deps/npm/test/tap/install-at-locally.js | 1 - deps/npm/test/tap/install-from-local.js | 38 + .../package-local-dependency/package.json | 5 + .../package-local-dev-dependency/package.json | 5 + .../package-with-local-paths/package.json | 10 + deps/npm/test/tap/install-save-exact.js | 1 - deps/npm/test/tap/install-save-local.js | 68 + .../package-local-dependency/package.json | 5 + .../package-local-dev-dependency/package.json | 5 + .../install-save-local/package/package.json | 4 + deps/npm/test/tap/install-save-prefix.js | 1 - deps/npm/test/tap/install-scoped-link.js | 52 + deps/npm/test/tap/install-scoped/package.json | 7 + deps/npm/test/tap/install-scoped/world.js | 1 + deps/npm/test/tap/lifecycle-path.js | 61 + deps/npm/test/tap/lifecycle-path/package.json | 1 + .../npm/test/tap/lifecycle-path/print-path.js | 1 + deps/npm/test/tap/maybe-github.js | 22 +- deps/npm/test/tap/nested-extraneous.js | 53 + .../optional-metadep-rollback-collision.js | 56 + .../deps/d1/package.json | 13 + .../deps/d2/blart.js | 52 + .../deps/d2/package.json | 15 + .../deps/opdep/bad-server.js | 35 + .../deps/opdep/package.json | 15 + .../package.json | 10 + deps/npm/test/tap/outdated-notarget.js | 44 +- deps/npm/test/tap/pack-scoped.js | 91 + deps/npm/test/tap/prepublish.js | 89 +- deps/npm/test/tap/publish-config.js | 17 +- deps/npm/test/tap/publish-scoped.js | 71 + deps/npm/test/tap/pwd-prefix.js | 35 + deps/npm/test/tap/registry.js | 20 +- deps/npm/test/tap/run-script.js | 62 + deps/npm/test/tap/run-script/package.json | 6 + deps/npm/test/tap/semver-tag.js | 15 + deps/npm/test/tap/url-dependencies.js | 20 +- deps/npm/test/tap/whoami.js | 77 + tools/upgrade-npm.sh | 7 + 556 files changed, 13934 insertions(+), 10691 deletions(-) create mode 100644 deps/npm/doc/misc/npm-scope.md delete mode 100644 deps/npm/html/doc/misc/index.html delete mode 100644 deps/npm/lib/utils/fetch.js delete mode 100644 deps/npm/lib/utils/is-git-url.js create mode 100644 deps/npm/lib/utils/map-to-registry.js delete mode 100644 deps/npm/man/man7/index.7 create mode 100644 deps/npm/node_modules/async-some/.eslintrc create mode 100644 deps/npm/node_modules/async-some/.npmignore create mode 100644 deps/npm/node_modules/async-some/README.md create mode 100644 deps/npm/node_modules/async-some/package.json create mode 100644 deps/npm/node_modules/async-some/some.js create mode 100644 deps/npm/node_modules/async-some/test/base-case.js create mode 100644 deps/npm/node_modules/async-some/test/parameters.js create mode 100644 deps/npm/node_modules/async-some/test/simple.js create mode 100644 deps/npm/node_modules/dezalgo/README.md create mode 100644 deps/npm/node_modules/dezalgo/dezalgo.js create mode 100644 deps/npm/node_modules/dezalgo/node_modules/asap/LICENSE.md create mode 100644 deps/npm/node_modules/dezalgo/node_modules/asap/README.md create mode 100644 deps/npm/node_modules/dezalgo/node_modules/asap/asap.js create mode 100644 deps/npm/node_modules/dezalgo/node_modules/asap/package.json create mode 100644 deps/npm/node_modules/dezalgo/package.json create mode 100644 deps/npm/node_modules/dezalgo/test/basic.js create mode 100644 deps/npm/node_modules/fs-vacuum/.eslintrc create mode 100644 deps/npm/node_modules/fs-vacuum/.npmignore create mode 100644 deps/npm/node_modules/fs-vacuum/README.md create mode 100644 deps/npm/node_modules/fs-vacuum/package.json create mode 100644 deps/npm/node_modules/fs-vacuum/test/arguments.js create mode 100644 deps/npm/node_modules/fs-vacuum/test/base-leaf-mismatch.js create mode 100644 deps/npm/node_modules/fs-vacuum/test/no-entries-file-no-purge.js create mode 100644 deps/npm/node_modules/fs-vacuum/test/no-entries-link-no-purge.js create mode 100644 deps/npm/node_modules/fs-vacuum/test/no-entries-no-purge.js create mode 100644 deps/npm/node_modules/fs-vacuum/test/no-entries-with-link-purge.js create mode 100644 deps/npm/node_modules/fs-vacuum/test/no-entries-with-purge.js create mode 100644 deps/npm/node_modules/fs-vacuum/test/other-directories-no-purge.js create mode 100644 deps/npm/node_modules/fs-vacuum/vacuum.js rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/.npmignore (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/.travis.yml (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/AUTHORS (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/LICENSE (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/README.md (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/lib/core_module_names.json (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/lib/extract_description.js (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/lib/fixer.js (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/lib/make_warning.js (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/lib/normalize.js (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/lib/safe_format.js (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/lib/typos.json (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/lib/warning_messages.json (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/package.json (74%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/basic.js (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/consistency.js (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/dependencies.js (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/fixtures/async.json (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/fixtures/bcrypt.json (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/fixtures/coffee-script.json (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/fixtures/http-server.json (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/fixtures/movefile.json (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/fixtures/no-description.json (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/fixtures/node-module_exist.json (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/fixtures/npm.json (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/fixtures/read-package-json.json (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/fixtures/request.json (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/fixtures/underscore.json (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/github-urls.js (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/normalize.js (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/scoped.js (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/strict.js (100%) rename deps/npm/node_modules/{read-package-json/node_modules => }/normalize-package-data/test/typo.js (100%) create mode 100644 deps/npm/node_modules/npm-package-arg/LICENSE create mode 100644 deps/npm/node_modules/npm-package-arg/README.md create mode 100644 deps/npm/node_modules/npm-package-arg/npa.js create mode 100644 deps/npm/node_modules/npm-package-arg/package.json create mode 100644 deps/npm/node_modules/npm-package-arg/test/basic.js create mode 100644 deps/npm/node_modules/npm-package-arg/test/windows.js create mode 100644 deps/npm/node_modules/npm-registry-client/lib/attempt.js create mode 100644 deps/npm/node_modules/npm-registry-client/lib/authify.js create mode 100644 deps/npm/node_modules/npm-registry-client/lib/fetch.js create mode 100644 deps/npm/node_modules/npm-registry-client/lib/initialize.js create mode 100644 deps/npm/node_modules/npm-registry-client/lib/util/nerf-dart.js create mode 100644 deps/npm/node_modules/npm-registry-client/lib/whoami.js create mode 100644 deps/npm/node_modules/npm-registry-client/test/fetch-404.js create mode 100644 deps/npm/node_modules/npm-registry-client/test/fetch-408.js create mode 100644 deps/npm/node_modules/npm-registry-client/test/fetch-503.js create mode 100644 deps/npm/node_modules/npm-registry-client/test/fetch-basic.js create mode 100644 deps/npm/node_modules/npm-registry-client/test/get-error-403.js create mode 100644 deps/npm/node_modules/npm-registry-client/test/publish-again-scoped.js create mode 100644 deps/npm/node_modules/npm-registry-client/test/publish-scoped-auth-token.js create mode 100644 deps/npm/node_modules/npm-registry-client/test/publish-scoped.js create mode 100644 deps/npm/node_modules/npm-registry-client/test/unpublish-scoped.js create mode 100644 deps/npm/node_modules/npm-registry-client/test/whoami.js create mode 100644 deps/npm/node_modules/npmconf/lib/get-credentials-by-uri.js create mode 100644 deps/npm/node_modules/npmconf/lib/nerf-dart.js create mode 100644 deps/npm/node_modules/npmconf/lib/set-credentials-by-uri.js create mode 100644 deps/npm/node_modules/npmconf/test/credentials.js create mode 100644 deps/npm/node_modules/npmconf/test/semver-tag.js create mode 100644 deps/npm/node_modules/read-installed/node_modules/debuglog/LICENSE create mode 100644 deps/npm/node_modules/read-installed/node_modules/debuglog/README.md create mode 100644 deps/npm/node_modules/read-installed/node_modules/debuglog/debuglog.js create mode 100644 deps/npm/node_modules/read-installed/node_modules/debuglog/package.json create mode 100644 deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/LICENSE create mode 100644 deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/README.md create mode 100644 deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/package.json create mode 100644 deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/readdir.js create mode 100644 deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/basic.js create mode 100644 deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/@org/x/.keep create mode 100644 deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/@org/y/.keep create mode 100644 deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/@scope/x/.keep create mode 100644 deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/@scope/y/.keep create mode 100644 deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/a/x/.keep create mode 100644 deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/a/y/.keep create mode 100644 deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/b/x/.keep create mode 100644 deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/test/fixtures/b/y/.keep create mode 100644 deps/npm/node_modules/read-installed/test/cyclic-extraneous-peer-deps.js create mode 100644 deps/npm/node_modules/read-installed/test/extraneous-dev.js create mode 100644 deps/npm/node_modules/read-installed/test/fixtures/extraneous-dev-dep/package.json create mode 100644 deps/npm/node_modules/read-installed/test/fixtures/grandparent-peer-dev/package.json create mode 100644 deps/npm/node_modules/read-installed/test/grandparent-peer-dev.js create mode 100644 deps/npm/node_modules/read-installed/test/linked-dep-dev-deps-extraneous.js delete mode 100644 deps/npm/node_modules/request/node_modules/bl/.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 rename deps/npm/node_modules/semver/{foot.js => foot.js.txt} (100%) rename deps/npm/node_modules/semver/{head.js => head.js.txt} (100%) create mode 100644 deps/npm/node_modules/semver/test/clean.js create mode 100644 deps/npm/test/tap/00-verify-ls-ok.js create mode 100644 deps/npm/test/tap/cache-add-localdir-fallback.js create mode 100644 deps/npm/test/tap/git-cache-permissions.js create mode 100644 deps/npm/test/tap/install-from-local.js create mode 100644 deps/npm/test/tap/install-from-local/package-local-dependency/package.json create mode 100644 deps/npm/test/tap/install-from-local/package-local-dev-dependency/package.json create mode 100644 deps/npm/test/tap/install-from-local/package-with-local-paths/package.json create mode 100644 deps/npm/test/tap/install-save-local.js create mode 100644 deps/npm/test/tap/install-save-local/package-local-dependency/package.json create mode 100644 deps/npm/test/tap/install-save-local/package-local-dev-dependency/package.json create mode 100644 deps/npm/test/tap/install-save-local/package/package.json create mode 100644 deps/npm/test/tap/install-scoped-link.js create mode 100644 deps/npm/test/tap/install-scoped/package.json create mode 100644 deps/npm/test/tap/install-scoped/world.js create mode 100644 deps/npm/test/tap/lifecycle-path.js create mode 100644 deps/npm/test/tap/lifecycle-path/package.json create mode 100644 deps/npm/test/tap/lifecycle-path/print-path.js create mode 100644 deps/npm/test/tap/nested-extraneous.js create mode 100644 deps/npm/test/tap/optional-metadep-rollback-collision.js create mode 100644 deps/npm/test/tap/optional-metadep-rollback-collision/deps/d1/package.json create mode 100644 deps/npm/test/tap/optional-metadep-rollback-collision/deps/d2/blart.js create mode 100644 deps/npm/test/tap/optional-metadep-rollback-collision/deps/d2/package.json create mode 100644 deps/npm/test/tap/optional-metadep-rollback-collision/deps/opdep/bad-server.js create mode 100644 deps/npm/test/tap/optional-metadep-rollback-collision/deps/opdep/package.json create mode 100644 deps/npm/test/tap/optional-metadep-rollback-collision/package.json create mode 100644 deps/npm/test/tap/pack-scoped.js create mode 100644 deps/npm/test/tap/publish-scoped.js create mode 100644 deps/npm/test/tap/pwd-prefix.js create mode 100644 deps/npm/test/tap/run-script.js create mode 100644 deps/npm/test/tap/run-script/package.json create mode 100644 deps/npm/test/tap/semver-tag.js create mode 100644 deps/npm/test/tap/whoami.js create mode 100755 tools/upgrade-npm.sh diff --git a/deps/npm/.travis.yml b/deps/npm/.travis.yml index 0fbe8dc335f..2734148642f 100644 --- a/deps/npm/.travis.yml +++ b/deps/npm/.travis.yml @@ -1,5 +1,11 @@ language: node_js -script: "npm run-script tap" node_js: - "0.11" - "0.10" +env: + - DEPLOY_VERSION=testing +before_install: + - "npm config set spin false" + - "npm install -g npm@^2" + - "sudo mkdir -p /var/run/couchdb" +script: "npm run-script tap" diff --git a/deps/npm/CHANGELOG.md b/deps/npm/CHANGELOG.md index 330c1ac17ad..a8afe8ac75f 100644 --- a/deps/npm/CHANGELOG.md +++ b/deps/npm/CHANGELOG.md @@ -1,3 +1,69 @@ +### v2.0.0 (2014-09-12): + +BREAKING CHANGES: + +* [`4378a17`](https://github.com/npm/npm/commit/4378a17db340404a725ffe2eb75c9936f1612670) + `semver@4.0.0`: prerelease versions no longer show up in ranges; `^0.x.y` + behaves the way it did in `semver@2` rather than `semver@3`; docs have been + reorganized for comprehensibility ([@isaacs](https://github.com/isaacs)) +* [`c6ddb64`](https://github.com/npm/npm/commit/c6ddb6462fe32bf3a27b2c4a62a032a92e982429) + npm now assumes that node is newer than 0.6 + ([@isaacs](https://github.com/isaacs)) + +Other changes: + +* [`ea515c3`](https://github.com/npm/npm/commit/ea515c3b858bf493a7b87fa4cdc2110a0d9cef7f) + [#6043](https://github.com/npm/npm/issues/6043) `slide@1.1.6`: wait until all + callbacks have finished before proceeding + ([@othiym23](https://github.com/othiym23)) +* [`0b0a59d`](https://github.com/npm/npm/commit/0b0a59d504f20f424294b1590ace73a7464f0378) + [#6043](https://github.com/npm/npm/issues/6043) defer rollbacks until just + before the CLI exits ([@isaacs](https://github.com/isaacs)) +* [`a11c88b`](https://github.com/npm/npm/commit/a11c88bdb1488b87d8dcac69df9a55a7a91184b6) + [#6175](https://github.com/npm/npm/issues/6175) pack scoped packages + correctly ([@othiym23](https://github.com/othiym23)) +* [`e4e48e0`](https://github.com/npm/npm/commit/e4e48e037d4e95fdb6acec80b04c5c6eaee59970) + [#6121](https://github.com/npm/npm/issues/6121) `read-installed@3.1.2`: don't + mark linked dev dependencies as extraneous + ([@isaacs](https://github.com/isaacs)) +* [`d673e41`](https://github.com/npm/npm/commit/d673e4185d43362c2b2a91acbca8c057e7303c7b) + `cmd-shim@2.0.1`: depend on `graceful-fs` directly + ([@ForbesLindesay](https://github.com/ForbesLindesay)) +* [`9d54d45`](https://github.com/npm/npm/commit/9d54d45e602d595bdab7eae09b9fa1dc46370147) + `npm-registry-couchapp@2.5.3`: make tests more reliable on Travis + ([@iarna](https://github.com/iarna)) +* [`673d738`](https://github.com/npm/npm/commit/673d738c6142c3d043dcee0b7aa02c9831a2e0ca) + ensure permissions are set correctly in cache when running as root + ([@isaacs](https://github.com/isaacs)) +* [`6e6a5fb`](https://github.com/npm/npm/commit/6e6a5fb74af10fd345411df4e121e554e2e3f33e) + prepare for upgrade to `node-semver@4.0.0` + ([@isaacs](https://github.com/isaacs)) +* [`ab8dd87`](https://github.com/npm/npm/commit/ab8dd87b943262f5996744e8d4cc30cc9358b7d7) + swap out `ronn` for `marked-man@0.1.3` ([@isaacs](https://github.com/isaacs)) +* [`803da54`](https://github.com/npm/npm/commit/803da5404d5a0b7c9defa3fe7fa0f2d16a2b19d3) + `npm-registry-client@3.2.0`: prepare for `node-semver@4.0.0` and include more + error information ([@isaacs](https://github.com/isaacs)) +* [`4af0e71`](https://github.com/npm/npm/commit/4af0e7134f5757c3d456d83e8349224a4ba12660) + make default error display less scary ([@isaacs](https://github.com/isaacs)) +* [`4fd9e79`](https://github.com/npm/npm/commit/4fd9e7901a15abff7a3dd478d99ce239b9580bca) + `npm-registry-client@3.2.1`: handle errors returned by the registry much, + much better ([@othiym23](https://github.com/othiym23)) +* [`ca791e2`](https://github.com/npm/npm/commit/ca791e27e97e51c1dd491bff6622ac90b54c3e23) + restore a long (always?) missing pass for deduping + ([@othiym23](https://github.com/othiym23)) +* [`ca0ef0e`](https://github.com/npm/npm/commit/ca0ef0e99bbdeccf28d550d0296baa4cb5e7ece2) + correctly interpret relative paths for local dependencies + ([@othiym23](https://github.com/othiym23)) +* [`5eb8db2`](https://github.com/npm/npm/commit/5eb8db2c370eeb4cd34f6e8dc6a935e4ea325621) + `npm-package-arg@2.1.2`: support git+file:// URLs for local bare repos + ([@othiym23](https://github.com/othiym23)) +* [`860a185`](https://github.com/npm/npm/commit/860a185c43646aca84cb93d1c05e2266045c316b) + tweak docs to no longer advocate checking in `node_modules` + ([@hunterloftis](https://github.com/hunterloftis)) +* [`80e9033`](https://github.com/npm/npm/commit/80e9033c40e373775e35c674faa6c1948661782b) + add links to nodejs.org downloads to docs + ([@meetar](https://github.com/meetar)) + ### v1.4.28 (2014-09-12): * [`f4540b6`](https://github.com/npm/npm/commit/f4540b6537a87e653d7495a9ddcf72949fdd4d14) @@ -8,16 +74,101 @@ callbacks have finished before proceeding ([@othiym23](https://github.com/othiym23)) +### v2.0.0-beta.3 (2014-09-04): + +* [`fa79413`](https://github.com/npm/npm/commit/fa794138bec8edb7b88639db25ee9c010d2f4c2b) + [#6119](https://github.com/npm/npm/issues/6119) fall back to registry installs + if package.json is missing in a local directory ([@iarna](https://github.com/iarna)) +* [`16073e2`](https://github.com/npm/npm/commit/16073e2d8ae035961c4c189b602d4aacc6d6b387) + `npm-package-arg@2.1.0`: support file URIs as local specs + ([@othiym23](https://github.com/othiym23)) +* [`9164acb`](https://github.com/npm/npm/commit/9164acbdee28956fa816ce5e473c559395ae4ec2) + `github-url-from-username-repo@1.0.2`: don't match strings that are already + URIs ([@othiym23](https://github.com/othiym23)) +* [`4067d6b`](https://github.com/npm/npm/commit/4067d6bf303a69be13f3af4b19cf4fee1b0d3e12) + [#5629](https://github.com/npm/npm/issues/5629) support saving of local packages + in `package.json` ([@dylang](https://github.com/dylang)) +* [`1b2ffdf`](https://github.com/npm/npm/commit/1b2ffdf359a8c897a78f91fc5a5d535c97aaec97) + [#6097](https://github.com/npm/npm/issues/6097) document scoped packages + ([@seldo](https://github.com/seldo)) +* [`0a67d53`](https://github.com/npm/npm/commit/0a67d536067c4808a594d81288d34c0f7e97e105) + [#6007](https://github.com/npm/npm/issues/6007) `request@2.42.0`: properly + set headers on proxy requests ([@isaacs](https://github.com/isaacs)) +* [`9bac6b8`](https://github.com/npm/npm/commit/9bac6b860b674d24251bb7b8ba412fdb26cbc836) + `npmconf@2.0.8`: disallow semver ranges in tag configuration + ([@isaacs](https://github.com/isaacs)) +* [`d2d4d7c`](https://github.com/npm/npm/commit/d2d4d7cd3c32f91a87ffa11fe464d524029011c3) + [#6082](https://github.com/npm/npm/issues/6082) don't allow tagging with a + semver range as the tag name ([@isaacs](https://github.com/isaacs)) + ### v1.4.27 (2014-09-04): * [`4cf3c8f`](https://github.com/npm/npm/commit/4cf3c8fd78c9e2693a5f899f50c28f4823c88e2e) - [#6007](https://github.com/npm/npm/issues/6007) `request@2.42.0`: properly set + [#6007](https://github.com/npm/npm/issues/6007) request@2.42.0: properly set headers on proxy requests ([@isaacs](https://github.com/isaacs)) * [`403cb52`](https://github.com/npm/npm/commit/403cb526be1472bb7545fa8e62d4976382cdbbe5) - [#6055](https://github.com/npm/npm/issues/6055) `npmconf@1.1.8`: restore + [#6055](https://github.com/npm/npm/issues/6055) npmconf@1.1.8: restore case-insensitivity of environmental config ([@iarna](https://github.com/iarna)) +### v2.0.0-beta.2 (2014-08-29): + +SPECIAL LABOR DAY WEEKEND RELEASE PARTY WOOO + +* [`ed207e8`](https://github.com/npm/npm/commit/ed207e88019de3150037048df6267024566e1093) + `npm-registry-client@3.1.7`: Clean up auth logic and improve logging around + auth decisions. Also error on trying to change a user document without + writing to it. ([@othiym23](https://github.com/othiym23)) +* [`66c7423`](https://github.com/npm/npm/commit/66c7423b7fb07a326b83c83727879410d43c439f) + `npmconf@2.0.7`: support -C as an alias for --prefix + ([@isaacs](https://github.com/isaacs)) +* [`0dc6a07`](https://github.com/npm/npm/commit/0dc6a07c778071c94c2251429c7d107e88a45095) + [#6059](https://github.com/npm/npm/issues/6059) run commands in prefix, not + cwd ([@isaacs](https://github.com/isaacs)) +* [`65d2179`](https://github.com/npm/npm/commit/65d2179af96737eb9038eaa24a293a62184aaa13) + `github-url-from-username-repo@1.0.1`: part 3 handle slashes in branch names + ([@robertkowalski](https://github.com/robertkowalski)) +* [`e8d75d0`](https://github.com/npm/npm/commit/e8d75d0d9f148ce2b3e8f7671fa281945bac363d) + [#6057](https://github.com/npm/npm/issues/6057) `read-installed@3.1.1`: + properly handle extraneous dev dependencies of required dependencies + ([@othiym23](https://github.com/othiym23)) +* [`0602f70`](https://github.com/npm/npm/commit/0602f708f070d524ad41573afd4c57171cab21ad) + [#6064](https://github.com/npm/npm/issues/6064) ls: do not show deps of + extraneous deps ([@isaacs](https://github.com/isaacs)) + +### v2.0.0-beta.1 (2014-08-28): + +* [`78a1fc1`](https://github.com/npm/npm/commit/78a1fc12307a0cbdbc944775ed831b876ee65855) + `github-url-from-git@1.4.0`: add support for git+https and git+ssh + ([@stefanbuck](https://github.com/stefanbuck)) +* [`bf247ed`](https://github.com/npm/npm/commit/bf247edf5429c6b3ec4d4cb798fa0eb0a9c19fc1) + `columnify@1.2.1` ([@othiym23](https://github.com/othiym23)) +* [`4bbe682`](https://github.com/npm/npm/commit/4bbe682a6d4eabcd23f892932308c9f228bf4de3) + `cmd-shim@2.0.0`: upgrade to graceful-fs 3 + ([@ForbesLindesay](https://github.com/ForbesLindesay)) +* [`ae1d590`](https://github.com/npm/npm/commit/ae1d590bdfc2476a4ed446e760fea88686e3ae05) + `npm-package-arg@2.0.4`: accept slashes in branch names + ([@thealphanerd](https://github.com/thealphanerd)) +* [`b2f51ae`](https://github.com/npm/npm/commit/b2f51aecadf585711e145b6516f99e7c05f53614) + `semver@3.0.1`: semver.clean() is cleaner + ([@isaacs](https://github.com/isaacs)) +* [`1d041a8`](https://github.com/npm/npm/commit/1d041a8a5ebd5bf6cecafab2072d4ec07823adab) + `github-url-from-username-repo@1.0.0`: accept slashes in branch names + ([@robertkowalski](https://github.com/robertkowalski)) +* [`02c85d5`](https://github.com/npm/npm/commit/02c85d592c4058e5d9eafb0be36b6743ae631998) + `async-some@1.0.1` ([@othiym23](https://github.com/othiym23)) +* [`5af493e`](https://github.com/npm/npm/commit/5af493efa8a463cd1acc4a9a394699e2c0793b9c) + ensure lifecycle spawn errors caught properly + ([@isaacs](https://github.com/isaacs)) +* [`60fe012`](https://github.com/npm/npm/commit/60fe012fac9570d6c72554cdf34a6fa95bf0f0a6) + `npmconf@2.0.6`: init.version defaults to 1.0.0 + ([@isaacs](https://github.com/isaacs)) +* [`b4c717b`](https://github.com/npm/npm/commit/b4c717bbf58fb6a0d64ad229036c79a184297ee2) + `npm-registry-client@3.1.4`: properly encode % in passwords + ([@isaacs](https://github.com/isaacs)) +* [`7b55f44`](https://github.com/npm/npm/commit/7b55f44420252baeb3f30da437d22956315c31c9) + doc: Fix 'npm help index' ([@isaacs](https://github.com/isaacs)) + ### v1.4.26 (2014-08-28): * [`eceea95`](https://github.com/npm/npm/commit/eceea95c804fa15b18e91c52c0beb08d42a3e77d) @@ -40,6 +191,51 @@ * [`91cfb58`](https://github.com/npm/npm/commit/91cfb58dda851377ec604782263519f01fd96ad8) doc: Fix 'npm help index' ([@isaacs](https://github.com/isaacs)) +### v2.0.0-beta.0 (2014-08-21): + +* [`685f8be`](https://github.com/npm/npm/commit/685f8be1f2770cc75fd0e519a8d7aac72735a270) + `npm-registry-client@3.1.3`: Print the notification header returned by the + registry, and make sure status codes are printed without gratuitous quotes + around them. ([@isaacs](https://github.com/isaacs) / + [@othiym23](https://github.com/othiym23)) +* [`a8cb676`](https://github.com/npm/npm/commit/a8cb676aef0561eaf04487d2719672b097392c85) + [#5900](https://github.com/npm/npm/issues/5900) remove `npm` from its own + `engines` field in `package.json`. None of us remember why it was there. + ([@timoxley](https://github.com/timoxley)) +* [`6c47201`](https://github.com/npm/npm/commit/6c47201a7d071e8bf091b36933daf4199cc98e80) + [#5752](https://github.com/npm/npm/issues/5752), + [#6013](https://github.com/npm/npm/issues/6013) save git URLs correctly in + `_resolved` fields ([@isaacs](https://github.com/isaacs)) +* [`e4e1223`](https://github.com/npm/npm/commit/e4e1223a91c37688ba3378e1fc9d5ae045654d00) + [#5936](https://github.com/npm/npm/issues/5936) document the use of tags in + `package.json` ([@KenanY](https://github.com/KenanY)) +* [`c92b8d4`](https://github.com/npm/npm/commit/c92b8d4db7bde2a501da5b7d612684de1d629a42) + [#6004](https://github.com/npm/npm/issues/6004) manually installed scoped + packages are tracked correctly ([@dead](https://github.com/dead)-horse) +* [`21ca0aa`](https://github.com/npm/npm/commit/21ca0aaacbcfe2b89b0a439d914da0cae62de550) + [#5945](https://github.com/npm/npm/issues/5945) link scoped packages + correctly ([@dead](https://github.com/dead)-horse) +* [`16bead7`](https://github.com/npm/npm/commit/16bead7f2c82aec35b83ff0ec04df051ba456764) + [#5958](https://github.com/npm/npm/issues/5958) ensure that file streams work + in all versions of node ([@dead](https://github.com/dead)-horse) +* [`dbf0cab`](https://github.com/npm/npm/commit/dbf0cab29d0db43ac95e4b5a1fbdea1e0af75f10) + you can now pass quoted args to `npm run-script` + ([@bcoe](https://github.com/bcoe)) +* [`0583874`](https://github.com/npm/npm/commit/05838743f01ccb8d2432b3858d66847002fb62df) + `tar@1.0.1`: Add test for removing an extract target immediately after + unpacking. + ([@isaacs](https://github.com/isaacs)) +* [`cdf3b04`](https://github.com/npm/npm/commit/cdf3b0428bc0b0183fb41dcde9e34e8f42c5e3a7) + `lockfile@1.0.0`: Fix incorrect interaction between `wait`, `stale`, and + `retries` options. Part 2 of race condition leading to `ENOENT` + ([@isaacs](https://github.com/isaacs)) + errors. +* [`22d72a8`](https://github.com/npm/npm/commit/22d72a87a9e1a9ab56d9585397f63551887d9125) + `fstream@1.0.2`: Fix a double-finish call which can result in excess FS + operations after the `close` event. Part 1 of race condition leading to + `ENOENT` errors. + ([@isaacs](https://github.com/isaacs)) + ### v1.4.25 (2014-08-21): * [`64c0ec2`](https://github.com/npm/npm/commit/64c0ec241ef5d83761ca8de54acb3c41b079956e) @@ -61,6 +257,48 @@ leading to `ENOENT` errors. ([@isaacs](https://github.com/isaacs)) +### v2.0.0-alpha.7 (2014-08-14): + +* [`f23f1d8`](https://github.com/npm/npm/commit/f23f1d8e8f86ec1b7ab8dad68250bccaa67d61b1) + doc: update version doc to include `pre-*` increment args + ([@isaacs](https://github.com/isaacs)) +* [`b6bb746`](https://github.com/npm/npm/commit/b6bb7461824d4dc1c0936f46bd7929b5cd597986) + build: add 'make tag' to tag current release as latest + ([@isaacs](https://github.com/isaacs)) +* [`27c4bb6`](https://github.com/npm/npm/commit/27c4bb606e46e5eaf604b19fe8477bc6567f8b2e) + build: publish with `--tag=v1.4-next` ([@isaacs](https://github.com/isaacs)) +* [`cff66c3`](https://github.com/npm/npm/commit/cff66c3bf2850880058ebe2a26655dafd002495e) + build: add script to output `v1.4-next` publish tag + ([@isaacs](https://github.com/isaacs)) +* [`22abec8`](https://github.com/npm/npm/commit/22abec8833474879ac49b9604c103bc845dad779) + build: remove outdated `docpublish` make target + ([@isaacs](https://github.com/isaacs)) +* [`1be4de5`](https://github.com/npm/npm/commit/1be4de51c3976db8564f72b00d50384c921f0917) + build: remove `unpublish` step from `make publish` + ([@isaacs](https://github.com/isaacs)) +* [`e429e20`](https://github.com/npm/npm/commit/e429e2011f4d78e398f2461bca3e5a9a146fbd0c) + doc: add new changelog ([@othiym23](https://github.com/othiym23)) +* [`9243d20`](https://github.com/npm/npm/commit/9243d207896ea307082256604c10817f7c318d68) + lifecycle: test lifecycle path modification + ([@isaacs](https://github.com/isaacs)) +* [`021770b`](https://github.com/npm/npm/commit/021770b9cb07451509f0a44afff6c106311d8cf6) + lifecycle: BREAKING CHANGE do not add the directory containing node executable + ([@chulkilee](https://github.com/chulkilee)) +* [`1d5c41d`](https://github.com/npm/npm/commit/1d5c41dd0d757bce8b87f10c4135f04ece55aeb9) + install: rename .gitignore when unpacking foreign tarballs + ([@isaacs](https://github.com/isaacs)) +* [`9aac267`](https://github.com/npm/npm/commit/9aac2670a73423544d92b27cc301990a16a9563b) + cache: detect non-gzipped tar files more reliably + ([@isaacs](https://github.com/isaacs)) +* [`3f24755`](https://github.com/npm/npm/commit/3f24755c8fce3c7ab11ed1dc632cc40d7ef42f62) + `readdir-scoped-modules@1.0.0` ([@isaacs](https://github.com/isaacs)) +* [`151cd2f`](https://github.com/npm/npm/commit/151cd2ff87b8ac2fc9ea366bc9b7f766dc5b9684) + `read-installed@3.1.0` ([@isaacs](https://github.com/isaacs)) +* [`f5a9434`](https://github.com/npm/npm/commit/f5a94343a8ebe4a8cd987320b55137aef53fb3fd) + test: fix Travis timeouts ([@dylang](https://github.com/dylang)) +* [`126cafc`](https://github.com/npm/npm/commit/126cafcc6706814c88af3042f2ffff408747bff4) + `npm-registry-couchapp@2.5.0` ([@othiym23](https://github.com/othiym23)) + ### v1.4.24 (2014-08-14): * [`9344bd9`](https://github.com/npm/npm/commit/9344bd9b2929b5c399a0e0e0b34d45bce7bc24bb) @@ -89,7 +327,15 @@ cache: detect non-gzipped tar files more reliably ([@isaacs](https://github.com/isaacs)) -### v2.0.0-alpha-6 (2014-07-31): +### v2.0.0-alpha.6 (2014-08-07): + +BREAKING CHANGE: + +* [`ea547e2`](https://github.com/npm/npm/commit/ea547e2) Bump semver to + version 3: `^0.x.y` is now functionally the same as `=0.x.y`. + ([@isaacs](https://github.com/isaacs)) + +Other changes: * [`d987707`](https://github.com/npm/npm/commit/d987707) move fetch into npm-registry-client ([@othiym23](https://github.com/othiym23)) @@ -97,8 +343,6 @@ ([@isaacs](https://github.com/isaacs)) * [`9d73de7`](https://github.com/npm/npm/commit/9d73de7) remove unnecessary mkdirps ([@isaacs](https://github.com/isaacs)) -* [`ea547e2`](https://github.com/npm/npm/commit/ea547e2) Bump semver to version 3 - ([@isaacs](https://github.com/isaacs)) * [`33ccd13`](https://github.com/npm/npm/commit/33ccd13) Don't squash execute perms in `_git-remotes/` dir ([@adammeadows](https://github.com/adammeadows)) * [`48fd233`](https://github.com/npm/npm/commit/48fd233) `npm-package-arg@2.0.1` @@ -270,7 +514,7 @@ Other changes: ([@othiym23](https://github.com/othiym23)) * Allow to build all the docs OOTB. ([@GeJ](https://github.com/GeJ)) * Use core.longpaths on win32 git - fixes - [#5525](https://github.com/npm/npm/issues/5525) (Bradley Meck) + [#5525](https://github.com/npm/npm/issues/5525) ([@bmeck](https://github.com/bmeck)) * `npmconf@1.1.2` ([@isaacs](https://github.com/isaacs)) * Consolidate color sniffing in config/log loading process ([@isaacs](https://github.com/isaacs)) diff --git a/deps/npm/Makefile b/deps/npm/Makefile index 540e2da05b6..fe2d963bbad 100644 --- a/deps/npm/Makefile +++ b/deps/npm/Makefile @@ -72,7 +72,7 @@ dev: install link: uninstall node cli.js link -f -clean: markedclean ronnclean doc-clean uninstall +clean: markedclean marked-manclean doc-clean uninstall rm -rf npmrc node cli.js cache clean @@ -84,19 +84,19 @@ doc: $(mandocs) $(htmldocs) markedclean: rm -rf node_modules/marked node_modules/.bin/marked .building_marked -ronnclean: - rm -rf node_modules/ronn node_modules/.bin/ronn .building_ronn +marked-manclean: + rm -rf node_modules/marked-man node_modules/.bin/marked-man .building_marked-man docclean: doc-clean doc-clean: rm -rf \ .building_marked \ - .building_ronn \ + .building_marked-man \ html/doc \ html/api \ man -# use `npm install ronn` for this to work. +# use `npm install marked-man` for this to work. man/man1/npm-README.1: README.md scripts/doc-build.sh package.json @[ -d man/man1 ] || mkdir -p man/man1 scripts/doc-build.sh $< $@ @@ -161,10 +161,10 @@ marked: node_modules/.bin/marked node_modules/.bin/marked: node cli.js install marked --no-global -ronn: node_modules/.bin/ronn +marked-man: node_modules/.bin/marked-man -node_modules/.bin/ronn: - node cli.js install ronn --no-global +node_modules/.bin/marked-man: + node cli.js install marked-man --no-global doc: man diff --git a/deps/npm/README.md b/deps/npm/README.md index 0c08862fce9..19ced3a81f3 100644 --- a/deps/npm/README.md +++ b/deps/npm/README.md @@ -16,15 +16,15 @@ and prior, clone the git repo and dig through the old tags and branches. ## Super Easy Install -npm comes with node now. +npm comes with [node](http://nodejs.org/download/) now. ### Windows Computers -Get the MSI. npm is in it. +[Get the MSI](http://nodejs.org/download/). npm is in it. ### Apple Macintosh Computers -Get the pkg. npm is in it. +[Get the pkg](http://nodejs.org/download/). npm is in it. ### Other Sorts of Unices diff --git a/deps/npm/bin/npm-cli.js b/deps/npm/bin/npm-cli.js index ef8873542bb..ed81a989a3d 100755 --- a/deps/npm/bin/npm-cli.js +++ b/deps/npm/bin/npm-cli.js @@ -19,8 +19,7 @@ var log = require("npmlog") log.pause() // will be unpaused when config is loaded. log.info("it worked if it ends with", "ok") -var fs = require("graceful-fs") - , path = require("path") +var path = require("path") , npm = require("../lib/npm.js") , npmconf = require("npmconf") , errorHandler = require("../lib/utils/error-handler.js") @@ -58,16 +57,6 @@ if (conf.versions) { log.info("using", "npm@%s", npm.version) log.info("using", "node@%s", process.version) -// make sure that this version of node works with this version of npm. -var semver = require("semver") - , nodeVer = process.version - , reqVer = npm.nodeVersionRequired -if (reqVer && !semver.satisfies(nodeVer, reqVer)) { - return errorHandler(new Error( - "npm doesn't work with node " + nodeVer - + "\nRequired: node@" + reqVer), true) -} - process.on("uncaughtException", errorHandler) if (conf.usage && npm.command !== "help") { diff --git a/deps/npm/doc/cli/npm-adduser.md b/deps/npm/doc/cli/npm-adduser.md index 68f3a3c0085..d60d6e9a073 100644 --- a/deps/npm/doc/cli/npm-adduser.md +++ b/deps/npm/doc/cli/npm-adduser.md @@ -3,30 +3,47 @@ npm-adduser(1) -- Add a registry user account ## SYNOPSIS - npm adduser + npm adduser [--registry=url] [--scope=@orgname] ## DESCRIPTION -Create or verify a user named `` in the npm registry, and -save the credentials to the `.npmrc` file. +Create or verify a user named `` in the specified registry, and +save the credentials to the `.npmrc` file. If no registry is specified, +the default registry will be used (see `npm-config(7)`). The username, password, and email are read in from prompts. You may use this command to change your email address, but not username or password. -To reset your password, go to +To reset your password, go to You may use this command multiple times with the same user account to authorize on a new machine. +`npm login` is an alias to `adduser` and behaves exactly the same way. + ## CONFIGURATION ### registry Default: http://registry.npmjs.org/ -The base URL of the npm package registry. +The base URL of the npm package registry. If `scope` is also specified, +this registry will only be used for packages with that scope. See `npm-scope(7)`. + +### scope + +Default: none + +If specified, the user and login credentials given will be associated +with the specified scope. See `npm-scope(7)`. You can use both at the same time, +e.g. + + npm adduser --registry=http://myregistry.example.com --scope=@myco + +This will set a registry for the given scope and login or create a user for +that registry at the same time. ## SEE ALSO diff --git a/deps/npm/doc/cli/npm-install.md b/deps/npm/doc/cli/npm-install.md index 62eec2d8e34..2d427163730 100644 --- a/deps/npm/doc/cli/npm-install.md +++ b/deps/npm/doc/cli/npm-install.md @@ -7,10 +7,10 @@ npm-install(1) -- Install a package npm install npm install npm install - npm install [--save|--save-dev|--save-optional] [--save-exact] - npm install @ - npm install @ - npm install @ + npm install [@/] [--save|--save-dev|--save-optional] [--save-exact] + npm install [@/]@ + npm install [@/]@ + npm install [@/]@ npm i (with any of the previous argument usage) ## DESCRIPTION @@ -70,7 +70,7 @@ after packing it up into a tarball (b). npm install https://github.com/indexzero/forever/tarball/v0.5.6 -* `npm install [--save|--save-dev|--save-optional]`: +* `npm install [@/] [--save|--save-dev|--save-optional]`: Do a `@` install, where `` is the "tag" config. (See `npm-config(7)`.) @@ -98,9 +98,19 @@ after packing it up into a tarball (b). exact version rather than using npm's default semver range operator. + `` is optional. The package will be downloaded from the registry + associated with the specified scope. If no registry is associated with + the given scope the default registry is assumed. See `npm-scope(7)`. + + Note: if you do not include the @-symbol on your scope name, npm will + interpret this as a GitHub repository instead, see below. Scopes names + must also be followed by a slash. + Examples: npm install sax --save + npm install githubname/reponame + npm install @myorg/privatepackage npm install node-tap --save-dev npm install dtrace-provider --save-optional npm install readable-stream --save --save-exact @@ -110,7 +120,7 @@ after packing it up into a tarball (b). working directory, then it will try to install that, and only try to fetch the package by name if it is not valid. -* `npm install @`: +* `npm install [@/]@`: Install the version of the package that is referenced by the specified tag. If the tag does not exist in the registry data for that package, then this @@ -119,17 +129,19 @@ after packing it up into a tarball (b). Example: npm install sax@latest + npm install @myorg/mypackage@latest -* `npm install @`: +* `npm install [@/]@`: - Install the specified version of the package. This will fail if the version - has not been published to the registry. + Install the specified version of the package. This will fail if the + version has not been published to the registry. Example: npm install sax@0.1.1 + npm install @myorg/privatepackage@1.5.0 -* `npm install @`: +* `npm install [@/]@`: Install a version of the package matching the specified version range. This will follow the same rules for resolving dependencies described in `package.json(5)`. @@ -140,6 +152,19 @@ after packing it up into a tarball (b). Example: npm install sax@">=0.1.0 <0.2.0" + npm install @myorg/privatepackage@">=0.1.0 <0.2.0" + +* `npm install /`: + + Install the package at `https://github.com/githubname/githubrepo" by + attempting to clone it using `git`. + + Example: + + npm install mygithubuser/myproject + + To reference a package in a git repo that is not on GitHub, see git + remote urls below. * `npm install `: diff --git a/deps/npm/doc/cli/npm-link.md b/deps/npm/doc/cli/npm-link.md index c0fc01eb26d..a6c27479007 100644 --- a/deps/npm/doc/cli/npm-link.md +++ b/deps/npm/doc/cli/npm-link.md @@ -4,7 +4,7 @@ npm-link(1) -- Symlink a package folder ## SYNOPSIS npm link (in package folder) - npm link + npm link [@/] npm ln (with any of the previous argument usage) ## DESCRIPTION @@ -12,7 +12,8 @@ npm-link(1) -- Symlink a package folder Package linking is a two-step process. First, `npm link` in a package folder will create a globally-installed -symbolic link from `prefix/package-name` to the current folder. +symbolic link from `prefix/package-name` to the current folder (see +`npm-config(7)` for the value of `prefix`). Next, in some other location, `npm link package-name` will create a symlink from the local `node_modules` folder to the global symlink. @@ -20,12 +21,14 @@ symlink from the local `node_modules` folder to the global symlink. Note that `package-name` is taken from `package.json`, not from directory name. +The package name can be optionally prefixed with a scope. See `npm-scope(7)`. +The scope must by preceded by an @-symbol and followed by a slash. + When creating tarballs for `npm publish`, the linked packages are "snapshotted" to their current state by resolving the symbolic links. -This is -handy for installing your own stuff, so that you can work on it and test it -iteratively without having to continually rebuild. +This is handy for installing your own stuff, so that you can work on it and +test it iteratively without having to continually rebuild. For example: @@ -51,6 +54,11 @@ The second line is the equivalent of doing: That is, it first creates a global link, and then links the global installation target into your project's `node_modules` folder. +If your linked package is scoped (see `npm-scope(7)`) your link command must +include that scope, e.g. + + npm link @myorg/privatepackage + ## SEE ALSO * npm-developers(7) diff --git a/deps/npm/doc/cli/npm-ls.md b/deps/npm/doc/cli/npm-ls.md index 21f54264c7f..0f0d79489ae 100644 --- a/deps/npm/doc/cli/npm-ls.md +++ b/deps/npm/doc/cli/npm-ls.md @@ -3,10 +3,10 @@ npm-ls(1) -- List installed packages ## SYNOPSIS - npm list [ ...] - npm ls [ ...] - npm la [ ...] - npm ll [ ...] + npm list [[@/] ...] + npm ls [[@/] ...] + npm la [[@/] ...] + npm ll [[@/] ...] ## DESCRIPTION diff --git a/deps/npm/doc/cli/npm-prefix.md b/deps/npm/doc/cli/npm-prefix.md index f99a401d147..f262a36a752 100644 --- a/deps/npm/doc/cli/npm-prefix.md +++ b/deps/npm/doc/cli/npm-prefix.md @@ -3,11 +3,15 @@ npm-prefix(1) -- Display prefix ## SYNOPSIS - npm prefix + npm prefix [-g] ## DESCRIPTION -Print the prefix to standard out. +Print the local prefix to standard out. This is the closest parent directory +to contain a package.json file unless `-g` is also specified. + +If `-g` is specified, this will be the value of the global prefix. See +`npm-config(7)` for more detail. ## SEE ALSO diff --git a/deps/npm/doc/cli/npm-publish.md b/deps/npm/doc/cli/npm-publish.md index 338728e3e4c..8860b88fc7d 100644 --- a/deps/npm/doc/cli/npm-publish.md +++ b/deps/npm/doc/cli/npm-publish.md @@ -11,6 +11,10 @@ npm-publish(1) -- Publish a package Publishes a package to the registry so that it can be installed by name. +By default npm will publish to the public registry. This can be overridden by +specifying a different default registry or using a `npm-scope(7)` in the name +(see `package.json(5)`). + * ``: A folder containing a package.json file @@ -24,7 +28,7 @@ Publishes a package to the registry so that it can be installed by name. and `npm install` installs the `latest` tag. Fails if the package name and version combination already exists in -the registry. +the specified registry. Once a package is published with a given name and version, that specific name and version combination can never be used again, even if diff --git a/deps/npm/doc/cli/npm-restart.md b/deps/npm/doc/cli/npm-restart.md index 4661d6b23ba..7b039a8f8f1 100644 --- a/deps/npm/doc/cli/npm-restart.md +++ b/deps/npm/doc/cli/npm-restart.md @@ -3,7 +3,7 @@ npm-restart(1) -- Start a package ## SYNOPSIS - npm restart + npm restart [-- ] ## DESCRIPTION diff --git a/deps/npm/doc/cli/npm-run-script.md b/deps/npm/doc/cli/npm-run-script.md index 835dbf5df7f..09a546b9a81 100644 --- a/deps/npm/doc/cli/npm-run-script.md +++ b/deps/npm/doc/cli/npm-run-script.md @@ -3,8 +3,8 @@ npm-run-script(1) -- Run arbitrary package scripts ## SYNOPSIS - npm run-script [] [command] - npm run [] [command] + npm run-script [command] [-- ] + npm run [command] [-- ] ## DESCRIPTION diff --git a/deps/npm/doc/cli/npm-start.md b/deps/npm/doc/cli/npm-start.md index 01347d2e469..759de221f38 100644 --- a/deps/npm/doc/cli/npm-start.md +++ b/deps/npm/doc/cli/npm-start.md @@ -3,7 +3,7 @@ npm-start(1) -- Start a package ## SYNOPSIS - npm start + npm start [-- ] ## DESCRIPTION diff --git a/deps/npm/doc/cli/npm-stop.md b/deps/npm/doc/cli/npm-stop.md index bda5cc8f47c..92b14b41796 100644 --- a/deps/npm/doc/cli/npm-stop.md +++ b/deps/npm/doc/cli/npm-stop.md @@ -3,7 +3,7 @@ npm-stop(1) -- Stop a package ## SYNOPSIS - npm stop + npm stop [-- ] ## DESCRIPTION diff --git a/deps/npm/doc/cli/npm-test.md b/deps/npm/doc/cli/npm-test.md index 800f3ae104e..c2267082dfb 100644 --- a/deps/npm/doc/cli/npm-test.md +++ b/deps/npm/doc/cli/npm-test.md @@ -3,8 +3,8 @@ npm-test(1) -- Test a package ## SYNOPSIS - npm test - npm tst + npm test [-- ] + npm tst [-- ] ## DESCRIPTION diff --git a/deps/npm/doc/cli/npm-uninstall.md b/deps/npm/doc/cli/npm-uninstall.md index e24815bec79..bfa667c3e26 100644 --- a/deps/npm/doc/cli/npm-uninstall.md +++ b/deps/npm/doc/cli/npm-uninstall.md @@ -3,7 +3,7 @@ npm-rm(1) -- Remove a package ## SYNOPSIS - npm uninstall [--save|--save-dev|--save-optional] + npm uninstall [@/] [--save|--save-dev|--save-optional] npm rm (with any of the previous argument usage) ## DESCRIPTION @@ -27,9 +27,12 @@ the package version in your main package.json: * `--save-optional`: Package will be removed from your `optionalDependencies`. +Scope is optional and follows the usual rules for `npm-scope(7)`. + Examples: npm uninstall sax --save + npm uninstall @myorg/privatepackage --save npm uninstall node-tap --save-dev npm uninstall dtrace-provider --save-optional diff --git a/deps/npm/doc/cli/npm-unpublish.md b/deps/npm/doc/cli/npm-unpublish.md index 45026197e1f..1d5fe928780 100644 --- a/deps/npm/doc/cli/npm-unpublish.md +++ b/deps/npm/doc/cli/npm-unpublish.md @@ -3,7 +3,7 @@ npm-unpublish(1) -- Remove a package from the registry ## SYNOPSIS - npm unpublish [@] + npm unpublish [@/][@] ## WARNING @@ -27,6 +27,8 @@ Even if a package version is unpublished, that specific name and version combination can never be reused. In order to publish the package again, a new version number must be used. +The scope is optional and follows the usual rules for `npm-scope(7)`. + ## SEE ALSO * npm-deprecate(1) diff --git a/deps/npm/doc/cli/npm-update.md b/deps/npm/doc/cli/npm-update.md index 1ea6b627562..a53d2945928 100644 --- a/deps/npm/doc/cli/npm-update.md +++ b/deps/npm/doc/cli/npm-update.md @@ -12,8 +12,11 @@ This command will update all the packages listed to the latest version It will also install missing packages. -If the `-g` flag is specified, this command will update globally installed packages. -If no package name is specified, all packages in the specified location (global or local) will be updated. +If the `-g` flag is specified, this command will update globally installed +packages. + +If no package name is specified, all packages in the specified location (global +or local) will be updated. ## SEE ALSO diff --git a/deps/npm/doc/cli/npm-view.md b/deps/npm/doc/cli/npm-view.md index 1d19fe88d46..8f52a85a92f 100644 --- a/deps/npm/doc/cli/npm-view.md +++ b/deps/npm/doc/cli/npm-view.md @@ -3,8 +3,8 @@ npm-view(1) -- View registry info ## SYNOPSIS - npm view [@] [[.]...] - npm v [@] [[.]...] + npm view [@/][@] [[.]...] + npm v [@/][@] [[.]...] ## DESCRIPTION diff --git a/deps/npm/doc/files/npm-folders.md b/deps/npm/doc/files/npm-folders.md index 1b1485d5ed3..1fb21b1a310 100644 --- a/deps/npm/doc/files/npm-folders.md +++ b/deps/npm/doc/files/npm-folders.md @@ -42,6 +42,12 @@ Global installs on Unix systems go to `{prefix}/lib/node_modules`. Global installs on Windows go to `{prefix}/node_modules` (that is, no `lib` folder.) +Scoped packages are installed the same way, except they are grouped together +in a sub-folder of the relevant `node_modules` folder with the name of that +scope prefix by the @ symbol, e.g. `npm install @myorg/package` would place +the package in `{prefix}/node_modules/@myorg/package`. See `scopes(7)` for +more details. + If you wish to `require()` a package, then install it locally. ### Executables diff --git a/deps/npm/doc/files/package.json.md b/deps/npm/doc/files/package.json.md index b9b05d4d4d9..82b94052243 100644 --- a/deps/npm/doc/files/package.json.md +++ b/deps/npm/doc/files/package.json.md @@ -30,6 +30,9 @@ The name is what your thing is called. Some tips: * You may want to check the npm registry to see if there's something by that name already, before you get too attached to it. http://registry.npmjs.org/ +A name can be optionally prefixed by a scope, e.g. `@myorg/mypackage`. See +`npm-scope(7)` for more detail. + ## version The *most* important things in your package.json are the name and version fields. @@ -320,6 +323,8 @@ See semver(7) for more details about specifying version ranges. * `range1 || range2` Passes if either range1 or range2 are satisfied. * `git...` See 'Git URLs as Dependencies' below * `user/repo` See 'GitHub URLs' below +* `tag` A specific version tagged and published as `tag` See `npm-tag(1)` +* `path/path/path` See Local Paths below For example, these are all valid: @@ -334,6 +339,8 @@ For example, these are all valid: , "elf" : "~1.2.3" , "two" : "2.x" , "thr" : "3.3.x" + , "lat" : "latest" + , "dyl" : "~/projects/dyl" } } @@ -369,6 +376,21 @@ As of version 1.1.65, you can refer to GitHub urls as just "foo": "user/foo-proj } } +## Local Paths + +As of version 2.0.0 you can provide a path to a local directory that +contains a package. Local paths can be in the form: + + ../foo/bar + ~/foo/bar + ./foo/bar + /foo/bar + +This feature is helpful for local offline development and creating +tests that require npm installing where you don't want to hit an +external server, but should not be used when publishing packages +to the public registry. + ## devDependencies If someone is planning on downloading and using your module in their diff --git a/deps/npm/doc/misc/npm-config.md b/deps/npm/doc/misc/npm-config.md index 035923fa6f4..8b5ae12c0d0 100644 --- a/deps/npm/doc/misc/npm-config.md +++ b/deps/npm/doc/misc/npm-config.md @@ -50,6 +50,7 @@ The following shorthands are parsed on the command-line: * `-dd`, `--verbose`: `--loglevel verbose` * `-ddd`: `--loglevel silly` * `-g`: `--global` +* `-C`: `--prefix` * `-l`: `--long` * `-m`: `--message` * `-p`, `--porcelain`: `--parseable` @@ -253,12 +254,6 @@ set. The command to run for `npm edit` or `npm config edit`. -### email - -The email of the logged-in user. - -Set by the `npm adduser` command. Should not be set explicitly. - ### engine-strict * Default: false @@ -417,6 +412,14 @@ The value `npm init` should use by default for the package author's homepage. The value `npm init` should use by default for the package license. +### init.version + +* Default: "0.0.0" +* Type: semver + +The value that `npm init` should use by default for the package +version number, if not already set in package.json. + ### json * Default: false @@ -463,7 +466,7 @@ to the npm registry. Must be IPv4 in versions of Node prior to 0.12. * Default: "http" * Type: String -* Values: "silent", "win", "error", "warn", "http", "info", "verbose", "silly" +* Values: "silent", "error", "warn", "http", "info", "verbose", "silly" What level of logs to report. On failure, *all* logs are written to `npm-debug.log` in the current working directory. @@ -663,14 +666,25 @@ Only works if there is already a package.json file present. * Default: '^' * Type: String -Configure how versions of packages installed to a package.json file via +Configure how versions of packages installed to a package.json file via `--save` or `--save-dev` get prefixed. For example if a package has version `1.2.3`, by default it's version is -set to `^1.2.3` which allows minor upgrades for that package, but after +set to `^1.2.3` which allows minor upgrades for that package, but after `npm config set save-prefix='~'` it would be set to `~1.2.3` which only allows patch upgrades. +### scope + +* Default: "" +* Type: String + +Associate an operation with a scope for a scoped registry. Useful when logging +in to a private registry for the first time: +`npm login --scope=@organization --registry=registry.organization.com`, which +will cause `@organization` to be mapped to the registry for future installation +of packages specified according to the pattern `@organization/package`. + ### searchopts * Default: "" @@ -794,13 +808,6 @@ instead of complete help when doing `npm-help(1)`. The UID to set to when running package scripts as root. -### username - -* Default: null -* Type: String - -The username on the npm registry. Set with `npm adduser` - ### userconfig * Default: ~/.npmrc diff --git a/deps/npm/doc/misc/npm-faq.md b/deps/npm/doc/misc/npm-faq.md index 53fa03d629d..4dca3cd71ef 100644 --- a/deps/npm/doc/misc/npm-faq.md +++ b/deps/npm/doc/misc/npm-faq.md @@ -75,18 +75,20 @@ npm will not help you do something that is known to be a bad idea. ## Should I check my `node_modules` folder into git? -Mikeal Rogers answered this question very well: +Usually, no. Allow npm to resolve dependencies for your packages. - +For packages you **deploy**, such as websites and apps, +you should use npm shrinkwrap to lock down your full dependency tree: -tl;dr +https://www.npmjs.org/doc/cli/npm-shrinkwrap.html -* Check `node_modules` into git for things you **deploy**, such as - websites and apps. -* Do not check `node_modules` into git for libraries and modules - intended to be reused. -* Use npm to manage dependencies in your dev environment, but not in - your deployment scripts. +If you are paranoid about depending on the npm ecosystem, +you should run a private npm mirror or a private cache. + +If you want 100% confidence in being able to reproduce the specific bytes +included in a deployment, you should use an additional mechanism that can +verify contents rather than versions. For example, +Amazon machine images, DigitalOcean snapshots, Heroku slugs, or simple tarballs. ## Is it 'npm' or 'NPM' or 'Npm'? diff --git a/deps/npm/doc/misc/npm-index.md b/deps/npm/doc/misc/npm-index.md index 4e9f70c99e2..cf969868f96 100644 --- a/deps/npm/doc/misc/npm-index.md +++ b/deps/npm/doc/misc/npm-index.md @@ -409,6 +409,10 @@ Index of all npm documentation The JavaScript Package Registry +### npm-scope(7) + +Scoped packages + ### npm-scripts(7) How npm handles the "scripts" field diff --git a/deps/npm/doc/misc/npm-registry.md b/deps/npm/doc/misc/npm-registry.md index a8c4b0200d3..42cec59448a 100644 --- a/deps/npm/doc/misc/npm-registry.md +++ b/deps/npm/doc/misc/npm-registry.md @@ -12,15 +12,14 @@ write APIs as well, to allow for publishing packages and managing user account information. The official public npm registry is at . It -is powered by a CouchDB database at -. The code for the couchapp is -available at . npm user accounts -are CouchDB users, stored in the -database. - -The registry URL is supplied by the `registry` config parameter. See -`npm-config(1)`, `npmrc(5)`, and `npm-config(7)` for more on managing -npm's configuration. +is powered by a CouchDB database, of which there is a public mirror at +. The code for the couchapp is +available at . + +The registry URL used is determined by the scope of the package (see +`npm-scope(7)`). If no scope is specified, the default registry is used, which is +supplied by the `registry` config parameter. See `npm-config(1)`, +`npmrc(5)`, and `npm-config(7)` for more on managing npm's configuration. ## Can I run my own private registry? diff --git a/deps/npm/doc/misc/npm-scope.md b/deps/npm/doc/misc/npm-scope.md new file mode 100644 index 00000000000..a4ee1a0825c --- /dev/null +++ b/deps/npm/doc/misc/npm-scope.md @@ -0,0 +1,84 @@ +npm-scope(7) -- Scoped packages +=============================== + +## DESCRIPTION + +All npm packages have a name. Some package names also have a scope. A scope +follows the usual rules for package names (url-safe characters, no leading dots +or underscores). When used in package names, preceded by an @-symbol and +followed by a slash, e.g. + + @somescope/somepackagename + +Scopes are a way of grouping related packages together, and also affect a few +things about the way npm treats the package. + +**As of 2014-09-03, scoped packages are not supported by the public npm registry**. +However, the npm client is backwards-compatible with un-scoped registries, so +it can be used to work with scoped and un-scoped registries at the same time. + +## Installing scoped packages + +Scoped packages are installed to a sub-folder of the regular installation +folder, e.g. if your other packages are installed in `node_modules/packagename`, +scoped modules will be in `node_modules/@myorg/packagename`. The scope folder +(`@myorg`) is simply the name of the scope preceded by an @-symbol, and can +contain any number of scoped packages. + +A scoped package is install by referencing it by name, preceded by an @-symbol, +in `npm install`: + + npm install @myorg/mypackage + +Or in `package.json`: + + "dependencies": { + "@myorg/mypackage": "^1.3.0" + } + +Note that if the @-symbol is omitted in either case npm will instead attempt to +install from GitHub; see `npm-install(1)`. + +## Requiring scoped packages + +Because scoped packages are installed into a scope folder, you have to +include the name of the scope when requiring them in your code, e.g. + + require('@myorg/mypackage') + +There is nothing special about the way Node treats scope folders, this is +just specifying to require the module `mypackage` in the folder called `@myorg`. + +## Publishing scoped packages + +Scoped packages can be published to any registry that supports them. +*As of 2014-09-03, the public npm registry does not support scoped packages*, +so attempting to publish a scoped package to the registry will fail unless +you have associated that scope with a different registry, see below. + +## Associating a scope with a registry + +Scopes can be associated with a separate registry. This allows you to +seamlessly use a mix of packages from the public npm registry and one or more +private registries, such as npm Enterprise. + +You can associate a scope with a registry at login, e.g. + + npm login --registry=http://reg.example.com --scope=@myco + +Scopes have a many-to-one relationship with registries: one registry can +host multiple scopes, but a scope only ever points to one registry. + +You can also associate a scope with a registry using `npm config`: + + npm config set @myco:registry http://reg.example.com + +Once a scope is associated with a registry, any `npm install` for a package +with that scope will request packages from that registry instead. Any +`npm publish` for a package name that contains the scope will be published to +that registry instead. + +## SEE ALSO + +* npm-install(1) +* npm-publish(1) \ No newline at end of file diff --git a/deps/npm/doc/misc/npm-scripts.md b/deps/npm/doc/misc/npm-scripts.md index b49d9e23d14..7ef8fb10d13 100644 --- a/deps/npm/doc/misc/npm-scripts.md +++ b/deps/npm/doc/misc/npm-scripts.md @@ -33,8 +33,9 @@ following scripts: Run by the `npm restart` command. Note: `npm restart` will run the stop and start scripts if no `restart` script is provided. -Additionally, arbitrary scripts can be run by doing -`npm run-script `. +Additionally, arbitrary scripts can be executed by running `npm 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 diff --git a/deps/npm/doc/misc/semver.md b/deps/npm/doc/misc/semver.md index 6c7d28061c6..af83d717c9d 100644 --- a/deps/npm/doc/misc/semver.md +++ b/deps/npm/doc/misc/semver.md @@ -41,53 +41,170 @@ A leading `"="` or `"v"` character is stripped off and ignored. ## Ranges -The following range styles are supported: - -* `1.2.3` A specific version. When nothing else will do. Must be a full - version number, with major, minor, and patch versions specified. - Note that build metadata is still ignored, so `1.2.3+build2012` will - satisfy this range. -* `>1.2.3` Greater than a specific version. -* `<1.2.3` Less than a specific version. If there is no prerelease - tag on the version range, then no prerelease version will be allowed - either, even though these are technically "less than". -* `>=1.2.3` Greater than or equal to. Note that prerelease versions - are NOT equal to their "normal" equivalents, so `1.2.3-beta` will - not satisfy this range, but `2.3.0-beta` will. -* `<=1.2.3` Less than or equal to. In this case, prerelease versions - ARE allowed, so `1.2.3-beta` would satisfy. +A `version range` is a set of `comparators` which specify versions +that satisfy the range. + +A `comparator` is composed of an `operator` and a `version`. The set +of primitive `operators` is: + +* `<` Less than +* `<=` Less than or equal to +* `>` Greater than +* `>=` Greater than or equal to +* `=` Equal. If no operator is specified, then equality is assumed, + so this operator is optional, but MAY be included. + +For example, the comparator `>=1.2.7` would match the versions +`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6` +or `1.1.0`. + +Comparators can be joined by whitespace to form a `comparator set`, +which is satisfied by the **intersection** of all of the comparators +it includes. + +A range is composed of one or more comparator sets, joined by `||`. A +version matches a range if and only if every comparator in at least +one of the `||`-separated comparator sets is satisfied by the version. + +For example, the range `>=1.2.7 <1.3.0` would match the versions +`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`, +or `1.1.0`. + +The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`, +`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`. + +### Prerelease Tags + +If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then +it will only be allowed to satisfy comparator sets if at least one +comparator with the same `[major, minor, patch]` tuple also has a +prerelease tag. + +For example, the range `>1.2.3-alpha.3` would be allowed to match the +version `1.2.3-alpha.7`, but it would *not* be satisfied by +`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater +than" `1.2.3-alpha.3` according to the SemVer sort rules. The version +range only accepts prerelease tags on the `1.2.3` version. The +version `3.4.5` *would* satisfy the range, because it does not have a +prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`. + +The purpose for this behavior is twofold. First, prerelease versions +frequently are updated very quickly, and contain many breaking changes +that are (by the author's design) not yet fit for public consumption. +Therefore, by default, they are excluded from range matching +semantics. + +Second, a user who has opted into using a prerelease version has +clearly indicated the intent to use *that specific* set of +alpha/beta/rc versions. By including a prerelease tag in the range, +the user is indicating that they are aware of the risk. However, it +is still not appropriate to assume that they have opted into taking a +similar risk on the *next* set of prerelease versions. + +### Advanced Range Syntax + +Advanced range syntax desugars to primitive comparators in +deterministic ways. + +Advanced ranges may be combined in the same way as primitive +comparators using white space or `||`. + +#### Hyphen Ranges `X.Y.Z - A.B.C` + +Specifies an inclusive set. + * `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4` -* `~1.2.3` := `>=1.2.3-0 <1.3.0-0` "Reasonably close to `1.2.3`". When - using tilde operators, prerelease versions are supported as well, - but a prerelease of the next significant digit will NOT be - satisfactory, so `1.3.0-beta` will not satisfy `~1.2.3`. -* `^1.2.3` := `>=1.2.3-0 <2.0.0-0` "Compatible with `1.2.3`". When - using caret operators, anything from the specified version (including - prerelease) will be supported up to, but not including, the next - major version (or its prereleases). `1.5.1` will satisfy `^1.2.3`, - while `1.2.2` and `2.0.0-beta` will not. -* `^0.1.3` := `>=0.1.3-0 <0.2.0-0` "Compatible with `0.1.3`". `0.x.x` versions are - special: the first non-zero component indicates potentially breaking changes, - meaning the caret operator matches any version with the same first non-zero - component starting at the specified version. -* `^0.0.2` := `=0.0.2` "Only the version `0.0.2` is considered compatible" -* `~1.2` := `>=1.2.0-0 <1.3.0-0` "Any version starting with `1.2`" -* `^1.2` := `>=1.2.0-0 <2.0.0-0` "Any version compatible with `1.2`" -* `1.2.x` := `>=1.2.0-0 <1.3.0-0` "Any version starting with `1.2`" -* `1.2.*` Same as `1.2.x`. -* `1.2` Same as `1.2.x`. -* `~1` := `>=1.0.0-0 <2.0.0-0` "Any version starting with `1`" -* `^1` := `>=1.0.0-0 <2.0.0-0` "Any version compatible with `1`" -* `1.x` := `>=1.0.0-0 <2.0.0-0` "Any version starting with `1`" -* `1.*` Same as `1.x`. -* `1` Same as `1.x`. -* `*` Any version whatsoever. -* `x` Same as `*`. -* `""` (just an empty string) Same as `*`. - - -Ranges can be joined with either a space (which implies "and") or a -`||` (which implies "or"). + +If a partial version is provided as the first version in the inclusive +range, then the missing pieces are replaced with zeroes. + +* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4` + +If a partial version is provided as the second version in the +inclusive range, then all versions that start with the supplied parts +of the tuple are accepted, but nothing that would be greater than the +provided tuple parts. + +* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0` +* `1.2.3 - 2` := `>=1.2.3 <3.0.0` + +#### X-Ranges `1.2.x` `1.X` `1.2.*` `*` + +Any of `X`, `x`, or `*` may be used to "stand in" for one of the +numeric values in the `[major, minor, patch]` tuple. + +* `*` := `>=0.0.0` (Any version satisfies) +* `1.x` := `>=1.0.0 <2.0.0` (Matching major version) +* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions) + +A partial version range is treated as an X-Range, so the special +character is in fact optional. + +* `` (empty string) := `*` := `>=0.0.0` +* `1` := `1.x.x` := `>=1.0.0 <2.0.0` +* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0` + +#### Tilde Ranges `~1.2.3` `~1.2` `~1` + +Allows patch-level changes if a minor version is specified on the +comparator. Allows minor-level changes if not. + +* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0` +* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`) +* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`) +* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0` +* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`) +* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`) +* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in + the `1.2.3` version will be allowed, if they are greater than or + equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but + `1.2.4-beta.2` would not, because it is a prerelease of a + different `[major, minor, patch]` tuple. + +Note: this is the same as the `~>` operator in rubygems. + +#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4` + +Allows changes that do not modify the left-most non-zero digit in the +`[major, minor, patch]` tuple. In other words, this allows patch and +minor updates for versions `1.0.0` and above, patch updates for +versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`. + +Many authors treat a `0.x` version as if the `x` were the major +"breaking-change" indicator. + +Caret ranges are ideal when an author may make breaking changes +between `0.2.4` and `0.3.0` releases, which is a common practice. +However, it presumes that there will *not* be breaking changes between +`0.2.4` and `0.2.5`. It allows for changes that are presumed to be +additive (but non-breaking), according to commonly observed practices. + +* `^1.2.3` := `>=1.2.3 <2.0.0` +* `^0.2.3` := `>=0.2.3 <0.3.0` +* `^0.0.3` := `>=0.0.3 <0.0.4` +* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in + the `1.2.3` version will be allowed, if they are greater than or + equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but + `1.2.4-beta.2` would not, because it is a prerelease of a + different `[major, minor, patch]` tuple. +* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4` Note that prereleases in the + `0.0.3` version *only* will be allowed, if they are greater than or + equal to `beta`. So, `0.0.3-pr.2` would be allowed. + +When parsing caret ranges, a missing `patch` value desugars to the +number `0`, but will allow flexibility within that value, even if the +major and minor versions are both `0`. + +* `^1.2.x` := `>=1.2.0 <2.0.0` +* `^0.0.x` := `>=0.0.0 <0.1.0` +* `^0.0` := `>=0.0.0 <0.1.0` + +A missing `minor` and `patch` values will desugar to zero, but also +allow flexibility within those values, even if the major version is +zero. + +* `^1.x` := `>=1.0.0 <2.0.0` +* `^0.x` := `>=0.0.0 <1.0.0` ## Functions diff --git a/deps/npm/html/doc/README.html b/deps/npm/html/doc/README.html index 6a4832313b0..64bb15f3196 100644 --- a/deps/npm/html/doc/README.html +++ b/deps/npm/html/doc/README.html @@ -19,11 +19,11 @@

    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