From 1065a7809161fd4dc23e96b642019fc842fdacf2 Mon Sep 17 00:00:00 2001 From: Xu Meng Date: Tue, 11 Dec 2018 06:43:24 +0800 Subject: [PATCH 01/97] config: support default user on IBM i (#65) setuid() can not accept a 'nobody' parameter on IBM i. The default user (QSECOFR) on IBM i has user id 0. PR-URL: https://github.com/npm/cli/pull/65 Credit: @dmabupt Reviewed-By: @zkat --- lib/config/defaults.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/config/defaults.js b/lib/config/defaults.js index 991a2129f6894..2592659539120 100644 --- a/lib/config/defaults.js +++ b/lib/config/defaults.js @@ -239,7 +239,7 @@ Object.defineProperty(exports, 'defaults', {get: function () { process.getuid() !== 0, 'update-notifier': true, usage: false, - user: process.platform === 'win32' ? 0 : 'nobody', + user: (process.platform === 'win32' || os.type() === 'OS400') ? 0 : 'nobody', userconfig: path.resolve(home, '.npmrc'), umask: process.umask ? process.umask() : umask.fromString('022'), version: false, From 31a7274b70de18b24e7bee51daa22cc7cbb6141c Mon Sep 17 00:00:00 2001 From: George Date: Mon, 10 Dec 2018 17:44:00 -0500 Subject: [PATCH 02/97] docs: Fix typo in npm-token documentation (#71) PR-URL: https://github.com/npm/cli/pull/71 Credit: @GeorgeTaveras1231 Reviewed-By: @zkat --- doc/cli/npm-token.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/cli/npm-token.md b/doc/cli/npm-token.md index 0212dfe2ea85a..ae7aacae60155 100644 --- a/doc/cli/npm-token.md +++ b/doc/cli/npm-token.md @@ -9,7 +9,7 @@ npm-token(1) -- Manage your authentication tokens ## DESCRIPTION -This list you list, create and revoke authentication tokens. +This lets you list, create and revoke authentication tokens. * `npm token list`: Shows a table of all active authentication tokens. You can request this as From 890a74458dd4a55e2d85f3eba9dbf125affa4206 Mon Sep 17 00:00:00 2001 From: Lars Willighagen Date: Mon, 10 Dec 2018 23:45:27 +0100 Subject: [PATCH 03/97] pacote: pass git opts to pacote (#98) Pass git binary path config to pacote. Ref: zkat/pacote#164 Fixes: https://npm.community/t/3278 PR-URL: https://github.com/npm/cli/pull/98 Credit: @larsgw Reviewed-By: @zkat --- lib/config/pacote.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/config/pacote.js b/lib/config/pacote.js index 505b69da375a4..aa573e13ed4a0 100644 --- a/lib/config/pacote.js +++ b/lib/config/pacote.js @@ -25,6 +25,7 @@ function pacoteOpts (moreOpts) { cert: npm.config.get('cert'), defaultTag: npm.config.get('tag'), dirPacker: pack.packGitDep, + git: npm.config.get('git'), hashAlgorithm: 'sha1', includeDeprecated: false, key: npm.config.get('key'), From 02c837e01a71a26f37cbd5a09be89df8a9ce01da Mon Sep 17 00:00:00 2001 From: isaacs Date: Mon, 10 Dec 2018 14:51:38 -0800 Subject: [PATCH 04/97] dist-tag: make 'ls' the default action (#106) I keep typing `npm dist-tags` expecting it to print out a list of dist-tags and instead it yells at me and that feels very un-npm-y. PR-URL: https://github.com/npm/cli/pull/106 Credit: @isaacs Reviewed-By: @zkat --- doc/cli/npm-dist-tag.md | 2 ++ lib/dist-tag.js | 2 +- test/tap/dist-tag.js | 45 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/doc/cli/npm-dist-tag.md b/doc/cli/npm-dist-tag.md index 1a69d1b6ce42b..7de3c828fb215 100644 --- a/doc/cli/npm-dist-tag.md +++ b/doc/cli/npm-dist-tag.md @@ -26,6 +26,8 @@ Add, remove, and enumerate distribution tags on a package: Show all of the dist-tags for a package, defaulting to the package in the current prefix. + This is the default action if none is specified. + A tag can be used when installing packages as a reference to a version instead of using a specific version number: diff --git a/lib/dist-tag.js b/lib/dist-tag.js index bd0c5ae8a27a7..534cbe94c6bdb 100644 --- a/lib/dist-tag.js +++ b/lib/dist-tag.js @@ -40,7 +40,7 @@ function distTag (args, cb) { case 'ls': case 'l': case 'sl': case 'list': return list(args[0], cb) default: - return cb('Usage:\n' + distTag.usage) + return list(cmd, cb) } } diff --git a/test/tap/dist-tag.js b/test/tap/dist-tag.js index 651639f32a5fe..3631a598e9c68 100644 --- a/test/tap/dist-tag.js +++ b/test/tap/dist-tag.js @@ -20,10 +20,16 @@ function mocks (server) { server.get('/-/package/@scoped%2fpkg/dist-tags') .reply(200, { latest: '1.0.0', a: '0.0.1', b: '0.5.0' }) + server.get('/-/package/@scoped%2fpkg/dist-tags') + .reply(200, { latest: '1.0.0', a: '0.0.1', b: '0.5.0' }) + // ls named package server.get('/-/package/@scoped%2fanother/dist-tags') .reply(200, { latest: '2.0.0', a: '0.0.2', b: '0.6.0' }) + server.get('/-/package/@scoped%2fanother/dist-tags') + .reply(200, { latest: '2.0.0', a: '0.0.2', b: '0.6.0' }) + // add c server.get('/-/package/@scoped%2fanother/dist-tags') .reply(200, { latest: '2.0.0', a: '0.0.2', b: '0.6.0' }) @@ -83,6 +89,25 @@ test('npm dist-tags ls in current package', function (t) { ) }) +test('npm dist-tags ls default in current package', function (t) { + common.npm( + [ + 'dist-tags', + '--registry', common.registry, + '--loglevel', 'silent' + ], + { cwd: pkg }, + function (er, code, stdout, stderr) { + t.ifError(er, 'npm access') + t.notOk(code, 'exited OK') + t.notOk(stderr, 'no error output') + t.equal(stdout, 'a: 0.0.1\nb: 0.5.0\nlatest: 1.0.0\n') + + t.end() + } + ) +}) + test('npm dist-tags ls on named package', function (t) { common.npm( [ @@ -103,6 +128,26 @@ test('npm dist-tags ls on named package', function (t) { ) }) +test('npm dist-tags ls default, named package', function (t) { + common.npm( + [ + 'dist-tags', + '@scoped/another', + '--registry', common.registry, + '--loglevel', 'silent' + ], + { cwd: pkg }, + function (er, code, stdout, stderr) { + t.ifError(er, 'npm access') + t.notOk(code, 'exited OK') + t.notOk(stderr, 'no error output') + t.equal(stdout, 'a: 0.0.2\nb: 0.6.0\nlatest: 2.0.0\n') + + t.end() + } + ) +}) + test('npm dist-tags add @scoped/another@7.7.7 c', function (t) { common.npm( [ From 90e55a143ed1de8678d65c17bc3c2b103a15ddac Mon Sep 17 00:00:00 2001 From: Beni von Cheni Date: Mon, 10 Dec 2018 17:52:21 -0500 Subject: [PATCH 05/97] utils: check npm.config existence in error-handler.js (#108) Fixes: https://npm.community/t/npx-envinfo-preset-jest-fails-on-windows-with-a-stack-trace/2713 PR-URL: https://github.com/npm/cli/pull/108 Credit: @BeniCheni Reviewed-By: @zkat --- lib/utils/error-handler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/utils/error-handler.js b/lib/utils/error-handler.js index c6481abf6737d..ba9d9f8e252e5 100644 --- a/lib/utils/error-handler.js +++ b/lib/utils/error-handler.js @@ -202,7 +202,7 @@ function errorHandler (er) { msg.summary.concat(msg.detail).forEach(function (errline) { log.error.apply(log, errline) }) - if (npm.config.get('json')) { + if (npm.config && npm.config.get('json')) { var error = { error: { code: er.code, From 9cefcdc1d2289b56f9164d14d7e499e115cfeaee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kat=20March=C3=A1n?= Date: Wed, 15 Aug 2018 14:00:06 -0700 Subject: [PATCH 06/97] npm-registry-fetch@3.8.0 --- .../npm-registry-fetch/CHANGELOG.md | 104 --- .../npm-registry-fetch/LICENSE.md | 16 - .../node_modules/npm-registry-fetch/README.md | 549 ------------- .../node_modules/npm-registry-fetch/auth.js | 48 -- .../npm-registry-fetch/check-response.js | 99 --- .../node_modules/npm-registry-fetch/config.js | 90 --- .../node_modules/npm-registry-fetch/errors.js | 58 -- .../node_modules/npm-registry-fetch/index.js | 160 ---- .../npm-registry-fetch/package.json | 90 --- .../npm-registry-fetch/silentlog.js | 14 - node_modules/libnpmhook/package.json | 22 +- node_modules/npm-registry-fetch/CHANGELOG.md | 156 ++++ node_modules/npm-registry-fetch/README.md | 93 ++- node_modules/npm-registry-fetch/auth.js | 12 +- .../npm-registry-fetch/check-response.js | 30 +- node_modules/npm-registry-fetch/config.js | 24 +- node_modules/npm-registry-fetch/errors.js | 21 + node_modules/npm-registry-fetch/index.js | 149 ++-- .../node_modules/cacache/CHANGELOG.md | 478 ------------ .../node_modules/cacache/LICENSE.md | 16 - .../node_modules/cacache/README.es.md | 628 --------------- .../node_modules/cacache/README.md | 624 --------------- .../node_modules/cacache/en.js | 3 - .../node_modules/cacache/es.js | 3 - .../node_modules/cacache/get.js | 190 ----- .../node_modules/cacache/index.js | 3 - .../node_modules/cacache/lib/content/path.js | 26 - .../node_modules/cacache/lib/content/read.js | 125 --- .../node_modules/cacache/lib/content/rm.js | 21 - .../node_modules/cacache/lib/content/write.js | 162 ---- .../node_modules/cacache/lib/entry-index.js | 225 ------ .../node_modules/cacache/lib/memoization.js | 69 -- .../cacache/lib/util/fix-owner.js | 44 -- .../cacache/lib/util/hash-to-segments.js | 11 - .../cacache/lib/util/move-file.js | 51 -- .../node_modules/cacache/lib/util/tmp.js | 32 - .../node_modules/cacache/lib/util/y.js | 25 - .../node_modules/cacache/lib/verify.js | 213 ----- .../node_modules/cacache/locales/en.js | 44 -- .../node_modules/cacache/locales/en.json | 6 - .../node_modules/cacache/locales/es.js | 46 -- .../node_modules/cacache/locales/es.json | 6 - .../node_modules/cacache/ls.js | 6 - .../node_modules/mississippi/changelog.md | 7 - .../cacache/node_modules/mississippi/index.js | 10 - .../cacache/node_modules/mississippi/license | 7 - .../node_modules/mississippi/package.json | 62 -- .../node_modules/mississippi/readme.md | 411 ---------- .../node_modules/cacache/package.json | 137 ---- .../node_modules/cacache/put.js | 71 -- .../node_modules/cacache/rm.js | 28 - .../node_modules/cacache/verify.js | 3 - .../node_modules/figgy-pudding/CHANGELOG.md | 29 - .../node_modules/figgy-pudding/LICENSE.md | 16 - .../node_modules/figgy-pudding/README.md | 121 --- .../node_modules/figgy-pudding/index.js | 60 -- .../node_modules/figgy-pudding/package.json | 70 -- .../make-fetch-happen/CHANGELOG.md | 525 ------------- .../node_modules/make-fetch-happen/LICENSE | 16 - .../node_modules/make-fetch-happen/README.md | 404 ---------- .../node_modules/make-fetch-happen/agent.js | 171 ----- .../node_modules/make-fetch-happen/cache.js | 257 ------- .../node_modules/make-fetch-happen/index.js | 482 ------------ .../make-fetch-happen/package.json | 95 --- .../node_modules/make-fetch-happen/warning.js | 24 - .../node_modules/pump/.travis.yml | 5 - .../node_modules/pump/LICENSE | 21 - .../node_modules/pump/README.md | 56 -- .../node_modules/pump/index.js | 82 -- .../node_modules/pump/package.json | 59 -- .../node_modules/pump/test-browser.js | 62 -- .../node_modules/pump/test-node.js | 53 -- .../node_modules/smart-buffer/.npmignore | 5 - .../node_modules/smart-buffer/.travis.yml | 11 - .../node_modules/smart-buffer/LICENSE | 20 - .../node_modules/smart-buffer/README.md | 307 -------- .../smart-buffer/build/smartbuffer.js | 726 ------------------ .../smart-buffer/build/smartbuffer.js.map | 1 - .../smart-buffer/lib/smart-buffer.js | 371 --------- .../node_modules/smart-buffer/package.json | 70 -- .../smart-buffer/test/smart-buffer.test.js | 410 ---------- .../smart-buffer/typings/index.d.ts | 383 --------- .../node_modules/socks-proxy-agent/.npmignore | 1 - .../socks-proxy-agent/.travis.yml | 22 - .../node_modules/socks-proxy-agent/History.md | 96 --- .../node_modules/socks-proxy-agent/README.md | 134 ---- .../node_modules/socks-proxy-agent/index.js | 141 ---- .../socks-proxy-agent/package.json | 66 -- .../test/ssl-cert-snakeoil.key | 15 - .../test/ssl-cert-snakeoil.pem | 12 - .../socks-proxy-agent/test/test.js | 144 ---- .../node_modules/socks/.npmignore | 4 - .../node_modules/socks/LICENSE | 20 - .../node_modules/socks/README.md | 339 -------- .../node_modules/socks/examples/associate.js | 33 - .../node_modules/socks/examples/bind.js | 30 - .../node_modules/socks/examples/connect.js | 31 - .../node_modules/socks/index.js | 6 - .../node_modules/socks/lib/socks-agent.js | 108 --- .../node_modules/socks/lib/socks-client.js | 306 -------- .../node_modules/socks/package.json | 68 -- .../node_modules/ssri/CHANGELOG.md | 256 ------ .../node_modules/ssri/LICENSE.md | 16 - .../node_modules/ssri/README.md | 488 ------------ .../node_modules/ssri/index.js | 379 --------- .../node_modules/ssri/package.json | 90 --- node_modules/npm-registry-fetch/package.json | 92 +-- package-lock.json | 138 +--- package.json | 2 +- 109 files changed, 434 insertions(+), 13043 deletions(-) delete mode 100644 node_modules/libnpmhook/node_modules/npm-registry-fetch/CHANGELOG.md delete mode 100644 node_modules/libnpmhook/node_modules/npm-registry-fetch/LICENSE.md delete mode 100644 node_modules/libnpmhook/node_modules/npm-registry-fetch/README.md delete mode 100644 node_modules/libnpmhook/node_modules/npm-registry-fetch/auth.js delete mode 100644 node_modules/libnpmhook/node_modules/npm-registry-fetch/check-response.js delete mode 100644 node_modules/libnpmhook/node_modules/npm-registry-fetch/config.js delete mode 100644 node_modules/libnpmhook/node_modules/npm-registry-fetch/errors.js delete mode 100644 node_modules/libnpmhook/node_modules/npm-registry-fetch/index.js delete mode 100644 node_modules/libnpmhook/node_modules/npm-registry-fetch/package.json delete mode 100644 node_modules/libnpmhook/node_modules/npm-registry-fetch/silentlog.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/CHANGELOG.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/LICENSE.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/README.es.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/README.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/en.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/es.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/get.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/index.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/lib/content/path.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/lib/content/read.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/lib/content/rm.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/lib/content/write.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/lib/entry-index.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/lib/memoization.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/lib/util/fix-owner.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/lib/util/hash-to-segments.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/lib/util/move-file.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/lib/util/tmp.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/lib/util/y.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/lib/verify.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/locales/en.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/locales/en.json delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/locales/es.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/locales/es.json delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/ls.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/changelog.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/index.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/license delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/package.json delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/readme.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/package.json delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/put.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/rm.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/cacache/verify.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/figgy-pudding/CHANGELOG.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/figgy-pudding/LICENSE.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/figgy-pudding/README.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/figgy-pudding/index.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/figgy-pudding/package.json delete mode 100644 node_modules/npm-registry-fetch/node_modules/make-fetch-happen/CHANGELOG.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/make-fetch-happen/LICENSE delete mode 100644 node_modules/npm-registry-fetch/node_modules/make-fetch-happen/README.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/make-fetch-happen/agent.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/make-fetch-happen/cache.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/make-fetch-happen/index.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/make-fetch-happen/package.json delete mode 100644 node_modules/npm-registry-fetch/node_modules/make-fetch-happen/warning.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/pump/.travis.yml delete mode 100644 node_modules/npm-registry-fetch/node_modules/pump/LICENSE delete mode 100644 node_modules/npm-registry-fetch/node_modules/pump/README.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/pump/index.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/pump/package.json delete mode 100644 node_modules/npm-registry-fetch/node_modules/pump/test-browser.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/pump/test-node.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/smart-buffer/.npmignore delete mode 100644 node_modules/npm-registry-fetch/node_modules/smart-buffer/.travis.yml delete mode 100644 node_modules/npm-registry-fetch/node_modules/smart-buffer/LICENSE delete mode 100644 node_modules/npm-registry-fetch/node_modules/smart-buffer/README.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/smart-buffer/build/smartbuffer.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/smart-buffer/build/smartbuffer.js.map delete mode 100644 node_modules/npm-registry-fetch/node_modules/smart-buffer/lib/smart-buffer.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/smart-buffer/package.json delete mode 100644 node_modules/npm-registry-fetch/node_modules/smart-buffer/test/smart-buffer.test.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/smart-buffer/typings/index.d.ts delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/.npmignore delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/.travis.yml delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/History.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/README.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/index.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/package.json delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/test/ssl-cert-snakeoil.key delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/test/ssl-cert-snakeoil.pem delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/test/test.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks/.npmignore delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks/LICENSE delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks/README.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks/examples/associate.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks/examples/bind.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks/examples/connect.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks/index.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks/lib/socks-agent.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks/lib/socks-client.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/socks/package.json delete mode 100644 node_modules/npm-registry-fetch/node_modules/ssri/CHANGELOG.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/ssri/LICENSE.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/ssri/README.md delete mode 100644 node_modules/npm-registry-fetch/node_modules/ssri/index.js delete mode 100644 node_modules/npm-registry-fetch/node_modules/ssri/package.json diff --git a/node_modules/libnpmhook/node_modules/npm-registry-fetch/CHANGELOG.md b/node_modules/libnpmhook/node_modules/npm-registry-fetch/CHANGELOG.md deleted file mode 100644 index 8f9366551fb97..0000000000000 --- a/node_modules/libnpmhook/node_modules/npm-registry-fetch/CHANGELOG.md +++ /dev/null @@ -1,104 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. - - -## [3.1.1](https://github.com/npm/registry-fetch/compare/v3.1.0...v3.1.1) (2018-04-09) - - - - -# [3.1.0](https://github.com/npm/registry-fetch/compare/v3.0.0...v3.1.0) (2018-04-09) - - -### Features - -* **config:** support no-proxy and https-proxy options ([9aa906b](https://github.com/npm/registry-fetch/commit/9aa906b)) - - - - -# [3.0.0](https://github.com/npm/registry-fetch/compare/v2.1.0...v3.0.0) (2018-04-09) - - -### Bug Fixes - -* **api:** pacote integration-related fixes ([a29de4f](https://github.com/npm/registry-fetch/commit/a29de4f)) -* **config:** stop caring about opts.config ([5856a6f](https://github.com/npm/registry-fetch/commit/5856a6f)) - - -### BREAKING CHANGES - -* **config:** opts.config is no longer supported. Pass the options down in opts itself. - - - - -# [2.1.0](https://github.com/npm/registry-fetch/compare/v2.0.0...v2.1.0) (2018-04-08) - - -### Features - -* **token:** accept opts.token for opts._authToken ([108c9f0](https://github.com/npm/registry-fetch/commit/108c9f0)) - - - - -# [2.0.0](https://github.com/npm/registry-fetch/compare/v1.1.1...v2.0.0) (2018-04-08) - - -### meta - -* drop support for node@4 ([758536e](https://github.com/npm/registry-fetch/commit/758536e)) - - -### BREAKING CHANGES - -* node@4 is no longer supported - - - - -## [1.1.1](https://github.com/npm/registry-fetch/compare/v1.1.0...v1.1.1) (2018-04-06) - - - - -# [1.1.0](https://github.com/npm/registry-fetch/compare/v1.0.1...v1.1.0) (2018-03-16) - - -### Features - -* **specs:** can use opts.spec to trigger pickManifest ([85c4ac9](https://github.com/npm/registry-fetch/commit/85c4ac9)) - - - - -## [1.0.1](https://github.com/npm/registry-fetch/compare/v1.0.0...v1.0.1) (2018-03-16) - - -### Bug Fixes - -* **query:** oops console.log ([870e4f5](https://github.com/npm/registry-fetch/commit/870e4f5)) - - - - -# 1.0.0 (2018-03-16) - - -### Bug Fixes - -* **auth:** get auth working with all the little details ([84b94ba](https://github.com/npm/registry-fetch/commit/84b94ba)) -* **deps:** add bluebird as an actual dep ([1286e31](https://github.com/npm/registry-fetch/commit/1286e31)) -* **errors:** Unknown auth errors use default code ([#1](https://github.com/npm/registry-fetch/issues/1)) ([3d91b93](https://github.com/npm/registry-fetch/commit/3d91b93)) -* **standard:** remove args from invocation ([9620a0a](https://github.com/npm/registry-fetch/commit/9620a0a)) - - -### Features - -* **api:** baseline kinda-working API impl ([bf91f9f](https://github.com/npm/registry-fetch/commit/bf91f9f)) -* **body:** automatic handling of different opts.body values ([f3b97db](https://github.com/npm/registry-fetch/commit/f3b97db)) -* **config:** nicer input config input handling ([b9ce21d](https://github.com/npm/registry-fetch/commit/b9ce21d)) -* **opts:** use figgy-pudding for opts handling ([0abd527](https://github.com/npm/registry-fetch/commit/0abd527)) -* **query:** add query utility support ([65ea8b1](https://github.com/npm/registry-fetch/commit/65ea8b1)) diff --git a/node_modules/libnpmhook/node_modules/npm-registry-fetch/LICENSE.md b/node_modules/libnpmhook/node_modules/npm-registry-fetch/LICENSE.md deleted file mode 100644 index 8d28acf866d93..0000000000000 --- a/node_modules/libnpmhook/node_modules/npm-registry-fetch/LICENSE.md +++ /dev/null @@ -1,16 +0,0 @@ -ISC License - -Copyright (c) npm, Inc. - -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 COPYRIGHT HOLDER DISCLAIMS -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -COPYRIGHT HOLDER 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/node_modules/libnpmhook/node_modules/npm-registry-fetch/README.md b/node_modules/libnpmhook/node_modules/npm-registry-fetch/README.md deleted file mode 100644 index 3d55eef6de85b..0000000000000 --- a/node_modules/libnpmhook/node_modules/npm-registry-fetch/README.md +++ /dev/null @@ -1,549 +0,0 @@ -# npm-registry-fetch [![npm version](https://img.shields.io/npm/v/npm-registry-fetch.svg)](https://npm.im/npm-registry-fetch) [![license](https://img.shields.io/npm/l/npm-registry-fetch.svg)](https://npm.im/npm-registry-fetch) [![Travis](https://img.shields.io/travis/npm/npm-registry-fetch/latest.svg)](https://travis-ci.org/npm/npm-registry-fetch) [![AppVeyor](https://img.shields.io/appveyor/ci/zkat/npm-registry-fetch/latest.svg)](https://ci.appveyor.com/project/npm/npm-registry-fetch) [![Coverage Status](https://coveralls.io/repos/github/npm/npm-registry-fetch/badge.svg?branch=latest)](https://coveralls.io/github/npm/npm-registry-fetch?branch=latest) - -[`npm-registry-fetch`](https://github.com/npm/npm-registry-fetch) is a Node.js -library that implements a `fetch`-like API for accessing npm registry APIs -consistently. It's able to consume npm-style configuration values and has all -the necessary logic for picking registries, handling scopes, and dealing with -authentication details built-in. - -This package is meant to replace the older -[`npm-registry-client`](https://npm.im/npm-registry-client). - -## Example - -```javascript -const npmFetch = require('npm-registry-fetch') - -console.log( - await npmFetch.json('/-/ping') -) -``` - -## Table of Contents - -* [Installing](#install) -* [Example](#example) -* [Contributing](#contributing) -* [API](#api) - * [`fetch`](#fetch) - * [`fetch.json`](#fetch-json) - * [`fetch` options](#fetch-opts) - -### Install - -`$ npm install npm-registry-fetch` - -### Contributing - -The npm team enthusiastically welcomes contributions and project participation! -There's a bunch of things you can do if you want to contribute! The [Contributor -Guide](CONTRIBUTING.md) has all the information you need for everything from -reporting bugs to contributing entire new features. Please don't hesitate to -jump in if you'd like to, or even ask us questions if something isn't clear. - -All participants and maintainers in this project are expected to follow [Code of -Conduct](CODE_OF_CONDUCT.md), and just generally be excellent to each other. - -Please refer to the [Changelog](CHANGELOG.md) for project history details, too. - -Happy hacking! - -### API - -#### `> fetch(url, [opts]) -> Promise` - -Performs a request to a given URL. - -The URL can be either a full URL, or a path to one. The appropriate registry -will be automatically picked if only a URL path is given. - -For available options, please see the section on [`fetch` options](#fetch-opts). - -##### Example - -```javascript -const res = await fetch('/-/ping') -console.log(res.headers) -res.on('data', d => console.log(d.toString('utf8'))) -``` - -#### `> fetch.json(url, [opts]) -> Promise` - -Performs a request to a given registry URL, parses the body of the response as -JSON, and returns it as its final value. This is a utility shorthand for -`fetch(url).then(res => res.json())`. - -For available options, please see the section on [`fetch` options](#fetch-opts). - -##### Example - -```javascript -const res = await fetch.json('/-/ping') -console.log(res) // Body parsed as JSON -``` - -#### `fetch` Options - -Fetch options are optional, and can be passed in as either a Map-like object -(one with a `.get()` method), a plain javascript object, or a -[`figgy-pudding`](https://npm.im/figgy-pudding) instance. - -##### `opts.agent` - -* Type: http.Agent -* Default: an appropriate agent based on URL protocol and proxy settings - -An [`Agent`](https://nodejs.org/api/http.html#http_class_http_agent) instance to -be shared across requests. This allows multiple concurrent `fetch` requests to -happen on the same socket. - -You do _not_ need to provide this option unless you want something particularly -specialized, since proxy configurations and http/https agents are already -automatically managed internally when this option is not passed through. - -##### `opts.body` - -* Type: Buffer | Stream | Object -* Default: null - -Request body to send through the outgoing request. Buffers and Streams will be -passed through as-is, with a default `content-type` of -`application/octet-stream`. Plain JavaScript objects will be `JSON.stringify`ed -and the `content-type` will default to `application/json`. - -Use [`opts.headers`](#opts-headers) to set the content-type to something else. - -##### `opts.ca` - -* Type: String, Array, or null -* Default: null - -The Certificate Authority signing certificate that is trusted for SSL -connections to the registry. Values should be in PEM format (Windows calls it -"Base-64 encoded X.509 (.CER)") with newlines replaced by the string `'\n'`. For -example: - -``` -{ - ca: '-----BEGIN CERTIFICATE-----\nXXXX\nXXXX\n-----END CERTIFICATE-----' -} -``` - -Set to `null` to only allow "known" registrars, or to a specific CA cert -to trust only that specific signing authority. - -Multiple CAs can be trusted by specifying an array of certificates instead of a -single string. - -See also [`opts.strict-ssl`](#opts-strict-ssl), [`opts.ca`](#opts-ca) and -[`opts.key`](#opts-key) - -##### `opts.cache` - -* Type: path -* Default: null - -The location of the http cache directory. If provided, certain cachable requests -will be cached according to [IETF RFC 7234](https://tools.ietf.org/html/rfc7234) -rules. This will speed up future requests, as well as make the cached data -available offline if necessary/requested. - -See also [`offline`](#opts-offline), [`prefer-offline`](#opts-prefer-offline), -and [`prefer-online`](#opts-prefer-online). - -##### `opts.cert` - -* Type: String -* Default: null - -A client certificate to pass when accessing the registry. Values should be in -PEM format (Windows calls it "Base-64 encoded X.509 (.CER)") with newlines -replaced by the string `'\n'`. For example: - -``` -{ - cert: '-----BEGIN CERTIFICATE-----\nXXXX\nXXXX\n-----END CERTIFICATE-----' -} -``` - -It is _not_ the path to a certificate file (and there is no "certfile" option). - -See also: [`opts.ca`](#opts-ca) and [`opts.key`](#opts-key) - -##### `opts.fetch-retries` - -* Type: Number -* Default: 2 - -The "retries" config for [`retry`](https://npm.im/retry) to use when fetching -packages from the registry. - -See also [`opts.retry`](#opts-retry) to provide all retry options as a single -object. - -##### `opts.fetch-retry-factor` - -* Type: Number -* Default: 10 - -The "factor" config for [`retry`](https://npm.im/retry) to use when fetching -packages. - -See also [`opts.retry`](#opts-retry) to provide all retry options as a single -object. - -##### `opts.fetch-retry-mintimeout` - -* Type: Number -* Default: 10000 (10 seconds) - -The "minTimeout" config for [`retry`](https://npm.im/retry) to use when fetching -packages. - -See also [`opts.retry`](#opts-retry) to provide all retry options as a single -object. - -##### `opts.fetch-retry-maxtimeout` - -* Type: Number -* Default: 60000 (1 minute) - -The "maxTimeout" config for [`retry`](https://npm.im/retry) to use when fetching -packages. - -See also [`opts.retry`](#opts-retry) to provide all retry options as a single -object. - -##### `opts.headers` - -* Type: Object -* Default: null - -Additional headers for the outgoing request. This option can also be used to -override headers automatically generated by `npm-registry-fetch`, such as -`Content-Type`. - -##### `opts.integrity` - -* Type: String | [SRI object](https://npm.im/ssri) -* Default: null - -If provided, the response body's will be verified against this integrity string, -using [`ssri`](https://npm.im/ssri). If verification succeeds, the response will -complete as normal. If verification fails, the response body will error with an -`EINTEGRITY` error. - -Body integrity is only verified if the body is actually consumed to completion -- -that is, if you use `res.json()`/`res.buffer()`, or if you consume the default -`res` stream data to its end. - -Cached data will have its integrity automatically verified using the -previously-generated integrity hash for the saved request information, so -`EINTEGRITY` errors can happen if [`opts.cache`](#opts-cache) is used, even if -`opts.integrity` is not passed in. - -##### `opts.is-from-ci` - -* Alias: `opts.isFromCI` -* Type: Boolean -* Default: Based on environment variables - -This is used to populate the `npm-in-ci` request header sent to the registry. - -##### `opts.key` - -* Type: String -* Default: null - -A client key to pass when accessing the registry. Values should be in PEM -format with newlines replaced by the string `'\n'`. For example: - -``` -{ - key: '-----BEGIN PRIVATE KEY-----\nXXXX\nXXXX\n-----END PRIVATE KEY-----' -} -``` - -It is _not_ the path to a key file (and there is no "keyfile" option). - -See also: [`opts.ca`](#opts-ca) and [`opts.cert`](#opts-cert) - -##### `opts.local-address` - -* Type: IP Address String -* Default: null - -The IP address of the local interface to use when making connections -to the registry. - -See also [`opts.proxy`](#opts-proxy) - -##### `opts.log` - -* Type: [`npmlog`](https://npm.im/npmlog)-like -* Default: null - -Logger object to use for logging operation details. Must have the same methods -as `npmlog`. - -##### `opts.maxsockets` - -* Alias: `opts.max-sockets` -* Type: Integer -* Default: 12 - -Maximum number of sockets to keep open during requests. Has no effect if -[`opts.agent`](#opts-agent) is used. - -##### `opts.method` - -* Type: String -* Default: 'GET' - -HTTP method to use for the outgoing request. Case-insensitive. - -##### `opts.noproxy` - -* Type: Boolean -* Default: process.env.NOPROXY - -If true, proxying will be disabled even if [`opts.proxy`](#opts-proxy) is used. - -##### `opts.npm-session` - -* Alias: `opts.npmSession` -* Type: String -* Default: null - -If provided, will be sent in the `npm-session` header. This header is used by -the npm registry to identify individual user sessions (usually individual -invocations of the CLI). - -##### `opts.offline` - -* Type: Boolean -* Default: false - -Force offline mode: no network requests will be done during install. To allow -`npm-registry-fetch` to fill in missing cache data, see -[`opts.prefer-offline`](#opts-prefer-offline). - -This option is only really useful if you're also using -[`opts.cache`](#opts-cache). - -##### `opts.otp` - -* Type: Number | String -* Default: null - -This is a one-time password from a two-factor authenticator. It is required for -certain registry interactions when two-factor auth is enabled for a user -account. - -##### `opts.password` - -* Alias: _password -* Type: String -* Default: null - -Password used for basic authentication. For the more modern authentication -method, please use the (more secure) [`opts.token`](#opts-token) - -Can optionally be scoped to a registry by using a "nerf dart" for that registry. -That is: - -``` -{ - '//registry.npmjs.org/:password': 't0k3nH34r' -} -``` - -See also [`opts.username`](#opts-username) - -##### `opts.prefer-offline` - -* Type: Boolean -* Default: false - -If true, staleness checks for cached data will be bypassed, but missing data -will be requested from the server. To force full offline mode, use -[`opts.offline`](#opts-offline). - -This option is generally only useful if you're also using -[`opts.cache`](#opts-cache). - -##### `opts.prefer-online` - -* Type: Boolean -* Default: false - -If true, staleness checks for cached data will be forced, making the CLI look -for updates immediately even for fresh package data. - -This option is generally only useful if you're also using -[`opts.cache`](#opts-cache). - - -##### `opts.project-scope` - -* Alias: `opts.projectScope` -* Type: String -* Default: null - -If provided, will be sent in the `npm-scope` header. This header is used by the -npm registry to identify the toplevel package scope that a particular project -installation is using. - -##### `opts.proxy` - -* Type: url -* Default: null - -A proxy to use for outgoing http requests. If not passed in, the `HTTP(S)_PROXY` -environment variable will be used. - -##### `opts.query` - -* Type: String | Object -* Default: null - -If provided, the request URI will have a query string appended to it using this -query. If `opts.query` is an object, it will be converted to a query string -using -[`querystring.stringify()`](https://nodejs.org/api/querystring.html#querystring_querystring_stringify_obj_sep_eq_options). - -If the request URI already has a query string, it will be merged with -`opts.query`, preferring `opts.query` values. - -##### `opts.refer` - -* Alias: `opts.referer` -* Type: String -* Default: null - -Value to use for the `Referer` header. The npm CLI itself uses this to serialize -the npm command line using the given request. - -##### `opts.registry` - -* Type: URL -* Default: `'https://registry.npmjs.org'` - -Registry configuration for a request. If a request URL only includes the URL -path, this registry setting will be prepended. This configuration is also used -to determine authentication details, so even if the request URL references a -completely different host, `opts.registry` will be used to find the auth details -for that request. - -See also [`opts.scope`](#opts-scope), [`opts.spec`](#opts-spec), and -[`opts.:registry`](#opts-scope-registry) which can all affect the actual -registry URL used by the outgoing request. - -##### `opts.retry` - -* Type: Object -* Default: null - -Single-object configuration for request retry settings. If passed in, will -override individually-passed `fetch-retry-*` settings. - -##### `opts.scope` - -* Type: String -* Default: null - -Associate an operation with a scope for a scoped registry. This option can force -lookup of scope-specific registries and authentication. - -See also [`opts.:registry`](#opts-scope-registry) and -[`opts.spec`](#opts-spec) for interactions with this option. - -##### `opts.:registry` - -* Type: String -* Default: null - -This option type can be used to configure the registry used for requests -involving a particular scope. For example, `opts['@myscope:registry'] = -'https://scope-specific.registry/'` will make it so requests go out to this -registry instead of [`opts.registry`](#opts-registry) when -[`opts.scope`](#opts-scope) is used, or when [`opts.spec`](#opts-spec) is a -scoped package spec. - -The `@` before the scope name is optional, but recommended. - -##### `opts.spec` - -* Type: String | [`npm-registry-arg`](https://npm.im/npm-registry-arg) object. -* Default: null - -If provided, can be used to automatically configure [`opts.scope`](#opts-scope) -based on a specific package name. Non-registry package specs will throw an -error. - -##### `opts.strict-ssl` - -* Type: Boolean -* Default: true - -Whether or not to do SSL key validation when making requests to the -registry via https. - -See also [`opts.ca`](#opts-ca). - -##### `opts.timeout` - -* Type: Milliseconds -* Default: 30000 (30 seconds) - -Time before a hanging request times out. - -##### `opts.token` - -* Alias: `opts._authToken` -* Type: String -* Default: null - -Authentication token string. - -Can be scoped to a registry by using a "nerf dart" for that registry. That is: - -``` -{ - '//registry.npmjs.org/:token': 't0k3nH34r' -} -``` - -##### `opts.user-agent` - -* Type: String -* Default: `'npm-registry-fetch@/node@+ ()'` - -User agent string to send in the `User-Agent` header. - -##### `opts.username` - -* Type: String -* Default: null - -Username used for basic authentication. For the more modern authentication -method, please use the (more secure) [`opts.token`](#opts-token) - -Can optionally be scoped to a registry by using a "nerf dart" for that registry. -That is: - -``` -{ - '//registry.npmjs.org/:username': 't0k3nH34r' -} -``` - -See also [`opts.password`](#opts-password) - -##### `opts._auth` - -* Type: String -* Default: null - -** DEPRECATED ** This is a legacy authentication token supported only for -*compatibility. Please use [`opts.token`](#opts-token) instead. diff --git a/node_modules/libnpmhook/node_modules/npm-registry-fetch/auth.js b/node_modules/libnpmhook/node_modules/npm-registry-fetch/auth.js deleted file mode 100644 index 9532341db1400..0000000000000 --- a/node_modules/libnpmhook/node_modules/npm-registry-fetch/auth.js +++ /dev/null @@ -1,48 +0,0 @@ -'use strict' - -const config = require('./config.js') -const url = require('url') - -module.exports = getAuth -function getAuth (registry, opts) { - if (!registry) { throw new Error('registry is required') } - opts = config(opts) - let AUTH = {} - const regKey = registry && registryKey(registry) - const doKey = (key, alias) => addKey(opts, AUTH, regKey, key, alias) - doKey('token') - doKey('_authToken', 'token') - doKey('username') - doKey('password') - doKey('_password', 'password') - doKey('email') - doKey('_auth') - doKey('otp') - doKey('always-auth', 'alwaysAuth') - if (AUTH.password) { - AUTH.password = Buffer.from(AUTH.password, 'base64').toString('utf8') - } - AUTH.alwaysAuth = AUTH.alwaysAuth === 'false' ? false : !!AUTH.alwaysAuth - return AUTH -} - -function addKey (opts, obj, scope, key, objKey) { - if (opts.get(key)) { - obj[objKey || key] = opts.get(key) - } - if (scope && opts.get(`${scope}:${key}`)) { - obj[objKey || key] = opts.get(`${scope}:${key}`) - } -} - -// Called a nerf dart in the main codebase. Used as a "safe" -// key when fetching registry info from config. -function registryKey (registry) { - const parsed = url.parse(registry) - const formatted = url.format({ - host: parsed.host, - pathname: parsed.pathname, - slashes: parsed.slashes - }) - return url.resolve(formatted, '.') -} diff --git a/node_modules/libnpmhook/node_modules/npm-registry-fetch/check-response.js b/node_modules/libnpmhook/node_modules/npm-registry-fetch/check-response.js deleted file mode 100644 index 407a80e4ce38a..0000000000000 --- a/node_modules/libnpmhook/node_modules/npm-registry-fetch/check-response.js +++ /dev/null @@ -1,99 +0,0 @@ -'use strict' - -const config = require('./config.js') -const errors = require('./errors.js') -const LRU = require('lru-cache') - -module.exports = checkResponse -function checkResponse (method, res, registry, startTime, opts) { - opts = config(opts) - if (res.headers.has('npm-notice') && !res.headers.has('x-local-cache')) { - opts.get('log').notice('', res.headers.get('npm-notice')) - } - checkWarnings(res, registry, opts) - if (res.status >= 400) { - logRequest(method, res, startTime, opts) - return checkErrors(method, res, startTime, opts) - } else { - res.body.on('end', () => logRequest(method, res, startTime, opts)) - return res - } -} - -function logRequest (method, res, startTime, opts) { - const elapsedTime = Date.now() - startTime - const attempt = res.headers.get('x-fetch-attempts') - const attemptStr = attempt && attempt > 1 ? ` attempt #${attempt}` : '' - const cacheStr = res.headers.get('x-local-cache') ? ' (from cache)' : '' - opts.get('log').http( - 'fetch', - `${method.toUpperCase()} ${res.status} ${res.url} ${elapsedTime}ms${attemptStr}${cacheStr}` - ) -} - -const WARNING_REGEXP = /^\s*(\d{3})\s+(\S+)\s+"(.*)"\s+"([^"]+)"/ -const BAD_HOSTS = new LRU({ max: 50 }) - -function checkWarnings (res, registry, opts) { - if (res.headers.has('warning') && !BAD_HOSTS.has(registry)) { - const warnings = {} - res.headers.raw()['warning'].forEach(w => { - const match = w.match(WARNING_REGEXP) - if (match) { - warnings[match[1]] = { - code: match[1], - host: match[2], - message: match[3], - date: new Date(match[4]) - } - } - }) - BAD_HOSTS.set(registry, true) - if (warnings['199']) { - if (warnings['199'].message.match(/ENOTFOUND/)) { - opts.get('log').warn('registry', `Using stale data from ${registry} because the host is inaccessible -- are you offline?`) - } else { - opts.get('log').warn('registry', `Unexpected warning for ${registry}: ${warnings['199'].message}`) - } - } - if (warnings['111']) { - // 111 Revalidation failed -- we're using stale data - opts.get('log').warn( - 'registry', - `Using stale data from ${registry} due to a request error during revalidation.` - ) - } - } -} - -function checkErrors (method, res, startTime, opts) { - return res.buffer() - .catch(() => null) - .then(body => { - try { - body = JSON.parse(body.toString('utf8')) - } catch (e) {} - if (res.status === 401 && res.headers.get('www-authenticate')) { - const auth = res.headers.get('www-authenticate') - .split(/,\s*/) - .map(s => s.toLowerCase()) - if (auth.indexOf('ipaddress') !== -1) { - throw new errors.HttpErrorAuthIPAddress( - method, res, body, opts.spec - ) - } else if (auth.indexOf('otp') !== -1) { - throw new errors.HttpErrorAuthOTP( - method, res, body, opts.spec - ) - } else { - throw new errors.HttpErrorAuthUnknown( - method, res, body, opts.spec - ) - } - } else { - throw new errors.HttpErrorGeneral( - method, res, body, opts.spec - ) - } - }) -} diff --git a/node_modules/libnpmhook/node_modules/npm-registry-fetch/config.js b/node_modules/libnpmhook/node_modules/npm-registry-fetch/config.js deleted file mode 100644 index db08c1e47001f..0000000000000 --- a/node_modules/libnpmhook/node_modules/npm-registry-fetch/config.js +++ /dev/null @@ -1,90 +0,0 @@ -'use strict' - -const pkg = require('./package.json') -const figgyPudding = require('figgy-pudding') -const silentLog = require('./silentlog.js') - -const AUTH_REGEX = /^(?:.*:)?(token|_authToken|username|_password|password|email|always-auth|_auth|otp)$/ -const SCOPE_REGISTRY_REGEX = /@.*:registry$/gi -module.exports = figgyPudding({ - 'agent': {}, - 'algorithms': {}, - 'body': {}, - 'ca': {}, - 'cache': {}, - 'cert': {}, - 'fetch-retries': {}, - 'fetch-retry-factor': {}, - 'fetch-retry-maxtimeout': {}, - 'fetch-retry-mintimeout': {}, - 'gid': {}, - 'headers': {}, - 'https-proxy': {}, - 'integrity': {}, - 'is-from-ci': 'isFromCI', - 'isFromCI': { - default () { - return ( - process.env['CI'] === 'true' || - process.env['TDDIUM'] || - process.env['JENKINS_URL'] || - process.env['bamboo.buildKey'] || - process.env['GO_PIPELINE_NAME'] - ) - } - }, - 'key': {}, - 'local-address': {}, - 'log': { - default: silentLog - }, - 'max-sockets': 'maxsockets', - 'maxsockets': { - default: 12 - }, - 'memoize': {}, - 'method': { - default: 'GET' - }, - 'no-proxy': {}, - 'noproxy': {}, - 'npm-session': 'npmSession', - 'npmSession': {}, - 'offline': {}, - 'otp': {}, - 'prefer-offline': {}, - 'prefer-online': {}, - 'projectScope': {}, - 'project-scope': 'projectScope', - 'Promise': {}, - 'proxy': {}, - 'query': {}, - 'refer': {}, - 'referer': 'refer', - 'registry': { - default: 'https://registry.npmjs.org/' - }, - 'retry': {}, - 'scope': {}, - 'spec': {}, - 'strict-ssl': {}, - 'timeout': {}, - 'uid': {}, - 'user-agent': { - default: `${ - pkg.name - }@${ - pkg.version - }/node@${ - process.version - }+${ - process.arch - } (${ - process.platform - })` - } -}, { - other (key) { - return key.match(AUTH_REGEX) || key.match(SCOPE_REGISTRY_REGEX) - } -}) diff --git a/node_modules/libnpmhook/node_modules/npm-registry-fetch/errors.js b/node_modules/libnpmhook/node_modules/npm-registry-fetch/errors.js deleted file mode 100644 index 217f46f9773a7..0000000000000 --- a/node_modules/libnpmhook/node_modules/npm-registry-fetch/errors.js +++ /dev/null @@ -1,58 +0,0 @@ -'use strict' - -class HttpErrorBase extends Error { - constructor (method, res, body, spec) { - super() - this.headers = res.headers.raw() - this.statusCode = res.status - this.code = `E${res.status}` - this.method = method - this.uri = res.url - this.body = body - } -} -module.exports.HttpErrorBase = HttpErrorBase - -class HttpErrorGeneral extends HttpErrorBase { - constructor (method, res, body, spec) { - super(method, res, body, spec) - this.message = `${res.status} ${res.statusText} - ${ - this.method.toUpperCase() - } ${ - this.spec || this.uri - }${ - (body && body.error) ? ' - ' + body.error : '' - }` - Error.captureStackTrace(this, HttpErrorGeneral) - } -} -module.exports.HttpErrorGeneral = HttpErrorGeneral - -class HttpErrorAuthOTP extends HttpErrorBase { - constructor (method, res, body, spec) { - super(method, res, body, spec) - this.message = 'OTP required for authentication' - this.code = 'EOTP' - Error.captureStackTrace(this, HttpErrorAuthOTP) - } -} -module.exports.HttpErrorAuthOTP = HttpErrorAuthOTP - -class HttpErrorAuthIPAddress extends HttpErrorBase { - constructor (method, res, body, spec) { - super(method, res, body, spec) - this.message = 'Login is not allowed from your IP address' - this.code = 'EAUTHIP' - Error.captureStackTrace(this, HttpErrorAuthIPAddress) - } -} -module.exports.HttpErrorAuthIPAddress = HttpErrorAuthIPAddress - -class HttpErrorAuthUnknown extends HttpErrorBase { - constructor (method, res, body, spec) { - super(method, res, body, spec) - this.message = 'Unable to authenticate, need: ' + res.headers.get('www-authenticate') - Error.captureStackTrace(this, HttpErrorAuthUnknown) - } -} -module.exports.HttpErrorAuthUnknown = HttpErrorAuthUnknown diff --git a/node_modules/libnpmhook/node_modules/npm-registry-fetch/index.js b/node_modules/libnpmhook/node_modules/npm-registry-fetch/index.js deleted file mode 100644 index bb6ddeaee0151..0000000000000 --- a/node_modules/libnpmhook/node_modules/npm-registry-fetch/index.js +++ /dev/null @@ -1,160 +0,0 @@ -'use strict' - -const Buffer = require('safe-buffer').Buffer - -const checkResponse = require('./check-response.js') -const config = require('./config.js') -const getAuth = require('./auth.js') -const fetch = require('make-fetch-happen') -const npa = require('npm-package-arg') -const qs = require('querystring') -const url = require('url') - -module.exports = regFetch -function regFetch (uri, opts) { - opts = config(opts) - const registry = ( - (opts.get('spec') && pickRegistry(opts.get('spec'), opts)) || - opts.get('registry') || - 'https://registry.npmjs.org/' - ) - uri = url.parse(uri).protocol - ? uri - : `${ - registry.trim().replace(/\/?$/g, '') - }/${ - uri.trim().replace(/^\//, '') - }` - // through that takes into account the scope, the prefix of `uri`, etc - const startTime = Date.now() - const headers = getHeaders(registry, uri, opts) - let body = opts.get('body') - const bodyIsStream = body && - typeof body === 'object' && - typeof body.pipe === 'function' - if (body && !bodyIsStream && typeof body !== 'string' && !Buffer.isBuffer(body)) { - headers['content-type'] = headers['content-type'] || 'application/json' - body = JSON.stringify(body) - } else if (body && !headers['content-type']) { - headers['content-type'] = 'application/octet-stream' - } - if (opts.get('query')) { - let q = opts.get('query') - if (typeof q === 'string') { - q = qs.parse(q) - } - const parsed = url.parse(uri) - parsed.search = '?' + qs.stringify( - parsed.query - ? Object.assign(qs.parse(parsed.query), q) - : q - ) - uri = url.format(parsed) - } - return fetch(uri, { - agent: opts.get('agent'), - algorithms: opts.get('algorithms'), - body, - cache: getCacheMode(opts), - cacheManager: opts.get('cache'), - ca: opts.get('ca'), - cert: opts.get('cert'), - headers, - integrity: opts.get('integrity'), - key: opts.get('key'), - localAddress: opts.get('local-address'), - maxSockets: opts.get('maxsockets'), - memoize: opts.get('memoize'), - method: opts.get('method') || 'GET', - noProxy: opts.get('no-proxy') || opts.get('noproxy'), - Promise: opts.get('Promise'), - proxy: opts.get('https-proxy') || opts.get('proxy'), - referer: opts.get('refer'), - retry: opts.get('retry') || { - retries: opts.get('fetch-retries'), - factor: opts.get('fetch-retry-factor'), - minTimeout: opts.get('fetch-retry-mintimeout'), - maxTimeout: opts.get('fetch-retry-maxtimeout') - }, - strictSSL: !!opts.get('strict-ssl'), - timeout: opts.get('timeout'), - uid: opts.get('uid'), - gid: opts.get('gid') - }).then(res => checkResponse( - opts.get('method') || 'GET', res, registry, startTime, opts - )) -} - -module.exports.json = fetchJSON -function fetchJSON (uri, opts) { - return regFetch(uri, opts).then(res => res.json()) -} - -module.exports.pickRegistry = pickRegistry -function pickRegistry (spec, opts) { - spec = npa(spec) - opts = config(opts) - let registry = spec.scope && - opts.get(spec.scope.replace(/^@?/, '@') + ':registry') - - if (!registry && opts.get('scope')) { - registry = opts.get( - opts.get('scope').replace(/^@?/, '@') + ':registry' - ) - } - - if (!registry) { - registry = opts.get('registry') || 'https://registry.npmjs.org/' - } - - return registry -} - -function getCacheMode (opts) { - return opts.get('offline') - ? 'only-if-cached' - : opts.get('prefer-offline') - ? 'force-cache' - : opts.get('prefer-online') - ? 'no-cache' - : 'default' -} - -function getHeaders (registry, uri, opts) { - const headers = Object.assign({ - 'npm-in-ci': !!( - opts.get('is-from-ci') || - process.env['CI'] === 'true' || - process.env['TDDIUM'] || - process.env['JENKINS_URL'] || - process.env['bamboo.buildKey'] || - process.env['GO_PIPELINE_NAME'] - ), - 'npm-scope': opts.get('project-scope'), - 'npm-session': opts.get('npm-session'), - 'user-agent': opts.get('user-agent'), - 'referer': opts.get('refer') - }, opts.get('headers')) - - const auth = getAuth(registry, opts) - // If a tarball is hosted on a different place than the manifest, only send - // credentials on `alwaysAuth` - const shouldAuth = ( - auth.alwaysAuth || - url.parse(uri).host === url.parse(registry).host - ) - if (shouldAuth && auth.token) { - headers.authorization = `Bearer ${auth.token}` - } else if (shouldAuth && auth.username && auth.password) { - const encoded = Buffer.from( - `${auth.username}:${auth.password}`, 'utf8' - ).toString('base64') - headers.authorization = `Basic ${encoded}` - } else if (shouldAuth && auth._auth) { - headers.authorization = `Basic ${auth._auth}` - } - if (shouldAuth && auth.otp) { - headers['npm-otp'] = auth.otp - } - return headers -} diff --git a/node_modules/libnpmhook/node_modules/npm-registry-fetch/package.json b/node_modules/libnpmhook/node_modules/npm-registry-fetch/package.json deleted file mode 100644 index f17636c6cf5e4..0000000000000 --- a/node_modules/libnpmhook/node_modules/npm-registry-fetch/package.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "_from": "npm-registry-fetch@^3.0.0", - "_id": "npm-registry-fetch@3.1.1", - "_inBundle": false, - "_integrity": "sha512-xBobENeenvjIG8PgQ1dy77AXTI25IbYhmA3DusMIfw/4EL5BaQ5e1V9trkPrqHvyjR3/T0cnH6o0Wt/IzcI5Ag==", - "_location": "/libnpmhook/npm-registry-fetch", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "npm-registry-fetch@^3.0.0", - "name": "npm-registry-fetch", - "escapedName": "npm-registry-fetch", - "rawSpec": "^3.0.0", - "saveSpec": null, - "fetchSpec": "^3.0.0" - }, - "_requiredBy": [ - "/libnpmhook" - ], - "_resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.1.1.tgz", - "_shasum": "e96bae698afdd45d4a01aca29e881fc0bc55206c", - "_spec": "npm-registry-fetch@^3.0.0", - "_where": "/Users/rebecca/code/npm/node_modules/libnpmhook", - "author": { - "name": "Kat Marchán", - "email": "kzm@sykosomatic.org" - }, - "bugs": { - "url": "https://github.com/npm/registry-fetch/issues" - }, - "bundleDependencies": false, - "config": { - "nyc": { - "exclude": [ - "node_modules/**", - "test/**" - ] - } - }, - "dependencies": { - "bluebird": "^3.5.1", - "figgy-pudding": "^3.1.0", - "lru-cache": "^4.1.2", - "make-fetch-happen": "^4.0.0", - "npm-package-arg": "^6.0.0" - }, - "deprecated": false, - "description": "Fetch-based http client for use with npm registry APIs", - "devDependencies": { - "cacache": "^11.0.0", - "mkdirp": "^0.5.1", - "nock": "^9.2.3", - "npmlog": "^4.1.2", - "rimraf": "^2.6.2", - "ssri": "^6.0.0", - "standard": "^11.0.1", - "standard-version": "^4.2.0", - "tap": "^11.1.3", - "weallbehave": "^1.2.0", - "weallcontribute": "^1.0.8" - }, - "files": [ - "*.js", - "lib" - ], - "homepage": "https://github.com/npm/registry-fetch#readme", - "keywords": [ - "npm", - "registry", - "fetch" - ], - "license": "ISC", - "main": "index.js", - "name": "npm-registry-fetch", - "repository": { - "type": "git", - "url": "git+https://github.com/npm/registry-fetch.git" - }, - "scripts": { - "postrelease": "npm publish && git push --follow-tags", - "prerelease": "npm t", - "pretest": "standard", - "release": "standard-version -s", - "test": "tap -J --coverage test/*.js", - "update-coc": "weallbehave -o . && git add CODE_OF_CONDUCT.md && git commit -m 'docs(coc): updated CODE_OF_CONDUCT.md'", - "update-contrib": "weallcontribute -o . && git add CONTRIBUTING.md && git commit -m 'docs(contributing): updated CONTRIBUTING.md'" - }, - "version": "3.1.1" -} diff --git a/node_modules/libnpmhook/node_modules/npm-registry-fetch/silentlog.js b/node_modules/libnpmhook/node_modules/npm-registry-fetch/silentlog.js deleted file mode 100644 index 886c5d55b2dbb..0000000000000 --- a/node_modules/libnpmhook/node_modules/npm-registry-fetch/silentlog.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict' - -const noop = Function.prototype -module.exports = { - error: noop, - warn: noop, - notice: noop, - info: noop, - verbose: noop, - silly: noop, - http: noop, - pause: noop, - resume: noop -} diff --git a/node_modules/libnpmhook/package.json b/node_modules/libnpmhook/package.json index 2f06e7a6b53bf..84839475be2eb 100644 --- a/node_modules/libnpmhook/package.json +++ b/node_modules/libnpmhook/package.json @@ -1,22 +1,10 @@ { - "_args": [ - [ - "libnpmhook@4.0.1", - "/Users/rebecca/code/npm" - ] - ], "_from": "libnpmhook@4.0.1", "_id": "libnpmhook@4.0.1", "_inBundle": false, "_integrity": "sha512-3qqpfqvBD1712WA6iGe0stkG40WwAeoWcujA6BlC0Be1JArQbqwabnEnZ0CRcD05Tf1fPYJYdCbSfcfedEJCOg==", "_location": "/libnpmhook", - "_phantomChildren": { - "bluebird": "3.5.1", - "figgy-pudding": "3.1.0", - "lru-cache": "4.1.3", - "make-fetch-happen": "4.0.1", - "npm-package-arg": "6.1.0" - }, + "_phantomChildren": {}, "_requested": { "type": "version", "registry": true, @@ -28,11 +16,13 @@ "fetchSpec": "4.0.1" }, "_requiredBy": [ + "#USER", "/" ], "_resolved": "https://registry.npmjs.org/libnpmhook/-/libnpmhook-4.0.1.tgz", - "_spec": "4.0.1", - "_where": "/Users/rebecca/code/npm", + "_shasum": "63641654de772cbeb96a88527a7fd5456ec3c2d7", + "_spec": "libnpmhook@4.0.1", + "_where": "/Users/zkat/Documents/code/work/npm", "author": { "name": "Kat Marchán", "email": "kzm@sykosomatic.org" @@ -40,10 +30,12 @@ "bugs": { "url": "https://github.com/npm/libnpmhook/issues" }, + "bundleDependencies": false, "dependencies": { "figgy-pudding": "^3.1.0", "npm-registry-fetch": "^3.0.0" }, + "deprecated": false, "description": "programmatic API for managing npm registry hooks", "devDependencies": { "nock": "^9.2.3", diff --git a/node_modules/npm-registry-fetch/CHANGELOG.md b/node_modules/npm-registry-fetch/CHANGELOG.md index 05d5741ee8b6d..71232eff75c0e 100644 --- a/node_modules/npm-registry-fetch/CHANGELOG.md +++ b/node_modules/npm-registry-fetch/CHANGELOG.md @@ -2,6 +2,162 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +# [3.8.0](https://github.com/npm/registry-fetch/compare/v3.7.0...v3.8.0) (2018-08-23) + + +### Features + +* **mapJson:** add support for passing in json stream mapper ([0600986](https://github.com/npm/registry-fetch/commit/0600986)) + + + + +# [3.7.0](https://github.com/npm/registry-fetch/compare/v3.6.0...v3.7.0) (2018-08-23) + + +### Features + +* **json.stream:** add utility function for streamed JSON parsing ([051d969](https://github.com/npm/registry-fetch/commit/051d969)) + + + + +# [3.6.0](https://github.com/npm/registry-fetch/compare/v3.5.0...v3.6.0) (2018-08-22) + + +### Bug Fixes + +* **docs:** document opts.forceAuth ([40bcd65](https://github.com/npm/registry-fetch/commit/40bcd65)) + + +### Features + +* **opts.ignoreBody:** add a boolean to throw away response bodies ([6923702](https://github.com/npm/registry-fetch/commit/6923702)) + + + + +# [3.5.0](https://github.com/npm/registry-fetch/compare/v3.4.0...v3.5.0) (2018-08-22) + + +### Features + +* **pkgid:** heuristic pkgid calculation for errors ([2e789a5](https://github.com/npm/registry-fetch/commit/2e789a5)) + + + + +# [3.4.0](https://github.com/npm/registry-fetch/compare/v3.3.0...v3.4.0) (2018-08-22) + + +### Bug Fixes + +* **deps:** use new figgy-pudding with aliases fix ([0308f54](https://github.com/npm/registry-fetch/commit/0308f54)) + + +### Features + +* **auth:** add forceAuth option to force a specific auth mechanism ([4524d17](https://github.com/npm/registry-fetch/commit/4524d17)) + + + + +# [3.3.0](https://github.com/npm/registry-fetch/compare/v3.2.1...v3.3.0) (2018-08-21) + + +### Bug Fixes + +* **query:** stop including undefined keys ([4718b1b](https://github.com/npm/registry-fetch/commit/4718b1b)) + + +### Features + +* **otp:** use heuristic detection for malformed EOTP responses ([f035194](https://github.com/npm/registry-fetch/commit/f035194)) + + + + +## [3.2.1](https://github.com/npm/registry-fetch/compare/v3.2.0...v3.2.1) (2018-08-16) + + +### Bug Fixes + +* **opts:** pass through non-null opts.retry ([beba040](https://github.com/npm/registry-fetch/commit/beba040)) + + + + +# [3.2.0](https://github.com/npm/registry-fetch/compare/v3.1.1...v3.2.0) (2018-07-27) + + +### Features + +* **gzip:** add opts.gzip convenience opt ([340abe0](https://github.com/npm/registry-fetch/commit/340abe0)) + + + + +## [3.1.1](https://github.com/npm/registry-fetch/compare/v3.1.0...v3.1.1) (2018-04-09) + + + + +# [3.1.0](https://github.com/npm/registry-fetch/compare/v3.0.0...v3.1.0) (2018-04-09) + + +### Features + +* **config:** support no-proxy and https-proxy options ([9aa906b](https://github.com/npm/registry-fetch/commit/9aa906b)) + + + + +# [3.0.0](https://github.com/npm/registry-fetch/compare/v2.1.0...v3.0.0) (2018-04-09) + + +### Bug Fixes + +* **api:** pacote integration-related fixes ([a29de4f](https://github.com/npm/registry-fetch/commit/a29de4f)) +* **config:** stop caring about opts.config ([5856a6f](https://github.com/npm/registry-fetch/commit/5856a6f)) + + +### BREAKING CHANGES + +* **config:** opts.config is no longer supported. Pass the options down in opts itself. + + + + +# [2.1.0](https://github.com/npm/registry-fetch/compare/v2.0.0...v2.1.0) (2018-04-08) + + +### Features + +* **token:** accept opts.token for opts._authToken ([108c9f0](https://github.com/npm/registry-fetch/commit/108c9f0)) + + + + +# [2.0.0](https://github.com/npm/registry-fetch/compare/v1.1.1...v2.0.0) (2018-04-08) + + +### meta + +* drop support for node@4 ([758536e](https://github.com/npm/registry-fetch/commit/758536e)) + + +### BREAKING CHANGES + +* node@4 is no longer supported + + + + +## [1.1.1](https://github.com/npm/registry-fetch/compare/v1.1.0...v1.1.1) (2018-04-06) + + + # [1.1.0](https://github.com/npm/registry-fetch/compare/v1.0.1...v1.1.0) (2018-03-16) diff --git a/node_modules/npm-registry-fetch/README.md b/node_modules/npm-registry-fetch/README.md index 4947dc891fe1a..0c3f4f9469955 100644 --- a/node_modules/npm-registry-fetch/README.md +++ b/node_modules/npm-registry-fetch/README.md @@ -82,27 +82,33 @@ const res = await fetch.json('/-/ping') console.log(res) // Body parsed as JSON ``` -#### `fetch` Options +#### `> fetch.json.stream(url, jsonPath, [opts]) -> Stream` -Fetch options are optional, and can be passed in as either a Map-like object -(one with a `.get()` method), a plain javascript object, or a -[`figgy-pudding`](https://npm.im/figgy-pudding) instance. +Performs a request to a given registry URL and parses the body of the response +as JSON, with each entry being emitted through the stream. -##### `opts._authToken` - -* Type: String -* Default: null +The `jsonPath` argument is a [`JSONStream.parse()` +path](https://github.com/dominictarr/JSONStream#jsonstreamparsepath), and the +returned stream (unlike default `JSONStream`s), has a valid +`Symbol.asyncIterator` implementation. -Authentication token string. +For available options, please see the section on [`fetch` options](#fetch-opts). -Can be scoped to a registry by using a "nerf dart" for that registry. That is: +##### Example -``` -{ - '//registry.npmjs.org/:_authToken': 't0k3nH34r' +```javascript +console.log('https://npm.im/~zkat has access to the following packages:') +for await (let {key, value} of fetch.json.stream('/-/user/zkat/package', '$*')) { + console.log(`https://npm.im/${key} (perms: ${value})`) } ``` +#### `fetch` Options + +Fetch options are optional, and can be passed in as either a Map-like object +(one with a `.get()` method), a plain javascript object, or a +[`figgy-pudding`](https://npm.im/figgy-pudding) instance. + ##### `opts.agent` * Type: http.Agent @@ -229,6 +235,25 @@ packages. See also [`opts.retry`](#opts-retry) to provide all retry options as a single object. +##### `opts.force-auth` + +* Alias: `opts.forceAuth` +* Type: Object +* Default: null + +If present, other auth-related values in `opts` will be completely ignored, +including `alwaysAuth`, `email`, and `otp`, when calculating auth for a request, +and the auth details in `opts.forceAuth` will be used instead. + +##### `opts.gzip` + +* Type: Boolean +* Default: false + +If true, `npm-registry-fetch` will set the `Content-Encoding` header to `gzip` +and use `zlib.gzip()` or `zlib.createGzip()` to gzip-encode +[`opts.body`](#opts-body). + ##### `opts.headers` * Type: Object @@ -238,6 +263,16 @@ Additional headers for the outgoing request. This option can also be used to override headers automatically generated by `npm-registry-fetch`, such as `Content-Type`. +##### `opts.ignore-body` + +* Alias: `opts.ignoreBody` +* Type: Boolean +* Default: false + +If true, the **response body** will be thrown away and `res.body` set to `null`. +This will prevent dangling response sockets for requests where you don't usually +care what the response body is. + ##### `opts.integrity` * Type: String | [SRI object](https://npm.im/ssri) @@ -301,6 +336,16 @@ See also [`opts.proxy`](#opts-proxy) Logger object to use for logging operation details. Must have the same methods as `npmlog`. +##### `opts.map-json` + +* Alias: `mapJson`, `mapJSON` +* Type: Function +* Default: undefined + +When using `fetch.json.stream()` (NOT `fetch.json()`), this will be passed down +to [`JSONStream`](https://npm.im/JSONStream) as the second argument to +`JSONStream.parse`, and can be used to transform stream data before output. + ##### `opts.maxsockets` * Alias: `opts.max-sockets` @@ -362,7 +407,7 @@ account. * Default: null Password used for basic authentication. For the more modern authentication -method, please use the (more secure) [`opts._authToken`](#opts-auth-token) +method, please use the (more secure) [`opts.token`](#opts-token) Can optionally be scoped to a registry by using a "nerf dart" for that registry. That is: @@ -513,6 +558,22 @@ See also [`opts.ca`](#opts-ca). Time before a hanging request times out. +##### `opts.token` + +* Alias: `opts._authToken` +* Type: String +* Default: null + +Authentication token string. + +Can be scoped to a registry by using a "nerf dart" for that registry. That is: + +``` +{ + '//registry.npmjs.org/:token': 't0k3nH34r' +} +``` + ##### `opts.user-agent` * Type: String @@ -526,7 +587,7 @@ User agent string to send in the `User-Agent` header. * Default: null Username used for basic authentication. For the more modern authentication -method, please use the (more secure) [`opts._authToken`](#opts-auth-token) +method, please use the (more secure) [`opts.token`](#opts-token) Can optionally be scoped to a registry by using a "nerf dart" for that registry. That is: @@ -545,4 +606,4 @@ See also [`opts.password`](#opts-password) * Default: null ** DEPRECATED ** This is a legacy authentication token supported only for -*compatibility. Please us [`opts._authToken`](#opts-auth-token) instead. +*compatibility. Please use [`opts.token`](#opts-token) instead. diff --git a/node_modules/npm-registry-fetch/auth.js b/node_modules/npm-registry-fetch/auth.js index f4f7316db1af8..fa696b97ddee5 100644 --- a/node_modules/npm-registry-fetch/auth.js +++ b/node_modules/npm-registry-fetch/auth.js @@ -9,7 +9,11 @@ function getAuth (registry, opts) { opts = config(opts) let AUTH = {} const regKey = registry && registryKey(registry) + if (opts.forceAuth) { + opts = opts.forceAuth + } const doKey = (key, alias) => addKey(opts, AUTH, regKey, key, alias) + doKey('token') doKey('_authToken', 'token') doKey('username') doKey('password') @@ -26,11 +30,11 @@ function getAuth (registry, opts) { } function addKey (opts, obj, scope, key, objKey) { - if (opts.get(key)) { - obj[objKey || key] = opts.get(key) + if (opts[key]) { + obj[objKey || key] = opts[key] } - if (scope && opts.get(`${scope}:${key}`)) { - obj[objKey || key] = opts.get(`${scope}:${key}`) + if (scope && opts[`${scope}:${key}`]) { + obj[objKey || key] = opts[`${scope}:${key}`] } } diff --git a/node_modules/npm-registry-fetch/check-response.js b/node_modules/npm-registry-fetch/check-response.js index 407a80e4ce38a..bfde699edcfbd 100644 --- a/node_modules/npm-registry-fetch/check-response.js +++ b/node_modules/npm-registry-fetch/check-response.js @@ -8,7 +8,7 @@ module.exports = checkResponse function checkResponse (method, res, registry, startTime, opts) { opts = config(opts) if (res.headers.has('npm-notice') && !res.headers.has('x-local-cache')) { - opts.get('log').notice('', res.headers.get('npm-notice')) + opts.log.notice('', res.headers.get('npm-notice')) } checkWarnings(res, registry, opts) if (res.status >= 400) { @@ -16,6 +16,10 @@ function checkResponse (method, res, registry, startTime, opts) { return checkErrors(method, res, startTime, opts) } else { res.body.on('end', () => logRequest(method, res, startTime, opts)) + if (opts.ignoreBody) { + res.body.resume() + res.body = null + } return res } } @@ -25,7 +29,7 @@ function logRequest (method, res, startTime, opts) { const attempt = res.headers.get('x-fetch-attempts') const attemptStr = attempt && attempt > 1 ? ` attempt #${attempt}` : '' const cacheStr = res.headers.get('x-local-cache') ? ' (from cache)' : '' - opts.get('log').http( + opts.log.http( 'fetch', `${method.toUpperCase()} ${res.status} ${res.url} ${elapsedTime}ms${attemptStr}${cacheStr}` ) @@ -51,14 +55,14 @@ function checkWarnings (res, registry, opts) { BAD_HOSTS.set(registry, true) if (warnings['199']) { if (warnings['199'].message.match(/ENOTFOUND/)) { - opts.get('log').warn('registry', `Using stale data from ${registry} because the host is inaccessible -- are you offline?`) + opts.log.warn('registry', `Using stale data from ${registry} because the host is inaccessible -- are you offline?`) } else { - opts.get('log').warn('registry', `Unexpected warning for ${registry}: ${warnings['199'].message}`) + opts.log.warn('registry', `Unexpected warning for ${registry}: ${warnings['199'].message}`) } } if (warnings['111']) { // 111 Revalidation failed -- we're using stale data - opts.get('log').warn( + opts.log.warn( 'registry', `Using stale data from ${registry} due to a request error during revalidation.` ) @@ -70,8 +74,9 @@ function checkErrors (method, res, startTime, opts) { return res.buffer() .catch(() => null) .then(body => { + let parsed = body try { - body = JSON.parse(body.toString('utf8')) + parsed = JSON.parse(body.toString('utf8')) } catch (e) {} if (res.status === 401 && res.headers.get('www-authenticate')) { const auth = res.headers.get('www-authenticate') @@ -79,20 +84,25 @@ function checkErrors (method, res, startTime, opts) { .map(s => s.toLowerCase()) if (auth.indexOf('ipaddress') !== -1) { throw new errors.HttpErrorAuthIPAddress( - method, res, body, opts.spec + method, res, parsed, opts.spec ) } else if (auth.indexOf('otp') !== -1) { throw new errors.HttpErrorAuthOTP( - method, res, body, opts.spec + method, res, parsed, opts.spec ) } else { throw new errors.HttpErrorAuthUnknown( - method, res, body, opts.spec + method, res, parsed, opts.spec ) } + } else if (res.status === 401 && /one-time pass/.test(body.toString('utf8'))) { + // Heuristic for malformed OTP responses that don't include the www-authenticate header. + throw new errors.HttpErrorAuthOTP( + method, res, parsed, opts.spec + ) } else { throw new errors.HttpErrorGeneral( - method, res, body, opts.spec + method, res, parsed, opts.spec ) } }) diff --git a/node_modules/npm-registry-fetch/config.js b/node_modules/npm-registry-fetch/config.js index 6249f66e05bb1..7fe5dacc94362 100644 --- a/node_modules/npm-registry-fetch/config.js +++ b/node_modules/npm-registry-fetch/config.js @@ -1,12 +1,12 @@ 'use strict' const pkg = require('./package.json') -const pudding = require('figgy-pudding') +const figgyPudding = require('figgy-pudding') const silentLog = require('./silentlog.js') -const AUTH_REGEX = /^(?:.*:)?(_authToken|username|_password|password|email|always-auth|_auth|otp)$/ +const AUTH_REGEX = /^(?:.*:)?(token|_authToken|username|_password|password|email|always-auth|_auth|otp)$/ const SCOPE_REGISTRY_REGEX = /@.*:registry$/gi -const RegFetchConfig = pudding({ +module.exports = figgyPudding({ 'agent': {}, 'algorithms': {}, 'body': {}, @@ -17,8 +17,14 @@ const RegFetchConfig = pudding({ 'fetch-retry-factor': {}, 'fetch-retry-maxtimeout': {}, 'fetch-retry-mintimeout': {}, + 'force-auth': {}, + forceAuth: 'force-auth', 'gid': {}, + 'gzip': {}, 'headers': {}, + 'https-proxy': {}, + 'ignore-body': {}, + ignoreBody: 'ignore-body', 'integrity': {}, 'is-from-ci': 'isFromCI', 'isFromCI': { @@ -37,6 +43,9 @@ const RegFetchConfig = pudding({ 'log': { default: silentLog }, + 'map-json': 'mapJson', + 'mapJSON': 'mapJson', + 'mapJson': {}, 'max-sockets': 'maxsockets', 'maxsockets': { default: 12 @@ -45,6 +54,7 @@ const RegFetchConfig = pudding({ 'method': { default: 'GET' }, + 'no-proxy': {}, 'noproxy': {}, 'npm-session': 'npmSession', 'npmSession': {}, @@ -54,7 +64,7 @@ const RegFetchConfig = pudding({ 'prefer-online': {}, 'projectScope': {}, 'project-scope': 'projectScope', - 'Promise': {}, + 'Promise': {default: () => Promise}, 'proxy': {}, 'query': {}, 'refer': {}, @@ -86,9 +96,3 @@ const RegFetchConfig = pudding({ return key.match(AUTH_REGEX) || key.match(SCOPE_REGISTRY_REGEX) } }) - -module.exports = config -function config (opts) { - opts = opts || {} - return RegFetchConfig(opts, opts.config) -} diff --git a/node_modules/npm-registry-fetch/errors.js b/node_modules/npm-registry-fetch/errors.js index 217f46f9773a7..ba78735fce135 100644 --- a/node_modules/npm-registry-fetch/errors.js +++ b/node_modules/npm-registry-fetch/errors.js @@ -1,5 +1,25 @@ 'use strict' +const url = require('url') + +function packageName (href) { + try { + let basePath = url.parse(href).pathname.substr(1) + if (!basePath.match(/^-/)) { + basePath = basePath.split('/') + var index = basePath.indexOf('_rewrite') + if (index === -1) { + index = basePath.length - 1 + } else { + index++ + } + return decodeURIComponent(basePath[index]) + } + } catch (_) { + // this is ok + } +} + class HttpErrorBase extends Error { constructor (method, res, body, spec) { super() @@ -9,6 +29,7 @@ class HttpErrorBase extends Error { this.method = method this.uri = res.url this.body = body + this.pkgid = spec ? spec.toString() : packageName(res.url) } } module.exports.HttpErrorBase = HttpErrorBase diff --git a/node_modules/npm-registry-fetch/index.js b/node_modules/npm-registry-fetch/index.js index cf6e8d3bf39bf..4ba3c19243471 100644 --- a/node_modules/npm-registry-fetch/index.js +++ b/node_modules/npm-registry-fetch/index.js @@ -6,19 +6,19 @@ const checkResponse = require('./check-response.js') const config = require('./config.js') const getAuth = require('./auth.js') const fetch = require('make-fetch-happen') +const JSONStream = require('JSONStream') const npa = require('npm-package-arg') +const {PassThrough} = require('stream') const qs = require('querystring') -const silentLog = require('./silentlog.js') const url = require('url') +const zlib = require('zlib') module.exports = regFetch function regFetch (uri, opts) { - opts = config(Object.assign({ - log: silentLog - }, opts)) + opts = config(opts) const registry = ( - (opts.get('spec') && pickRegistry(opts.get('spec'), opts)) || - opts.get('registry') || + (opts.spec && pickRegistry(opts.spec, opts)) || + opts.registry || 'https://registry.npmjs.org/' ) uri = url.parse(uri).protocol @@ -31,7 +31,7 @@ function regFetch (uri, opts) { // through that takes into account the scope, the prefix of `uri`, etc const startTime = Date.now() const headers = getHeaders(registry, uri, opts) - let body = opts.get('body') + let body = opts.body const bodyIsStream = body && typeof body === 'object' && typeof body.pipe === 'function' @@ -41,51 +41,70 @@ function regFetch (uri, opts) { } else if (body && !headers['content-type']) { headers['content-type'] = 'application/octet-stream' } - if (opts.get('query')) { - let q = opts.get('query') + if (opts.gzip) { + headers['content-encoding'] = 'gzip' + if (bodyIsStream) { + const gz = zlib.createGzip() + body.on('error', err => gz.emit('error', err)) + body = body.pipe(gz) + } else { + body = new opts.Promise((resolve, reject) => { + zlib.gzip(body, (err, gz) => err ? reject(err) : resolve(gz)) + }) + } + } + if (opts.query) { + let q = opts.query if (typeof q === 'string') { q = qs.parse(q) } - const parsed = url.parse(uri) - parsed.search = '?' + qs.stringify( - parsed.query - ? Object.assign(qs.parse(parsed.query), q) - : q - ) - uri = url.format(parsed) + Object.keys(q).forEach(key => { + if (q[key] === undefined) { + delete q[key] + } + }) + if (Object.keys(q).length) { + const parsed = url.parse(uri) + parsed.search = '?' + qs.stringify( + parsed.query + ? Object.assign(qs.parse(parsed.query), q) + : q + ) + uri = url.format(parsed) + } } - return fetch(uri, { - agent: opts.get('agent'), - algorithms: opts.get('algorithms'), + return opts.Promise.resolve(body).then(body => fetch(uri, { + agent: opts.agent, + algorithms: opts.algorithms, body, cache: getCacheMode(opts), - cacheManager: opts.get('cache'), - ca: opts.get('ca'), - cert: opts.get('cert'), + cacheManager: opts.cache, + ca: opts.ca, + cert: opts.cert, headers, - integrity: opts.get('integrity'), - key: opts.get('key'), - localAddress: opts.get('local-address'), - maxSockets: opts.get('maxsockets'), - memoize: opts.get('memoize'), - method: opts.get('method') || 'GET', - noProxy: opts.get('noproxy'), - Promise: opts.get('Promise'), - proxy: opts.get('proxy'), - referer: opts.get('refer'), - retry: opts.get('retry') || { - retries: opts.get('fetch-retries'), - factor: opts.get('fetch-retry-factor'), - minTimeout: opts.get('fetch-retry-mintimeout'), - maxTimeout: opts.get('fetch-retry-maxtimeout') + integrity: opts.integrity, + key: opts.key, + localAddress: opts['local-address'], + maxSockets: opts.maxsockets, + memoize: opts.memoize, + method: opts.method || 'GET', + noProxy: opts['no-proxy'] || opts.noproxy, + Promise: opts.Promise, + proxy: opts['https-proxy'] || opts.proxy, + referer: opts.refer, + retry: opts.retry != null ? opts.retry : { + retries: opts['fetch-retries'], + factor: opts['fetch-retry-factor'], + minTimeout: opts['fetch-retry-mintimeout'], + maxTimeout: opts['fetch-retry-maxtimeout'] }, - strictSSL: !!opts.get('strict-ssl'), - timeout: opts.get('timeout'), - uid: opts.get('uid'), - gid: opts.get('gid') + strictSSL: !!opts['strict-ssl'], + timeout: opts.timeout, + uid: opts.uid, + gid: opts.gid }).then(res => checkResponse( - opts.get('method') || 'GET', res, registry, startTime, opts - )) + opts.method || 'GET', res, registry, startTime, opts + ))) } module.exports.json = fetchJSON @@ -93,35 +112,43 @@ function fetchJSON (uri, opts) { return regFetch(uri, opts).then(res => res.json()) } +module.exports.json.stream = fetchJSONStream +function fetchJSONStream (uri, jsonPath, opts) { + opts = config(opts) + const parser = JSONStream.parse(jsonPath, opts.mapJson) + const pt = parser.pipe(new PassThrough({objectMode: true})) + parser.on('error', err => pt.emit('error', err)) + regFetch(uri, opts).then(res => { + res.body.on('error', err => parser.emit('error', err)) + res.body.pipe(parser) + }, err => pt.emit('error', err)) + return pt +} + module.exports.pickRegistry = pickRegistry function pickRegistry (spec, opts) { spec = npa(spec) opts = config(opts) - if (!spec.registry) { - throw new Error(`${spec} is not a valid registry dependency spec`) - } let registry = spec.scope && - opts.get(spec.scope.replace(/^@?/, '@') + ':registry') + opts[spec.scope.replace(/^@?/, '@') + ':registry'] - if (!registry && opts.get('scope')) { - registry = opts.get( - opts.get('scope').replace(/^@?/, '@') + ':registry' - ) + if (!registry && opts.scope) { + registry = opts[opts.scope.replace(/^@?/, '@') + ':registry'] } if (!registry) { - registry = opts.get('registry') || 'https://registry.npmjs.org/' + registry = opts.registry || 'https://registry.npmjs.org/' } return registry } function getCacheMode (opts) { - return opts.get('offline') + return opts.offline ? 'only-if-cached' - : opts.get('prefer-offline') + : opts['prefer-offline'] ? 'force-cache' - : opts.get('prefer-online') + : opts['prefer-online'] ? 'no-cache' : 'default' } @@ -129,18 +156,18 @@ function getCacheMode (opts) { function getHeaders (registry, uri, opts) { const headers = Object.assign({ 'npm-in-ci': !!( - opts.get('is-from-ci') || + opts['is-from-ci'] || process.env['CI'] === 'true' || process.env['TDDIUM'] || process.env['JENKINS_URL'] || process.env['bamboo.buildKey'] || process.env['GO_PIPELINE_NAME'] ), - 'npm-scope': opts.get('project-scope'), - 'npm-session': opts.get('npm-session'), - 'user-agent': opts.get('user-agent'), - 'referer': opts.get('refer') - }, opts.get('headers')) + 'npm-scope': opts['project-scope'], + 'npm-session': opts['npm-session'], + 'user-agent': opts['user-agent'], + 'referer': opts.refer + }, opts.headers) const auth = getAuth(registry, opts) // If a tarball is hosted on a different place than the manifest, only send diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/CHANGELOG.md b/node_modules/npm-registry-fetch/node_modules/cacache/CHANGELOG.md deleted file mode 100644 index 5c3e7911db3ea..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/CHANGELOG.md +++ /dev/null @@ -1,478 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. - - -## [10.0.4](https://github.com/zkat/cacache/compare/v10.0.3...v10.0.4) (2018-02-16) - - - - -## [10.0.3](https://github.com/zkat/cacache/compare/v10.0.2...v10.0.3) (2018-02-16) - - -### Bug Fixes - -* **content:** rethrow aggregate errors as ENOENT ([fa918f5](https://github.com/zkat/cacache/commit/fa918f5)) - - - - -## [10.0.2](https://github.com/zkat/cacache/compare/v10.0.1...v10.0.2) (2018-01-07) - - -### Bug Fixes - -* **ls:** deleted entries could cause a premature stream EOF ([347dc36](https://github.com/zkat/cacache/commit/347dc36)) - - - - -## [10.0.1](https://github.com/zkat/cacache/compare/v10.0.0...v10.0.1) (2017-11-15) - - -### Bug Fixes - -* **move-file:** actually use the fallback to `move-concurrently` (#110) ([073fbe1](https://github.com/zkat/cacache/commit/073fbe1)) - - - - -# [10.0.0](https://github.com/zkat/cacache/compare/v9.3.0...v10.0.0) (2017-10-23) - - -### Features - -* **license:** relicense to ISC (#111) ([fdbb4e5](https://github.com/zkat/cacache/commit/fdbb4e5)) - - -### Performance Improvements - -* more copyFile benchmarks ([63787bb](https://github.com/zkat/cacache/commit/63787bb)) - - -### BREAKING CHANGES - -* **license:** the license has been changed from CC0-1.0 to ISC. - - - - -# [9.3.0](https://github.com/zkat/cacache/compare/v9.2.9...v9.3.0) (2017-10-07) - - -### Features - -* **copy:** added cacache.get.copy api for fast copies (#107) ([067b5f6](https://github.com/zkat/cacache/commit/067b5f6)) - - - - -## [9.2.9](https://github.com/zkat/cacache/compare/v9.2.8...v9.2.9) (2017-06-17) - - - - -## [9.2.8](https://github.com/zkat/cacache/compare/v9.2.7...v9.2.8) (2017-06-05) - - -### Bug Fixes - -* **ssri:** bump ssri for bugfix ([c3232ea](https://github.com/zkat/cacache/commit/c3232ea)) - - - - -## [9.2.7](https://github.com/zkat/cacache/compare/v9.2.6...v9.2.7) (2017-06-05) - - -### Bug Fixes - -* **content:** make verified content completely read-only (#96) ([4131196](https://github.com/zkat/cacache/commit/4131196)) - - - - -## [9.2.6](https://github.com/zkat/cacache/compare/v9.2.5...v9.2.6) (2017-05-31) - - -### Bug Fixes - -* **node:** update ssri to prevent old node 4 crash ([5209ffe](https://github.com/zkat/cacache/commit/5209ffe)) - - - - -## [9.2.5](https://github.com/zkat/cacache/compare/v9.2.4...v9.2.5) (2017-05-25) - - -### Bug Fixes - -* **deps:** fix lockfile issues and bump ssri ([84e1d7e](https://github.com/zkat/cacache/commit/84e1d7e)) - - - - -## [9.2.4](https://github.com/zkat/cacache/compare/v9.2.3...v9.2.4) (2017-05-24) - - -### Bug Fixes - -* **deps:** bumping deps ([bbccb12](https://github.com/zkat/cacache/commit/bbccb12)) - - - - -## [9.2.3](https://github.com/zkat/cacache/compare/v9.2.2...v9.2.3) (2017-05-24) - - -### Bug Fixes - -* **rm:** stop crashing if content is missing on rm ([ac90bc0](https://github.com/zkat/cacache/commit/ac90bc0)) - - - - -## [9.2.2](https://github.com/zkat/cacache/compare/v9.2.1...v9.2.2) (2017-05-14) - - -### Bug Fixes - -* **i18n:** lets pretend this didn't happen ([519b4ee](https://github.com/zkat/cacache/commit/519b4ee)) - - - - -## [9.2.1](https://github.com/zkat/cacache/compare/v9.2.0...v9.2.1) (2017-05-14) - - -### Bug Fixes - -* **docs:** fixing translation messup ([bb9e4f9](https://github.com/zkat/cacache/commit/bb9e4f9)) - - - - -# [9.2.0](https://github.com/zkat/cacache/compare/v9.1.0...v9.2.0) (2017-05-14) - - -### Features - -* **i18n:** add Spanish translation for API ([531f9a4](https://github.com/zkat/cacache/commit/531f9a4)) - - - - -# [9.1.0](https://github.com/zkat/cacache/compare/v9.0.0...v9.1.0) (2017-05-14) - - -### Features - -* **i18n:** Add Spanish translation and i18n setup (#91) ([323b90c](https://github.com/zkat/cacache/commit/323b90c)) - - - - -# [9.0.0](https://github.com/zkat/cacache/compare/v8.0.0...v9.0.0) (2017-04-28) - - -### Bug Fixes - -* **memoization:** actually use the LRU ([0e55dc9](https://github.com/zkat/cacache/commit/0e55dc9)) - - -### Features - -* **memoization:** memoizers can be injected through opts.memoize (#90) ([e5614c7](https://github.com/zkat/cacache/commit/e5614c7)) - - -### BREAKING CHANGES - -* **memoization:** If you were passing an object to opts.memoize, it will now be used as an injected memoization object. If you were only passing booleans and other non-objects through that option, no changes are needed. - - - - -# [8.0.0](https://github.com/zkat/cacache/compare/v7.1.0...v8.0.0) (2017-04-22) - - -### Features - -* **read:** change hasContent to return {sri, size} (#88) ([bad6c49](https://github.com/zkat/cacache/commit/bad6c49)), closes [#87](https://github.com/zkat/cacache/issues/87) - - -### BREAKING CHANGES - -* **read:** hasContent now returns an object with `{sri, size}` instead of `sri`. Use `result.sri` anywhere that needed the old return value. - - - - -# [7.1.0](https://github.com/zkat/cacache/compare/v7.0.5...v7.1.0) (2017-04-20) - - -### Features - -* **size:** handle content size info (#49) ([91230af](https://github.com/zkat/cacache/commit/91230af)) - - - - -## [7.0.5](https://github.com/zkat/cacache/compare/v7.0.4...v7.0.5) (2017-04-18) - - -### Bug Fixes - -* **integrity:** new ssri with fixed integrity stream ([6d13e8e](https://github.com/zkat/cacache/commit/6d13e8e)) -* **write:** wrap stuff in promises to improve errors ([3624fc5](https://github.com/zkat/cacache/commit/3624fc5)) - - - - -## [7.0.4](https://github.com/zkat/cacache/compare/v7.0.3...v7.0.4) (2017-04-15) - - -### Bug Fixes - -* **fix-owner:** throw away ENOENTs on chownr ([d49bbcd](https://github.com/zkat/cacache/commit/d49bbcd)) - - - - -## [7.0.3](https://github.com/zkat/cacache/compare/v7.0.2...v7.0.3) (2017-04-05) - - -### Bug Fixes - -* **read:** fixing error message for integrity verification failures ([9d4f0a5](https://github.com/zkat/cacache/commit/9d4f0a5)) - - - - -## [7.0.2](https://github.com/zkat/cacache/compare/v7.0.1...v7.0.2) (2017-04-03) - - -### Bug Fixes - -* **integrity:** use EINTEGRITY error code and update ssri ([8dc2e62](https://github.com/zkat/cacache/commit/8dc2e62)) - - - - -## [7.0.1](https://github.com/zkat/cacache/compare/v7.0.0...v7.0.1) (2017-04-03) - - -### Bug Fixes - -* **docs:** fix header name conflict in readme ([afcd456](https://github.com/zkat/cacache/commit/afcd456)) - - - - -# [7.0.0](https://github.com/zkat/cacache/compare/v6.3.0...v7.0.0) (2017-04-03) - - -### Bug Fixes - -* **test:** fix content.write tests when running in docker ([d2e9b6a](https://github.com/zkat/cacache/commit/d2e9b6a)) - - -### Features - -* **integrity:** subresource integrity support (#78) ([b1e731f](https://github.com/zkat/cacache/commit/b1e731f)) - - -### BREAKING CHANGES - -* **integrity:** The entire API has been overhauled to use SRI hashes instead of digest/hashAlgorithm pairs. SRI hashes follow the Subresource Integrity standard and support strings and objects compatible with [`ssri`](https://npm.im/ssri). - -* This change bumps the index version, which will invalidate all previous index entries. Content entries will remain intact, and existing caches will automatically reuse any content from before this breaking change. - -* `cacache.get.info()`, `cacache.ls()`, and `cacache.ls.stream()` will now return objects that looks like this: - -``` -{ - key: String, - integrity: '-', - path: ContentPath, - time: Date, - metadata: Any -} -``` - -* `opts.digest` and `opts.hashAlgorithm` are obsolete for any API calls that used them. - -* Anywhere `opts.digest` was accepted, `opts.integrity` is now an option. Any valid SRI hash is accepted here -- multiple hash entries will be resolved according to the standard: first, the "strongest" hash algorithm will be picked, and then each of the entries for that algorithm will be matched against the content. Content will be validated if *any* of the entries match (so, a single integrity string can be used for multiple "versions" of the same document/data). - -* `put.byDigest()`, `put.stream.byDigest`, `get.byDigest()` and `get.stream.byDigest()` now expect an SRI instead of a `digest` + `opts.hashAlgorithm` pairing. - -* `get.hasContent()` now expects an integrity hash instead of a digest. If content exists, it will return the specific single integrity hash that was found in the cache. - -* `verify()` has learned to handle integrity-based caches, and forgotten how to handle old-style cache indices due to the format change. - -* `cacache.rm.content()` now expects an integrity hash instead of a hex digest. - - - - -# [6.3.0](https://github.com/zkat/cacache/compare/v6.2.0...v6.3.0) (2017-04-01) - - -### Bug Fixes - -* **fixOwner:** ignore EEXIST race condition from mkdirp ([4670e9b](https://github.com/zkat/cacache/commit/4670e9b)) -* **index:** ignore index removal races when inserting ([b9d2fa2](https://github.com/zkat/cacache/commit/b9d2fa2)) -* **memo:** use lru-cache for better mem management (#75) ([d8ac5aa](https://github.com/zkat/cacache/commit/d8ac5aa)) - - -### Features - -* **dependencies:** Switch to move-concurrently (#77) ([dc6482d](https://github.com/zkat/cacache/commit/dc6482d)) - - - - -# [6.2.0](https://github.com/zkat/cacache/compare/v6.1.2...v6.2.0) (2017-03-15) - - -### Bug Fixes - -* **index:** additional bucket entry verification with checksum (#72) ([f8e0f25](https://github.com/zkat/cacache/commit/f8e0f25)) -* **verify:** return fixOwner.chownr promise ([6818521](https://github.com/zkat/cacache/commit/6818521)) - - -### Features - -* **tmp:** safe tmp dir creation/management util (#73) ([c42da71](https://github.com/zkat/cacache/commit/c42da71)) - - - - -## [6.1.2](https://github.com/zkat/cacache/compare/v6.1.1...v6.1.2) (2017-03-13) - - -### Bug Fixes - -* **index:** set default hashAlgorithm ([d6eb2f0](https://github.com/zkat/cacache/commit/d6eb2f0)) - - - - -## [6.1.1](https://github.com/zkat/cacache/compare/v6.1.0...v6.1.1) (2017-03-13) - - -### Bug Fixes - -* **coverage:** bumping coverage for verify (#71) ([0b7faf6](https://github.com/zkat/cacache/commit/0b7faf6)) -* **deps:** glob should have been a regular dep :< ([0640bc4](https://github.com/zkat/cacache/commit/0640bc4)) - - - - -# [6.1.0](https://github.com/zkat/cacache/compare/v6.0.2...v6.1.0) (2017-03-12) - - -### Bug Fixes - -* **coverage:** more coverage for content reads (#70) ([ef4f70a](https://github.com/zkat/cacache/commit/ef4f70a)) -* **tests:** use safe-buffer because omfg (#69) ([6ab8132](https://github.com/zkat/cacache/commit/6ab8132)) - - -### Features - -* **rm:** limited rm.all and fixed bugs (#66) ([d5d25ba](https://github.com/zkat/cacache/commit/d5d25ba)), closes [#66](https://github.com/zkat/cacache/issues/66) -* **verify:** tested, working cache verifier/gc (#68) ([45ad77a](https://github.com/zkat/cacache/commit/45ad77a)) - - - - -## [6.0.2](https://github.com/zkat/cacache/compare/v6.0.1...v6.0.2) (2017-03-11) - - -### Bug Fixes - -* **index:** segment cache items with another subbucket (#64) ([c3644e5](https://github.com/zkat/cacache/commit/c3644e5)) - - - - -## [6.0.1](https://github.com/zkat/cacache/compare/v6.0.0...v6.0.1) (2017-03-05) - - -### Bug Fixes - -* **docs:** Missed spots in README ([8ffb7fa](https://github.com/zkat/cacache/commit/8ffb7fa)) - - - - -# [6.0.0](https://github.com/zkat/cacache/compare/v5.0.3...v6.0.0) (2017-03-05) - - -### Bug Fixes - -* **api:** keep memo cache mostly-internal ([2f72d0a](https://github.com/zkat/cacache/commit/2f72d0a)) -* **content:** use the rest of the string, not the whole string ([fa8f3c3](https://github.com/zkat/cacache/commit/fa8f3c3)) -* **deps:** removed `format-number[@2](https://github.com/2).0.2` ([1187791](https://github.com/zkat/cacache/commit/1187791)) -* **deps:** removed inflight[@1](https://github.com/1).0.6 ([0d1819c](https://github.com/zkat/cacache/commit/0d1819c)) -* **deps:** rimraf[@2](https://github.com/2).6.1 ([9efab6b](https://github.com/zkat/cacache/commit/9efab6b)) -* **deps:** standard[@9](https://github.com/9).0.0 ([4202cba](https://github.com/zkat/cacache/commit/4202cba)) -* **deps:** tap[@10](https://github.com/10).3.0 ([aa03088](https://github.com/zkat/cacache/commit/aa03088)) -* **deps:** weallcontribute[@1](https://github.com/1).0.8 ([ad4f4dc](https://github.com/zkat/cacache/commit/ad4f4dc)) -* **docs:** add security note to hashKey ([03f81ba](https://github.com/zkat/cacache/commit/03f81ba)) -* **hashes:** change default hashAlgorithm to sha512 ([ea00ba6](https://github.com/zkat/cacache/commit/ea00ba6)) -* **hashes:** missed a spot for hashAlgorithm defaults ([45997d8](https://github.com/zkat/cacache/commit/45997d8)) -* **index:** add length header before JSON for verification ([fb8cb4d](https://github.com/zkat/cacache/commit/fb8cb4d)) -* **index:** change index filenames to sha1s of keys ([bbc5fca](https://github.com/zkat/cacache/commit/bbc5fca)) -* **index:** who cares about race conditions anyway ([b1d3888](https://github.com/zkat/cacache/commit/b1d3888)) -* **perf:** bulk-read get+read for massive speed ([d26cdf9](https://github.com/zkat/cacache/commit/d26cdf9)) -* **perf:** use bulk file reads for index reads ([79a8891](https://github.com/zkat/cacache/commit/79a8891)) -* **put-stream:** remove tmp file on stream insert error ([65f6632](https://github.com/zkat/cacache/commit/65f6632)) -* **put-stream:** robustified and predictibilized ([daf9e08](https://github.com/zkat/cacache/commit/daf9e08)) -* **put-stream:** use new promise API for moves ([1d36013](https://github.com/zkat/cacache/commit/1d36013)) -* **readme:** updated to reflect new default hashAlgo ([c60a2fa](https://github.com/zkat/cacache/commit/c60a2fa)) -* **verify:** tiny typo fix ([db22d05](https://github.com/zkat/cacache/commit/db22d05)) - - -### Features - -* **api:** converted external api ([7bf032f](https://github.com/zkat/cacache/commit/7bf032f)) -* **cacache:** exported clearMemoized() utility ([8d2c5b6](https://github.com/zkat/cacache/commit/8d2c5b6)) -* **cache:** add versioning to content and index ([31bc549](https://github.com/zkat/cacache/commit/31bc549)) -* **content:** collate content files into subdirs ([c094d9f](https://github.com/zkat/cacache/commit/c094d9f)) -* **deps:** [@npmcorp](https://github.com/npmcorp)/move[@1](https://github.com/1).0.0 ([bdd00bf](https://github.com/zkat/cacache/commit/bdd00bf)) -* **deps:** bluebird[@3](https://github.com/3).4.7 ([3a17aff](https://github.com/zkat/cacache/commit/3a17aff)) -* **deps:** promise-inflight[@1](https://github.com/1).0.1 ([a004fe6](https://github.com/zkat/cacache/commit/a004fe6)) -* **get:** added memoization support for get ([c77d794](https://github.com/zkat/cacache/commit/c77d794)) -* **get:** export hasContent ([2956ec3](https://github.com/zkat/cacache/commit/2956ec3)) -* **index:** add hashAlgorithm and format insert ret val ([b639746](https://github.com/zkat/cacache/commit/b639746)) -* **index:** collate index files into subdirs ([e8402a5](https://github.com/zkat/cacache/commit/e8402a5)) -* **index:** promisify entry index ([cda3335](https://github.com/zkat/cacache/commit/cda3335)) -* **memo:** added memoization lib ([da07b92](https://github.com/zkat/cacache/commit/da07b92)) -* **memo:** export memoization api ([954b1b3](https://github.com/zkat/cacache/commit/954b1b3)) -* **move-file:** add move fallback for weird errors ([5cf4616](https://github.com/zkat/cacache/commit/5cf4616)) -* **perf:** bulk content write api ([51b536e](https://github.com/zkat/cacache/commit/51b536e)) -* **put:** added memoization support to put ([b613a70](https://github.com/zkat/cacache/commit/b613a70)) -* **read:** switched to promises ([a869362](https://github.com/zkat/cacache/commit/a869362)) -* **rm:** added memoization support to rm ([4205cf0](https://github.com/zkat/cacache/commit/4205cf0)) -* **rm:** switched to promises ([a000d24](https://github.com/zkat/cacache/commit/a000d24)) -* **util:** promise-inflight ownership fix requests ([9517cd7](https://github.com/zkat/cacache/commit/9517cd7)) -* **util:** use promises for api ([ae204bb](https://github.com/zkat/cacache/commit/ae204bb)) -* **verify:** converted to Promises ([f0b3974](https://github.com/zkat/cacache/commit/f0b3974)) - - -### BREAKING CHANGES - -* cache: index/content directories are now versioned. Previous caches are no longer compatible and cannot be migrated. -* util: fix-owner now uses Promises instead of callbacks -* index: Previously-generated index entries are no longer compatible and the index must be regenerated. -* index: The index format has changed and previous caches are no longer compatible. Existing caches will need to be regenerated. -* hashes: Default hashAlgorithm changed from sha1 to sha512. If you -rely on the prior setting, pass `opts.hashAlgorithm` in explicitly. -* content: Previously-generated content directories are no longer compatible -and must be regenerated. -* verify: API is now promise-based -* read: Switches to a Promise-based API and removes callback stuff -* rm: Switches to a Promise-based API and removes callback stuff -* index: this changes the API to work off promises instead of callbacks -* api: this means we are going all in on promises now diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/LICENSE.md b/node_modules/npm-registry-fetch/node_modules/cacache/LICENSE.md deleted file mode 100644 index 8d28acf866d93..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/LICENSE.md +++ /dev/null @@ -1,16 +0,0 @@ -ISC License - -Copyright (c) npm, Inc. - -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 COPYRIGHT HOLDER DISCLAIMS -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -COPYRIGHT HOLDER 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/node_modules/npm-registry-fetch/node_modules/cacache/README.es.md b/node_modules/npm-registry-fetch/node_modules/cacache/README.es.md deleted file mode 100644 index 783a0a19b01da..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/README.es.md +++ /dev/null @@ -1,628 +0,0 @@ -# cacache [![npm version](https://img.shields.io/npm/v/cacache.svg)](https://npm.im/cacache) [![license](https://img.shields.io/npm/l/cacache.svg)](https://npm.im/cacache) [![Travis](https://img.shields.io/travis/zkat/cacache.svg)](https://travis-ci.org/zkat/cacache) [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/zkat/cacache?svg=true)](https://ci.appveyor.com/project/zkat/cacache) [![Coverage Status](https://coveralls.io/repos/github/zkat/cacache/badge.svg?branch=latest)](https://coveralls.io/github/zkat/cacache?branch=latest) - -[`cacache`](https://github.com/zkat/cacache) es una librería de Node.js para -manejar caches locales en disco, con acceso tanto con claves únicas como -direcciones de contenido (hashes/hacheos). Es súper rápida, excelente con el -acceso concurrente, y jamás te dará datos incorrectos, aún si se corrompen o -manipulan directamente los ficheros del cache. - -El propósito original era reemplazar el caché local de -[npm](https://npm.im/npm), pero se puede usar por su propia cuenta. - -_Traducciones: [English](README.md)_ - -## Instalación - -`$ npm install --save cacache` - -## Índice - -* [Ejemplo](#ejemplo) -* [Características](#características) -* [Cómo Contribuir](#cómo-contribuir) -* [API](#api) - * [Usando el API en español](#localized-api) - * Leer - * [`ls`](#ls) - * [`ls.flujo`](#ls-stream) - * [`saca`](#get-data) - * [`saca.flujo`](#get-stream) - * [`saca.info`](#get-info) - * [`saca.tieneDatos`](#get-hasContent) - * Escribir - * [`mete`](#put-data) - * [`mete.flujo`](#put-stream) - * [opciones para `mete*`](#put-options) - * [`rm.todo`](#rm-all) - * [`rm.entrada`](#rm-entry) - * [`rm.datos`](#rm-content) - * Utilidades - * [`ponLenguaje`](#set-locale) - * [`limpiaMemoizado`](#clear-memoized) - * [`tmp.hazdir`](#tmp-mkdir) - * [`tmp.conTmp`](#with-tmp) - * Integridad - * [Subresource Integrity](#integrity) - * [`verifica`](#verify) - * [`verifica.ultimaVez`](#verify-last-run) - -### Ejemplo - -```javascript -const cacache = require('cacache/es') -const fs = require('fs') - -const tarbol = '/ruta/a/mi-tar.tgz' -const rutaCache = '/tmp/my-toy-cache' -const clave = 'mi-clave-única-1234' - -// ¡Añádelo al caché! Usa `rutaCache` como raíz del caché. -cacache.mete(rutaCache, clave, '10293801983029384').then(integrity => { - console.log(`Saved content to ${rutaCache}.`) -}) - -const destino = '/tmp/mytar.tgz' - -// Copia el contenido del caché a otro fichero, pero esta vez con flujos. -cacache.saca.flujo( - rutaCache, clave -).pipe( - fs.createWriteStream(destino) -).on('finish', () => { - console.log('extracción completada') -}) - -// La misma cosa, pero accesando el contenido directamente, sin tocar el índice. -cacache.saca.porHacheo(rutaCache, integridad).then(datos => { - fs.writeFile(destino, datos, err => { - console.log('datos del tarbol sacados basado en su sha512, y escrito a otro fichero') - }) -}) -``` - -### Características - -* Extracción por clave o por dirección de contenido (shasum, etc) -* Usa el estándard de web, [Subresource Integrity](#integrity) -* Compatible con multiples algoritmos - usa sha1, sha512, etc, en el mismo caché sin problema -* Entradas con contenido idéntico comparten ficheros -* Tolerancia de fallas (inmune a corrupción, ficheros parciales, carreras de proceso, etc) -* Verificación completa de datos cuando (escribiendo y leyendo) -* Concurrencia rápida, segura y "lockless" -* Compatible con `stream`s (flujos) -* Compatible con `Promise`s (promesas) -* Bastante rápida -- acceso, incluyendo verificación, en microsegundos -* Almacenaje de metadatos arbitrarios -* Colección de basura y verificación adicional fuera de banda -* Cobertura rigurosa de pruebas -* Probablente hay un "Bloom filter" por ahí en algún lado. Eso le mola a la gente, ¿Verdad? 🤔 - -### Cómo Contribuir - -El equipo de cacache felizmente acepta contribuciones de código y otras maneras de participación. ¡Hay muchas formas diferentes de contribuir! La [Guía de Colaboradores](CONTRIBUTING.md) (en inglés) tiene toda la información que necesitas para cualquier tipo de contribución: todo desde cómo reportar errores hasta cómo someter parches con nuevas características. Con todo y eso, no se preocupe por si lo que haces está exáctamente correcto: no hay ningún problema en hacer preguntas si algo no está claro, o no lo encuentras. - -El equipo de cacache tiene miembros hispanohablantes: es completamente aceptable crear `issues` y `pull requests` en español/castellano. - -Todos los participantes en este proyecto deben obedecer el [Código de Conducta](CODE_OF_CONDUCT.md) (en inglés), y en general actuar de forma amable y respetuosa mientras participan en esta comunidad. - -Por favor refiérase al [Historial de Cambios](CHANGELOG.md) (en inglés) para detalles sobre cambios importantes incluídos en cada versión. - -Finalmente, cacache tiene un sistema de localización de lenguaje. Si te interesa añadir lenguajes o mejorar los que existen, mira en el directorio `./locales` para comenzar. - -Happy hacking! - -### API - -#### Usando el API en español - -cacache incluye una traducción completa de su API al castellano, con las mismas -características. Para usar el API como está documentado en este documento, usa -`require('cacache/es')` - -cacache también tiene otros lenguajes: encuéntralos bajo `./locales`, y podrás -usar el API en ese lenguaje con `require('cacache/')` - -#### `> cacache.ls(cache) -> Promise` - -Enumera todas las entradas en el caché, dentro de un solo objeto. Cada entrada -en el objeto tendrá como clave la clave única usada para el índice, el valor -siendo un objeto de [`saca.info`](#get-info). - -##### Ejemplo - -```javascript -cacache.ls(rutaCache).then(console.log) -// Salida -{ - 'my-thing': { - key: 'my-thing', - integrity: 'sha512-BaSe64/EnCoDED+HAsh==' - path: '.testcache/content/deadbeef', // unido con `rutaCache` - time: 12345698490, - size: 4023948, - metadata: { - name: 'blah', - version: '1.2.3', - description: 'this was once a package but now it is my-thing' - } - }, - 'other-thing': { - key: 'other-thing', - integrity: 'sha1-ANothER+hasH=', - path: '.testcache/content/bada55', - time: 11992309289, - size: 111112 - } -} -``` - -#### `> cacache.ls.flujo(cache) -> Readable` - -Enumera todas las entradas en el caché, emitiendo un objeto de -[`saca.info`](#get-info) por cada evento de `data` en el flujo. - -##### Ejemplo - -```javascript -cacache.ls.flujo(rutaCache).on('data', console.log) -// Salida -{ - key: 'my-thing', - integrity: 'sha512-BaSe64HaSh', - path: '.testcache/content/deadbeef', // unido con `rutaCache` - time: 12345698490, - size: 13423, - metadata: { - name: 'blah', - version: '1.2.3', - description: 'this was once a package but now it is my-thing' - } -} - -{ - key: 'other-thing', - integrity: 'whirlpool-WoWSoMuchSupport', - path: '.testcache/content/bada55', - time: 11992309289, - size: 498023984029 -} - -{ - ... -} -``` - -#### `> cacache.saca(cache, clave, [ops]) -> Promise({data, metadata, integrity})` - -Devuelve un objeto con los datos, hacheo de integridad y metadatos identificados -por la `clave`. La propiedad `data` de este objeto será una instancia de -`Buffer` con los datos almacenados en el caché. to do with it! cacache just -won't care. - -`integrity` es un `string` de [Subresource Integrity](#integrity). Dígase, un -`string` que puede ser usado para verificar a la `data`, que tiene como formato -`-`. - -So no existe ninguna entrada identificada por `clave`, o se los datos -almacenados localmente fallan verificación, el `Promise` fallará. - -Una sub-función, `saca.porHacheo`, tiene casi el mismo comportamiento, excepto -que busca entradas usando el hacheo de integridad, sin tocar el índice general. -Esta versión *sólo* devuelve `data`, sin ningún objeto conteniéndola. - -##### Nota - -Esta función lee la entrada completa a la memoria antes de devolverla. Si estás -almacenando datos Muy Grandes, es posible que [`saca.flujo`](#get-stream) sea -una mejor solución. - -##### Ejemplo - -```javascript -// Busca por clave -cache.saca(rutaCache, 'my-thing').then(console.log) -// Salida: -{ - metadata: { - thingName: 'my' - }, - integrity: 'sha512-BaSe64HaSh', - data: Buffer#, - size: 9320 -} - -// Busca por hacheo -cache.saca.porHacheo(rutaCache, 'sha512-BaSe64HaSh').then(console.log) -// Salida: -Buffer# -``` - -#### `> cacache.saca.flujo(cache, clave, [ops]) -> Readable` - -Devuelve un [Readable -Stream](https://nodejs.org/api/stream.html#stream_readable_streams) de los datos -almacenados bajo `clave`. - -So no existe ninguna entrada identificada por `clave`, o se los datos -almacenados localmente fallan verificación, el `Promise` fallará. - -`metadata` y `integrity` serán emitidos como eventos antes de que el flujo -cierre. - -Una sub-función, `saca.flujo.porHacheo`, tiene casi el mismo comportamiento, -excepto que busca entradas usando el hacheo de integridad, sin tocar el índice -general. Esta versión no emite eventos de `metadata` o `integrity`. - -##### Ejemplo - -```javascript -// Busca por clave -cache.saca.flujo( - rutaCache, 'my-thing' -).on('metadata', metadata => { - console.log('metadata:', metadata) -}).on('integrity', integrity => { - console.log('integrity:', integrity) -}).pipe( - fs.createWriteStream('./x.tgz') -) -// Salidas: -metadata: { ... } -integrity: 'sha512-SoMeDIGest+64==' - -// Busca por hacheo -cache.saca.flujo.porHacheo( - rutaCache, 'sha512-SoMeDIGest+64==' -).pipe( - fs.createWriteStream('./x.tgz') -) -``` - -#### `> cacache.saca.info(cache, clave) -> Promise` - -Busca la `clave` en el índice del caché, devolviendo información sobre la -entrada si existe. - -##### Campos - -* `key` - Clave de la entrada. Igual al argumento `clave`. -* `integrity` - [hacheo de Subresource Integrity](#integrity) del contenido al que se refiere esta entrada. -* `path` - Dirección del fichero de datos almacenados, relativa al argumento `cache`. -* `time` - Hora de creación de la entrada -* `metadata` - Metadatos asignados a esta entrada por el usuario - -##### Ejemplo - -```javascript -cacache.saca.info(rutaCache, 'my-thing').then(console.log) - -// Salida -{ - key: 'my-thing', - integrity: 'sha256-MUSTVERIFY+ALL/THINGS==' - path: '.testcache/content/deadbeef', - time: 12345698490, - size: 849234, - metadata: { - name: 'blah', - version: '1.2.3', - description: 'this was once a package but now it is my-thing' - } -} -``` - -#### `> cacache.saca.tieneDatos(cache, integrity) -> Promise` - -Busca un [hacheo Subresource Integrity](#integrity) en el caché. Si existe el -contenido asociado con `integrity`, devuelve un objeto con dos campos: el hacheo -_específico_ que se usó para la búsqueda, `sri`, y el tamaño total del -contenido, `size`. Si no existe ningún contenido asociado con `integrity`, -devuelve `false`. - -##### Ejemplo - -```javascript -cacache.saca.tieneDatos(rutaCache, 'sha256-MUSTVERIFY+ALL/THINGS==').then(console.log) - -// Salida -{ - sri: { - source: 'sha256-MUSTVERIFY+ALL/THINGS==', - algorithm: 'sha256', - digest: 'MUSTVERIFY+ALL/THINGS==', - options: [] - }, - size: 9001 -} - -cacache.saca.tieneDatos(rutaCache, 'sha521-NOT+IN/CACHE==').then(console.log) - -// Salida -false -``` - -#### `> cacache.mete(cache, clave, datos, [ops]) -> Promise` - -Inserta `datos` en el caché. El `Promise` devuelto se resuelve con un hacheo -(generado conforme a [`ops.algorithms`](#optsalgorithms)) después que la entrada -haya sido escrita en completo. - -##### Ejemplo - -```javascript -fetch( - 'https://registry.npmjs.org/cacache/-/cacache-1.0.0.tgz' -).then(datos => { - return cacache.mete(rutaCache, 'registry.npmjs.org|cacache@1.0.0', datos) -}).then(integridad => { - console.log('el hacheo de integridad es', integridad) -}) -``` - -#### `> cacache.mete.flujo(cache, clave, [ops]) -> Writable` - -Devuelve un [Writable -Stream](https://nodejs.org/api/stream.html#stream_writable_streams) que inserta -al caché los datos escritos a él. Emite un evento `integrity` con el hacheo del -contenido escrito, cuando completa. - -##### Ejemplo - -```javascript -request.get( - 'https://registry.npmjs.org/cacache/-/cacache-1.0.0.tgz' -).pipe( - cacache.mete.flujo( - rutaCache, 'registry.npmjs.org|cacache@1.0.0' - ).on('integrity', d => console.log(`integrity digest is ${d}`)) -) -``` - -#### `> opciones para cacache.mete` - -La funciones `cacache.mete` tienen un número de opciones en común. - -##### `ops.metadata` - -Metadatos del usuario que se almacenarán con la entrada. - -##### `ops.size` - -El tamaño declarado de los datos que se van a insertar. Si es proveído, cacache -verificará que los datos escritos sean de ese tamaño, o si no, fallará con un -error con código `EBADSIZE`. - -##### `ops.integrity` - -El hacheo de integridad de los datos siendo escritos. - -Si es proveído, y los datos escritos no le corresponden, la operación fallará -con un error con código `EINTEGRITY`. - -`ops.algorithms` no tiene ningún efecto si esta opción está presente. - -##### `ops.algorithms` - -Por Defecto: `['sha512']` - -Algoritmos que se deben usar cuando se calcule el hacheo de [subresource -integrity](#integrity) para los datos insertados. Puede usar cualquier algoritmo -enumerado en `crypto.getHashes()`. - -Por el momento, sólo se acepta un algoritmo (dígase, un array con exáctamente un -valor). No tiene ningún efecto si `ops.integrity` también ha sido proveido. - -##### `ops.uid`/`ops.gid` - -Si están presentes, cacache hará todo lo posible para asegurarse que todos los -ficheros creados en el proceso de sus operaciones en el caché usen esta -combinación en particular. - -##### `ops.memoize` - -Por Defecto: `null` - -Si es verdad, cacache tratará de memoizar los datos de la entrada en memoria. La -próxima vez que el proceso corriente trate de accesar los datos o entrada, -cacache buscará en memoria antes de buscar en disco. - -Si `ops.memoize` es un objeto regular o un objeto como `Map` (es decir, un -objeto con métodos `get()` y `set()`), este objeto en sí sera usado en vez del -caché de memoria global. Esto permite tener lógica específica a tu aplicación -encuanto al almacenaje en memoria de tus datos. - -Si quieres asegurarte que los datos se lean del disco en vez de memoria, usa -`memoize: false` cuando uses funciones de `cacache.saca`. - -#### `> cacache.rm.todo(cache) -> Promise` - -Borra el caché completo, incluyendo ficheros temporeros, ficheros de datos, y el -índice del caché. - -##### Ejemplo - -```javascript -cacache.rm.todo(rutaCache).then(() => { - console.log('THE APOCALYPSE IS UPON US 😱') -}) -``` - -#### `> cacache.rm.entrada(cache, clave) -> Promise` - -Alias: `cacache.rm` - -Borra la entrada `clave` del índuce. El contenido asociado con esta entrada -seguirá siendo accesible por hacheo usando -[`saca.flujo.porHacheo`](#get-stream). - -Para borrar el contenido en sí, usa [`rm.datos`](#rm-content). Si quieres hacer -esto de manera más segura (pues ficheros de contenido pueden ser usados por -multiples entradas), usa [`verifica`](#verify) para borrar huérfanos. - -##### Ejemplo - -```javascript -cacache.rm.entrada(rutaCache, 'my-thing').then(() => { - console.log('I did not like it anyway') -}) -``` - -#### `> cacache.rm.datos(cache, integrity) -> Promise` - -Borra el contenido identificado por `integrity`. Cualquier entrada que se -refiera a este contenido quedarán huérfanas y se invalidarán si se tratan de -accesar, al menos que contenido idéntico sea añadido bajo `integrity`. - -##### Ejemplo - -```javascript -cacache.rm.datos(rutaCache, 'sha512-SoMeDIGest/IN+BaSE64==').then(() => { - console.log('los datos para `mi-cosa` se borraron') -}) -``` - -#### `> cacache.ponLenguaje(locale)` - -Configura el lenguaje usado para mensajes y errores de cacache. La lista de -lenguajes disponibles está en el directorio `./locales` del proyecto. - -_Te interesa añadir más lenguajes? [Somete un PR](CONTRIBUTING.md)!_ - -#### `> cacache.limpiaMemoizado()` - -Completamente reinicializa el caché de memoria interno. Si estás usando tu -propio objecto con `ops.memoize`, debes hacer esto de manera específica a él. - -#### `> tmp.hazdir(cache, ops) -> Promise` - -Alias: `tmp.mkdir` - -Devuelve un directorio único dentro del directorio `tmp` del caché. - -Una vez tengas el directorio, es responsabilidad tuya asegurarte que todos los -ficheros escrito a él sean creados usando los permisos y `uid`/`gid` concordante -con el caché. Si no, puedes pedirle a cacache que lo haga llamando a -[`cacache.tmp.fix()`](#tmp-fix). Esta función arreglará todos los permisos en el -directorio tmp. - -Si quieres que cacache limpie el directorio automáticamente cuando termines, usa -[`cacache.tmp.conTmp()`](#with-tpm). - -##### Ejemplo - -```javascript -cacache.tmp.mkdir(cache).then(dir => { - fs.writeFile(path.join(dir, 'blablabla'), Buffer#<1234>, ...) -}) -``` - -#### `> tmp.conTmp(cache, ops, cb) -> Promise` - -Crea un directorio temporero con [`tmp.mkdir()`](#tmp-mkdir) y ejecuta `cb` con -él como primer argumento. El directorio creado será removido automáticamente -cuando el valor devolvido por `cb()` se resuelva. - -Las mismas advertencias aplican en cuanto a manejando permisos para los ficheros -dentro del directorio. - -##### Ejemplo - -```javascript -cacache.tmp.conTmp(cache, dir => { - return fs.writeFileAsync(path.join(dir, 'blablabla'), Buffer#<1234>, ...) -}).then(() => { - // `dir` no longer exists -}) -``` - -#### Hacheos de Subresource Integrity - -cacache usa strings que siguen la especificación de [Subresource Integrity -spec](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity). - -Es decir, donde quiera cacache espera un argumento o opción `integrity`, ese -string debería usar el formato `-`. - -Una variación importante sobre los hacheos que cacache acepta es que acepta el -nombre de cualquier algoritmo aceptado por el proceso de Node.js donde se usa. -Puedes usar `crypto.getHashes()` para ver cuales están disponibles. - -##### Generando tus propios hacheos - -Si tienes un `shasum`, en general va a estar en formato de string hexadecimal -(es decir, un `sha1` se vería como algo así: -`5f5513f8822fdbe5145af33b64d8d970dcf95c6e`). - -Para ser compatible con cacache, necesitas convertir esto a su equivalente en -subresource integrity. Por ejemplo, el hacheo correspondiente al ejemplo -anterior sería: `sha1-X1UT+IIv2+UUWvM7ZNjZcNz5XG4=`. - -Puedes usar código así para generarlo por tu cuenta: - -```javascript -const crypto = require('crypto') -const algoritmo = 'sha512' -const datos = 'foobarbaz' - -const integrity = ( - algorithm + - '-' + - crypto.createHash(algoritmo).update(datos).digest('base64') -) -``` - -También puedes usar [`ssri`](https://npm.im/ssri) para deferir el trabajo a otra -librería que garantiza que todo esté correcto, pues maneja probablemente todas -las operaciones que tendrías que hacer con SRIs, incluyendo convirtiendo entre -hexadecimal y el formato SRI. - -#### `> cacache.verifica(cache, ops) -> Promise` - -Examina y arregla tu caché: - -* Limpia entradas inválidas, huérfanas y corrompidas -* Te deja filtrar cuales entradas retener, con tu propio filtro -* Reclama cualquier ficheros de contenido sin referencias en el índice -* Verifica integridad de todos los ficheros de contenido y remueve los malos -* Arregla permisos del caché -* Remieve el directorio `tmp` en el caché, y todo su contenido. - -Cuando termine, devuelve un objeto con varias estadísticas sobre el proceso de -verificación, por ejemplo la cantidad de espacio de disco reclamado, el número -de entradas válidas, número de entradas removidas, etc. - -##### Opciones - -* `ops.uid` - uid para asignarle al caché y su contenido -* `ops.gid` - gid para asignarle al caché y su contenido -* `ops.filter` - recibe una entrada como argumento. Devuelve falso para removerla. Nota: es posible que esta función sea invocada con la misma entrada más de una vez. - -##### Example - -```sh -echo somegarbage >> $RUTACACHE/content/deadbeef -``` - -```javascript -cacache.verifica(rutaCache).then(stats => { - // deadbeef collected, because of invalid checksum. - console.log('cache is much nicer now! stats:', stats) -}) -``` - -#### `> cacache.verifica.ultimaVez(cache) -> Promise` - -Alias: `últimaVez` - -Devuelve un `Date` que representa la última vez que `cacache.verifica` fue -ejecutada en `cache`. - -##### Example - -```javascript -cacache.verifica(rutaCache).then(() => { - cacache.verifica.ultimaVez(rutaCache).then(última => { - console.log('La última vez que se usó cacache.verifica() fue ' + última) - }) -}) -``` diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/README.md b/node_modules/npm-registry-fetch/node_modules/cacache/README.md deleted file mode 100644 index 4b284588a65aa..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/README.md +++ /dev/null @@ -1,624 +0,0 @@ -# cacache [![npm version](https://img.shields.io/npm/v/cacache.svg)](https://npm.im/cacache) [![license](https://img.shields.io/npm/l/cacache.svg)](https://npm.im/cacache) [![Travis](https://img.shields.io/travis/zkat/cacache.svg)](https://travis-ci.org/zkat/cacache) [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/zkat/cacache?svg=true)](https://ci.appveyor.com/project/zkat/cacache) [![Coverage Status](https://coveralls.io/repos/github/zkat/cacache/badge.svg?branch=latest)](https://coveralls.io/github/zkat/cacache?branch=latest) - -[`cacache`](https://github.com/zkat/cacache) is a Node.js library for managing -local key and content address caches. It's really fast, really good at -concurrency, and it will never give you corrupted data, even if cache files -get corrupted or manipulated. - -It was originally written to be used as [npm](https://npm.im)'s local cache, but -can just as easily be used on its own. - -_Translations: [español](README.es.md)_ - -## Install - -`$ npm install --save cacache` - -## Table of Contents - -* [Example](#example) -* [Features](#features) -* [Contributing](#contributing) -* [API](#api) - * [Using localized APIs](#localized-api) - * Reading - * [`ls`](#ls) - * [`ls.stream`](#ls-stream) - * [`get`](#get-data) - * [`get.stream`](#get-stream) - * [`get.info`](#get-info) - * [`get.hasContent`](#get-hasContent) - * Writing - * [`put`](#put-data) - * [`put.stream`](#put-stream) - * [`put*` opts](#put-options) - * [`rm.all`](#rm-all) - * [`rm.entry`](#rm-entry) - * [`rm.content`](#rm-content) - * Utilities - * [`setLocale`](#set-locale) - * [`clearMemoized`](#clear-memoized) - * [`tmp.mkdir`](#tmp-mkdir) - * [`tmp.withTmp`](#with-tmp) - * Integrity - * [Subresource Integrity](#integrity) - * [`verify`](#verify) - * [`verify.lastRun`](#verify-last-run) - -### Example - -```javascript -const cacache = require('cacache/en') -const fs = require('fs') - -const tarball = '/path/to/mytar.tgz' -const cachePath = '/tmp/my-toy-cache' -const key = 'my-unique-key-1234' - -// Cache it! Use `cachePath` as the root of the content cache -cacache.put(cachePath, key, '10293801983029384').then(integrity => { - console.log(`Saved content to ${cachePath}.`) -}) - -const destination = '/tmp/mytar.tgz' - -// Copy the contents out of the cache and into their destination! -// But this time, use stream instead! -cacache.get.stream( - cachePath, key -).pipe( - fs.createWriteStream(destination) -).on('finish', () => { - console.log('done extracting!') -}) - -// The same thing, but skip the key index. -cacache.get.byDigest(cachePath, integrityHash).then(data => { - fs.writeFile(destination, data, err => { - console.log('tarball data fetched based on its sha512sum and written out!') - }) -}) -``` - -### Features - -* Extraction by key or by content address (shasum, etc) -* [Subresource Integrity](#integrity) web standard support -* Multi-hash support - safely host sha1, sha512, etc, in a single cache -* Automatic content deduplication -* Fault tolerance (immune to corruption, partial writes, process races, etc) -* Consistency guarantees on read and write (full data verification) -* Lockless, high-concurrency cache access -* Streaming support -* Promise support -* Pretty darn fast -- sub-millisecond reads and writes including verification -* Arbitrary metadata storage -* Garbage collection and additional offline verification -* Thorough test coverage -* There's probably a bloom filter in there somewhere. Those are cool, right? 🤔 - -### Contributing - -The cacache team enthusiastically welcomes contributions and project participation! There's a bunch of things you can do if you want to contribute! The [Contributor Guide](CONTRIBUTING.md) has all the information you need for everything from reporting bugs to contributing entire new features. Please don't hesitate to jump in if you'd like to, or even ask us questions if something isn't clear. - -All participants and maintainers in this project are expected to follow [Code of Conduct](CODE_OF_CONDUCT.md), and just generally be excellent to each other. - -Please refer to the [Changelog](CHANGELOG.md) for project history details, too. - -Happy hacking! - -### API - -#### Using localized APIs - -cacache includes a complete API in English, with the same features as other -translations. To use the English API as documented in this README, use -`require('cacache/en')`. This is also currently the default if you do -`require('cacache')`, but may change in the future. - -cacache also supports other languages! You can find the list of currently -supported ones by looking in `./locales` in the source directory. You can use -the API in that language with `require('cacache/')`. - -Want to add support for a new language? Please go ahead! You should be able to -copy `./locales/en.js` and `./locales/en.json` and fill them in. Translating the -`README.md` is a bit more work, but also appreciated if you get around to it. 👍🏼 - -#### `> cacache.ls(cache) -> Promise` - -Lists info for all entries currently in the cache as a single large object. Each -entry in the object will be keyed by the unique index key, with corresponding -[`get.info`](#get-info) objects as the values. - -##### Example - -```javascript -cacache.ls(cachePath).then(console.log) -// Output -{ - 'my-thing': { - key: 'my-thing', - integrity: 'sha512-BaSe64/EnCoDED+HAsh==' - path: '.testcache/content/deadbeef', // joined with `cachePath` - time: 12345698490, - size: 4023948, - metadata: { - name: 'blah', - version: '1.2.3', - description: 'this was once a package but now it is my-thing' - } - }, - 'other-thing': { - key: 'other-thing', - integrity: 'sha1-ANothER+hasH=', - path: '.testcache/content/bada55', - time: 11992309289, - size: 111112 - } -} -``` - -#### `> cacache.ls.stream(cache) -> Readable` - -Lists info for all entries currently in the cache as a single large object. - -This works just like [`ls`](#ls), except [`get.info`](#get-info) entries are -returned as `'data'` events on the returned stream. - -##### Example - -```javascript -cacache.ls.stream(cachePath).on('data', console.log) -// Output -{ - key: 'my-thing', - integrity: 'sha512-BaSe64HaSh', - path: '.testcache/content/deadbeef', // joined with `cachePath` - time: 12345698490, - size: 13423, - metadata: { - name: 'blah', - version: '1.2.3', - description: 'this was once a package but now it is my-thing' - } -} - -{ - key: 'other-thing', - integrity: 'whirlpool-WoWSoMuchSupport', - path: '.testcache/content/bada55', - time: 11992309289, - size: 498023984029 -} - -{ - ... -} -``` - -#### `> cacache.get(cache, key, [opts]) -> Promise({data, metadata, integrity})` - -Returns an object with the cached data, digest, and metadata identified by -`key`. The `data` property of this object will be a `Buffer` instance that -presumably holds some data that means something to you. I'm sure you know what -to do with it! cacache just won't care. - -`integrity` is a [Subresource -Integrity](#integrity) -string. That is, a string that can be used to verify `data`, which looks like -`-`. - -If there is no content identified by `key`, or if the locally-stored data does -not pass the validity checksum, the promise will be rejected. - -A sub-function, `get.byDigest` may be used for identical behavior, except lookup -will happen by integrity hash, bypassing the index entirely. This version of the -function *only* returns `data` itself, without any wrapper. - -##### Note - -This function loads the entire cache entry into memory before returning it. If -you're dealing with Very Large data, consider using [`get.stream`](#get-stream) -instead. - -##### Example - -```javascript -// Look up by key -cache.get(cachePath, 'my-thing').then(console.log) -// Output: -{ - metadata: { - thingName: 'my' - }, - integrity: 'sha512-BaSe64HaSh', - data: Buffer#, - size: 9320 -} - -// Look up by digest -cache.get.byDigest(cachePath, 'sha512-BaSe64HaSh').then(console.log) -// Output: -Buffer# -``` - -#### `> cacache.get.stream(cache, key, [opts]) -> Readable` - -Returns a [Readable Stream](https://nodejs.org/api/stream.html#stream_readable_streams) of the cached data identified by `key`. - -If there is no content identified by `key`, or if the locally-stored data does -not pass the validity checksum, an error will be emitted. - -`metadata` and `integrity` events will be emitted before the stream closes, if -you need to collect that extra data about the cached entry. - -A sub-function, `get.stream.byDigest` may be used for identical behavior, -except lookup will happen by integrity hash, bypassing the index entirely. This -version does not emit the `metadata` and `integrity` events at all. - -##### Example - -```javascript -// Look up by key -cache.get.stream( - cachePath, 'my-thing' -).on('metadata', metadata => { - console.log('metadata:', metadata) -}).on('integrity', integrity => { - console.log('integrity:', integrity) -}).pipe( - fs.createWriteStream('./x.tgz') -) -// Outputs: -metadata: { ... } -integrity: 'sha512-SoMeDIGest+64==' - -// Look up by digest -cache.get.stream.byDigest( - cachePath, 'sha512-SoMeDIGest+64==' -).pipe( - fs.createWriteStream('./x.tgz') -) -``` - -#### `> cacache.get.info(cache, key) -> Promise` - -Looks up `key` in the cache index, returning information about the entry if -one exists. - -##### Fields - -* `key` - Key the entry was looked up under. Matches the `key` argument. -* `integrity` - [Subresource Integrity hash](#integrity) for the content this entry refers to. -* `path` - Filesystem path relative to `cache` argument where content is stored. -* `time` - Timestamp the entry was first added on. -* `metadata` - User-assigned metadata associated with the entry/content. - -##### Example - -```javascript -cacache.get.info(cachePath, 'my-thing').then(console.log) - -// Output -{ - key: 'my-thing', - integrity: 'sha256-MUSTVERIFY+ALL/THINGS==' - path: '.testcache/content/deadbeef', - time: 12345698490, - size: 849234, - metadata: { - name: 'blah', - version: '1.2.3', - description: 'this was once a package but now it is my-thing' - } -} -``` - -#### `> cacache.get.hasContent(cache, integrity) -> Promise` - -Looks up a [Subresource Integrity hash](#integrity) in the cache. If content -exists for this `integrity`, it will return an object, with the specific single integrity hash -that was found in `sri` key, and the size of the found content as `size`. If no content exists for this integrity, it will return `false`. - -##### Example - -```javascript -cacache.get.hasContent(cachePath, 'sha256-MUSTVERIFY+ALL/THINGS==').then(console.log) - -// Output -{ - sri: { - source: 'sha256-MUSTVERIFY+ALL/THINGS==', - algorithm: 'sha256', - digest: 'MUSTVERIFY+ALL/THINGS==', - options: [] - }, - size: 9001 -} - -cacache.get.hasContent(cachePath, 'sha521-NOT+IN/CACHE==').then(console.log) - -// Output -false -``` - -#### `> cacache.put(cache, key, data, [opts]) -> Promise` - -Inserts data passed to it into the cache. The returned Promise resolves with a -digest (generated according to [`opts.algorithms`](#optsalgorithms)) after the -cache entry has been successfully written. - -##### Example - -```javascript -fetch( - 'https://registry.npmjs.org/cacache/-/cacache-1.0.0.tgz' -).then(data => { - return cacache.put(cachePath, 'registry.npmjs.org|cacache@1.0.0', data) -}).then(integrity => { - console.log('integrity hash is', integrity) -}) -``` - -#### `> cacache.put.stream(cache, key, [opts]) -> Writable` - -Returns a [Writable -Stream](https://nodejs.org/api/stream.html#stream_writable_streams) that inserts -data written to it into the cache. Emits an `integrity` event with the digest of -written contents when it succeeds. - -##### Example - -```javascript -request.get( - 'https://registry.npmjs.org/cacache/-/cacache-1.0.0.tgz' -).pipe( - cacache.put.stream( - cachePath, 'registry.npmjs.org|cacache@1.0.0' - ).on('integrity', d => console.log(`integrity digest is ${d}`)) -) -``` - -#### `> cacache.put options` - -`cacache.put` functions have a number of options in common. - -##### `opts.metadata` - -Arbitrary metadata to be attached to the inserted key. - -##### `opts.size` - -If provided, the data stream will be verified to check that enough data was -passed through. If there's more or less data than expected, insertion will fail -with an `EBADSIZE` error. - -##### `opts.integrity` - -If present, the pre-calculated digest for the inserted content. If this option -if provided and does not match the post-insertion digest, insertion will fail -with an `EINTEGRITY` error. - -`algorithms` has no effect if this option is present. - -##### `opts.algorithms` - -Default: ['sha512'] - -Hashing algorithms to use when calculating the [subresource integrity -digest](#integrity) -for inserted data. Can use any algorithm listed in `crypto.getHashes()` or -`'omakase'`/`'お任せします'` to pick a random hash algorithm on each insertion. You -may also use any anagram of `'modnar'` to use this feature. - -Currently only supports one algorithm at a time (i.e., an array length of -exactly `1`). Has no effect if `opts.integrity` is present. - -##### `opts.uid`/`opts.gid` - -If provided, cacache will do its best to make sure any new files added to the -cache use this particular `uid`/`gid` combination. This can be used, -for example, to drop permissions when someone uses `sudo`, but cacache makes -no assumptions about your needs here. - -##### `opts.memoize` - -Default: null - -If provided, cacache will memoize the given cache insertion in memory, bypassing -any filesystem checks for that key or digest in future cache fetches. Nothing -will be written to the in-memory cache unless this option is explicitly truthy. - -If `opts.memoize` is an object or a `Map`-like (that is, an object with `get` -and `set` methods), it will be written to instead of the global memoization -cache. - -Reading from disk data can be forced by explicitly passing `memoize: false` to -the reader functions, but their default will be to read from memory. - -#### `> cacache.rm.all(cache) -> Promise` - -Clears the entire cache. Mainly by blowing away the cache directory itself. - -##### Example - -```javascript -cacache.rm.all(cachePath).then(() => { - console.log('THE APOCALYPSE IS UPON US 😱') -}) -``` - -#### `> cacache.rm.entry(cache, key) -> Promise` - -Alias: `cacache.rm` - -Removes the index entry for `key`. Content will still be accessible if -requested directly by content address ([`get.stream.byDigest`](#get-stream)). - -To remove the content itself (which might still be used by other entries), use -[`rm.content`](#rm-content). Or, to safely vacuum any unused content, use -[`verify`](#verify). - -##### Example - -```javascript -cacache.rm.entry(cachePath, 'my-thing').then(() => { - console.log('I did not like it anyway') -}) -``` - -#### `> cacache.rm.content(cache, integrity) -> Promise` - -Removes the content identified by `integrity`. Any index entries referring to it -will not be usable again until the content is re-added to the cache with an -identical digest. - -##### Example - -```javascript -cacache.rm.content(cachePath, 'sha512-SoMeDIGest/IN+BaSE64==').then(() => { - console.log('data for my-thing is gone!') -}) -``` - -#### `> cacache.setLocale(locale)` - -Configure the language/locale used for messages and errors coming from cacache. -The list of available locales is in the `./locales` directory in the project -root. - -_Interested in contributing more languages! [Submit a PR](CONTRIBUTING.md)!_ - -#### `> cacache.clearMemoized()` - -Completely resets the in-memory entry cache. - -#### `> tmp.mkdir(cache, opts) -> Promise` - -Returns a unique temporary directory inside the cache's `tmp` dir. This -directory will use the same safe user assignment that all the other stuff use. - -Once the directory is made, it's the user's responsibility that all files within -are made according to the same `opts.gid`/`opts.uid` settings that would be -passed in. If not, you can ask cacache to do it for you by calling -[`tmp.fix()`](#tmp-fix), which will fix all tmp directory permissions. - -If you want automatic cleanup of this directory, use -[`tmp.withTmp()`](#with-tpm) - -##### Example - -```javascript -cacache.tmp.mkdir(cache).then(dir => { - fs.writeFile(path.join(dir, 'blablabla'), Buffer#<1234>, ...) -}) -``` - -#### `> tmp.withTmp(cache, opts, cb) -> Promise` - -Creates a temporary directory with [`tmp.mkdir()`](#tmp-mkdir) and calls `cb` -with it. The created temporary directory will be removed when the return value -of `cb()` resolves -- that is, if you return a Promise from `cb()`, the tmp -directory will be automatically deleted once that promise completes. - -The same caveats apply when it comes to managing permissions for the tmp dir's -contents. - -##### Example - -```javascript -cacache.tmp.withTmp(cache, dir => { - return fs.writeFileAsync(path.join(dir, 'blablabla'), Buffer#<1234>, ...) -}).then(() => { - // `dir` no longer exists -}) -``` - -#### Subresource Integrity Digests - -For content verification and addressing, cacache uses strings following the -[Subresource -Integrity spec](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity). -That is, any time cacache expects an `integrity` argument or option, it -should be in the format `-`. - -One deviation from the current spec is that cacache will support any hash -algorithms supported by the underlying Node.js process. You can use -`crypto.getHashes()` to see which ones you can use. - -##### Generating Digests Yourself - -If you have an existing content shasum, they are generally formatted as a -hexadecimal string (that is, a sha1 would look like: -`5f5513f8822fdbe5145af33b64d8d970dcf95c6e`). In order to be compatible with -cacache, you'll need to convert this to an equivalent subresource integrity -string. For this example, the corresponding hash would be: -`sha1-X1UT+IIv2+UUWvM7ZNjZcNz5XG4=`. - -If you want to generate an integrity string yourself for existing data, you can -use something like this: - -```javascript -const crypto = require('crypto') -const hashAlgorithm = 'sha512' -const data = 'foobarbaz' - -const integrity = ( - hashAlgorithm + - '-' + - crypto.createHash(hashAlgorithm).update(data).digest('base64') -) -``` - -You can also use [`ssri`](https://npm.im/ssri) to have a richer set of functionality -around SRI strings, including generation, parsing, and translating from existing -hex-formatted strings. - -#### `> cacache.verify(cache, opts) -> Promise` - -Checks out and fixes up your cache: - -* Cleans up corrupted or invalid index entries. -* Custom entry filtering options. -* Garbage collects any content entries not referenced by the index. -* Checks integrity for all content entries and removes invalid content. -* Fixes cache ownership. -* Removes the `tmp` directory in the cache and all its contents. - -When it's done, it'll return an object with various stats about the verification -process, including amount of storage reclaimed, number of valid entries, number -of entries removed, etc. - -##### Options - -* `opts.uid` - uid to assign to cache and its contents -* `opts.gid` - gid to assign to cache and its contents -* `opts.filter` - receives a formatted entry. Return false to remove it. - Note: might be called more than once on the same entry. - -##### Example - -```sh -echo somegarbage >> $CACHEPATH/content/deadbeef -``` - -```javascript -cacache.verify(cachePath).then(stats => { - // deadbeef collected, because of invalid checksum. - console.log('cache is much nicer now! stats:', stats) -}) -``` - -#### `> cacache.verify.lastRun(cache) -> Promise` - -Returns a `Date` representing the last time `cacache.verify` was run on `cache`. - -##### Example - -```javascript -cacache.verify(cachePath).then(() => { - cacache.verify.lastRun(cachePath).then(lastTime => { - console.log('cacache.verify was last called on' + lastTime) - }) -}) -``` diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/en.js b/node_modules/npm-registry-fetch/node_modules/cacache/en.js deleted file mode 100644 index a3db581c9f1fa..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/en.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict' - -module.exports = require('./locales/en.js') diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/es.js b/node_modules/npm-registry-fetch/node_modules/cacache/es.js deleted file mode 100644 index 6282363c3bdbf..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/es.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict' - -module.exports = require('./locales/es.js') diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/get.js b/node_modules/npm-registry-fetch/node_modules/cacache/get.js deleted file mode 100644 index 2bb3afa5281ca..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/get.js +++ /dev/null @@ -1,190 +0,0 @@ -'use strict' - -const BB = require('bluebird') - -const fs = require('fs') -const index = require('./lib/entry-index') -const memo = require('./lib/memoization') -const pipe = require('mississippi').pipe -const pipeline = require('mississippi').pipeline -const read = require('./lib/content/read') -const through = require('mississippi').through - -module.exports = function get (cache, key, opts) { - return getData(false, cache, key, opts) -} -module.exports.byDigest = function getByDigest (cache, digest, opts) { - return getData(true, cache, digest, opts) -} -function getData (byDigest, cache, key, opts) { - opts = opts || {} - const memoized = ( - byDigest - ? memo.get.byDigest(cache, key, opts) - : memo.get(cache, key, opts) - ) - if (memoized && opts.memoize !== false) { - return BB.resolve(byDigest ? memoized : { - metadata: memoized.entry.metadata, - data: memoized.data, - integrity: memoized.entry.integrity, - size: memoized.entry.size - }) - } - return ( - byDigest ? BB.resolve(null) : index.find(cache, key, opts) - ).then(entry => { - if (!entry && !byDigest) { - throw new index.NotFoundError(cache, key) - } - return read(cache, byDigest ? key : entry.integrity, { - integrity: opts.integrity, - size: opts.size - }).then(data => byDigest ? data : { - metadata: entry.metadata, - data: data, - size: entry.size, - integrity: entry.integrity - }).then(res => { - if (opts.memoize && byDigest) { - memo.put.byDigest(cache, key, res, opts) - } else if (opts.memoize) { - memo.put(cache, entry, res.data, opts) - } - return res - }) - }) -} - -module.exports.stream = getStream -function getStream (cache, key, opts) { - opts = opts || {} - let stream = through() - const memoized = memo.get(cache, key, opts) - if (memoized && opts.memoize !== false) { - stream.on('newListener', function (ev, cb) { - ev === 'metadata' && cb(memoized.entry.metadata) - ev === 'integrity' && cb(memoized.entry.integrity) - ev === 'size' && cb(memoized.entry.size) - }) - stream.write(memoized.data, () => stream.end()) - return stream - } - index.find(cache, key).then(entry => { - if (!entry) { - return stream.emit( - 'error', new index.NotFoundError(cache, key) - ) - } - let memoStream - if (opts.memoize) { - let memoData = [] - let memoLength = 0 - memoStream = through((c, en, cb) => { - memoData && memoData.push(c) - memoLength += c.length - cb(null, c, en) - }, cb => { - memoData && memo.put(cache, entry, Buffer.concat(memoData, memoLength), opts) - cb() - }) - } else { - memoStream = through() - } - opts.size = opts.size == null ? entry.size : opts.size - stream.emit('metadata', entry.metadata) - stream.emit('integrity', entry.integrity) - stream.emit('size', entry.size) - stream.on('newListener', function (ev, cb) { - ev === 'metadata' && cb(entry.metadata) - ev === 'integrity' && cb(entry.integrity) - ev === 'size' && cb(entry.size) - }) - pipe( - read.readStream(cache, entry.integrity, opts), - memoStream, - stream - ) - }, err => stream.emit('error', err)) - return stream -} - -module.exports.stream.byDigest = getStreamDigest -function getStreamDigest (cache, integrity, opts) { - opts = opts || {} - const memoized = memo.get.byDigest(cache, integrity, opts) - if (memoized && opts.memoize !== false) { - const stream = through() - stream.write(memoized, () => stream.end()) - return stream - } else { - let stream = read.readStream(cache, integrity, opts) - if (opts.memoize) { - let memoData = [] - let memoLength = 0 - const memoStream = through((c, en, cb) => { - memoData && memoData.push(c) - memoLength += c.length - cb(null, c, en) - }, cb => { - memoData && memo.put.byDigest( - cache, - integrity, - Buffer.concat(memoData, memoLength), - opts - ) - cb() - }) - stream = pipeline(stream, memoStream) - } - return stream - } -} - -module.exports.info = info -function info (cache, key, opts) { - opts = opts || {} - const memoized = memo.get(cache, key, opts) - if (memoized && opts.memoize !== false) { - return BB.resolve(memoized.entry) - } else { - return index.find(cache, key) - } -} - -module.exports.hasContent = read.hasContent - -module.exports.copy = function cp (cache, key, dest, opts) { - return copy(false, cache, key, dest, opts) -} -module.exports.copy.byDigest = function cpDigest (cache, digest, dest, opts) { - return copy(true, cache, digest, dest, opts) -} -function copy (byDigest, cache, key, dest, opts) { - opts = opts || {} - if (read.copy) { - return ( - byDigest ? BB.resolve(null) : index.find(cache, key, opts) - ).then(entry => { - if (!entry && !byDigest) { - throw new index.NotFoundError(cache, key) - } - return read.copy( - cache, byDigest ? key : entry.integrity, dest, opts - ).then(() => byDigest ? key : { - metadata: entry.metadata, - size: entry.size, - integrity: entry.integrity - }) - }) - } else { - return getData(byDigest, cache, key, opts).then(res => { - return fs.writeFileAsync(dest, byDigest ? res : res.data) - .then(() => byDigest ? key : { - metadata: res.metadata, - size: res.size, - integrity: res.integrity - }) - }) - } -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/index.js b/node_modules/npm-registry-fetch/node_modules/cacache/index.js deleted file mode 100644 index a3db581c9f1fa..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/index.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict' - -module.exports = require('./locales/en.js') diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/lib/content/path.js b/node_modules/npm-registry-fetch/node_modules/cacache/lib/content/path.js deleted file mode 100644 index fa6491ba6f895..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/lib/content/path.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict' - -const contentVer = require('../../package.json')['cache-version'].content -const hashToSegments = require('../util/hash-to-segments') -const path = require('path') -const ssri = require('ssri') - -// Current format of content file path: -// -// sha512-BaSE64Hex= -> -// ~/.my-cache/content-v2/sha512/ba/da/55deadbeefc0ffee -// -module.exports = contentPath -function contentPath (cache, integrity) { - const sri = ssri.parse(integrity, {single: true}) - // contentPath is the *strongest* algo given - return path.join.apply(path, [ - contentDir(cache), - sri.algorithm - ].concat(hashToSegments(sri.hexDigest()))) -} - -module.exports._contentDir = contentDir -function contentDir (cache) { - return path.join(cache, `content-v${contentVer}`) -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/lib/content/read.js b/node_modules/npm-registry-fetch/node_modules/cacache/lib/content/read.js deleted file mode 100644 index 7a4da3beb8677..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/lib/content/read.js +++ /dev/null @@ -1,125 +0,0 @@ -'use strict' - -const BB = require('bluebird') - -const contentPath = require('./path') -const fs = require('graceful-fs') -const PassThrough = require('stream').PassThrough -const pipe = BB.promisify(require('mississippi').pipe) -const ssri = require('ssri') -const Y = require('../util/y.js') - -BB.promisifyAll(fs) - -module.exports = read -function read (cache, integrity, opts) { - opts = opts || {} - return pickContentSri(cache, integrity).then(content => { - const sri = content.sri - const cpath = contentPath(cache, sri) - return fs.readFileAsync(cpath, null).then(data => { - if (typeof opts.size === 'number' && opts.size !== data.length) { - throw sizeError(opts.size, data.length) - } else if (ssri.checkData(data, sri)) { - return data - } else { - throw integrityError(sri, cpath) - } - }) - }) -} - -module.exports.stream = readStream -module.exports.readStream = readStream -function readStream (cache, integrity, opts) { - opts = opts || {} - const stream = new PassThrough() - pickContentSri( - cache, integrity - ).then(content => { - const sri = content.sri - return pipe( - fs.createReadStream(contentPath(cache, sri)), - ssri.integrityStream({ - integrity: sri, - size: opts.size - }), - stream - ) - }).catch(err => { - stream.emit('error', err) - }) - return stream -} - -if (fs.copyFile) { - module.exports.copy = copy -} -function copy (cache, integrity, dest, opts) { - opts = opts || {} - return pickContentSri(cache, integrity).then(content => { - const sri = content.sri - const cpath = contentPath(cache, sri) - return fs.copyFileAsync(cpath, dest).then(() => content.size) - }) -} - -module.exports.hasContent = hasContent -function hasContent (cache, integrity) { - if (!integrity) { return BB.resolve(false) } - return pickContentSri(cache, integrity) - .catch({code: 'ENOENT'}, () => false) - .catch({code: 'EPERM'}, err => { - if (process.platform !== 'win32') { - throw err - } else { - return false - } - }).then(content => { - if (!content.sri) return false - return ({ sri: content.sri, size: content.stat.size }) - }) -} - -module.exports._pickContentSri = pickContentSri -function pickContentSri (cache, integrity) { - const sri = ssri.parse(integrity) - // If `integrity` has multiple entries, pick the first digest - // with available local data. - const algo = sri.pickAlgorithm() - const digests = sri[algo] - if (digests.length <= 1) { - const cpath = contentPath(cache, digests[0]) - return fs.lstatAsync(cpath).then(stat => ({ sri: digests[0], stat })) - } else { - return BB.any(sri[sri.pickAlgorithm()].map(meta => { - return pickContentSri(cache, meta) - })) - .catch(err => { - if ([].some.call(err, e => e.code === 'ENOENT')) { - throw Object.assign( - new Error('No matching content found for ' + sri.toString()), - {code: 'ENOENT'} - ) - } else { - throw err[0] - } - }) - } -} - -function sizeError (expected, found) { - var err = new Error(Y`Bad data size: expected inserted data to be ${expected} bytes, but got ${found} instead`) - err.expected = expected - err.found = found - err.code = 'EBADSIZE' - return err -} - -function integrityError (sri, path) { - var err = new Error(Y`Integrity verification failed for ${sri} (${path})`) - err.code = 'EINTEGRITY' - err.sri = sri - err.path = path - return err -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/lib/content/rm.js b/node_modules/npm-registry-fetch/node_modules/cacache/lib/content/rm.js deleted file mode 100644 index 12cf1582358dd..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/lib/content/rm.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict' - -const BB = require('bluebird') - -const contentPath = require('./path') -const hasContent = require('./read').hasContent -const rimraf = BB.promisify(require('rimraf')) - -module.exports = rm -function rm (cache, integrity) { - return hasContent(cache, integrity).then(content => { - if (content) { - const sri = content.sri - if (sri) { - return rimraf(contentPath(cache, sri)).then(() => true) - } - } else { - return false - } - }) -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/lib/content/write.js b/node_modules/npm-registry-fetch/node_modules/cacache/lib/content/write.js deleted file mode 100644 index a79ae92902137..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/lib/content/write.js +++ /dev/null @@ -1,162 +0,0 @@ -'use strict' - -const BB = require('bluebird') - -const contentPath = require('./path') -const fixOwner = require('../util/fix-owner') -const fs = require('graceful-fs') -const moveFile = require('../util/move-file') -const PassThrough = require('stream').PassThrough -const path = require('path') -const pipe = BB.promisify(require('mississippi').pipe) -const rimraf = BB.promisify(require('rimraf')) -const ssri = require('ssri') -const to = require('mississippi').to -const uniqueFilename = require('unique-filename') -const Y = require('../util/y.js') - -const writeFileAsync = BB.promisify(fs.writeFile) - -module.exports = write -function write (cache, data, opts) { - opts = opts || {} - if (opts.algorithms && opts.algorithms.length > 1) { - throw new Error( - Y`opts.algorithms only supports a single algorithm for now` - ) - } - if (typeof opts.size === 'number' && data.length !== opts.size) { - return BB.reject(sizeError(opts.size, data.length)) - } - const sri = ssri.fromData(data, opts) - if (opts.integrity && !ssri.checkData(data, opts.integrity, opts)) { - return BB.reject(checksumError(opts.integrity, sri)) - } - return BB.using(makeTmp(cache, opts), tmp => ( - writeFileAsync( - tmp.target, data, {flag: 'wx'} - ).then(() => ( - moveToDestination(tmp, cache, sri, opts) - )) - )).then(() => ({integrity: sri, size: data.length})) -} - -module.exports.stream = writeStream -function writeStream (cache, opts) { - opts = opts || {} - const inputStream = new PassThrough() - let inputErr = false - function errCheck () { - if (inputErr) { throw inputErr } - } - - let allDone - const ret = to((c, n, cb) => { - if (!allDone) { - allDone = handleContent(inputStream, cache, opts, errCheck) - } - inputStream.write(c, n, cb) - }, cb => { - inputStream.end(() => { - if (!allDone) { - const e = new Error(Y`Cache input stream was empty`) - e.code = 'ENODATA' - return ret.emit('error', e) - } - allDone.then(res => { - res.integrity && ret.emit('integrity', res.integrity) - res.size !== null && ret.emit('size', res.size) - cb() - }, e => { - ret.emit('error', e) - }) - }) - }) - ret.once('error', e => { - inputErr = e - }) - return ret -} - -function handleContent (inputStream, cache, opts, errCheck) { - return BB.using(makeTmp(cache, opts), tmp => { - errCheck() - return pipeToTmp( - inputStream, cache, tmp.target, opts, errCheck - ).then(res => { - return moveToDestination( - tmp, cache, res.integrity, opts, errCheck - ).then(() => res) - }) - }) -} - -function pipeToTmp (inputStream, cache, tmpTarget, opts, errCheck) { - return BB.resolve().then(() => { - let integrity - let size - const hashStream = ssri.integrityStream({ - integrity: opts.integrity, - algorithms: opts.algorithms, - size: opts.size - }).on('integrity', s => { - integrity = s - }).on('size', s => { - size = s - }) - const outStream = fs.createWriteStream(tmpTarget, { - flags: 'wx' - }) - errCheck() - return pipe(inputStream, hashStream, outStream).then(() => { - return {integrity, size} - }, err => { - return rimraf(tmpTarget).then(() => { throw err }) - }) - }) -} - -function makeTmp (cache, opts) { - const tmpTarget = uniqueFilename(path.join(cache, 'tmp'), opts.tmpPrefix) - return fixOwner.mkdirfix( - path.dirname(tmpTarget), opts.uid, opts.gid - ).then(() => ({ - target: tmpTarget, - moved: false - })).disposer(tmp => (!tmp.moved && rimraf(tmp.target))) -} - -function moveToDestination (tmp, cache, sri, opts, errCheck) { - errCheck && errCheck() - const destination = contentPath(cache, sri) - const destDir = path.dirname(destination) - - return fixOwner.mkdirfix( - destDir, opts.uid, opts.gid - ).then(() => { - errCheck && errCheck() - return moveFile(tmp.target, destination) - }).then(() => { - errCheck && errCheck() - tmp.moved = true - return fixOwner.chownr(destination, opts.uid, opts.gid) - }) -} - -function sizeError (expected, found) { - var err = new Error(Y`Bad data size: expected inserted data to be ${expected} bytes, but got ${found} instead`) - err.expected = expected - err.found = found - err.code = 'EBADSIZE' - return err -} - -function checksumError (expected, found) { - var err = new Error(Y`Integrity check failed: - Wanted: ${expected} - Found: ${found}`) - err.code = 'EINTEGRITY' - err.expected = expected - err.found = found - return err -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/lib/entry-index.js b/node_modules/npm-registry-fetch/node_modules/cacache/lib/entry-index.js deleted file mode 100644 index fe1cd06457472..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/lib/entry-index.js +++ /dev/null @@ -1,225 +0,0 @@ -'use strict' - -const BB = require('bluebird') - -const contentPath = require('./content/path') -const crypto = require('crypto') -const fixOwner = require('./util/fix-owner') -const fs = require('graceful-fs') -const hashToSegments = require('./util/hash-to-segments') -const ms = require('mississippi') -const path = require('path') -const ssri = require('ssri') -const Y = require('./util/y.js') - -const indexV = require('../package.json')['cache-version'].index - -const appendFileAsync = BB.promisify(fs.appendFile) -const readFileAsync = BB.promisify(fs.readFile) -const readdirAsync = BB.promisify(fs.readdir) -const concat = ms.concat -const from = ms.from - -module.exports.NotFoundError = class NotFoundError extends Error { - constructor (cache, key) { - super(Y`No cache entry for \`${key}\` found in \`${cache}\``) - this.code = 'ENOENT' - this.cache = cache - this.key = key - } -} - -module.exports.insert = insert -function insert (cache, key, integrity, opts) { - opts = opts || {} - const bucket = bucketPath(cache, key) - const entry = { - key, - integrity: integrity && ssri.stringify(integrity), - time: Date.now(), - size: opts.size, - metadata: opts.metadata - } - return fixOwner.mkdirfix( - path.dirname(bucket), opts.uid, opts.gid - ).then(() => { - const stringified = JSON.stringify(entry) - // NOTE - Cleverness ahoy! - // - // This works because it's tremendously unlikely for an entry to corrupt - // another while still preserving the string length of the JSON in - // question. So, we just slap the length in there and verify it on read. - // - // Thanks to @isaacs for the whiteboarding session that ended up with this. - return appendFileAsync( - bucket, `\n${hashEntry(stringified)}\t${stringified}` - ) - }).then( - () => fixOwner.chownr(bucket, opts.uid, opts.gid) - ).catch({code: 'ENOENT'}, () => { - // There's a class of race conditions that happen when things get deleted - // during fixOwner, or between the two mkdirfix/chownr calls. - // - // It's perfectly fine to just not bother in those cases and lie - // that the index entry was written. Because it's a cache. - }).then(() => { - return formatEntry(cache, entry) - }) -} - -module.exports.find = find -function find (cache, key) { - const bucket = bucketPath(cache, key) - return bucketEntries(cache, bucket).then(entries => { - return entries.reduce((latest, next) => { - if (next && next.key === key) { - return formatEntry(cache, next) - } else { - return latest - } - }, null) - }).catch(err => { - if (err.code === 'ENOENT') { - return null - } else { - throw err - } - }) -} - -module.exports.delete = del -function del (cache, key, opts) { - return insert(cache, key, null, opts) -} - -module.exports.lsStream = lsStream -function lsStream (cache) { - const indexDir = bucketDir(cache) - const stream = from.obj() - - // "/cachename/*" - readdirOrEmpty(indexDir).map(bucket => { - const bucketPath = path.join(indexDir, bucket) - - // "/cachename//*" - return readdirOrEmpty(bucketPath).map(subbucket => { - const subbucketPath = path.join(bucketPath, subbucket) - - // "/cachename///*" - return readdirOrEmpty(subbucketPath).map(entry => { - const getKeyToEntry = bucketEntries( - cache, - path.join(subbucketPath, entry) - ).reduce((acc, entry) => { - acc.set(entry.key, entry) - return acc - }, new Map()) - - return getKeyToEntry.then(reduced => { - for (let entry of reduced.values()) { - const formatted = formatEntry(cache, entry) - formatted && stream.push(formatted) - } - }).catch({code: 'ENOENT'}, nop) - }) - }) - }).then(() => { - stream.push(null) - }, err => { - stream.emit('error', err) - }) - - return stream -} - -module.exports.ls = ls -function ls (cache) { - return BB.fromNode(cb => { - lsStream(cache).on('error', cb).pipe(concat(entries => { - cb(null, entries.reduce((acc, xs) => { - acc[xs.key] = xs - return acc - }, {})) - })) - }) -} - -function bucketEntries (cache, bucket, filter) { - return readFileAsync( - bucket, 'utf8' - ).then(data => { - let entries = [] - data.split('\n').forEach(entry => { - if (!entry) { return } - const pieces = entry.split('\t') - if (!pieces[1] || hashEntry(pieces[1]) !== pieces[0]) { - // Hash is no good! Corruption or malice? Doesn't matter! - // EJECT EJECT - return - } - let obj - try { - obj = JSON.parse(pieces[1]) - } catch (e) { - // Entry is corrupted! - return - } - if (obj) { - entries.push(obj) - } - }) - return entries - }) -} - -module.exports._bucketDir = bucketDir -function bucketDir (cache) { - return path.join(cache, `index-v${indexV}`) -} - -module.exports._bucketPath = bucketPath -function bucketPath (cache, key) { - const hashed = hashKey(key) - return path.join.apply(path, [bucketDir(cache)].concat( - hashToSegments(hashed) - )) -} - -module.exports._hashKey = hashKey -function hashKey (key) { - return hash(key, 'sha256') -} - -module.exports._hashEntry = hashEntry -function hashEntry (str) { - return hash(str, 'sha1') -} - -function hash (str, digest) { - return crypto - .createHash(digest) - .update(str) - .digest('hex') -} - -function formatEntry (cache, entry) { - // Treat null digests as deletions. They'll shadow any previous entries. - if (!entry.integrity) { return null } - return { - key: entry.key, - integrity: entry.integrity, - path: contentPath(cache, entry.integrity), - size: entry.size, - time: entry.time, - metadata: entry.metadata - } -} - -function readdirOrEmpty (dir) { - return readdirAsync(dir) - .catch({code: 'ENOENT'}, () => []) - .catch({code: 'ENOTDIR'}, () => []) -} - -function nop () { -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/lib/memoization.js b/node_modules/npm-registry-fetch/node_modules/cacache/lib/memoization.js deleted file mode 100644 index 92179c7ac6afc..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/lib/memoization.js +++ /dev/null @@ -1,69 +0,0 @@ -'use strict' - -const LRU = require('lru-cache') - -const MAX_SIZE = 50 * 1024 * 1024 // 50MB -const MAX_AGE = 3 * 60 * 1000 - -let MEMOIZED = new LRU({ - max: MAX_SIZE, - maxAge: MAX_AGE, - length: (entry, key) => { - if (key.startsWith('key:')) { - return entry.data.length - } else if (key.startsWith('digest:')) { - return entry.length - } - } -}) - -module.exports.clearMemoized = clearMemoized -function clearMemoized () { - const old = {} - MEMOIZED.forEach((v, k) => { - old[k] = v - }) - MEMOIZED.reset() - return old -} - -module.exports.put = put -function put (cache, entry, data, opts) { - pickMem(opts).set(`key:${cache}:${entry.key}`, { entry, data }) - putDigest(cache, entry.integrity, data, opts) -} - -module.exports.put.byDigest = putDigest -function putDigest (cache, integrity, data, opts) { - pickMem(opts).set(`digest:${cache}:${integrity}`, data) -} - -module.exports.get = get -function get (cache, key, opts) { - return pickMem(opts).get(`key:${cache}:${key}`) -} - -module.exports.get.byDigest = getDigest -function getDigest (cache, integrity, opts) { - return pickMem(opts).get(`digest:${cache}:${integrity}`) -} - -class ObjProxy { - constructor (obj) { - this.obj = obj - } - get (key) { return this.obj[key] } - set (key, val) { this.obj[key] = val } -} - -function pickMem (opts) { - if (!opts || !opts.memoize) { - return MEMOIZED - } else if (opts.memoize.get && opts.memoize.set) { - return opts.memoize - } else if (typeof opts.memoize === 'object') { - return new ObjProxy(opts.memoize) - } else { - return MEMOIZED - } -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/lib/util/fix-owner.js b/node_modules/npm-registry-fetch/node_modules/cacache/lib/util/fix-owner.js deleted file mode 100644 index 7000bff04807a..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/lib/util/fix-owner.js +++ /dev/null @@ -1,44 +0,0 @@ -'use strict' - -const BB = require('bluebird') - -const chownr = BB.promisify(require('chownr')) -const mkdirp = BB.promisify(require('mkdirp')) -const inflight = require('promise-inflight') - -module.exports.chownr = fixOwner -function fixOwner (filepath, uid, gid) { - if (!process.getuid) { - // This platform doesn't need ownership fixing - return BB.resolve() - } - if (typeof uid !== 'number' && typeof gid !== 'number') { - // There's no permissions override. Nothing to do here. - return BB.resolve() - } - if ((typeof uid === 'number' && process.getuid() === uid) && - (typeof gid === 'number' && process.getgid() === gid)) { - // No need to override if it's already what we used. - return BB.resolve() - } - return inflight( - 'fixOwner: fixing ownership on ' + filepath, - () => chownr( - filepath, - typeof uid === 'number' ? uid : process.getuid(), - typeof gid === 'number' ? gid : process.getgid() - ).catch({code: 'ENOENT'}, () => null) - ) -} - -module.exports.mkdirfix = mkdirfix -function mkdirfix (p, uid, gid, cb) { - return mkdirp(p).then(made => { - if (made) { - return fixOwner(made, uid, gid).then(() => made) - } - }).catch({code: 'EEXIST'}, () => { - // There's a race in mkdirp! - return fixOwner(p, uid, gid).then(() => null) - }) -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/lib/util/hash-to-segments.js b/node_modules/npm-registry-fetch/node_modules/cacache/lib/util/hash-to-segments.js deleted file mode 100644 index 192be2a6d650a..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/lib/util/hash-to-segments.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict' - -module.exports = hashToSegments - -function hashToSegments (hash) { - return [ - hash.slice(0, 2), - hash.slice(2, 4), - hash.slice(4) - ] -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/lib/util/move-file.js b/node_modules/npm-registry-fetch/node_modules/cacache/lib/util/move-file.js deleted file mode 100644 index b43744b3da867..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/lib/util/move-file.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict' - -const fs = require('graceful-fs') -const BB = require('bluebird') -const chmod = BB.promisify(fs.chmod) -const unlink = BB.promisify(fs.unlink) -let move -let pinflight - -module.exports = moveFile -function moveFile (src, dest) { - // This isn't quite an fs.rename -- the assumption is that - // if `dest` already exists, and we get certain errors while - // trying to move it, we should just not bother. - // - // In the case of cache corruption, users will receive an - // EINTEGRITY error elsewhere, and can remove the offending - // content their own way. - // - // Note that, as the name suggests, this strictly only supports file moves. - return BB.fromNode(cb => { - fs.link(src, dest, err => { - if (err) { - if (err.code === 'EEXIST' || err.code === 'EBUSY') { - // file already exists, so whatever - } else if (err.code === 'EPERM' && process.platform === 'win32') { - // file handle stayed open even past graceful-fs limits - } else { - return cb(err) - } - } - return cb() - }) - }).then(() => { - // content should never change for any reason, so make it read-only - return BB.join(unlink(src), process.platform !== 'win32' && chmod(dest, '0444')) - }).catch(() => { - if (!pinflight) { pinflight = require('promise-inflight') } - return pinflight('cacache-move-file:' + dest, () => { - return BB.promisify(fs.stat)(dest).catch(err => { - if (err.code !== 'ENOENT') { - // Something else is wrong here. Bail bail bail - throw err - } - // file doesn't already exist! let's try a rename -> copy fallback - if (!move) { move = require('move-concurrently') } - return move(src, dest, { BB, fs }) - }) - }) - }) -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/lib/util/tmp.js b/node_modules/npm-registry-fetch/node_modules/cacache/lib/util/tmp.js deleted file mode 100644 index 4fc4512cc854e..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/lib/util/tmp.js +++ /dev/null @@ -1,32 +0,0 @@ -'use strict' - -const BB = require('bluebird') - -const fixOwner = require('./fix-owner') -const path = require('path') -const rimraf = BB.promisify(require('rimraf')) -const uniqueFilename = require('unique-filename') - -module.exports.mkdir = mktmpdir -function mktmpdir (cache, opts) { - opts = opts || {} - const tmpTarget = uniqueFilename(path.join(cache, 'tmp'), opts.tmpPrefix) - return fixOwner.mkdirfix(tmpTarget, opts.uid, opts.gid).then(() => { - return tmpTarget - }) -} - -module.exports.withTmp = withTmp -function withTmp (cache, opts, cb) { - if (!cb) { - cb = opts - opts = null - } - opts = opts || {} - return BB.using(mktmpdir(cache, opts).disposer(rimraf), cb) -} - -module.exports.fix = fixtmpdir -function fixtmpdir (cache, opts) { - return fixOwner(path.join(cache, 'tmp'), opts.uid, opts.gid) -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/lib/util/y.js b/node_modules/npm-registry-fetch/node_modules/cacache/lib/util/y.js deleted file mode 100644 index d62bedacb32a2..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/lib/util/y.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict' - -const path = require('path') -const y18n = require('y18n')({ - directory: path.join(__dirname, '../../locales'), - locale: 'en', - updateFiles: process.env.CACACHE_UPDATE_LOCALE_FILES === 'true' -}) - -module.exports = yTag -function yTag (parts) { - let str = '' - parts.forEach((part, i) => { - const arg = arguments[i + 1] - str += part - if (arg) { - str += '%s' - } - }) - return y18n.__.apply(null, [str].concat([].slice.call(arguments, 1))) -} - -module.exports.setLocale = locale => { - y18n.setLocale(locale) -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/lib/verify.js b/node_modules/npm-registry-fetch/node_modules/cacache/lib/verify.js deleted file mode 100644 index 6a01004c97c4a..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/lib/verify.js +++ /dev/null @@ -1,213 +0,0 @@ -'use strict' - -const BB = require('bluebird') - -const contentPath = require('./content/path') -const finished = BB.promisify(require('mississippi').finished) -const fixOwner = require('./util/fix-owner') -const fs = require('graceful-fs') -const glob = BB.promisify(require('glob')) -const index = require('./entry-index') -const path = require('path') -const rimraf = BB.promisify(require('rimraf')) -const ssri = require('ssri') - -BB.promisifyAll(fs) - -module.exports = verify -function verify (cache, opts) { - opts = opts || {} - opts.log && opts.log.silly('verify', 'verifying cache at', cache) - return BB.reduce([ - markStartTime, - fixPerms, - garbageCollect, - rebuildIndex, - cleanTmp, - writeVerifile, - markEndTime - ], (stats, step, i) => { - const label = step.name || `step #${i}` - const start = new Date() - return BB.resolve(step(cache, opts)).then(s => { - s && Object.keys(s).forEach(k => { - stats[k] = s[k] - }) - const end = new Date() - if (!stats.runTime) { stats.runTime = {} } - stats.runTime[label] = end - start - return stats - }) - }, {}).tap(stats => { - stats.runTime.total = stats.endTime - stats.startTime - opts.log && opts.log.silly('verify', 'verification finished for', cache, 'in', `${stats.runTime.total}ms`) - }) -} - -function markStartTime (cache, opts) { - return { startTime: new Date() } -} - -function markEndTime (cache, opts) { - return { endTime: new Date() } -} - -function fixPerms (cache, opts) { - opts.log && opts.log.silly('verify', 'fixing cache permissions') - return fixOwner.mkdirfix(cache, opts.uid, opts.gid).then(() => { - // TODO - fix file permissions too - return fixOwner.chownr(cache, opts.uid, opts.gid) - }).then(() => null) -} - -// Implements a naive mark-and-sweep tracing garbage collector. -// -// The algorithm is basically as follows: -// 1. Read (and filter) all index entries ("pointers") -// 2. Mark each integrity value as "live" -// 3. Read entire filesystem tree in `content-vX/` dir -// 4. If content is live, verify its checksum and delete it if it fails -// 5. If content is not marked as live, rimraf it. -// -function garbageCollect (cache, opts) { - opts.log && opts.log.silly('verify', 'garbage collecting content') - const indexStream = index.lsStream(cache) - const liveContent = new Set() - indexStream.on('data', entry => { - if (opts && opts.filter && !opts.filter(entry)) { return } - liveContent.add(entry.integrity.toString()) - }) - return finished(indexStream).then(() => { - const contentDir = contentPath._contentDir(cache) - return glob(path.join(contentDir, '**'), { - follow: false, - nodir: true, - nosort: true - }).then(files => { - return BB.resolve({ - verifiedContent: 0, - reclaimedCount: 0, - reclaimedSize: 0, - badContentCount: 0, - keptSize: 0 - }).tap((stats) => BB.map(files, (f) => { - const split = f.split(/[/\\]/) - const digest = split.slice(split.length - 3).join('') - const algo = split[split.length - 4] - const integrity = ssri.fromHex(digest, algo) - if (liveContent.has(integrity.toString())) { - return verifyContent(f, integrity).then(info => { - if (!info.valid) { - stats.reclaimedCount++ - stats.badContentCount++ - stats.reclaimedSize += info.size - } else { - stats.verifiedContent++ - stats.keptSize += info.size - } - return stats - }) - } else { - // No entries refer to this content. We can delete. - stats.reclaimedCount++ - return fs.statAsync(f).then(s => { - return rimraf(f).then(() => { - stats.reclaimedSize += s.size - return stats - }) - }) - } - }, {concurrency: opts.concurrency || 20})) - }) - }) -} - -function verifyContent (filepath, sri) { - return fs.statAsync(filepath).then(stat => { - const contentInfo = { - size: stat.size, - valid: true - } - return ssri.checkStream( - fs.createReadStream(filepath), - sri - ).catch(err => { - if (err.code !== 'EINTEGRITY') { throw err } - return rimraf(filepath).then(() => { - contentInfo.valid = false - }) - }).then(() => contentInfo) - }).catch({code: 'ENOENT'}, () => ({size: 0, valid: false})) -} - -function rebuildIndex (cache, opts) { - opts.log && opts.log.silly('verify', 'rebuilding index') - return index.ls(cache).then(entries => { - const stats = { - missingContent: 0, - rejectedEntries: 0, - totalEntries: 0 - } - const buckets = {} - for (let k in entries) { - if (entries.hasOwnProperty(k)) { - const hashed = index._hashKey(k) - const entry = entries[k] - const excluded = opts && opts.filter && !opts.filter(entry) - excluded && stats.rejectedEntries++ - if (buckets[hashed] && !excluded) { - buckets[hashed].push(entry) - } else if (buckets[hashed] && excluded) { - // skip - } else if (excluded) { - buckets[hashed] = [] - buckets[hashed]._path = index._bucketPath(cache, k) - } else { - buckets[hashed] = [entry] - buckets[hashed]._path = index._bucketPath(cache, k) - } - } - } - return BB.map(Object.keys(buckets), key => { - return rebuildBucket(cache, buckets[key], stats, opts) - }, {concurrency: opts.concurrency || 20}).then(() => stats) - }) -} - -function rebuildBucket (cache, bucket, stats, opts) { - return fs.truncateAsync(bucket._path).then(() => { - // This needs to be serialized because cacache explicitly - // lets very racy bucket conflicts clobber each other. - return BB.mapSeries(bucket, entry => { - const content = contentPath(cache, entry.integrity) - return fs.statAsync(content).then(() => { - return index.insert(cache, entry.key, entry.integrity, { - uid: opts.uid, - gid: opts.gid, - metadata: entry.metadata - }).then(() => { stats.totalEntries++ }) - }).catch({code: 'ENOENT'}, () => { - stats.rejectedEntries++ - stats.missingContent++ - }) - }) - }) -} - -function cleanTmp (cache, opts) { - opts.log && opts.log.silly('verify', 'cleaning tmp directory') - return rimraf(path.join(cache, 'tmp')) -} - -function writeVerifile (cache, opts) { - const verifile = path.join(cache, '_lastverified') - opts.log && opts.log.silly('verify', 'writing verifile to ' + verifile) - return fs.writeFileAsync(verifile, '' + (+(new Date()))) -} - -module.exports.lastRun = lastRun -function lastRun (cache) { - return fs.readFileAsync( - path.join(cache, '_lastverified'), 'utf8' - ).then(data => new Date(+data)) -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/locales/en.js b/node_modules/npm-registry-fetch/node_modules/cacache/locales/en.js deleted file mode 100644 index 22025cf0e895e..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/locales/en.js +++ /dev/null @@ -1,44 +0,0 @@ -'use strict' - -const ls = require('../ls.js') -const get = require('../get.js') -const put = require('../put.js') -const rm = require('../rm.js') -const verify = require('../verify.js') -const setLocale = require('../lib/util/y.js').setLocale -const clearMemoized = require('../lib/memoization.js').clearMemoized -const tmp = require('../lib/util/tmp.js') - -setLocale('en') - -const x = module.exports - -x.ls = cache => ls(cache) -x.ls.stream = cache => ls.stream(cache) - -x.get = (cache, key, opts) => get(cache, key, opts) -x.get.byDigest = (cache, hash, opts) => get.byDigest(cache, hash, opts) -x.get.stream = (cache, key, opts) => get.stream(cache, key, opts) -x.get.stream.byDigest = (cache, hash, opts) => get.stream.byDigest(cache, hash, opts) -x.get.copy = (cache, key, dest, opts) => get.copy(cache, key, dest, opts) -x.get.copy.byDigest = (cache, hash, dest, opts) => get.copy.byDigest(cache, hash, dest, opts) -x.get.info = (cache, key) => get.info(cache, key) -x.get.hasContent = (cache, hash) => get.hasContent(cache, hash) - -x.put = (cache, key, data, opts) => put(cache, key, data, opts) -x.put.stream = (cache, key, opts) => put.stream(cache, key, opts) - -x.rm = (cache, key) => rm.entry(cache, key) -x.rm.all = cache => rm.all(cache) -x.rm.entry = x.rm -x.rm.content = (cache, hash) => rm.content(cache, hash) - -x.setLocale = lang => setLocale(lang) -x.clearMemoized = () => clearMemoized() - -x.tmp = {} -x.tmp.mkdir = (cache, opts) => tmp.mkdir(cache, opts) -x.tmp.withTmp = (cache, opts, cb) => tmp.withTmp(cache, opts, cb) - -x.verify = (cache, opts) => verify(cache, opts) -x.verify.lastRun = cache => verify.lastRun(cache) diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/locales/en.json b/node_modules/npm-registry-fetch/node_modules/cacache/locales/en.json deleted file mode 100644 index 82ecb0832490d..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/locales/en.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "No cache entry for `%s` found in `%s`": "No cache entry for %s found in %s", - "Integrity verification failed for %s (%s)": "Integrity verification failed for %s (%s)", - "Bad data size: expected inserted data to be %s bytes, but got %s instead": "Bad data size: expected inserted data to be %s bytes, but got %s instead", - "Cache input stream was empty": "Cache input stream was empty" -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/locales/es.js b/node_modules/npm-registry-fetch/node_modules/cacache/locales/es.js deleted file mode 100644 index 9a27de6585a23..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/locales/es.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict' - -const ls = require('../ls.js') -const get = require('../get.js') -const put = require('../put.js') -const rm = require('../rm.js') -const verify = require('../verify.js') -const setLocale = require('../lib/util/y.js').setLocale -const clearMemoized = require('../lib/memoization.js').clearMemoized -const tmp = require('../lib/util/tmp.js') - -setLocale('es') - -const x = module.exports - -x.ls = cache => ls(cache) -x.ls.flujo = cache => ls.stream(cache) - -x.saca = (cache, clave, ops) => get(cache, clave, ops) -x.saca.porHacheo = (cache, hacheo, ops) => get.byDigest(cache, hacheo, ops) -x.saca.flujo = (cache, clave, ops) => get.stream(cache, clave, ops) -x.saca.flujo.porHacheo = (cache, hacheo, ops) => get.stream.byDigest(cache, hacheo, ops) -x.sava.copia = (cache, clave, destino, opts) => get.copy(cache, clave, destino, opts) -x.sava.copia.porHacheo = (cache, hacheo, destino, opts) => get.copy.byDigest(cache, hacheo, destino, opts) -x.saca.info = (cache, clave) => get.info(cache, clave) -x.saca.tieneDatos = (cache, hacheo) => get.hasContent(cache, hacheo) - -x.mete = (cache, clave, datos, ops) => put(cache, clave, datos, ops) -x.mete.flujo = (cache, clave, ops) => put.stream(cache, clave, ops) - -x.rm = (cache, clave) => rm.entry(cache, clave) -x.rm.todo = cache => rm.all(cache) -x.rm.entrada = x.rm -x.rm.datos = (cache, hacheo) => rm.content(cache, hacheo) - -x.ponLenguaje = lang => setLocale(lang) -x.limpiaMemoizado = () => clearMemoized() - -x.tmp = {} -x.tmp.mkdir = (cache, ops) => tmp.mkdir(cache, ops) -x.tmp.hazdir = x.tmp.mkdir -x.tmp.conTmp = (cache, ops, cb) => tmp.withTmp(cache, ops, cb) - -x.verifica = (cache, ops) => verify(cache, ops) -x.verifica.ultimaVez = cache => verify.lastRun(cache) -x.verifica.últimaVez = x.verifica.ultimaVez diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/locales/es.json b/node_modules/npm-registry-fetch/node_modules/cacache/locales/es.json deleted file mode 100644 index a91d76225b43f..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/locales/es.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "No cache entry for `%s` found in `%s`": "No existe ninguna entrada para «%s» en «%s»", - "Integrity verification failed for %s (%s)": "Verificación de integridad falló para «%s» (%s)", - "Bad data size: expected inserted data to be %s bytes, but got %s instead": "Tamaño incorrecto de datos: los datos insertados debieron haber sido %s octetos, pero fueron %s", - "Cache input stream was empty": "El stream de entrada al caché estaba vacío" -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/ls.js b/node_modules/npm-registry-fetch/node_modules/cacache/ls.js deleted file mode 100644 index 9f49b388ac380..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/ls.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict' - -var index = require('./lib/entry-index') - -module.exports = index.ls -module.exports.stream = index.lsStream diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/changelog.md b/node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/changelog.md deleted file mode 100644 index 93430828f89f0..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/changelog.md +++ /dev/null @@ -1,7 +0,0 @@ -# mississippi Change Log -All notable changes to this project will be documented in this file. -This project adheres to [Semantic Versioning](http://semver.org/). - -## 2.0.0 - 2018-01-30 -* Update to pump@2.0.1. (Use the individual modules to avoid potentially unnecessary major updates in your project) -* Pin engines support to >= Node 4.0.0. Run Node LTS or greater. diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/index.js b/node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/index.js deleted file mode 100644 index d635b29c5614d..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/index.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports.pipe = require('pump') -module.exports.each = require('stream-each') -module.exports.pipeline = require('pumpify') -module.exports.duplex = require('duplexify') -module.exports.through = require('through2') -module.exports.concat = require('concat-stream') -module.exports.finished = require('end-of-stream') -module.exports.from = require('from2') -module.exports.to = require('flush-write-stream') -module.exports.parallel = require('parallel-transform') diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/license b/node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/license deleted file mode 100644 index e34763968c262..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/license +++ /dev/null @@ -1,7 +0,0 @@ -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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/node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/package.json b/node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/package.json deleted file mode 100644 index 0d8c11480d1c4..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "_from": "mississippi@^2.0.0", - "_id": "mississippi@2.0.0", - "_inBundle": false, - "_integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", - "_location": "/npm-registry-fetch/cacache/mississippi", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "mississippi@^2.0.0", - "name": "mississippi", - "escapedName": "mississippi", - "rawSpec": "^2.0.0", - "saveSpec": null, - "fetchSpec": "^2.0.0" - }, - "_requiredBy": [ - "/npm-registry-fetch/cacache" - ], - "_resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "_shasum": "3442a508fafc28500486feea99409676e4ee5a6f", - "_spec": "mississippi@^2.0.0", - "_where": "/Users/rebecca/code/npm/node_modules/npm-registry-fetch/node_modules/cacache", - "author": { - "name": "max ogden" - }, - "bugs": { - "url": "https://github.com/maxogden/mississippi/issues" - }, - "bundleDependencies": false, - "dependencies": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "deprecated": false, - "description": "a collection of useful streams", - "devDependencies": {}, - "engines": { - "node": ">=4.0.0" - }, - "homepage": "https://github.com/maxogden/mississippi#readme", - "license": "BSD-2-Clause", - "main": "index.js", - "name": "mississippi", - "repository": { - "type": "git", - "url": "git+https://github.com/maxogden/mississippi.git" - }, - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "version": "2.0.0" -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/readme.md b/node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/readme.md deleted file mode 100644 index 5fa6d66c89e2a..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi/readme.md +++ /dev/null @@ -1,411 +0,0 @@ -# mississippi - -a collection of useful stream utility modules. learn how the modules work using this and then pick the ones you want and use them individually - -the goal of the modules included in mississippi is to make working with streams easy without sacrificing speed, error handling or composability. - -## usage - -```js -var miss = require('mississippi') -``` - -## methods - -- [pipe](#pipe) -- [each](#each) -- [pipeline](#pipeline) -- [duplex](#duplex) -- [through](#through) -- [from](#from) -- [to](#to) -- [concat](#concat) -- [finished](#finished) -- [parallel](#parallel) - -### pipe - -##### `miss.pipe(stream1, stream2, stream3, ..., cb)` - -Pipes streams together and destroys all of them if one of them closes. Calls `cb` with `(error)` if there was an error in any of the streams. - -When using standard `source.pipe(destination)` the source will _not_ be destroyed if the destination emits close or error. You are also not able to provide a callback to tell when the pipe has finished. - -`miss.pipe` does these two things for you, ensuring you handle stream errors 100% of the time (unhandled errors are probably the most common bug in most node streams code) - -#### original module - -`miss.pipe` is provided by [`require('pump')`](https://www.npmjs.com/package/pump) - -#### example - -```js -// lets do a simple file copy -var fs = require('fs') - -var read = fs.createReadStream('./original.zip') -var write = fs.createWriteStream('./copy.zip') - -// use miss.pipe instead of read.pipe(write) -miss.pipe(read, write, function (err) { - if (err) return console.error('Copy error!', err) - console.log('Copied successfully') -}) -``` - -### each - -##### `miss.each(stream, each, [done])` - -Iterate the data in `stream` one chunk at a time. Your `each` function will be called with `(data, next)` where data is a data chunk and next is a callback. Call `next` when you are ready to consume the next chunk. - -Optionally you can call `next` with an error to destroy the stream. You can also pass the optional third argument, `done`, which is a function that will be called with `(err)` when the stream ends. The `err` argument will be populated with an error if the stream emitted an error. - -#### original module - -`miss.each` is provided by [`require('stream-each')`](https://www.npmjs.com/package/stream-each) - -#### example - -```js -var fs = require('fs') -var split = require('split2') - -var newLineSeparatedNumbers = fs.createReadStream('numbers.txt') - -var pipeline = miss.pipeline(newLineSeparatedNumbers, split()) -miss.each(pipeline, eachLine, done) -var sum = 0 - -function eachLine (line, next) { - sum += parseInt(line.toString()) - next() -} - -function done (err) { - if (err) throw err - console.log('sum is', sum) -} -``` - -### pipeline - -##### `var pipeline = miss.pipeline(stream1, stream2, stream3, ...)` - -Builds a pipeline from all the transform streams passed in as arguments by piping them together and returning a single stream object that lets you write to the first stream and read from the last stream. - -If you are pumping object streams together use `pipeline = miss.pipeline.obj(s1, s2, ...)`. - -If any of the streams in the pipeline emits an error or gets destroyed, or you destroy the stream it returns, all of the streams will be destroyed and cleaned up for you. - -#### original module - -`miss.pipeline` is provided by [`require('pumpify')`](https://www.npmjs.com/package/pumpify) - -#### example - -```js -// first create some transform streams (note: these two modules are fictional) -var imageResize = require('image-resizer-stream')({width: 400}) -var pngOptimizer = require('png-optimizer-stream')({quality: 60}) - -// instead of doing a.pipe(b), use pipelin -var resizeAndOptimize = miss.pipeline(imageResize, pngOptimizer) -// `resizeAndOptimize` is a transform stream. when you write to it, it writes -// to `imageResize`. when you read from it, it reads from `pngOptimizer`. -// it handles piping all the streams together for you - -// use it like any other transform stream -var fs = require('fs') - -var read = fs.createReadStream('./image.png') -var write = fs.createWriteStream('./resized-and-optimized.png') - -miss.pipe(read, resizeAndOptimize, write, function (err) { - if (err) return console.error('Image processing error!', err) - console.log('Image processed successfully') -}) -``` - -### duplex - -##### `var duplex = miss.duplex([writable, readable, opts])` - -Take two separate streams, a writable and a readable, and turn them into a single [duplex (readable and writable) stream](https://nodejs.org/api/stream.html#stream_class_stream_duplex). - -The returned stream will emit data from the readable. When you write to it it writes to the writable. - -You can either choose to supply the writable and the readable at the time you create the stream, or you can do it later using the `.setWritable` and `.setReadable` methods and data written to the stream in the meantime will be buffered for you. - -#### original module - -`miss.duplex` is provided by [`require('duplexify')`](https://www.npmjs.com/package/duplexify) - -#### example - -```js -// lets spawn a process and take its stdout and stdin and combine them into 1 stream -var child = require('child_process') - -// @- tells it to read from stdin, --data-binary sets 'raw' binary mode -var curl = child.spawn('curl -X POST --data-binary @- http://foo.com') - -// duplexCurl will write to stdin and read from stdout -var duplexCurl = miss.duplex(curl.stdin, curl.stdout) -``` - -### through - -##### `var transformer = miss.through([options, transformFunction, flushFunction])` - -Make a custom [transform stream](https://nodejs.org/docs/latest/api/stream.html#stream_class_stream_transform). - -The `options` object is passed to the internal transform stream and can be used to create an `objectMode` stream (or use the shortcut `miss.through.obj([...])`) - -The `transformFunction` is called when data is available for the writable side and has the signature `(chunk, encoding, cb)`. Within the function, add data to the readable side any number of times with `this.push(data)`. Call `cb()` to indicate processing of the `chunk` is complete. Or to easily emit a single error or chunk, call `cb(err, chunk)` - -The `flushFunction`, with signature `(cb)`, is called just before the stream is complete and should be used to wrap up stream processing. - -#### original module - -`miss.through` is provided by [`require('through2')`](https://www.npmjs.com/package/through2) - -#### example - -```js -var fs = require('fs') - -var read = fs.createReadStream('./boring_lowercase.txt') -var write = fs.createWriteStream('./AWESOMECASE.TXT') - -// Leaving out the options object -var uppercaser = miss.through( - function (chunk, enc, cb) { - cb(null, chunk.toString().toUpperCase()) - }, - function (cb) { - cb(null, 'ONE LAST BIT OF UPPERCASE') - } -) - -miss.pipe(read, uppercaser, write, function (err) { - if (err) return console.error('Trouble uppercasing!') - console.log('Splendid uppercasing!') -}) -``` - -### from - -##### `miss.from([opts], read)` - -Make a custom [readable stream](https://nodejs.org/docs/latest/api/stream.html#stream_class_stream_readable). - -`opts` contains the options to pass on to the ReadableStream constructor e.g. for creating a readable object stream (or use the shortcut `miss.from.obj([...])`). - -Returns a readable stream that calls `read(size, next)` when data is requested from the stream. - -- `size` is the recommended amount of data (in bytes) to retrieve. -- `next(err, chunk)` should be called when you're ready to emit more data. - -#### original module - -`miss.from` is provided by [`require('from2')`](https://www.npmjs.com/package/from2) - -#### example - -```js - - -function fromString(string) { - return miss.from(function(size, next) { - // if there's no more content - // left in the string, close the stream. - if (string.length <= 0) return next(null, null) - - // Pull in a new chunk of text, - // removing it from the string. - var chunk = string.slice(0, size) - string = string.slice(size) - - // Emit "chunk" from the stream. - next(null, chunk) - }) -} - -// pipe "hello world" out -// to stdout. -fromString('hello world').pipe(process.stdout) -``` - -### to - -##### `miss.to([options], write, [flush])` - -Make a custom [writable stream](https://nodejs.org/docs/latest/api/stream.html#stream_class_stream_writable). - -`opts` contains the options to pass on to the WritableStream constructor e.g. for creating a writable object stream (or use the shortcut `miss.to.obj([...])`). - -Returns a writable stream that calls `write(data, enc, cb)` when data is written to the stream. - -- `data` is the received data to write the destination. -- `enc` encoding of the piece of data received. -- `cb(err, data)` should be called when you're ready to write more data, or encountered an error. - -`flush(cb)` is called before `finish` is emitted and allows for cleanup steps to occur. - -#### original module - -`miss.to` is provided by [`require('flush-write-stream')`](https://www.npmjs.com/package/flush-write-stream) - -#### example - -```js -var ws = miss.to(write, flush) - -ws.on('finish', function () { - console.log('finished') -}) - -ws.write('hello') -ws.write('world') -ws.end() - -function write (data, enc, cb) { - // i am your normal ._write method - console.log('writing', data.toString()) - cb() -} - -function flush (cb) { - // i am called before finish is emitted - setTimeout(cb, 1000) // wait 1 sec -} -``` - -If you run the above it will produce the following output - -``` -writing hello -writing world -(nothing happens for 1 sec) -finished -``` - -### concat - -##### `var concat = miss.concat(cb)` - -Returns a writable stream that concatenates all data written to the stream and calls a callback with the single result. - -Calling `miss.concat(cb)` returns a writable stream. `cb` is called when the writable stream is finished, e.g. when all data is done being written to it. `cb` is called with a single argument, `(data)`, which will contain the result of concatenating all the data written to the stream. - -Note that `miss.concat` will not handle stream errors for you. To handle errors, use `miss.pipe` or handle the `error` event manually. - -#### original module - -`miss.concat` is provided by [`require('concat-stream')`](https://www.npmjs.com/package/concat-stream) - -#### example - -```js -var fs = require('fs') - -var readStream = fs.createReadStream('cat.png') -var concatStream = miss.concat(gotPicture) - -function callback (err) { - if (err) { - console.error(err) - process.exit(1) - } -} - -miss.pipe(readStream, concatStream, callback) - -function gotPicture(imageBuffer) { - // imageBuffer is all of `cat.png` as a node.js Buffer -} - -function handleError(err) { - // handle your error appropriately here, e.g.: - console.error(err) // print the error to STDERR - process.exit(1) // exit program with non-zero exit code -} -``` - -### finished - -##### `miss.finished(stream, cb)` - -Waits for `stream` to finish or error and then calls `cb` with `(err)`. `cb` will only be called once. `err` will be null if the stream finished without error, or else it will be populated with the error from the streams `error` event. - -This function is useful for simplifying stream handling code as it lets you handle success or error conditions in a single code path. It's used internally `miss.pipe`. - -#### original module - -`miss.finished` is provided by [`require('end-of-stream')`](https://www.npmjs.com/package/end-of-stream) - -#### example - -```js -var copySource = fs.createReadStream('./movie.mp4') -var copyDest = fs.createWriteStream('./movie-copy.mp4') - -copySource.pipe(copyDest) - -miss.finished(copyDest, function(err) { - if (err) return console.log('write failed', err) - console.log('write success') -}) -``` - -### parallel - -##### `miss.parallel(concurrency, each)` - -This works like `through` except you can process items in parallel, while still preserving the original input order. - -This is handy if you wanna take advantage of node's async I/O and process streams of items in batches. With this module you can build your very own streaming parallel job queue. - -Note that `miss.parallel` preserves input ordering, if you don't need that then you can use [through2-concurrent](https://github.com/almost/through2-concurrent) instead, which is very similar to this otherwise. - -#### original module - -`miss.parallel` is provided by [`require('parallel-transform')`](https://npmjs.org/parallel-transform) - -#### example - -This example fetches the GET HTTP headers for a stream of input URLs 5 at a time in parallel. - -```js -function getResponse (item, cb) { - var r = request(item.url) - r.on('error', function (err) { - cb(err) - }) - r.on('response', function (re) { - cb(null, {url: item.url, date: new Date(), status: re.statusCode, headers: re.headers}) - r.abort() - }) -} - -miss.pipe( - fs.createReadStream('./urls.txt'), // one url per line - split(), - miss.parallel(5, getResponse), - miss.through(function (row, enc, next) { - console.log(JSON.stringify(row)) - next() - }) -) -``` - -## see also - -- [substack/stream-handbook](https://github.com/substack/stream-handbook) -- [nodejs.org/api/stream.html](https://nodejs.org/api/stream.html) -- [awesome-nodejs-streams](https://github.com/thejmazz/awesome-nodejs-streams) - -## license - -Licensed under the BSD 2-clause license. diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/package.json b/node_modules/npm-registry-fetch/node_modules/cacache/package.json deleted file mode 100644 index 12cfb5aac575f..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/package.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "_from": "cacache@^10.0.4", - "_id": "cacache@10.0.4", - "_inBundle": false, - "_integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "_location": "/npm-registry-fetch/cacache", - "_phantomChildren": { - "concat-stream": "1.6.2", - "duplexify": "3.6.0", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.3", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "2.0.1", - "pumpify": "1.5.1", - "stream-each": "1.2.2", - "through2": "2.0.3" - }, - "_requested": { - "type": "range", - "registry": true, - "raw": "cacache@^10.0.4", - "name": "cacache", - "escapedName": "cacache", - "rawSpec": "^10.0.4", - "saveSpec": null, - "fetchSpec": "^10.0.4" - }, - "_requiredBy": [ - "/npm-registry-fetch/make-fetch-happen" - ], - "_resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "_shasum": "6452367999eff9d4188aefd9a14e9d7c6a263460", - "_spec": "cacache@^10.0.4", - "_where": "/Users/rebecca/code/npm/node_modules/npm-registry-fetch/node_modules/make-fetch-happen", - "author": { - "name": "Kat Marchán", - "email": "kzm@sykosomatic.org" - }, - "bugs": { - "url": "https://github.com/zkat/cacache/issues" - }, - "bundleDependencies": false, - "cache-version": { - "content": "2", - "index": "5" - }, - "config": { - "nyc": { - "exclude": [ - "node_modules/**", - "test/**" - ] - } - }, - "contributors": [ - { - "name": "Charlotte Spencer", - "email": "charlottelaspencer@gmail.com" - }, - { - "name": "Rebecca Turner", - "email": "me@re-becca.org" - } - ], - "dependencies": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - }, - "deprecated": false, - "description": "Fast, fault-tolerant, cross-platform, disk-based, data-agnostic, content-addressable cache.", - "devDependencies": { - "benchmark": "^2.1.4", - "chalk": "^2.3.1", - "cross-env": "^5.1.3", - "nyc": "^11.4.1", - "require-inject": "^1.4.2", - "safe-buffer": "^5.1.1", - "standard": "^10.0.3", - "standard-version": "^4.3.0", - "tacks": "^1.2.2", - "tap": "^11.1.0", - "weallbehave": "^1.2.0", - "weallcontribute": "^1.0.8" - }, - "files": [ - "*.js", - "lib", - "locales" - ], - "homepage": "https://github.com/zkat/cacache#readme", - "keywords": [ - "cache", - "caching", - "content-addressable", - "sri", - "sri hash", - "subresource integrity", - "cache", - "storage", - "store", - "file store", - "filesystem", - "disk cache", - "disk storage" - ], - "license": "ISC", - "main": "index.js", - "name": "cacache", - "repository": { - "type": "git", - "url": "git+https://github.com/zkat/cacache.git" - }, - "scripts": { - "benchmarks": "node test/benchmarks", - "postrelease": "npm publish && git push --follow-tags", - "prerelease": "npm t", - "pretest": "standard", - "release": "standard-version -s", - "test": "cross-env CACACHE_UPDATE_LOCALE_FILES=true nyc --all -- tap -J test/*.js", - "test-docker": "docker run -it --rm --name pacotest -v \"$PWD\":/tmp -w /tmp node:latest npm test", - "update-coc": "weallbehave -o . && git add CODE_OF_CONDUCT.md && git commit -m 'docs(coc): updated CODE_OF_CONDUCT.md'", - "update-contrib": "weallcontribute -o . && git add CONTRIBUTING.md && git commit -m 'docs(contributing): updated CONTRIBUTING.md'" - }, - "version": "10.0.4" -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/put.js b/node_modules/npm-registry-fetch/node_modules/cacache/put.js deleted file mode 100644 index fe1293e5e7c5a..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/put.js +++ /dev/null @@ -1,71 +0,0 @@ -'use strict' - -const index = require('./lib/entry-index') -const memo = require('./lib/memoization') -const write = require('./lib/content/write') -const to = require('mississippi').to - -module.exports = putData -function putData (cache, key, data, opts) { - opts = opts || {} - return write(cache, data, opts).then(res => { - // TODO - stop modifying opts - opts.size = res.size - return index.insert(cache, key, res.integrity, opts).then(entry => { - if (opts.memoize) { - memo.put(cache, entry, data, opts) - } - return res.integrity - }) - }) -} - -module.exports.stream = putStream -function putStream (cache, key, opts) { - opts = opts || {} - let integrity - let size - const contentStream = write.stream( - cache, opts - ).on('integrity', int => { - integrity = int - }).on('size', s => { - size = s - }) - let memoData - let memoTotal = 0 - const stream = to((chunk, enc, cb) => { - contentStream.write(chunk, enc, () => { - if (opts.memoize) { - if (!memoData) { memoData = [] } - memoData.push(chunk) - memoTotal += chunk.length - } - cb() - }) - }, cb => { - contentStream.end(() => { - // TODO - stop modifying `opts` - opts.size = size - index.insert(cache, key, integrity, opts).then(entry => { - if (opts.memoize) { - memo.put(cache, entry, Buffer.concat(memoData, memoTotal), opts) - } - stream.emit('integrity', integrity) - cb() - }) - }) - }) - let erred = false - stream.once('error', err => { - if (erred) { return } - erred = true - contentStream.emit('error', err) - }) - contentStream.once('error', err => { - if (erred) { return } - erred = true - stream.emit('error', err) - }) - return stream -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/rm.js b/node_modules/npm-registry-fetch/node_modules/cacache/rm.js deleted file mode 100644 index e71a1d27b4cf8..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/rm.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict' - -const BB = require('bluebird') - -const index = require('./lib/entry-index') -const memo = require('./lib/memoization') -const path = require('path') -const rimraf = BB.promisify(require('rimraf')) -const rmContent = require('./lib/content/rm') - -module.exports = entry -module.exports.entry = entry -function entry (cache, key) { - memo.clearMemoized() - return index.delete(cache, key) -} - -module.exports.content = content -function content (cache, integrity) { - memo.clearMemoized() - return rmContent(cache, integrity) -} - -module.exports.all = all -function all (cache) { - memo.clearMemoized() - return rimraf(path.join(cache, '*(content-*|index-*)')) -} diff --git a/node_modules/npm-registry-fetch/node_modules/cacache/verify.js b/node_modules/npm-registry-fetch/node_modules/cacache/verify.js deleted file mode 100644 index db7763d7afd07..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/cacache/verify.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict' - -module.exports = require('./lib/verify') diff --git a/node_modules/npm-registry-fetch/node_modules/figgy-pudding/CHANGELOG.md b/node_modules/npm-registry-fetch/node_modules/figgy-pudding/CHANGELOG.md deleted file mode 100644 index f70e02d71dcbc..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/figgy-pudding/CHANGELOG.md +++ /dev/null @@ -1,29 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. - - -## [2.0.1](https://github.com/zkat/figgy-pudding/compare/v2.0.0...v2.0.1) (2018-03-16) - - -### Bug Fixes - -* **opts:** ignore non-object providers ([7b9c0f8](https://github.com/zkat/figgy-pudding/commit/7b9c0f8)) - - - - -# [2.0.0](https://github.com/zkat/figgy-pudding/compare/v1.0.0...v2.0.0) (2018-03-16) - - -### Features - -* **api:** overhauled API with new opt handling concept ([e6cc929](https://github.com/zkat/figgy-pudding/commit/e6cc929)) -* **license:** relicense to ISC ([87479aa](https://github.com/zkat/figgy-pudding/commit/87479aa)) - - -### BREAKING CHANGES - -* **license:** the license has been changed from CC0-1.0 to ISC. -* **api:** this is a completely different approach than previously -used by this library. See the readme for the new API and an explanation. diff --git a/node_modules/npm-registry-fetch/node_modules/figgy-pudding/LICENSE.md b/node_modules/npm-registry-fetch/node_modules/figgy-pudding/LICENSE.md deleted file mode 100644 index 8d28acf866d93..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/figgy-pudding/LICENSE.md +++ /dev/null @@ -1,16 +0,0 @@ -ISC License - -Copyright (c) npm, Inc. - -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 COPYRIGHT HOLDER DISCLAIMS -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -COPYRIGHT HOLDER 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/node_modules/npm-registry-fetch/node_modules/figgy-pudding/README.md b/node_modules/npm-registry-fetch/node_modules/figgy-pudding/README.md deleted file mode 100644 index 3cdec3f81ac2d..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/figgy-pudding/README.md +++ /dev/null @@ -1,121 +0,0 @@ -# figgy-pudding [![npm version](https://img.shields.io/npm/v/figgy-pudding.svg)](https://npm.im/figgy-pudding) [![license](https://img.shields.io/npm/l/figgy-pudding.svg)](https://npm.im/figgy-pudding) [![Travis](https://img.shields.io/travis/zkat/figgy-pudding.svg)](https://travis-ci.org/zkat/figgy-pudding) [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/zkat/figgy-pudding?svg=true)](https://ci.appveyor.com/project/zkat/figgy-pudding) [![Coverage Status](https://coveralls.io/repos/github/zkat/figgy-pudding/badge.svg?branch=latest)](https://coveralls.io/github/zkat/figgy-pudding?branch=latest) - -# Death to the God Object! Now Bring Us Some Figgy Pudding! - -[`figgy-pudding`](https://github.com/zkat/figgy-pudding) is a simple JavaScript library for managing and composing cascading options objects -- hiding what needs to be hidden from each layer, without having to do a lot of manual munging and passing of options. - -## Install - -`$ npm install figgy-pudding` - -## Table of Contents - -* [Example](#example) -* [Features](#features) -* [API](#api) - * [`figgyPudding(spec)`](#figgy-pudding) - * [`Opts(values)`](#opts) - -### Example - -```javascript -const puddin = require('figgyPudding') - -const RequestOpts = puddin({ - follow: { - default: true - }, - streaming: { - default: false - }, - log: { - default: require('npmlog') - } -}) - -const MyAppOpts = puddin({ - log: { - default: require('npmlog') - }, - cache: { - default: './cache' - } -}) - -function start (opts) { - opts = MyAppOpts(opts) - initCache(opts.get('cache')) - opts.get('streaming') // => undefined - reqStuff('https://npm.im/figgy-pudding', opts) -} - -function reqStuff (uri, opts) { - opts = RequestOpts(opts) - require('request').get(uri, opts) // can't see `cache` -} -``` - -### Features - -* Hide options from layer that didn't ask for it -* Shared multi-layer options - -### API - -#### `> figgyPudding({ key: { default: val } | String }, [opts])` - -Defines an Options constructor that can be used to collect only the needed -options. - -An optional `default` property for specs can be used to specify default values -if nothing was passed in. - -If the value for a spec is a string, it will be treated as an alias to that -other key. - -##### Example - -```javascript -const MyAppOpts = figgyPudding({ - lg: 'log', - log: { - default: () => require('npmlog') - }, - cache: {} -}) -``` - -#### `> Opts(...providers)` - -Instantiates an options object defined by `figgyPudding()`, which uses -`providers`, in order, to find requested properties. - -Each provider can be either a plain object, a `Map`-like object (that is, one -with a `.get()` method) or another figgyPudding `Opts` object. - -When nesting `Opts` objects, their properties will not become available to the -new object, but any further nested `Opts` that reference that property _will_ be -able to read from their grandparent, as long as they define that key. Default -values for nested `Opts` parents will be used, if found. - -##### Example - -```javascript -const ReqOpts = figgyPudding({ - follow: {} -}) - -const opts = ReqOpts({ - follow: true, - log: require('npmlog') -}) - -opts.get('follow') // => true -opts.get('log') // => Error: ReqOpts does not define `log` - -const MoreOpts = figgyPudding({ - log: {} -}) -MoreOpts(opts).log // => npmlog object (passed in from original plain obj) -MoreOpts(opts).get('follow') // => Error: MoreOpts does not define `follow` -``` diff --git a/node_modules/npm-registry-fetch/node_modules/figgy-pudding/index.js b/node_modules/npm-registry-fetch/node_modules/figgy-pudding/index.js deleted file mode 100644 index c13d143862ddd..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/figgy-pudding/index.js +++ /dev/null @@ -1,60 +0,0 @@ -'use strict' - -class FiggyPudding { - constructor (specs, opts, providers) { - this.specs = specs || {} - this.opts = opts || (() => false) - this.providers = providers - this.isFiggyPudding = true - } - get (key) { - return pudGet(this, key, true) - } -} - -function pudGet (pud, key, validate) { - let spec = pud.specs[key] - if (typeof spec === 'string') { - key = spec - spec = pud.specs[key] - } - if (validate && !spec && (!pud.opts.other || !pud.opts.other(key))) { - throw new Error(`invalid config key requested: ${key}`) - } else { - if (!spec) { spec = {} } - let ret - for (let p of pud.providers) { - if (p.isFiggyPudding) { - ret = pudGet(p, key, false) - } else if (typeof p.get === 'function') { - ret = p.get(key) - } else { - ret = p[key] - } - if (ret !== undefined) { - break - } - } - if (ret === undefined && spec.default !== undefined) { - if (typeof spec.default === 'function') { - return spec.default() - } else { - return spec.default - } - } else { - return ret - } - } -} - -module.exports = figgyPudding -function figgyPudding (specs, opts) { - function factory () { - return new FiggyPudding( - specs, - opts, - [].slice.call(arguments).filter(x => x != null && typeof x === 'object') - ) - } - return factory -} diff --git a/node_modules/npm-registry-fetch/node_modules/figgy-pudding/package.json b/node_modules/npm-registry-fetch/node_modules/figgy-pudding/package.json deleted file mode 100644 index 7e71124643c25..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/figgy-pudding/package.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "_from": "figgy-pudding@^2.0.1", - "_id": "figgy-pudding@2.0.1", - "_inBundle": false, - "_integrity": "sha512-yIJPhIBi/oFdU/P+GSXjmk/rmGjuZkm7A5LTXZxNrEprXJXRK012FiI1BR1Pga+0d/d6taWWD+B5d2ozqaxHig==", - "_location": "/npm-registry-fetch/figgy-pudding", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "figgy-pudding@^2.0.1", - "name": "figgy-pudding", - "escapedName": "figgy-pudding", - "rawSpec": "^2.0.1", - "saveSpec": null, - "fetchSpec": "^2.0.1" - }, - "_requiredBy": [ - "/npm-registry-fetch" - ], - "_resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-2.0.1.tgz", - "_shasum": "56c8fc878e06e1090799b9bcc91cbd85c2c92278", - "_spec": "figgy-pudding@^2.0.1", - "_where": "/Users/rebecca/code/npm/node_modules/npm-registry-fetch", - "author": { - "name": "Kat Marchán", - "email": "kzm@sykosomatic.org" - }, - "bugs": { - "url": "https://github.com/zkat/figgy-pudding/issues" - }, - "bundleDependencies": false, - "dependencies": {}, - "deprecated": false, - "description": "Delicious, festive, cascading config/opts definitions", - "devDependencies": { - "standard": "^11.0.1", - "standard-version": "^4.3.0", - "tap": "^11.1.2", - "weallbehave": "^1.2.0", - "weallcontribute": "^1.0.8" - }, - "files": [ - "*.js", - "lib" - ], - "homepage": "https://github.com/zkat/figgy-pudding#readme", - "keywords": [ - "config", - "options", - "yummy" - ], - "license": "ISC", - "main": "index.js", - "name": "figgy-pudding", - "repository": { - "type": "git", - "url": "git+https://github.com/zkat/figgy-pudding.git" - }, - "scripts": { - "postrelease": "npm publish && git push --follow-tags", - "prerelease": "npm t", - "pretest": "standard", - "release": "standard-version -s", - "test": "tap -J --coverage test/*.js", - "update-coc": "weallbehave -o . && git add CODE_OF_CONDUCT.md && git commit -m 'docs(coc): updated CODE_OF_CONDUCT.md'", - "update-contrib": "weallcontribute -o . && git add CONTRIBUTING.md && git commit -m 'docs(contributing): updated CONTRIBUTING.md'" - }, - "version": "2.0.1" -} diff --git a/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/CHANGELOG.md b/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/CHANGELOG.md deleted file mode 100644 index 123133fe61876..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/CHANGELOG.md +++ /dev/null @@ -1,525 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. - - -# [3.0.0](https://github.com/zkat/make-fetch-happen/compare/v2.6.0...v3.0.0) (2018-03-12) - - -### Bug Fixes - -* **license:** switch to ISC ([#49](https://github.com/zkat/make-fetch-happen/issues/49)) ([bf90c6d](https://github.com/zkat/make-fetch-happen/commit/bf90c6d)) -* **standard:** standard@11 update ([ff0aa70](https://github.com/zkat/make-fetch-happen/commit/ff0aa70)) - - -### BREAKING CHANGES - -* **license:** license changed from CC0 to ISC. - - - - -# [2.6.0](https://github.com/zkat/make-fetch-happen/compare/v2.5.0...v2.6.0) (2017-11-14) - - -### Bug Fixes - -* **integrity:** disable node-fetch compress when checking integrity (#42) ([a7cc74c](https://github.com/zkat/make-fetch-happen/commit/a7cc74c)) - - -### Features - -* **onretry:** Add `options.onRetry` (#48) ([f90ccff](https://github.com/zkat/make-fetch-happen/commit/f90ccff)) - - - - -# [2.5.0](https://github.com/zkat/make-fetch-happen/compare/v2.4.13...v2.5.0) (2017-08-24) - - -### Bug Fixes - -* **agent:** support timeout durations greater than 30 seconds ([04875ae](https://github.com/zkat/make-fetch-happen/commit/04875ae)), closes [#35](https://github.com/zkat/make-fetch-happen/issues/35) - - -### Features - -* **cache:** export cache deletion functionality (#40) ([3da4250](https://github.com/zkat/make-fetch-happen/commit/3da4250)) - - - - -## [2.4.13](https://github.com/zkat/make-fetch-happen/compare/v2.4.12...v2.4.13) (2017-06-29) - - -### Bug Fixes - -* **deps:** bump other deps for bugfixes ([eab8297](https://github.com/zkat/make-fetch-happen/commit/eab8297)) -* **proxy:** bump proxy deps with bugfixes (#32) ([632f860](https://github.com/zkat/make-fetch-happen/commit/632f860)), closes [#32](https://github.com/zkat/make-fetch-happen/issues/32) - - - - -## [2.4.12](https://github.com/zkat/make-fetch-happen/compare/v2.4.11...v2.4.12) (2017-06-06) - - -### Bug Fixes - -* **cache:** encode x-local-cache-etc headers to be header-safe ([dc9fb1b](https://github.com/zkat/make-fetch-happen/commit/dc9fb1b)) - - - - -## [2.4.11](https://github.com/zkat/make-fetch-happen/compare/v2.4.10...v2.4.11) (2017-06-05) - - -### Bug Fixes - -* **deps:** bump deps with ssri fix ([bef1994](https://github.com/zkat/make-fetch-happen/commit/bef1994)) - - - - -## [2.4.10](https://github.com/zkat/make-fetch-happen/compare/v2.4.9...v2.4.10) (2017-05-31) - - -### Bug Fixes - -* **deps:** bump dep versions with bugfixes ([0af4003](https://github.com/zkat/make-fetch-happen/commit/0af4003)) -* **proxy:** use auth parameter for proxy authentication (#30) ([c687306](https://github.com/zkat/make-fetch-happen/commit/c687306)) - - - - -## [2.4.9](https://github.com/zkat/make-fetch-happen/compare/v2.4.8...v2.4.9) (2017-05-25) - - -### Bug Fixes - -* **cache:** use the passed-in promise for resolving cache stuff ([4c46257](https://github.com/zkat/make-fetch-happen/commit/4c46257)) - - - - -## [2.4.8](https://github.com/zkat/make-fetch-happen/compare/v2.4.7...v2.4.8) (2017-05-25) - - -### Bug Fixes - -* **cache:** pass uid/gid/Promise through to cache ([a847c92](https://github.com/zkat/make-fetch-happen/commit/a847c92)) - - - - -## [2.4.7](https://github.com/zkat/make-fetch-happen/compare/v2.4.6...v2.4.7) (2017-05-24) - - -### Bug Fixes - -* **deps:** pull in various fixes from deps ([fc2a587](https://github.com/zkat/make-fetch-happen/commit/fc2a587)) - - - - -## [2.4.6](https://github.com/zkat/make-fetch-happen/compare/v2.4.5...v2.4.6) (2017-05-24) - - -### Bug Fixes - -* **proxy:** choose agent for http(s)-proxy by protocol of destUrl ([ea4832a](https://github.com/zkat/make-fetch-happen/commit/ea4832a)) -* **proxy:** make socks proxy working ([1de810a](https://github.com/zkat/make-fetch-happen/commit/1de810a)) -* **proxy:** revert previous proxy solution ([563b0d8](https://github.com/zkat/make-fetch-happen/commit/563b0d8)) - - - - -## [2.4.5](https://github.com/zkat/make-fetch-happen/compare/v2.4.4...v2.4.5) (2017-05-24) - - -### Bug Fixes - -* **proxy:** use the destination url when determining agent ([1a714e7](https://github.com/zkat/make-fetch-happen/commit/1a714e7)) - - - - -## [2.4.4](https://github.com/zkat/make-fetch-happen/compare/v2.4.3...v2.4.4) (2017-05-23) - - -### Bug Fixes - -* **redirect:** handle redirects explicitly (#27) ([4c4af54](https://github.com/zkat/make-fetch-happen/commit/4c4af54)) - - - - -## [2.4.3](https://github.com/zkat/make-fetch-happen/compare/v2.4.2...v2.4.3) (2017-05-06) - - -### Bug Fixes - -* **redirect:** redirects now delete authorization if hosts fail to match ([c071805](https://github.com/zkat/make-fetch-happen/commit/c071805)) - - - - -## [2.4.2](https://github.com/zkat/make-fetch-happen/compare/v2.4.1...v2.4.2) (2017-05-04) - - -### Bug Fixes - -* **cache:** reduce race condition window by checking for content ([24544b1](https://github.com/zkat/make-fetch-happen/commit/24544b1)) -* **match:** Rewrite the conditional stream logic (#25) ([66bba4b](https://github.com/zkat/make-fetch-happen/commit/66bba4b)) - - - - -## [2.4.1](https://github.com/zkat/make-fetch-happen/compare/v2.4.0...v2.4.1) (2017-04-28) - - -### Bug Fixes - -* **memoization:** missed spots + allow passthrough of memo objs ([ac0cd12](https://github.com/zkat/make-fetch-happen/commit/ac0cd12)) - - - - -# [2.4.0](https://github.com/zkat/make-fetch-happen/compare/v2.3.0...v2.4.0) (2017-04-28) - - -### Bug Fixes - -* **memoize:** cacache had a broken memoizer ([8a9ed4c](https://github.com/zkat/make-fetch-happen/commit/8a9ed4c)) - - -### Features - -* **memoization:** only slurp stuff into memory if opts.memoize is not false ([0744adc](https://github.com/zkat/make-fetch-happen/commit/0744adc)) - - - - -# [2.3.0](https://github.com/zkat/make-fetch-happen/compare/v2.2.6...v2.3.0) (2017-04-27) - - -### Features - -* **agent:** added opts.strictSSL and opts.localAddress ([c35015a](https://github.com/zkat/make-fetch-happen/commit/c35015a)) -* **proxy:** Added opts.noProxy and NO_PROXY support ([f45c915](https://github.com/zkat/make-fetch-happen/commit/f45c915)) - - - - -## [2.2.6](https://github.com/zkat/make-fetch-happen/compare/v2.2.5...v2.2.6) (2017-04-26) - - -### Bug Fixes - -* **agent:** check uppercase & lowercase proxy env (#24) ([acf2326](https://github.com/zkat/make-fetch-happen/commit/acf2326)), closes [#22](https://github.com/zkat/make-fetch-happen/issues/22) -* **deps:** switch to node-fetch-npm and stop bundling ([3db603b](https://github.com/zkat/make-fetch-happen/commit/3db603b)) - - - - -## [2.2.5](https://github.com/zkat/make-fetch-happen/compare/v2.2.4...v2.2.5) (2017-04-23) - - -### Bug Fixes - -* **deps:** bump cacache and use its size feature ([926c1d3](https://github.com/zkat/make-fetch-happen/commit/926c1d3)) - - - - -## [2.2.4](https://github.com/zkat/make-fetch-happen/compare/v2.2.3...v2.2.4) (2017-04-18) - - -### Bug Fixes - -* **integrity:** hash verification issues fixed ([07f9402](https://github.com/zkat/make-fetch-happen/commit/07f9402)) - - - - -## [2.2.3](https://github.com/zkat/make-fetch-happen/compare/v2.2.2...v2.2.3) (2017-04-18) - - -### Bug Fixes - -* **staleness:** responses older than 8h were never stale :< ([b54dd75](https://github.com/zkat/make-fetch-happen/commit/b54dd75)) -* **warning:** remove spurious warning, make format more spec-compliant ([2e4f6bb](https://github.com/zkat/make-fetch-happen/commit/2e4f6bb)) - - - - -## [2.2.2](https://github.com/zkat/make-fetch-happen/compare/v2.2.1...v2.2.2) (2017-04-12) - - -### Bug Fixes - -* **retry:** stop retrying 404s ([6fafd53](https://github.com/zkat/make-fetch-happen/commit/6fafd53)) - - - - -## [2.2.1](https://github.com/zkat/make-fetch-happen/compare/v2.2.0...v2.2.1) (2017-04-10) - - -### Bug Fixes - -* **deps:** move test-only deps to devDeps ([2daaf80](https://github.com/zkat/make-fetch-happen/commit/2daaf80)) - - - - -# [2.2.0](https://github.com/zkat/make-fetch-happen/compare/v2.1.0...v2.2.0) (2017-04-09) - - -### Bug Fixes - -* **cache:** treat caches as private ([57b7dc2](https://github.com/zkat/make-fetch-happen/commit/57b7dc2)) - - -### Features - -* **retry:** accept shorthand retry settings ([dfed69d](https://github.com/zkat/make-fetch-happen/commit/dfed69d)) - - - - -# [2.1.0](https://github.com/zkat/make-fetch-happen/compare/v2.0.4...v2.1.0) (2017-04-09) - - -### Features - -* **cache:** cache now obeys Age and a variety of other things (#13) ([7b9652d](https://github.com/zkat/make-fetch-happen/commit/7b9652d)) - - - - -## [2.0.4](https://github.com/zkat/make-fetch-happen/compare/v2.0.3...v2.0.4) (2017-04-09) - - -### Bug Fixes - -* **agent:** accept Request as fetch input, not just strings ([b71669a](https://github.com/zkat/make-fetch-happen/commit/b71669a)) - - - - -## [2.0.3](https://github.com/zkat/make-fetch-happen/compare/v2.0.2...v2.0.3) (2017-04-09) - - -### Bug Fixes - -* **deps:** seriously ([c29e7e7](https://github.com/zkat/make-fetch-happen/commit/c29e7e7)) - - - - -## [2.0.2](https://github.com/zkat/make-fetch-happen/compare/v2.0.1...v2.0.2) (2017-04-09) - - -### Bug Fixes - -* **deps:** use bundleDeps instead ([c36ebf0](https://github.com/zkat/make-fetch-happen/commit/c36ebf0)) - - - - -## [2.0.1](https://github.com/zkat/make-fetch-happen/compare/v2.0.0...v2.0.1) (2017-04-09) - - -### Bug Fixes - -* **deps:** make sure node-fetch tarball included in release ([3bf49d1](https://github.com/zkat/make-fetch-happen/commit/3bf49d1)) - - - - -# [2.0.0](https://github.com/zkat/make-fetch-happen/compare/v1.7.0...v2.0.0) (2017-04-09) - - -### Bug Fixes - -* **deps:** manually pull in newer node-fetch to avoid babel prod dep ([66e5e87](https://github.com/zkat/make-fetch-happen/commit/66e5e87)) -* **retry:** be more specific about when we retry ([a47b782](https://github.com/zkat/make-fetch-happen/commit/a47b782)) - - -### Features - -* **agent:** add ca/cert/key support to auto-agent (#15) ([57585a7](https://github.com/zkat/make-fetch-happen/commit/57585a7)) - - -### BREAKING CHANGES - -* **agent:** pac proxies are no longer supported. -* **retry:** Retry logic has changes. - -* 404s, 420s, and 429s all retry now. -* ENOTFOUND no longer retries. -* Only ECONNRESET, ECONNREFUSED, EADDRINUSE, ETIMEDOUT, and `request-timeout` errors are retried. - - - - -# [1.7.0](https://github.com/zkat/make-fetch-happen/compare/v1.6.0...v1.7.0) (2017-04-08) - - -### Features - -* **cache:** add useful headers to inform users about cached data ([9bd7b00](https://github.com/zkat/make-fetch-happen/commit/9bd7b00)) - - - - -# [1.6.0](https://github.com/zkat/make-fetch-happen/compare/v1.5.1...v1.6.0) (2017-04-06) - - -### Features - -* **agent:** better, keepalive-supporting, default http agents ([16277f6](https://github.com/zkat/make-fetch-happen/commit/16277f6)) - - - - -## [1.5.1](https://github.com/zkat/make-fetch-happen/compare/v1.5.0...v1.5.1) (2017-04-05) - - -### Bug Fixes - -* **cache:** bump cacache for its fixed error messages ([2f2b916](https://github.com/zkat/make-fetch-happen/commit/2f2b916)) -* **cache:** fix handling of errors in cache reads ([5729222](https://github.com/zkat/make-fetch-happen/commit/5729222)) - - - - -# [1.5.0](https://github.com/zkat/make-fetch-happen/compare/v1.4.0...v1.5.0) (2017-04-04) - - -### Features - -* **retry:** retry requests on 408 timeouts, too ([8d8b5bd](https://github.com/zkat/make-fetch-happen/commit/8d8b5bd)) - - - - -# [1.4.0](https://github.com/zkat/make-fetch-happen/compare/v1.3.1...v1.4.0) (2017-04-04) - - -### Bug Fixes - -* **cache:** stop relying on BB.catch ([2b04494](https://github.com/zkat/make-fetch-happen/commit/2b04494)) - - -### Features - -* **retry:** report retry attempt number as extra header ([fd50927](https://github.com/zkat/make-fetch-happen/commit/fd50927)) - - - - -## [1.3.1](https://github.com/zkat/make-fetch-happen/compare/v1.3.0...v1.3.1) (2017-04-04) - - -### Bug Fixes - -* **cache:** pretend cache entry is missing on ENOENT ([9c2bb26](https://github.com/zkat/make-fetch-happen/commit/9c2bb26)) - - - - -# [1.3.0](https://github.com/zkat/make-fetch-happen/compare/v1.2.1...v1.3.0) (2017-04-04) - - -### Bug Fixes - -* **cache:** if metadata is missing for some odd reason, ignore the entry ([a021a6b](https://github.com/zkat/make-fetch-happen/commit/a021a6b)) - - -### Features - -* **cache:** add special headers when request was loaded straight from cache ([8a7dbd1](https://github.com/zkat/make-fetch-happen/commit/8a7dbd1)) -* **cache:** allow configuring algorithms to be calculated on insertion ([bf4a0f2](https://github.com/zkat/make-fetch-happen/commit/bf4a0f2)) - - - - -## [1.2.1](https://github.com/zkat/make-fetch-happen/compare/v1.2.0...v1.2.1) (2017-04-03) - - -### Bug Fixes - -* **integrity:** update cacache and ssri and change EBADCHECKSUM -> EINTEGRITY ([b6cf6f6](https://github.com/zkat/make-fetch-happen/commit/b6cf6f6)) - - - - -# [1.2.0](https://github.com/zkat/make-fetch-happen/compare/v1.1.0...v1.2.0) (2017-04-03) - - -### Features - -* **integrity:** full Subresource Integrity support (#10) ([a590159](https://github.com/zkat/make-fetch-happen/commit/a590159)) - - - - -# [1.1.0](https://github.com/zkat/make-fetch-happen/compare/v1.0.1...v1.1.0) (2017-04-01) - - -### Features - -* **opts:** fetch.defaults() for default options ([522a65e](https://github.com/zkat/make-fetch-happen/commit/522a65e)) - - - - -## [1.0.1](https://github.com/zkat/make-fetch-happen/compare/v1.0.0...v1.0.1) (2017-04-01) - - - - -# 1.0.0 (2017-04-01) - - -### Bug Fixes - -* **cache:** default on cache-control header ([b872a2c](https://github.com/zkat/make-fetch-happen/commit/b872a2c)) -* standard stuff and cache matching ([753f2c2](https://github.com/zkat/make-fetch-happen/commit/753f2c2)) -* **agent:** nudge around things with opts.agent ([ed62b57](https://github.com/zkat/make-fetch-happen/commit/ed62b57)) -* **agent:** {agent: false} has special behavior ([b8cc923](https://github.com/zkat/make-fetch-happen/commit/b8cc923)) -* **cache:** invalidation on non-GET ([fe78fac](https://github.com/zkat/make-fetch-happen/commit/fe78fac)) -* **cache:** make force-cache and only-if-cached work as expected ([f50e9df](https://github.com/zkat/make-fetch-happen/commit/f50e9df)) -* **cache:** more spec compliance ([d5a56db](https://github.com/zkat/make-fetch-happen/commit/d5a56db)) -* **cache:** only cache 200 gets ([0abb25a](https://github.com/zkat/make-fetch-happen/commit/0abb25a)) -* **cache:** only load cache code if cache opt is a string ([250fcd5](https://github.com/zkat/make-fetch-happen/commit/250fcd5)) -* **cache:** oops ([e3fa15a](https://github.com/zkat/make-fetch-happen/commit/e3fa15a)) -* **cache:** refactored warning removal into main file ([5b0a9f9](https://github.com/zkat/make-fetch-happen/commit/5b0a9f9)) -* **cache:** req constructor no longer needed in Cache ([5b74cbc](https://github.com/zkat/make-fetch-happen/commit/5b74cbc)) -* **cache:** standard fetch api calls cacheMode "cache" ([6fba805](https://github.com/zkat/make-fetch-happen/commit/6fba805)) -* **cache:** was using wrong method for non-GET/HEAD cache invalidation ([810763a](https://github.com/zkat/make-fetch-happen/commit/810763a)) -* **caching:** a bunch of cache-related fixes ([8ebda1d](https://github.com/zkat/make-fetch-happen/commit/8ebda1d)) -* **deps:** `cacache[@6](https://github.com/6).3.0` - race condition fixes ([9528442](https://github.com/zkat/make-fetch-happen/commit/9528442)) -* **freshness:** fix regex for cacheControl matching ([070db86](https://github.com/zkat/make-fetch-happen/commit/070db86)) -* **freshness:** fixed default freshness heuristic value ([5d29e88](https://github.com/zkat/make-fetch-happen/commit/5d29e88)) -* **logging:** remove console.log calls ([a1d0a47](https://github.com/zkat/make-fetch-happen/commit/a1d0a47)) -* **method:** node-fetch guarantees uppercase ([a1d68d6](https://github.com/zkat/make-fetch-happen/commit/a1d68d6)) -* **opts:** simplified opts handling ([516fd6e](https://github.com/zkat/make-fetch-happen/commit/516fd6e)) -* **proxy:** pass proxy option directly to ProxyAgent ([3398460](https://github.com/zkat/make-fetch-happen/commit/3398460)) -* **retry:** false -> {retries: 0} ([297fbb6](https://github.com/zkat/make-fetch-happen/commit/297fbb6)) -* **retry:** only retry put if body is not a stream ([a24e599](https://github.com/zkat/make-fetch-happen/commit/a24e599)) -* **retry:** skip retries if body is a stream for ANY method ([780c0f8](https://github.com/zkat/make-fetch-happen/commit/780c0f8)) - - -### Features - -* **api:** initial implementation -- can make and cache requests ([7d55b49](https://github.com/zkat/make-fetch-happen/commit/7d55b49)) -* **fetch:** injectable cache, and retry support ([87b84bf](https://github.com/zkat/make-fetch-happen/commit/87b84bf)) - - -### BREAKING CHANGES - -* **cache:** opts.cache -> opts.cacheManager; opts.cacheMode -> opts.cache -* **fetch:** opts.cache accepts a Cache-like obj or a path. Requests are now retried. -* **api:** actual api implemented diff --git a/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/LICENSE b/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/LICENSE deleted file mode 100644 index 8d28acf866d93..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/LICENSE +++ /dev/null @@ -1,16 +0,0 @@ -ISC License - -Copyright (c) npm, Inc. - -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 COPYRIGHT HOLDER DISCLAIMS -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -COPYRIGHT HOLDER 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/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/README.md b/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/README.md deleted file mode 100644 index 4d12d8dae7e31..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/README.md +++ /dev/null @@ -1,404 +0,0 @@ -# make-fetch-happen [![npm version](https://img.shields.io/npm/v/make-fetch-happen.svg)](https://npm.im/make-fetch-happen) [![license](https://img.shields.io/npm/l/make-fetch-happen.svg)](https://npm.im/make-fetch-happen) [![Travis](https://img.shields.io/travis/zkat/make-fetch-happen.svg)](https://travis-ci.org/zkat/make-fetch-happen) [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/zkat/make-fetch-happen?svg=true)](https://ci.appveyor.com/project/zkat/make-fetch-happen) [![Coverage Status](https://coveralls.io/repos/github/zkat/make-fetch-happen/badge.svg?branch=latest)](https://coveralls.io/github/zkat/make-fetch-happen?branch=latest) - - -[`make-fetch-happen`](https://github.com/zkat/make-fetch-happen) is a Node.js -library that wraps [`node-fetch-npm`](https://github.com/npm/node-fetch-npm) with additional -features [`node-fetch`](https://github.com/bitinn/node-fetch) doesn't intend to include, including HTTP Cache support, request -pooling, proxies, retries, [and more](#features)! - -## Install - -`$ npm install --save make-fetch-happen` - -## Table of Contents - -* [Example](#example) -* [Features](#features) -* [Contributing](#contributing) -* [API](#api) - * [`fetch`](#fetch) - * [`fetch.defaults`](#fetch-defaults) - * [`node-fetch` options](#node-fetch-options) - * [`make-fetch-happen` options](#extra-options) - * [`opts.cacheManager`](#opts-cache-manager) - * [`opts.cache`](#opts-cache) - * [`opts.proxy`](#opts-proxy) - * [`opts.noProxy`](#opts-no-proxy) - * [`opts.ca, opts.cert, opts.key`](#https-opts) - * [`opts.maxSockets`](#opts-max-sockets) - * [`opts.retry`](#opts-retry) - * [`opts.onRetry`](#opts-onretry) - * [`opts.integrity`](#opts-integrity) -* [Message From Our Sponsors](#wow) - -### Example - -```javascript -const fetch = require('make-fetch-happen').defaults({ - cacheManager: './my-cache' // path where cache will be written (and read) -}) - -fetch('https://registry.npmjs.org/make-fetch-happen').then(res => { - return res.json() // download the body as JSON -}).then(body => { - console.log(`got ${body.name} from web`) - return fetch('https://registry.npmjs.org/make-fetch-happen', { - cache: 'no-cache' // forces a conditional request - }) -}).then(res => { - console.log(res.status) // 304! cache validated! - return res.json().then(body => { - console.log(`got ${body.name} from cache`) - }) -}) -``` - -### Features - -* Builds around [`node-fetch`](https://npm.im/node-fetch) for the core [`fetch` API](https://fetch.spec.whatwg.org) implementation -* Request pooling out of the box -* Quite fast, really -* Automatic HTTP-semantics-aware request retries -* Cache-fallback automatic "offline mode" -* Proxy support (http, https, socks, socks4, socks5) -* Built-in request caching following full HTTP caching rules (`Cache-Control`, `ETag`, `304`s, cache fallback on error, etc). -* Customize cache storage with any [Cache API](https://developer.mozilla.org/en-US/docs/Web/API/Cache)-compliant `Cache` instance. Cache to Redis! -* Node.js Stream support -* Transparent gzip and deflate support -* [Subresource Integrity](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity) support -* Literally punches nazis -* (PENDING) Range request caching and resuming - -### Contributing - -The make-fetch-happen team enthusiastically welcomes contributions and project participation! There's a bunch of things you can do if you want to contribute! The [Contributor Guide](CONTRIBUTING.md) has all the information you need for everything from reporting bugs to contributing entire new features. Please don't hesitate to jump in if you'd like to, or even ask us questions if something isn't clear. - -All participants and maintainers in this project are expected to follow [Code of Conduct](CODE_OF_CONDUCT.md), and just generally be excellent to each other. - -Please refer to the [Changelog](CHANGELOG.md) for project history details, too. - -Happy hacking! - -### API - -#### `> fetch(uriOrRequest, [opts]) -> Promise` - -This function implements most of the [`fetch` API](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch): given a `uri` string or a `Request` instance, it will fire off an http request and return a Promise containing the relevant response. - -If `opts` is provided, the [`node-fetch`-specific options](#node-fetch-options) will be passed to that library. There are also [additional options](#extra-options) specific to make-fetch-happen that add various features, such as HTTP caching, integrity verification, proxy support, and more. - -##### Example - -```javascript -fetch('https://google.com').then(res => res.buffer()) -``` - -#### `> fetch.defaults([defaultUrl], [defaultOpts])` - -Returns a new `fetch` function that will call `make-fetch-happen` using `defaultUrl` and `defaultOpts` as default values to any calls. - -A defaulted `fetch` will also have a `.defaults()` method, so they can be chained. - -##### Example - -```javascript -const fetch = require('make-fetch-happen').defaults({ - cacheManager: './my-local-cache' -}) - -fetch('https://registry.npmjs.org/make-fetch-happen') // will always use the cache -``` - -#### `> node-fetch options` - -The following options for `node-fetch` are used as-is: - -* method -* body -* redirect -* follow -* timeout -* compress -* size - -These other options are modified or augmented by make-fetch-happen: - -* headers - Default `User-Agent` set to make-fetch happen. `Connection` is set to `keep-alive` or `close` automatically depending on `opts.agent`. -* agent - * If agent is null, an http or https Agent will be automatically used. By default, these will be `http.globalAgent` and `https.globalAgent`. - * If [`opts.proxy`](#opts-proxy) is provided and `opts.agent` is null, the agent will be set to an appropriate proxy-handling agent. - * If `opts.agent` is an object, it will be used as the request-pooling agent argument for this request. - * If `opts.agent` is `false`, it will be passed as-is to the underlying request library. This causes a new Agent to be spawned for every request. - -For more details, see [the documentation for `node-fetch` itself](https://github.com/bitinn/node-fetch#options). - -#### `> make-fetch-happen options` - -make-fetch-happen augments the `node-fetch` API with additional features available through extra options. The following extra options are available: - -* [`opts.cacheManager`](#opts-cache-manager) - Cache target to read/write -* [`opts.cache`](#opts-cache) - `fetch` cache mode. Controls cache *behavior*. -* [`opts.proxy`](#opts-proxy) - Proxy agent -* [`opts.noProxy`](#opts-no-proxy) - Domain segments to disable proxying for. -* [`opts.ca, opts.cert, opts.key, opts.strictSSL`](#https-opts) -* [`opts.localAddress`](#opts-local-address) -* [`opts.maxSockets`](#opts-max-sockets) -* [`opts.retry`](#opts-retry) - Request retry settings -* [`opts.onRetry`](#opts-onretry) - a function called whenever a retry is attempted -* [`opts.integrity`](#opts-integrity) - [Subresource Integrity](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity) metadata. - -#### `> opts.cacheManager` - -Either a `String` or a `Cache`. If the former, it will be assumed to be a `Path` to be used as the cache root for [`cacache`](https://npm.im/cacache). - -If an object is provided, it will be assumed to be a compliant [`Cache` instance](https://developer.mozilla.org/en-US/docs/Web/API/Cache). Only `Cache.match()`, `Cache.put()`, and `Cache.delete()` are required. Options objects will not be passed in to `match()` or `delete()`. - -By implementing this API, you can customize the storage backend for make-fetch-happen itself -- for example, you could implement a cache that uses `redis` for caching, or simply keeps everything in memory. Most of the caching logic exists entirely on the make-fetch-happen side, so the only thing you need to worry about is reading, writing, and deleting, as well as making sure `fetch.Response` objects are what gets returned. - -You can refer to `cache.js` in the make-fetch-happen source code for a reference implementation. - -**NOTE**: Requests will not be cached unless their response bodies are consumed. You will need to use one of the `res.json()`, `res.buffer()`, etc methods on the response, or drain the `res.body` stream, in order for it to be written. - -The default cache manager also adds the following headers to cached responses: - -* `X-Local-Cache`: Path to the cache the content was found in -* `X-Local-Cache-Key`: Unique cache entry key for this response -* `X-Local-Cache-Hash`: Specific integrity hash for the cached entry -* `X-Local-Cache-Time`: UTCString of the cache insertion time for the entry - -Using [`cacache`](https://npm.im/cacache), a call like this may be used to -manually fetch the cached entry: - -```javascript -const h = response.headers -cacache.get(h.get('x-local-cache'), h.get('x-local-cache-key')) - -// grab content only, directly: -cacache.get.byDigest(h.get('x-local-cache'), h.get('x-local-cache-hash')) -``` - -##### Example - -```javascript -fetch('https://registry.npmjs.org/make-fetch-happen', { - cacheManager: './my-local-cache' -}) // -> 200-level response will be written to disk - -fetch('https://npm.im/cacache', { - cacheManager: new MyCustomRedisCache(process.env.PORT) -}) // -> 200-level response will be written to redis -``` - -A possible (minimal) implementation for `MyCustomRedisCache`: - -```javascript -const bluebird = require('bluebird') -const redis = require("redis") -bluebird.promisifyAll(redis.RedisClient.prototype) -class MyCustomRedisCache { - constructor (opts) { - this.redis = redis.createClient(opts) - } - match (req) { - return this.redis.getAsync(req.url).then(res => { - if (res) { - const parsed = JSON.parse(res) - return new fetch.Response(parsed.body, { - url: req.url, - headers: parsed.headers, - status: 200 - }) - } - }) - } - put (req, res) { - return res.buffer().then(body => { - return this.redis.setAsync(req.url, JSON.stringify({ - body: body, - headers: res.headers.raw() - })) - }).then(() => { - // return the response itself - return res - }) - } - 'delete' (req) { - return this.redis.unlinkAsync(req.url) - } -} -``` - -#### `> opts.cache` - -This option follows the standard `fetch` API cache option. This option will do nothing if [`opts.cacheManager`](#opts-cache-manager) is null. The following values are accepted (as strings): - -* `default` - Fetch will inspect the HTTP cache on the way to the network. If there is a fresh response it will be used. If there is a stale response a conditional request will be created, and a normal request otherwise. It then updates the HTTP cache with the response. If the revalidation request fails (for example, on a 500 or if you're offline), the stale response will be returned. -* `no-store` - Fetch behaves as if there is no HTTP cache at all. -* `reload` - Fetch behaves as if there is no HTTP cache on the way to the network. Ergo, it creates a normal request and updates the HTTP cache with the response. -* `no-cache` - Fetch creates a conditional request if there is a response in the HTTP cache and a normal request otherwise. It then updates the HTTP cache with the response. -* `force-cache` - Fetch uses any response in the HTTP cache matching the request, not paying attention to staleness. If there was no response, it creates a normal request and updates the HTTP cache with the response. -* `only-if-cached` - Fetch uses any response in the HTTP cache matching the request, not paying attention to staleness. If there was no response, it returns a network error. (Can only be used when request’s mode is "same-origin". Any cached redirects will be followed assuming request’s redirect mode is "follow" and the redirects do not violate request’s mode.) - -(Note: option descriptions are taken from https://fetch.spec.whatwg.org/#http-network-or-cache-fetch) - -##### Example - -```javascript -const fetch = require('make-fetch-happen').defaults({ - cacheManager: './my-cache' -}) - -// Will error with ENOTCACHED if we haven't already cached this url -fetch('https://registry.npmjs.org/make-fetch-happen', { - cache: 'only-if-cached' -}) - -// Will refresh any local content and cache the new response -fetch('https://registry.npmjs.org/make-fetch-happen', { - cache: 'reload' -}) - -// Will use any local data, even if stale. Otherwise, will hit network. -fetch('https://registry.npmjs.org/make-fetch-happen', { - cache: 'force-cache' -}) -``` - -#### `> opts.proxy` - -A string or `url.parse`-d URI to proxy through. Different Proxy handlers will be -used depending on the proxy's protocol. - -Additionally, `process.env.HTTP_PROXY`, `process.env.HTTPS_PROXY`, and -`process.env.PROXY` are used if present and no `opts.proxy` value is provided. - -(Pending) `process.env.NO_PROXY` may also be configured to skip proxying requests for all, or specific domains. - -##### Example - -```javascript -fetch('https://registry.npmjs.org/make-fetch-happen', { - proxy: 'https://corporate.yourcompany.proxy:4445' -}) - -fetch('https://registry.npmjs.org/make-fetch-happen', { - proxy: { - protocol: 'https:', - hostname: 'corporate.yourcompany.proxy', - port: 4445 - } -}) -``` - -#### `> opts.noProxy` - -If present, should be a comma-separated string or an array of domain extensions -that a proxy should _not_ be used for. - -This option may also be provided through `process.env.NO_PROXY`. - -#### `> opts.ca, opts.cert, opts.key, opts.strictSSL` - -These values are passed in directly to the HTTPS agent and will be used for both -proxied and unproxied outgoing HTTPS requests. They mostly correspond to the -same options the `https` module accepts, which will be themselves passed to -`tls.connect()`. `opts.strictSSL` corresponds to `rejectUnauthorized`. - -#### `> opts.localAddress` - -Passed directly to `http` and `https` request calls. Determines the local -address to bind to. - -#### `> opts.maxSockets` - -Default: 15 - -Maximum number of active concurrent sockets to use for the underlying -Http/Https/Proxy agents. This setting applies once per spawned agent. - -15 is probably a _pretty good value_ for most use-cases, and balances speed -with, uh, not knocking out people's routers. 🤓 - -#### `> opts.retry` - -An object that can be used to tune request retry settings. Retries will only be attempted on the following conditions: - -* Request method is NOT `POST` AND -* Request status is one of: `408`, `420`, `429`, or any status in the 500-range. OR -* Request errored with `ECONNRESET`, `ECONNREFUSED`, `EADDRINUSE`, `ETIMEDOUT`, or the `fetch` error `request-timeout`. - -The following are worth noting as explicitly not retried: - -* `getaddrinfo ENOTFOUND` and will be assumed to be either an unreachable domain or the user will be assumed offline. If a response is cached, it will be returned immediately. -* `ECONNRESET` currently has no support for restarting. It will eventually be supported but requires a bit more juggling due to streaming. - -If `opts.retry` is `false`, it is equivalent to `{retries: 0}` - -If `opts.retry` is a number, it is equivalent to `{retries: num}` - -The following retry options are available if you want more control over it: - -* retries -* factor -* minTimeout -* maxTimeout -* randomize - -For details on what each of these do, refer to the [`retry`](https://npm.im/retry) documentation. - -##### Example - -```javascript -fetch('https://flaky.site.com', { - retry: { - retries: 10, - randomize: true - } -}) - -fetch('http://reliable.site.com', { - retry: false -}) - -fetch('http://one-more.site.com', { - retry: 3 -}) -``` - -#### `> opts.onRetry` - -A function called whenever a retry is attempted. - -##### Example - -```javascript -fetch('https://flaky.site.com', { - onRetry() { - console.log('we will retry!') - } -}) -``` - -#### `> opts.integrity` - -Matches the response body against the given [Subresource Integrity](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity) metadata. If verification fails, the request will fail with an `EINTEGRITY` error. - -`integrity` may either be a string or an [`ssri`](https://npm.im/ssri) `Integrity`-like. - -##### Example - -```javascript -fetch('https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-1.0.0.tgz', { - integrity: 'sha1-o47j7zAYnedYFn1dF/fR9OV3z8Q=' -}) // -> ok - -fetch('https://malicious-registry.org/make-fetch-happen/-/make-fetch-happen-1.0.0.tgz', { - integrity: 'sha1-o47j7zAYnedYFn1dF/fR9OV3z8Q=' -}) // Error: EINTEGRITY -``` - -### Message From Our Sponsors - -![](stop.gif) - -![](happening.gif) diff --git a/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/agent.js b/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/agent.js deleted file mode 100644 index 55675946ad97d..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/agent.js +++ /dev/null @@ -1,171 +0,0 @@ -'use strict' -const LRU = require('lru-cache') -const url = require('url') - -let AGENT_CACHE = new LRU({ max: 50 }) -let HttpsAgent -let HttpAgent - -module.exports = getAgent - -function getAgent (uri, opts) { - const parsedUri = url.parse(typeof uri === 'string' ? uri : uri.url) - const isHttps = parsedUri.protocol === 'https:' - const pxuri = getProxyUri(uri, opts) - - const key = [ - `https:${isHttps}`, - pxuri - ? `proxy:${pxuri.protocol}//${pxuri.host}:${pxuri.port}` - : '>no-proxy<', - `local-address:${opts.localAddress || '>no-local-address<'}`, - `strict-ssl:${isHttps ? !!opts.strictSSL : '>no-strict-ssl<'}`, - `ca:${(isHttps && opts.ca) || '>no-ca<'}`, - `cert:${(isHttps && opts.cert) || '>no-cert<'}`, - `key:${(isHttps && opts.key) || '>no-key<'}` - ].join(':') - - if (opts.agent != null) { // `agent: false` has special behavior! - return opts.agent - } - - if (AGENT_CACHE.peek(key)) { - return AGENT_CACHE.get(key) - } - - if (pxuri) { - const proxy = getProxy(pxuri, opts, isHttps) - AGENT_CACHE.set(key, proxy) - return proxy - } - - if (isHttps && !HttpsAgent) { - HttpsAgent = require('agentkeepalive').HttpsAgent - } else if (!isHttps && !HttpAgent) { - HttpAgent = require('agentkeepalive') - } - - // If opts.timeout is zero, set the agentTimeout to zero as well. A timeout - // of zero disables the timeout behavior (OS limits still apply). Else, if - // opts.timeout is a non-zero value, set it to timeout + 1, to ensure that - // the node-fetch-npm timeout will always fire first, giving us more - // consistent errors. - const agentTimeout = opts.timeout === 0 ? 0 : opts.timeout + 1 - - const agent = isHttps ? new HttpsAgent({ - maxSockets: opts.maxSockets || 15, - ca: opts.ca, - cert: opts.cert, - key: opts.key, - localAddress: opts.localAddress, - rejectUnauthorized: opts.strictSSL, - timeout: agentTimeout - }) : new HttpAgent({ - maxSockets: opts.maxSockets || 15, - localAddress: opts.localAddress, - timeout: agentTimeout - }) - AGENT_CACHE.set(key, agent) - return agent -} - -function checkNoProxy (uri, opts) { - const host = url.parse(uri).hostname.split('.').reverse() - let noproxy = (opts.noProxy || getProcessEnv('no_proxy')) - if (typeof noproxy === 'string') { - noproxy = noproxy.split(/\s*,\s*/g) - } - return noproxy && noproxy.some(no => { - const noParts = no.split('.').filter(x => x).reverse() - if (!noParts.length) { return false } - for (let i = 0; i < noParts.length; i++) { - if (host[i] !== noParts[i]) { - return false - } - } - return true - }) -} - -module.exports.getProcessEnv = getProcessEnv - -function getProcessEnv (env) { - if (!env) { return } - - let value - - if (Array.isArray(env)) { - for (let e of env) { - value = process.env[e] || - process.env[e.toUpperCase()] || - process.env[e.toLowerCase()] - if (typeof value !== 'undefined') { break } - } - } - - if (typeof env === 'string') { - value = process.env[env] || - process.env[env.toUpperCase()] || - process.env[env.toLowerCase()] - } - - return value -} - -function getProxyUri (uri, opts) { - const protocol = url.parse(uri).protocol - - const proxy = opts.proxy || ( - protocol === 'https:' && getProcessEnv('https_proxy') - ) || ( - protocol === 'http:' && getProcessEnv(['https_proxy', 'http_proxy', 'proxy']) - ) - if (!proxy) { return null } - - const parsedProxy = (typeof proxy === 'string') ? url.parse(proxy) : proxy - - return !checkNoProxy(uri, opts) && parsedProxy -} - -let HttpProxyAgent -let HttpsProxyAgent -let SocksProxyAgent -function getProxy (proxyUrl, opts, isHttps) { - let popts = { - host: proxyUrl.hostname, - port: proxyUrl.port, - protocol: proxyUrl.protocol, - path: proxyUrl.path, - auth: proxyUrl.auth, - ca: opts.ca, - cert: opts.cert, - key: opts.key, - timeout: opts.timeout === 0 ? 0 : opts.timeout + 1, - localAddress: opts.localAddress, - maxSockets: opts.maxSockets || 15, - rejectUnauthorized: opts.strictSSL - } - - if (proxyUrl.protocol === 'http:' || proxyUrl.protocol === 'https:') { - if (!isHttps) { - if (!HttpProxyAgent) { - HttpProxyAgent = require('http-proxy-agent') - } - - return new HttpProxyAgent(popts) - } else { - if (!HttpsProxyAgent) { - HttpsProxyAgent = require('https-proxy-agent') - } - - return new HttpsProxyAgent(popts) - } - } - if (proxyUrl.protocol.startsWith('socks')) { - if (!SocksProxyAgent) { - SocksProxyAgent = require('socks-proxy-agent') - } - - return new SocksProxyAgent(popts) - } -} diff --git a/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/cache.js b/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/cache.js deleted file mode 100644 index edb9b3d036043..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/cache.js +++ /dev/null @@ -1,257 +0,0 @@ -'use strict' - -const cacache = require('cacache') -const fetch = require('node-fetch-npm') -const pipe = require('mississippi').pipe -const ssri = require('ssri') -const through = require('mississippi').through -const to = require('mississippi').to -const url = require('url') -const stream = require('stream') - -const MAX_MEM_SIZE = 5 * 1024 * 1024 // 5MB - -function cacheKey (req) { - const parsed = url.parse(req.url) - return `make-fetch-happen:request-cache:${ - url.format({ - protocol: parsed.protocol, - slashes: parsed.slashes, - host: parsed.host, - hostname: parsed.hostname, - pathname: parsed.pathname - }) - }` -} - -// This is a cacache-based implementation of the Cache standard, -// using node-fetch. -// docs: https://developer.mozilla.org/en-US/docs/Web/API/Cache -// -module.exports = class Cache { - constructor (path, opts) { - this._path = path - this._uid = opts && opts.uid - this._gid = opts && opts.gid - this.Promise = (opts && opts.Promise) || Promise - } - - // Returns a Promise that resolves to the response associated with the first - // matching request in the Cache object. - match (req, opts) { - opts = opts || {} - const key = cacheKey(req) - return cacache.get.info(this._path, key).then(info => { - return info && cacache.get.hasContent( - this._path, info.integrity, opts - ).then(exists => exists && info) - }).then(info => { - if (info && info.metadata && matchDetails(req, { - url: info.metadata.url, - reqHeaders: new fetch.Headers(info.metadata.reqHeaders), - resHeaders: new fetch.Headers(info.metadata.resHeaders), - cacheIntegrity: info.integrity, - integrity: opts && opts.integrity - })) { - const resHeaders = new fetch.Headers(info.metadata.resHeaders) - addCacheHeaders(resHeaders, this._path, key, info.integrity, info.time) - if (req.method === 'HEAD') { - return new fetch.Response(null, { - url: req.url, - headers: resHeaders, - status: 200 - }) - } - let body - const cachePath = this._path - // avoid opening cache file handles until a user actually tries to - // read from it. - if (opts.memoize !== false && info.size > MAX_MEM_SIZE) { - body = new stream.PassThrough() - const realRead = body._read - body._read = function (size) { - body._read = realRead - pipe( - cacache.get.stream.byDigest(cachePath, info.integrity, { - memoize: opts.memoize - }), - body, - err => body.emit(err)) - return realRead.call(this, size) - } - } else { - let readOnce = false - // cacache is much faster at bulk reads - body = new stream.Readable({ - read () { - if (readOnce) return this.push(null) - readOnce = true - cacache.get.byDigest(cachePath, info.integrity, { - memoize: opts.memoize - }).then(data => { - this.push(data) - this.push(null) - }, err => this.emit('error', err)) - } - }) - } - return this.Promise.resolve(new fetch.Response(body, { - url: req.url, - headers: resHeaders, - status: 200, - size: info.size - })) - } - }) - } - - // Takes both a request and its response and adds it to the given cache. - put (req, response, opts) { - opts = opts || {} - const size = response.headers.get('content-length') - const fitInMemory = !!size && opts.memoize !== false && size < MAX_MEM_SIZE - const ckey = cacheKey(req) - const cacheOpts = { - algorithms: opts.algorithms, - metadata: { - url: req.url, - reqHeaders: req.headers.raw(), - resHeaders: response.headers.raw() - }, - uid: this._uid, - gid: this._gid, - size, - memoize: fitInMemory && opts.memoize - } - if (req.method === 'HEAD' || response.status === 304) { - // Update metadata without writing - return cacache.get.info(this._path, ckey).then(info => { - // Providing these will bypass content write - cacheOpts.integrity = info.integrity - addCacheHeaders( - response.headers, this._path, ckey, info.integrity, info.time - ) - return new this.Promise((resolve, reject) => { - pipe( - cacache.get.stream.byDigest(this._path, info.integrity, cacheOpts), - cacache.put.stream(this._path, cacheKey(req), cacheOpts), - err => err ? reject(err) : resolve(response) - ) - }) - }).then(() => response) - } - let buf = [] - let bufSize = 0 - let cacheTargetStream = false - const cachePath = this._path - let cacheStream = to((chunk, enc, cb) => { - if (!cacheTargetStream) { - if (fitInMemory) { - cacheTargetStream = - to({highWaterMark: MAX_MEM_SIZE}, (chunk, enc, cb) => { - buf.push(chunk) - bufSize += chunk.length - cb() - }, done => { - cacache.put( - cachePath, - cacheKey(req), - Buffer.concat(buf, bufSize), - cacheOpts - ).then( - () => done(), - done - ) - }) - } else { - cacheTargetStream = - cacache.put.stream(cachePath, cacheKey(req), cacheOpts) - } - } - cacheTargetStream.write(chunk, enc, cb) - }, done => { - cacheTargetStream ? cacheTargetStream.end(done) : done() - }) - const oldBody = response.body - const newBody = through({highWaterMark: fitInMemory && MAX_MEM_SIZE}) - response.body = newBody - oldBody.once('error', err => newBody.emit('error', err)) - newBody.once('error', err => oldBody.emit('error', err)) - cacheStream.once('error', err => newBody.emit('error', err)) - pipe(oldBody, to((chunk, enc, cb) => { - cacheStream.write(chunk, enc, () => { - newBody.write(chunk, enc, cb) - }) - }, done => { - cacheStream.end(() => { - newBody.end(() => { - done() - }) - }) - }), err => err && newBody.emit('error', err)) - return response - } - - // Finds the Cache entry whose key is the request, and if found, deletes the - // Cache entry and returns a Promise that resolves to true. If no Cache entry - // is found, it returns false. - 'delete' (req, opts) { - opts = opts || {} - if (typeof opts.memoize === 'object') { - if (opts.memoize.reset) { - opts.memoize.reset() - } else if (opts.memoize.clear) { - opts.memoize.clear() - } else { - Object.keys(opts.memoize).forEach(k => { - opts.memoize[k] = null - }) - } - } - return cacache.rm.entry( - this._path, - cacheKey(req) - // TODO - true/false - ).then(() => false) - } -} - -function matchDetails (req, cached) { - const reqUrl = url.parse(req.url) - const cacheUrl = url.parse(cached.url) - const vary = cached.resHeaders.get('Vary') - // https://tools.ietf.org/html/rfc7234#section-4.1 - if (vary) { - if (vary.match(/\*/)) { - return false - } else { - const fieldsMatch = vary.split(/\s*,\s*/).every(field => { - return cached.reqHeaders.get(field) === req.headers.get(field) - }) - if (!fieldsMatch) { - return false - } - } - } - if (cached.integrity) { - const cachedSri = ssri.parse(cached.cacheIntegrity) - const sri = ssri.parse(cached.integrity) - const algo = sri.pickAlgorithm() - if (cachedSri[algo] && !sri[algo].some(hash => { - // cachedSri always has exactly one item per algorithm - return cachedSri[algo][0].digest === hash.digest - })) { - return false - } - } - reqUrl.hash = null - cacheUrl.hash = null - return url.format(reqUrl) === url.format(cacheUrl) -} - -function addCacheHeaders (resHeaders, path, key, hash, time) { - resHeaders.set('X-Local-Cache', encodeURIComponent(path)) - resHeaders.set('X-Local-Cache-Key', encodeURIComponent(key)) - resHeaders.set('X-Local-Cache-Hash', encodeURIComponent(hash)) - resHeaders.set('X-Local-Cache-Time', new Date(time).toUTCString()) -} diff --git a/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/index.js b/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/index.js deleted file mode 100644 index 0f2c164e19f28..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/index.js +++ /dev/null @@ -1,482 +0,0 @@ -'use strict' - -let Cache -const url = require('url') -const CachePolicy = require('http-cache-semantics') -const fetch = require('node-fetch-npm') -const pkg = require('./package.json') -const retry = require('promise-retry') -let ssri -const Stream = require('stream') -const getAgent = require('./agent') -const setWarning = require('./warning') - -const isURL = /^https?:/ -const USER_AGENT = `${pkg.name}/${pkg.version} (+https://npm.im/${pkg.name})` - -const RETRY_ERRORS = [ - 'ECONNRESET', // remote socket closed on us - 'ECONNREFUSED', // remote host refused to open connection - 'EADDRINUSE', // failed to bind to a local port (proxy?) - 'ETIMEDOUT' // someone in the transaction is WAY TOO SLOW - // Known codes we do NOT retry on: - // ENOTFOUND (getaddrinfo failure. Either bad hostname, or offline) -] - -const RETRY_TYPES = [ - 'request-timeout' -] - -// https://fetch.spec.whatwg.org/#http-network-or-cache-fetch -module.exports = cachingFetch -cachingFetch.defaults = function (_uri, _opts) { - const fetch = this - if (typeof _uri === 'object') { - _opts = _uri - _uri = null - } - - function defaultedFetch (uri, opts) { - const finalOpts = Object.assign({}, _opts || {}, opts || {}) - return fetch(uri || _uri, finalOpts) - } - - defaultedFetch.defaults = fetch.defaults - defaultedFetch.delete = fetch.delete - return defaultedFetch -} - -cachingFetch.delete = cacheDelete -function cacheDelete (uri, opts) { - opts = configureOptions(opts) - if (opts.cacheManager) { - const req = new fetch.Request(uri, { - method: opts.method, - headers: opts.headers - }) - return opts.cacheManager.delete(req, opts) - } -} - -function initializeCache (opts) { - if (typeof opts.cacheManager === 'string') { - if (!Cache) { - // Default cacache-based cache - Cache = require('./cache') - } - - opts.cacheManager = new Cache(opts.cacheManager, opts) - } - - opts.cache = opts.cache || 'default' - - if (opts.cache === 'default' && isHeaderConditional(opts.headers)) { - // If header list contains `If-Modified-Since`, `If-None-Match`, - // `If-Unmodified-Since`, `If-Match`, or `If-Range`, fetch will set cache - // mode to "no-store" if it is "default". - opts.cache = 'no-store' - } -} - -function configureOptions (_opts) { - const opts = Object.assign({}, _opts || {}) - opts.method = (opts.method || 'GET').toUpperCase() - - if (opts.retry && typeof opts.retry === 'number') { - opts.retry = { retries: opts.retry } - } - - if (opts.retry === false) { - opts.retry = { retries: 0 } - } - - if (opts.cacheManager) { - initializeCache(opts) - } - - return opts -} - -function initializeSsri () { - if (!ssri) { - ssri = require('ssri') - } -} - -function cachingFetch (uri, _opts) { - const opts = configureOptions(_opts) - - if (opts.integrity) { - initializeSsri() - // if verifying integrity, node-fetch must not decompress - opts.compress = false - } - - const isCachable = (opts.method === 'GET' || opts.method === 'HEAD') && - opts.cacheManager && - opts.cache !== 'no-store' && - opts.cache !== 'reload' - - if (isCachable) { - const req = new fetch.Request(uri, { - method: opts.method, - headers: opts.headers - }) - - return opts.cacheManager.match(req, opts).then(res => { - if (res) { - const warningCode = (res.headers.get('Warning') || '').match(/^\d+/) - if (warningCode && +warningCode >= 100 && +warningCode < 200) { - // https://tools.ietf.org/html/rfc7234#section-4.3.4 - // - // If a stored response is selected for update, the cache MUST: - // - // * delete any Warning header fields in the stored response with - // warn-code 1xx (see Section 5.5); - // - // * retain any Warning header fields in the stored response with - // warn-code 2xx; - // - res.headers.delete('Warning') - } - - if (opts.cache === 'default' && !isStale(req, res)) { - return res - } - - if (opts.cache === 'default' || opts.cache === 'no-cache') { - return conditionalFetch(req, res, opts) - } - - if (opts.cache === 'force-cache' || opts.cache === 'only-if-cached') { - // 112 Disconnected operation - // SHOULD be included if the cache is intentionally disconnected from - // the rest of the network for a period of time. - // (https://tools.ietf.org/html/rfc2616#section-14.46) - setWarning(res, 112, 'Disconnected operation') - return res - } - } - - if (!res && opts.cache === 'only-if-cached') { - const errorMsg = `request to ${ - uri - } failed: cache mode is 'only-if-cached' but no cached response available.` - - const err = new Error(errorMsg) - err.code = 'ENOTCACHED' - throw err - } - - // Missing cache entry, or mode is default (if stale), reload, no-store - return remoteFetch(req.url, opts) - }) - } - - return remoteFetch(uri, opts) -} - -function iterableToObject (iter) { - const obj = {} - for (let k of iter.keys()) { - obj[k] = iter.get(k) - } - return obj -} - -function makePolicy (req, res) { - const _req = { - url: req.url, - method: req.method, - headers: iterableToObject(req.headers) - } - const _res = { - status: res.status, - headers: iterableToObject(res.headers) - } - - return new CachePolicy(_req, _res, { shared: false }) -} - -// https://tools.ietf.org/html/rfc7234#section-4.2 -function isStale (req, res) { - if (!res) { - return null - } - - const _req = { - url: req.url, - method: req.method, - headers: iterableToObject(req.headers) - } - - const policy = makePolicy(req, res) - - const responseTime = res.headers.get('x-local-cache-time') || - res.headers.get('date') || - 0 - - policy._responseTime = new Date(responseTime) - - const bool = !policy.satisfiesWithoutRevalidation(_req) - return bool -} - -function mustRevalidate (res) { - return (res.headers.get('cache-control') || '').match(/must-revalidate/i) -} - -function conditionalFetch (req, cachedRes, opts) { - const _req = { - url: req.url, - method: req.method, - headers: Object.assign({}, opts.headers || {}) - } - - const policy = makePolicy(req, cachedRes) - opts.headers = policy.revalidationHeaders(_req) - - return remoteFetch(req.url, opts) - .then(condRes => { - const revalidatedPolicy = policy.revalidatedPolicy(_req, { - status: condRes.status, - headers: iterableToObject(condRes.headers) - }) - - if (condRes.status >= 500 && !mustRevalidate(cachedRes)) { - // 111 Revalidation failed - // MUST be included if a cache returns a stale response because an - // attempt to revalidate the response failed, due to an inability to - // reach the server. - // (https://tools.ietf.org/html/rfc2616#section-14.46) - setWarning(cachedRes, 111, 'Revalidation failed') - return cachedRes - } - - if (condRes.status === 304) { // 304 Not Modified - condRes.body = cachedRes.body - return opts.cacheManager.put(req, condRes, opts) - .then(newRes => { - newRes.headers = new fetch.Headers(revalidatedPolicy.policy.responseHeaders()) - return newRes - }) - } - - return condRes - }) - .then(res => res) - .catch(err => { - if (mustRevalidate(cachedRes)) { - throw err - } else { - // 111 Revalidation failed - // MUST be included if a cache returns a stale response because an - // attempt to revalidate the response failed, due to an inability to - // reach the server. - // (https://tools.ietf.org/html/rfc2616#section-14.46) - setWarning(cachedRes, 111, 'Revalidation failed') - // 199 Miscellaneous warning - // The warning text MAY include arbitrary information to be presented to - // a human user, or logged. A system receiving this warning MUST NOT take - // any automated action, besides presenting the warning to the user. - // (https://tools.ietf.org/html/rfc2616#section-14.46) - setWarning( - cachedRes, - 199, - `Miscellaneous Warning ${err.code}: ${err.message}` - ) - - return cachedRes - } - }) -} - -function remoteFetchHandleIntegrity (res, integrity) { - const oldBod = res.body - const newBod = ssri.integrityStream({ - integrity - }) - oldBod.pipe(newBod) - res.body = newBod - oldBod.once('error', err => { - newBod.emit('error', err) - }) - newBod.once('error', err => { - oldBod.emit('error', err) - }) -} - -function remoteFetch (uri, opts) { - const agent = getAgent(uri, opts) - const headers = Object.assign({ - 'connection': agent ? 'keep-alive' : 'close', - 'user-agent': USER_AGENT - }, opts.headers || {}) - - const reqOpts = { - agent, - body: opts.body, - compress: opts.compress, - follow: opts.follow, - headers: new fetch.Headers(headers), - method: opts.method, - redirect: 'manual', - size: opts.size, - counter: opts.counter, - timeout: opts.timeout - } - - return retry( - (retryHandler, attemptNum) => { - const req = new fetch.Request(uri, reqOpts) - return fetch(req) - .then(res => { - res.headers.set('x-fetch-attempts', attemptNum) - - if (opts.integrity) { - remoteFetchHandleIntegrity(res, opts.integrity) - } - - const isStream = req.body instanceof Stream - - if (opts.cacheManager) { - const isMethodGetHead = req.method === 'GET' || - req.method === 'HEAD' - - const isCachable = opts.cache !== 'no-store' && - isMethodGetHead && - makePolicy(req, res).storable() && - res.status === 200 // No other statuses should be stored! - - if (isCachable) { - return opts.cacheManager.put(req, res, opts) - } - - if (!isMethodGetHead) { - return opts.cacheManager.delete(req).then(() => { - if (res.status >= 500 && req.method !== 'POST' && !isStream) { - if (typeof opts.onRetry === 'function') { - opts.onRetry(res) - } - - return retryHandler(res) - } - - return res - }) - } - } - - const isRetriable = req.method !== 'POST' && - !isStream && ( - res.status === 408 || // Request Timeout - res.status === 420 || // Enhance Your Calm (usually Twitter rate-limit) - res.status === 429 || // Too Many Requests ("standard" rate-limiting) - res.status >= 500 // Assume server errors are momentary hiccups - ) - - if (isRetriable) { - if (typeof opts.onRetry === 'function') { - opts.onRetry(res) - } - - return retryHandler(res) - } - - if (!fetch.isRedirect(res.status) || opts.redirect === 'manual') { - return res - } - - // handle redirects - matches behavior of npm-fetch: https://github.com/bitinn/node-fetch - if (opts.redirect === 'error') { - const err = new Error(`redirect mode is set to error: ${uri}`) - err.code = 'ENOREDIRECT' - throw err - } - - if (!res.headers.get('location')) { - const err = new Error(`redirect location header missing at: ${uri}`) - err.code = 'EINVALIDREDIRECT' - throw err - } - - if (req.counter >= req.follow) { - const err = new Error(`maximum redirect reached at: ${uri}`) - err.code = 'EMAXREDIRECT' - throw err - } - - const resolvedUrl = url.resolve(req.url, res.headers.get('location')) - let redirectURL = url.parse(resolvedUrl) - - if (isURL.test(res.headers.get('location'))) { - redirectURL = url.parse(res.headers.get('location')) - } - - // Remove authorization if changing hostnames (but not if just - // changing ports or protocols). This matches the behavior of request: - // https://github.com/request/request/blob/b12a6245/lib/redirect.js#L134-L138 - if (url.parse(req.url).hostname !== redirectURL.hostname) { - req.headers.delete('authorization') - } - - // for POST request with 301/302 response, or any request with 303 response, - // use GET when following redirect - if (res.status === 303 || - ((res.status === 301 || res.status === 302) && req.method === 'POST')) { - opts.method = 'GET' - opts.body = null - req.headers.delete('content-length') - } - - opts.headers = {} - req.headers.forEach((value, name) => { - opts.headers[name] = value - }) - - opts.counter = ++req.counter - return cachingFetch(resolvedUrl, opts) - }) - .catch(err => { - const code = err.code === 'EPROMISERETRY' ? err.retried.code : err.code - - const isRetryError = RETRY_ERRORS.indexOf(code) === -1 && - RETRY_TYPES.indexOf(err.type) === -1 - - if (req.method === 'POST' || isRetryError) { - throw err - } - - if (typeof opts.onRetry === 'function') { - opts.onRetry(err) - } - - return retryHandler(err) - }) - }, - opts.retry - ).catch(err => { - if (err.status >= 400) { - return err - } - - throw err - }) -} - -function isHeaderConditional (headers) { - if (!headers || typeof headers !== 'object') { - return false - } - - const modifiers = [ - 'if-modified-since', - 'if-none-match', - 'if-unmodified-since', - 'if-match', - 'if-range' - ] - - return Object.keys(headers) - .some(h => modifiers.indexOf(h.toLowerCase()) !== -1) -} diff --git a/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/package.json b/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/package.json deleted file mode 100644 index ff28e528a7616..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/package.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "_from": "make-fetch-happen@^3.0.0", - "_id": "make-fetch-happen@3.0.0", - "_inBundle": false, - "_integrity": "sha512-FmWY7gC0mL6Z4N86vE14+m719JKE4H0A+pyiOH18B025gF/C113pyfb4gHDDYP5cqnRMHOz06JGdmffC/SES+w==", - "_location": "/npm-registry-fetch/make-fetch-happen", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "make-fetch-happen@^3.0.0", - "name": "make-fetch-happen", - "escapedName": "make-fetch-happen", - "rawSpec": "^3.0.0", - "saveSpec": null, - "fetchSpec": "^3.0.0" - }, - "_requiredBy": [ - "/npm-registry-fetch" - ], - "_resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-3.0.0.tgz", - "_shasum": "7b661d2372fc4710ab5cc8e1fa3c290eea69a961", - "_spec": "make-fetch-happen@^3.0.0", - "_where": "/Users/rebecca/code/npm/node_modules/npm-registry-fetch", - "author": { - "name": "Kat Marchán", - "email": "kzm@sykosomatic.org" - }, - "bugs": { - "url": "https://github.com/zkat/make-fetch-happen/issues" - }, - "bundleDependencies": false, - "dependencies": { - "agentkeepalive": "^3.4.1", - "cacache": "^10.0.4", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.0", - "lru-cache": "^4.1.2", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^3.0.1", - "ssri": "^5.2.4" - }, - "deprecated": false, - "description": "Opinionated, caching, retrying fetch client", - "devDependencies": { - "bluebird": "^3.5.1", - "mkdirp": "^0.5.1", - "nock": "^9.2.3", - "npmlog": "^4.1.2", - "nyc": "^11.4.1", - "require-inject": "^1.4.2", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.1", - "standard": "^11.0.0", - "standard-version": "^4.3.0", - "tacks": "^1.2.6", - "tap": "^11.1.2", - "weallbehave": "^1.0.0", - "weallcontribute": "^1.0.7" - }, - "files": [ - "*.js", - "lib" - ], - "homepage": "https://github.com/zkat/make-fetch-happen#readme", - "keywords": [ - "http", - "request", - "fetch", - "mean girls", - "caching", - "cache", - "subresource integrity" - ], - "license": "ISC", - "main": "index.js", - "name": "make-fetch-happen", - "repository": { - "type": "git", - "url": "git+https://github.com/zkat/make-fetch-happen.git" - }, - "scripts": { - "postrelease": "npm publish && git push --follow-tags", - "prerelease": "npm t", - "pretest": "standard", - "release": "standard-version -s", - "test": "nyc --all -- tap --timeout=35 -J test/*.js", - "update-coc": "weallbehave -o . && git add CODE_OF_CONDUCT.md && git commit -m 'docs(coc): updated CODE_OF_CONDUCT.md'", - "update-contrib": "weallcontribute -o . && git add CONTRIBUTING.md && git commit -m 'docs(contributing): updated CONTRIBUTING.md'" - }, - "version": "3.0.0" -} diff --git a/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/warning.js b/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/warning.js deleted file mode 100644 index b8f13cf83195a..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/make-fetch-happen/warning.js +++ /dev/null @@ -1,24 +0,0 @@ -const url = require('url') - -module.exports = setWarning - -function setWarning (reqOrRes, code, message, replace) { - // Warning = "Warning" ":" 1#warning-value - // warning-value = warn-code SP warn-agent SP warn-text [SP warn-date] - // warn-code = 3DIGIT - // warn-agent = ( host [ ":" port ] ) | pseudonym - // ; the name or pseudonym of the server adding - // ; the Warning header, for use in debugging - // warn-text = quoted-string - // warn-date = <"> HTTP-date <"> - // (https://tools.ietf.org/html/rfc2616#section-14.46) - const host = url.parse(reqOrRes.url).host - const jsonMessage = JSON.stringify(message) - const jsonDate = JSON.stringify(new Date().toUTCString()) - const header = replace ? 'set' : 'append' - - reqOrRes.headers[header]( - 'Warning', - `${code} ${host} ${jsonMessage} ${jsonDate}` - ) -} diff --git a/node_modules/npm-registry-fetch/node_modules/pump/.travis.yml b/node_modules/npm-registry-fetch/node_modules/pump/.travis.yml deleted file mode 100644 index 17f94330e70bc..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/pump/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - "0.10" - -script: "npm test" diff --git a/node_modules/npm-registry-fetch/node_modules/pump/LICENSE b/node_modules/npm-registry-fetch/node_modules/pump/LICENSE deleted file mode 100644 index 757562ec59276..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/pump/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Mathias Buus - -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. \ No newline at end of file diff --git a/node_modules/npm-registry-fetch/node_modules/pump/README.md b/node_modules/npm-registry-fetch/node_modules/pump/README.md deleted file mode 100644 index 5029b27d6817e..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/pump/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# pump - -pump is a small node module that pipes streams together and destroys all of them if one of them closes. - -``` -npm install pump -``` - -[![build status](http://img.shields.io/travis/mafintosh/pump.svg?style=flat)](http://travis-ci.org/mafintosh/pump) - -## What problem does it solve? - -When using standard `source.pipe(dest)` source will _not_ be destroyed if dest emits close or an error. -You are also not able to provide a callback to tell when then pipe has finished. - -pump does these two things for you - -## Usage - -Simply pass the streams you want to pipe together to pump and add an optional callback - -``` js -var pump = require('pump') -var fs = require('fs') - -var source = fs.createReadStream('/dev/random') -var dest = fs.createWriteStream('/dev/null') - -pump(source, dest, function(err) { - console.log('pipe finished', err) -}) - -setTimeout(function() { - dest.destroy() // when dest is closed pump will destroy source -}, 1000) -``` - -You can use pump to pipe more than two streams together as well - -``` js -var transform = someTransformStream() - -pump(source, transform, anotherTransform, dest, function(err) { - console.log('pipe finished', err) -}) -``` - -If `source`, `transform`, `anotherTransform` or `dest` closes all of them will be destroyed. - -## License - -MIT - -## Related - -`pump` is part of the [mississippi stream utility collection](https://github.com/maxogden/mississippi) which includes more useful stream modules similar to this one. diff --git a/node_modules/npm-registry-fetch/node_modules/pump/index.js b/node_modules/npm-registry-fetch/node_modules/pump/index.js deleted file mode 100644 index d9ca0335cbc1a..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/pump/index.js +++ /dev/null @@ -1,82 +0,0 @@ -var once = require('once') -var eos = require('end-of-stream') -var fs = require('fs') // we only need fs to get the ReadStream and WriteStream prototypes - -var noop = function () {} -var ancient = /^v?\.0/.test(process.version) - -var isFn = function (fn) { - return typeof fn === 'function' -} - -var isFS = function (stream) { - if (!ancient) return false // newer node version do not need to care about fs is a special way - if (!fs) return false // browser - return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close) -} - -var isRequest = function (stream) { - return stream.setHeader && isFn(stream.abort) -} - -var destroyer = function (stream, reading, writing, callback) { - callback = once(callback) - - var closed = false - stream.on('close', function () { - closed = true - }) - - eos(stream, {readable: reading, writable: writing}, function (err) { - if (err) return callback(err) - closed = true - callback() - }) - - var destroyed = false - return function (err) { - if (closed) return - if (destroyed) return - destroyed = true - - if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks - if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want - - if (isFn(stream.destroy)) return stream.destroy() - - callback(err || new Error('stream was destroyed')) - } -} - -var call = function (fn) { - fn() -} - -var pipe = function (from, to) { - return from.pipe(to) -} - -var pump = function () { - var streams = Array.prototype.slice.call(arguments) - var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop - - if (Array.isArray(streams[0])) streams = streams[0] - if (streams.length < 2) throw new Error('pump requires two streams per minimum') - - var error - var destroys = streams.map(function (stream, i) { - var reading = i < streams.length - 1 - var writing = i > 0 - return destroyer(stream, reading, writing, function (err) { - if (!error) error = err - if (err) destroys.forEach(call) - if (reading) return - destroys.forEach(call) - callback(error) - }) - }) - - streams.reduce(pipe) -} - -module.exports = pump diff --git a/node_modules/npm-registry-fetch/node_modules/pump/package.json b/node_modules/npm-registry-fetch/node_modules/pump/package.json deleted file mode 100644 index 4a3008e4880b0..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/pump/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "_from": "pump@^2.0.1", - "_id": "pump@2.0.1", - "_inBundle": false, - "_integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "_location": "/npm-registry-fetch/pump", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "pump@^2.0.1", - "name": "pump", - "escapedName": "pump", - "rawSpec": "^2.0.1", - "saveSpec": null, - "fetchSpec": "^2.0.1" - }, - "_requiredBy": [ - "/npm-registry-fetch/cacache/mississippi" - ], - "_resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "_shasum": "12399add6e4cf7526d973cbc8b5ce2e2908b3909", - "_spec": "pump@^2.0.1", - "_where": "/Users/rebecca/code/npm/node_modules/npm-registry-fetch/node_modules/cacache/node_modules/mississippi", - "author": { - "name": "Mathias Buus Madsen", - "email": "mathiasbuus@gmail.com" - }, - "browser": { - "fs": false - }, - "bugs": { - "url": "https://github.com/mafintosh/pump/issues" - }, - "bundleDependencies": false, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - }, - "deprecated": false, - "description": "pipe streams together and close all of them if one of them closes", - "homepage": "https://github.com/mafintosh/pump#readme", - "keywords": [ - "streams", - "pipe", - "destroy", - "callback" - ], - "license": "MIT", - "name": "pump", - "repository": { - "type": "git", - "url": "git://github.com/mafintosh/pump.git" - }, - "scripts": { - "test": "node test-browser.js && node test-node.js" - }, - "version": "2.0.1" -} diff --git a/node_modules/npm-registry-fetch/node_modules/pump/test-browser.js b/node_modules/npm-registry-fetch/node_modules/pump/test-browser.js deleted file mode 100644 index 75ea4a292e209..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/pump/test-browser.js +++ /dev/null @@ -1,62 +0,0 @@ -var stream = require('stream') -var pump = require('./index') - -var rs = new stream.Readable() -var ws = new stream.Writable() - -rs._read = function (size) { - this.push(Buffer(size).fill('abc')) -} - -ws._write = function (chunk, encoding, cb) { - setTimeout(function () { - cb() - }, 100) -} - -var toHex = function () { - var reverse = new (require('stream').Transform)() - - reverse._transform = function (chunk, enc, callback) { - reverse.push(chunk.toString('hex')) - callback() - } - - return reverse -} - -var wsClosed = false -var rsClosed = false -var callbackCalled = false - -var check = function () { - if (wsClosed && rsClosed && callbackCalled) { - console.log('test-browser.js passes') - clearTimeout(timeout) - } -} - -ws.on('finish', function () { - wsClosed = true - check() -}) - -rs.on('end', function () { - rsClosed = true - check() -}) - -pump(rs, toHex(), toHex(), toHex(), ws, function () { - callbackCalled = true - check() -}) - -setTimeout(function () { - rs.push(null) - rs.emit('close') -}, 1000) - -var timeout = setTimeout(function () { - check() - throw new Error('timeout') -}, 5000) diff --git a/node_modules/npm-registry-fetch/node_modules/pump/test-node.js b/node_modules/npm-registry-fetch/node_modules/pump/test-node.js deleted file mode 100644 index 034a65414d1b3..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/pump/test-node.js +++ /dev/null @@ -1,53 +0,0 @@ -var pump = require('./index') - -var rs = require('fs').createReadStream('/dev/random') -var ws = require('fs').createWriteStream('/dev/null') - -var toHex = function () { - var reverse = new (require('stream').Transform)() - - reverse._transform = function (chunk, enc, callback) { - reverse.push(chunk.toString('hex')) - callback() - } - - return reverse -} - -var wsClosed = false -var rsClosed = false -var callbackCalled = false - -var check = function () { - if (wsClosed && rsClosed && callbackCalled) { - console.log('test-node.js passes') - clearTimeout(timeout) - } -} - -ws.on('close', function () { - wsClosed = true - check() -}) - -rs.on('close', function () { - rsClosed = true - check() -}) - -var res = pump(rs, toHex(), toHex(), toHex(), ws, function () { - callbackCalled = true - check() -}) - -if (res) { - process.exit(1) -} - -setTimeout(function () { - rs.destroy() -}, 1000) - -var timeout = setTimeout(function () { - throw new Error('timeout') -}, 5000) diff --git a/node_modules/npm-registry-fetch/node_modules/smart-buffer/.npmignore b/node_modules/npm-registry-fetch/node_modules/smart-buffer/.npmignore deleted file mode 100644 index 6bcbf6f77d970..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/smart-buffer/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -.git* -.idea* -node_modules/ -npm-debug.log -coverage \ No newline at end of file diff --git a/node_modules/npm-registry-fetch/node_modules/smart-buffer/.travis.yml b/node_modules/npm-registry-fetch/node_modules/smart-buffer/.travis.yml deleted file mode 100644 index 9d67de58788b9..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/smart-buffer/.travis.yml +++ /dev/null @@ -1,11 +0,0 @@ -language: node_js -node_js: - - 0.10 - - 0.12 - - 4 - - 6 - - stable - -script: "npm run coverage" -# Send coverage data to Coveralls -after_script: "cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js" \ No newline at end of file diff --git a/node_modules/npm-registry-fetch/node_modules/smart-buffer/LICENSE b/node_modules/npm-registry-fetch/node_modules/smart-buffer/LICENSE deleted file mode 100644 index b2442a9e71326..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/smart-buffer/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Josh Glazebrook - -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/node_modules/npm-registry-fetch/node_modules/smart-buffer/README.md b/node_modules/npm-registry-fetch/node_modules/smart-buffer/README.md deleted file mode 100644 index cf49d72bfc65e..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/smart-buffer/README.md +++ /dev/null @@ -1,307 +0,0 @@ -smart-buffer [![Build Status](https://travis-ci.org/JoshGlazebrook/smart-buffer.svg?branch=master)](https://travis-ci.org/JoshGlazebrook/smart-buffer) [![Coverage Status](https://coveralls.io/repos/github/JoshGlazebrook/smart-buffer/badge.svg?branch=master)](https://coveralls.io/github/JoshGlazebrook/smart-buffer?branch=master) -============= - -smart-buffer is a light Buffer wrapper that takes away the need to keep track of what position to read and write data to and from the underlying Buffer. It also adds null terminating string operations and **grows** as you add more data. - - -### What it's useful for: - -I created smart-buffer because I wanted to simplify the process of using Buffer for building and reading network packets to send over a socket. Rather than having to keep track of which position I need to write a UInt16 to after adding a string of variable length, I simply don't have to. - -Key Features: -* Proxies all of the Buffer write and read functions. -* Keeps track of read and write positions for you. -* Grows the internal Buffer as you add data to it. -* Useful string operations. (Null terminating strings) -* Allows for inserting values at specific points in the internal Buffer. - -#### Note: -smart-buffer can be used for writing to an underlying buffer as well as reading from it. It however does not function correctly if you're mixing both read and write operations with each other. - -## Installing: - -`npm install smart-buffer` - -## Using smart-buffer - -### Example - -Say you were building a packet that had to conform to the following protocol: - -`[PacketType:2][PacketLength:2][Data:XX]` - -To build this packet using the vanilla Buffer class, you would have to count up the length of the data payload beforehand. You would also need to keep track of the current "cursor" position in your Buffer so you write everything in the right places. With smart-buffer you don't have to do either of those things. - -```javascript -function createLoginPacket(username, password, age, country) { - var packet = new SmartBuffer(); - packet.writeUInt16LE(0x0060); // Login Packet Type/ID - packet.writeStringNT(username); - packet.writeStringNT(password); - packet.writeUInt8(age); - packet.writeStringNT(country); - packet.writeUInt16LE(packet.length - 2, 2); - - return packet.toBuffer(); -} -``` -With the above function, you now can do this: -```javascript -var login = createLoginPacket("Josh", "secret123", 22, "United States"); - -// -``` -Notice that the `[PacketLength:2]` part of the packet was inserted after we had added everything else, and as shown in the Buffer dump above, is in the correct location along with everything else. - -Reading back the packet we created above is just as easy: -```javascript - -var reader = new SmartBuffer(login); - -var logininfo = { - packetType: reader.readUInt16LE(), - packetLength: reader.readUInt16LE(), - username: reader.readStringNT(), - password: reader.readStringNT(), - age: reader.readUInt8(), - country: reader.readStringNT() -}; - -/* -{ - packetType: 96, (0x0060) - packetLength: 30, - username: 'Josh', - password: 'secret123', - age: 22, - country: 'United States' -}; -*/ -``` - -# Api Reference: - -### Constructing a smart-buffer - -smart-buffer has a few different constructor signatures you can use. By default, utf8 encoding is used, and the internal Buffer length will be 4096. When reading from a Buffer, smart-buffer does NOT make a copy of the Buffer. It reads from the Buffer it was given. - -```javascript -var SmartBuffer = require('smart-buffer'); - -// Reading from an existing Buffer: -var reader = new SmartBuffer(buffer); -var reader = new SmartBuffer(buffer, 'ascii'); - -// Writing to a new Buffer: -var writer = new SmartBuffer(); // Defaults to utf8, 4096 length internal Buffer. -var writer = new SmartBuffer(1024); // Defaults to utf8, 1024 length internal Buffer. -var writer = new SmartBuffer('ascii'); // Sets to ascii encoding, 4096 length internal buffer. -var writer = new SmartBuffer(1024, 'ascii'); // Sets to ascii encoding, 1024 length internal buffer. -``` - -## Reading Data - -smart-buffer supports all of the common read functions you will find in the vanilla Buffer class. The only difference is, you do not need to specify which location to start reading from. This is possible because as you read data out of a smart-buffer, it automatically progresses an internal read offset/position to know where to pick up from on the next read. - -## Reading Numeric Values - -When numeric values, you simply need to call the function you want, and the data is returned. - -Supported Operations: -* readInt8 -* readInt16BE -* readInt16LE -* readInt32BE -* readInt32LE -* readUInt8 -* readUInt16BE -* readUInt16LE -* readUInt32BE -* readUInt32LE -* readFloatBE -* readFloatLE -* readDoubleBE -* readDoubleLE - -```javascript -var reader = new SmartBuffer(somebuffer); -var num = reader.readInt8(); -``` - -## Reading String Values - -When reading String values, you can either choose to read a null terminated string, or a string of a specified length. - -### SmartBuffer.readStringNT( [encoding] ) -> `String` **String encoding to use** - Defaults to the encoding set in the constructor, or utf8. - -returns `String` - -> Note: When readStringNT is called and there is no null character found, smart-buffer will read to the end of the internal Buffer. - -### SmartBuffer.readString( [length], [encoding] ) -### SmartBuffer.readString( [length] ) -### SmartBuffer.readString( [encoding] ) -> `Number` **Length of the string to read** - -> `String` **String encoding to use** - Defaults to the encoding set in the constructor, or utf8. - -returns `String` - -> Note: When readString is called without a specified length, smart-buffer will read to the end of the internal Buffer. - - - -## Reading Buffer Values - -### SmartBuffer.readBuffer( length ) -> `Number` **Length of data to read into a Buffer** - -returns `Buffer` - -> Note: This function uses `slice` to retrieve the Buffer. - - -### SmartBuffer.readBufferNT() - -returns `Buffer` - -> Note: This reads the next sequence of bytes in the buffer until a null (0x00) value is found. (Null terminated buffer) -> Note: This function uses `slice` to retrieve the Buffer. - - -## Writing Data - -smart-buffer supports all of the common write functions you will find in the vanilla Buffer class. The only difference is, you do not need to specify which location to write to in your Buffer by default. You do however have the option of **inserting** a piece of data into your smart-buffer at a given location. - - -## Writing Numeric Values - - -For numeric values, you simply need to call the function you want, and the data is written at the end of the internal Buffer's current write position. You can specify a offset/position to **insert** the given value at, but keep in mind this does not override data at the given position. This feature also does not work properly when inserting a value beyond the current internal length of the smart-buffer (length being the .length property of the smart-buffer instance you're writing to) - -Supported Operations: -* writeInt8 -* writeInt16BE -* writeInt16LE -* writeInt32BE -* writeInt32LE -* writeUInt8 -* writeUInt16BE -* writeUInt16LE -* writeUInt32BE -* writeUInt32LE -* writeFloatBE -* writeFloatLE -* writeDoubleBE -* writeDoubleLE - -The following signature is the same for all the above functions: - -### SmartBuffer.writeInt8( value, [offset] ) -> `Number` **A valid Int8 number** - -> `Number` **The position to insert this value at** - -returns this - -> Note: All write operations return `this` to allow for chaining. - -## Writing String Values - -When reading String values, you can either choose to write a null terminated string, or a non null terminated string. - -### SmartBuffer.writeStringNT( value, [offset], [encoding] ) -### SmartBuffer.writeStringNT( value, [offset] ) -### SmartBuffer.writeStringNT( value, [encoding] ) -> `String` **String value to write** - -> `Number` **The position to insert this String at** - -> `String` **The String encoding to use.** - Defaults to the encoding set in the constructor, or utf8. - -returns this - -### SmartBuffer.writeString( value, [offset], [encoding] ) -### SmartBuffer.writeString( value, [offset] ) -### SmartBuffer.writeString( value, [encoding] ) -> `String` **String value to write** - -> `Number` **The position to insert this String at** - -> `String` **The String encoding to use** - Defaults to the encoding set in the constructor, or utf8. - -returns this - - -## Writing Buffer Values - -### SmartBuffer.writeBuffer( value, [offset] ) -> `Buffer` **Buffer value to write** - -> `Number` **The position to insert this Buffer's content at** - -returns this - -### SmartBuffer.writeBufferNT( value, [offset] ) -> `Buffer` **Buffer value to write** - -> `Number` **The position to insert this Buffer's content at** - -returns this - - -## Utility Functions - -### SmartBuffer.clear() -Resets the SmartBuffer to its default state where it can be reused for reading or writing. - -### SmartBuffer.remaining() - -returns `Number` The amount of data left to read based on the current read Position. - -### SmartBuffer.skip( value ) -> `Number` **The amount of bytes to skip ahead** - -Skips the read position ahead by the given value. - -returns this - -### SmartBuffer.rewind( value ) -> `Number` **The amount of bytes to reward backwards** - -Rewinds the read position backwards by the given value. - -returns this - -### SmartBuffer.skipTo( position ) -> `Number` **The point to skip the read position to** - -Moves the read position to the given point. -returns this - -### SmartBuffer.toBuffer() - -returns `Buffer` A Buffer containing the contents of the internal Buffer. - -> Note: This uses the slice function. - -### SmartBuffer.toString( [encoding] ) -> `String` **The String encoding to use** - Defaults to the encoding set in the constructor, or utf8. - -returns `String` The internal Buffer in String representation. - -### SmartBuffer.destroy() -Attempts to destroy the smart-buffer. - -returns this - -## Properties - -### SmartBuffer.length - -returns `Number` **The length of the data that is being tracked in the internal Buffer** - Does NOT return the absolute length of the internal Buffer being written to. - -## License - -This work is licensed under the [MIT license](http://en.wikipedia.org/wiki/MIT_License). \ No newline at end of file diff --git a/node_modules/npm-registry-fetch/node_modules/smart-buffer/build/smartbuffer.js b/node_modules/npm-registry-fetch/node_modules/smart-buffer/build/smartbuffer.js deleted file mode 100644 index fefdfe63c0dd3..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/smart-buffer/build/smartbuffer.js +++ /dev/null @@ -1,726 +0,0 @@ -"use strict"; -// The default Buffer size if one is not provided. -const DEFAULT_SMARTBUFFER_SIZE = 4096; -// The default string encoding to use for reading/writing strings. -const DEFAULT_SMARTBUFFER_ENCODING = 'utf8'; -class SmartBuffer { - /** - * Creates a new SmartBuffer instance. - * - * @param arg1 { Number | BufferEncoding | Buffer | SmartBufferOptions } - * @param arg2 { BufferEncoding } - */ - constructor(arg1, arg2) { - this.length = 0; - this.encoding = DEFAULT_SMARTBUFFER_ENCODING; - this.writeOffset = 0; - this.readOffset = 0; - // Initial buffer size provided - if (typeof arg1 === 'number') { - if (Number.isFinite(arg1) && Number.isInteger(arg1) && arg1 > 0) { - this.buff = Buffer.allocUnsafe(arg1); - } - else { - throw new Error('Invalid size provided. Size must be a valid integer greater than zero.'); - } - } - else if (typeof arg1 === 'string') { - if (Buffer.isEncoding(arg1)) { - this.buff = Buffer.allocUnsafe(DEFAULT_SMARTBUFFER_SIZE); - this.encoding = arg1; - } - else { - throw new Error('Invalid encoding provided. Please specify a valid encoding the internal Node.js Buffer supports.'); - } - } - else if (arg1 instanceof Buffer) { - this.buff = arg1; - this.length = arg1.length; - } - else if (SmartBuffer.isSmartBufferOptions(arg1)) { - // Checks for encoding - if (arg1.encoding) { - if (Buffer.isEncoding(arg1.encoding)) { - this.encoding = arg1.encoding; - } - else { - throw new Error('Invalid encoding provided. Please specify a valid encoding the internal Node.js Buffer supports.'); - } - } - // Checks for initial size length - if (arg1.size) { - if (Number.isFinite(arg1.size) && Number.isInteger(arg1.size) && arg1.size > 0) { - this.buff = Buffer.allocUnsafe(arg1.size); - } - else { - throw new Error('Invalid size provided. Size must be a valid integer greater than zero.'); - } - } - else if (arg1.buff) { - if (arg1.buff instanceof Buffer) { - this.buff = arg1.buff; - this.length = arg1.buff.length; - } - else { - throw new Error('Invalid buffer provided in SmartBufferOptions.'); - } - } - else { - this.buff = Buffer.allocUnsafe(DEFAULT_SMARTBUFFER_SIZE); - } - } - else if (typeof arg1 === 'object') { - throw new Error('Invalid object supplied to SmartBuffer constructor.'); - } - else { - this.buff = Buffer.allocUnsafe(DEFAULT_SMARTBUFFER_SIZE); - } - // Check for encoding (Buffer, Encoding) constructor. - if (typeof arg2 === 'string') { - if (Buffer.isEncoding(arg2)) { - this.encoding = arg2; - } - else { - throw new Error('Invalid encoding provided. Please specify a valid encoding the internal Node.js Buffer supports.'); - } - } - } - /** - * Creates a new SmartBuffer instance with the provided internal Buffer size and optional encoding. - * - * @param size { Number } The size of the internal Buffer. - * @param encoding { String } The BufferEncoding to use for strings. - * - * @return { SmartBuffer } - */ - static fromSize(size, encoding) { - return new this({ - size: size, - encoding: encoding - }); - } - /** - * Creates a new SmartBuffer instance with the provided Buffer and optional encoding. - * - * @param buffer { Buffer } The Buffer to use as the internal Buffer value. - * @param encoding { String } The BufferEncoding to use for strings. - * - * @return { SmartBuffer } - */ - static fromBuffer(buff, encoding) { - return new this({ - buff: buff, - encoding: encoding - }); - } - /** - * Creates a new SmartBuffer instance with the provided SmartBufferOptions options. - * - * @param options { SmartBufferOptions } The options to use when creating the SmartBuffer instance. - */ - static fromOptions(options) { - return new this(options); - } - /** - * Ensures that the internal Buffer is large enough to write data. - * - * @param minLength { Number } The minimum length of the data that needs to be written. - * @param offset { Number } The offset of the data to be written. - */ - ensureWriteable(minLength, offset) { - const offsetVal = typeof offset === 'number' ? offset : 0; - // Ensure there is enough internal Buffer capacity. - this.ensureCapacity(this.length + minLength + offsetVal); - // If offset is provided, copy data into appropriate location in regards to the offset. - if (typeof offset === 'number') { - this.buff.copy(this.buff, offsetVal + minLength, offsetVal, this.buff.length); - } - // Adjust instance length. - this.length = Math.max(this.length + minLength, offsetVal + minLength); - } - /** - * Ensures that the internal Buffer is large enough to write at least the given amount of data. - * - * @param minLength { Number } The minimum length of the data needs to be written. - */ - ensureCapacity(minLength) { - const oldLength = this.buff.length; - if (minLength > oldLength) { - let data = this.buff; - let newLength = (oldLength * 3) / 2 + 1; - if (newLength < minLength) { - newLength = minLength; - } - this.buff = Buffer.allocUnsafe(newLength); - data.copy(this.buff, 0, 0, oldLength); - } - } - /** - * Reads a numeric number value using the provided function. - * - * @param func { Function(offset: number) => number } The function to read data on the internal Buffer with. - * @param byteSize { Number } The number of bytes read. - * - * @param { Number } - */ - readNumberValue(func, byteSize) { - // Call Buffer.readXXXX(); - const value = func.call(this.buff, this.readOffset); - // Adjust internal read offset - this.readOffset += byteSize; - return value; - } - /** - * Writes a numeric number value using the provided function. - * - * @param func { Function(offset: number, offset?) => number} The function to write data on the internal Buffer with. - * @param byteSize { Number } The number of bytes written. - * @param value { Number } The number value to write. - * @param offset { Number } the offset to write the number at. - * - */ - writeNumberValue(func, byteSize, value, offset) { - const offsetVal = typeof offset === 'number' ? offset : this.writeOffset; - // Ensure there is enough internal Buffer capacity. (raw offset is passed) - this.ensureWriteable(byteSize, offset); - // Call buffer.writeXXXX(); - func.call(this.buff, value, offsetVal); - // Adjusts internal write offset - this.writeOffset += byteSize; - } - // Signed integers - /** - * Reads an Int8 value from the current read position. - * - * @return { Number } - */ - readInt8() { - return this.readNumberValue(Buffer.prototype.readUInt8, 1); - } - /** - * Reads an Int16BE value from the current read position. - * - * @return { Number } - */ - readInt16BE() { - return this.readNumberValue(Buffer.prototype.readUInt16BE, 2); - } - /** - * Reads an Int16LE value from the current read position. - * - * @return { Number } - */ - readInt16LE() { - return this.readNumberValue(Buffer.prototype.readUInt16LE, 2); - } - /** - * Reads an Int32BE value from the current read position. - * - * @return { Number } - */ - readInt32BE() { - return this.readNumberValue(Buffer.prototype.readUInt32BE, 4); - } - /** - * Reads an Int32LE value from the current read position. - * - * @return { Number } - */ - readInt32LE() { - return this.readNumberValue(Buffer.prototype.readUInt32LE, 4); - } - /** - * Writes an Int8 value to the current write position (or at optional offset). - * - * @param value { Number } The value to write. - * @param offset { Number } The offset to write the value at. - * - * @return this - */ - writeInt8(value, offset) { - this.writeNumberValue(Buffer.prototype.writeInt8, 1, value, offset); - return this; - } - /** - * Writes an Int16BE value to the current write position (or at optional offset). - * - * @param value { Number } The value to write. - * @param offset { Number } The offset to write the value at. - * - * @return this - */ - writeInt16BE(value, offset) { - this.writeNumberValue(Buffer.prototype.writeInt16BE, 2, value, offset); - return this; - } - /** - * Writes an Int16LE value to the current write position (or at optional offset). - * - * @param value { Number } The value to write. - * @param offset { Number } The offset to write the value at. - * - * @return this - */ - writeInt16LE(value, offset) { - this.writeNumberValue(Buffer.prototype.writeInt16LE, 2, value, offset); - return this; - } - /** - * Writes an Int32BE value to the current write position (or at optional offset). - * - * @param value { Number } The value to write. - * @param offset { Number } The offset to write the value at. - * - * @return this - */ - writeInt32BE(value, offset) { - this.writeNumberValue(Buffer.prototype.writeInt32BE, 4, value, offset); - return this; - } - /** - * Writes an Int32LE value to the current write position (or at optional offset). - * - * @param value { Number } The value to write. - * @param offset { Number } The offset to write the value at. - * - * @return this - */ - writeInt32LE(value, offset) { - this.writeNumberValue(Buffer.prototype.writeInt32LE, 4, value, offset); - return this; - } - // Unsigned Integers - /** - * Reads an UInt8 value from the current read position. - * - * @return { Number } - */ - readUInt8() { - return this.readNumberValue(Buffer.prototype.readUInt8, 1); - } - /** - * Reads an UInt16BE value from the current read position. - * - * @return { Number } - */ - readUInt16BE() { - return this.readNumberValue(Buffer.prototype.readUInt16BE, 2); - } - /** - * Reads an UInt16LE value from the current read position. - * - * @return { Number } - */ - readUInt16LE() { - return this.readNumberValue(Buffer.prototype.readUInt16LE, 2); - } - /** - * Reads an UInt32BE value from the current read position. - * - * @return { Number } - */ - readUInt32BE() { - return this.readNumberValue(Buffer.prototype.readUInt32BE, 4); - } - /** - * Reads an UInt32LE value from the current read position. - * - * @return { Number } - */ - readUInt32LE() { - return this.readNumberValue(Buffer.prototype.readUInt32LE, 4); - } - /** - * Writes an UInt8 value to the current write position (or at optional offset). - * - * @param value { Number } The value to write. - * @param offset { Number } The offset to write the value at. - * - * @return this - */ - writeUInt8(value, offset) { - this.writeNumberValue(Buffer.prototype.writeUInt8, 1, value, offset); - return this; - } - /** - * Writes an UInt16BE value to the current write position (or at optional offset). - * - * @param value { Number } The value to write. - * @param offset { Number } The offset to write the value at. - * - * @return this - */ - writeUInt16BE(value, offset) { - this.writeNumberValue(Buffer.prototype.writeUInt16BE, 2, value, offset); - return this; - } - /** - * Writes an UInt16LE value to the current write position (or at optional offset). - * - * @param value { Number } The value to write. - * @param offset { Number } The offset to write the value at. - * - * @return this - */ - writeUInt16LE(value, offset) { - this.writeNumberValue(Buffer.prototype.writeUInt16LE, 2, value, offset); - return this; - } - /** - * Writes an UInt32BE value to the current write position (or at optional offset). - * - * @param value { Number } The value to write. - * @param offset { Number } The offset to write the value at. - * - * @return this - */ - writeUInt32BE(value, offset) { - this.writeNumberValue(Buffer.prototype.writeUInt32BE, 4, value, offset); - return this; - } - /** - * Writes an UInt32LE value to the current write position (or at optional offset). - * - * @param value { Number } The value to write. - * @param offset { Number } The offset to write the value at. - * - * @return this - */ - writeUInt32LE(value, offset) { - this.writeNumberValue(Buffer.prototype.writeUInt32LE, 4, value, offset); - return this; - } - // Floating Point - /** - * Reads an FloatBE value from the current read position. - * - * @return { Number } - */ - readFloatBE() { - return this.readNumberValue(Buffer.prototype.readFloatBE, 4); - } - /** - * Reads an FloatLE value from the current read position. - * - * @return { Number } - */ - readFloatLE() { - return this.readNumberValue(Buffer.prototype.readFloatLE, 4); - } - /** - * Writes a FloatBE value to the current write position (or at optional offset). - * - * @param value { Number } The value to write. - * @param offset { Number } The offset to write the value at. - * - * @return this - */ - writeFloatBE(value, offset) { - this.writeNumberValue(Buffer.prototype.writeFloatBE, 4, value, offset); - return this; - } - /** - * Writes a FloatLE value to the current write position (or at optional offset). - * - * @param value { Number } The value to write. - * @param offset { Number } The offset to write the value at. - * - * @return this - */ - writeFloatLE(value, offset) { - this.writeNumberValue(Buffer.prototype.writeFloatLE, 4, value, offset); - return this; - } - // Double Floating Point - /** - * Reads an DoublEBE value from the current read position. - * - * @return { Number } - */ - readDoubleBE() { - return this.readNumberValue(Buffer.prototype.readDoubleBE, 8); - } - /** - * Reads an DoubleLE value from the current read position. - * - * @return { Number } - */ - readDoubleLE() { - return this.readNumberValue(Buffer.prototype.readDoubleLE, 8); - } - /** - * Writes a DoubleBE value to the current write position (or at optional offset). - * - * @param value { Number } The value to write. - * @param offset { Number } The offset to write the value at. - * - * @return this - */ - writeDoubleBE(value, offset) { - this.writeNumberValue(Buffer.prototype.writeDoubleBE, 8, value, offset); - return this; - } - /** - * Writes a DoubleLE value to the current write position (or at optional offset). - * - * @param value { Number } The value to write. - * @param offset { Number } The offset to write the value at. - * - * @return this - */ - writeDoubleLE(value, offset) { - this.writeNumberValue(Buffer.prototype.writeDoubleLE, 8, value, offset); - return this; - } - // Strings - /** - * Reads a String from the current read position. - * - * @param length { Number } The number of bytes to read as a String. - * @param encoding { String } The BufferEncoding to use for the string (Defaults to instance level encoding). - * - * @return { String } - */ - readString(length, encoding) { - const lengthVal = Math.min(length, this.length - this.readOffset) || this.length - this.readOffset; - const value = this.buff.slice(this.readOffset, this.readOffset + lengthVal).toString(encoding || this.encoding); - this.readOffset += lengthVal; - return value; - } - /** - * Writes a String to the current write position. - * - * @param value { String } The String value to write. - * @param arg2 { Number | String } The offset to write the string to, or the BufferEncoding to use. - * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding). - */ - writeString(value, arg2, encoding) { - let offsetVal = this.writeOffset; - let encodingVal = this.encoding; - // Check for offset - if (typeof arg2 === 'number') { - offsetVal = arg2; - } - else if (typeof arg2 === 'string') { - if (Buffer.isEncoding(arg2)) { - encodingVal = arg2; - } - else { - throw new Error('Invalid encoding provided. Please specify a valid encoding the internal Node.js Buffer supports.'); - } - } - // Check for encoding (third param) - if (typeof encoding === 'string') { - if (Buffer.isEncoding(encoding)) { - encodingVal = encoding; - } - else { - throw new Error('Invalid encoding provided. Please specify a valid encoding the internal Node.js Buffer supports.'); - } - } - // Calculate bytelength of string. - const byteLength = Buffer.byteLength(value, encodingVal); - // Ensure there is enough internal Buffer capacity. - this.ensureWriteable(byteLength, offsetVal); - // Write value - this.buff.write(value, offsetVal, byteLength, encodingVal); - // Increment internal Buffer write offset; - this.writeOffset += byteLength; - return this; - } - /** - * Reads a null-terminated String from the current read position. - * - * @param encoding { String } The BufferEncoding to use for the string (Defaults to instance level encoding). - * - * @return { String } - */ - readStringNT(encoding) { - // Set null character position to the end SmartBuffer instance. - let nullPos = this.length; - // Find next null character (if one is not found, default from above is used) - for (let i = this.readOffset; i < this.length; i++) { - if (this.buff[i] === 0x00) { - nullPos = i; - break; - } - } - // Read string value - const value = this.buff.slice(this.readOffset, nullPos); - // Increment internal Buffer read offset - this.readOffset = nullPos + 1; - return value.toString(encoding || this.encoding); - } - /** - * Writes a null-terminated String to the current write position. - * - * @param value { String } The String value to write. - * @param arg2 { Number | String } The offset to write the string to, or the BufferEncoding to use. - * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding). - */ - writeStringNT(value, offset, encoding) { - // Write Values - this.writeString(value, offset, encoding); - this.writeUInt8(0x00, (typeof offset === 'number' ? offset + value.length : this.writeOffset)); - } - // Buffers - /** - * Reads a Buffer from the internal read position. - * - * @param length { Number } The length of data to read as a Buffer. - * - * @return { Buffer } - */ - readBuffer(length) { - const lengthVal = typeof length === 'number' ? length : this.length; - const endPoint = Math.min(this.length, this.readOffset + lengthVal); - // Read buffer value - const value = this.buff.slice(this.readOffset, endPoint); - // Increment internal Buffer read offset - this.readOffset = endPoint; - return value; - } - /** - * Writes a Buffer to the current write position. - * - * @param value { Buffer } The Buffer to write. - * @param offset { Number } The offset to write the Buffer to. - */ - writeBuffer(value, offset) { - const offsetVal = typeof offset === 'number' ? offset : this.writeOffset; - // Ensure there is enough internal Buffer capacity. - this.ensureWriteable(value.length, offsetVal); - // Write buffer value - value.copy(this.buff, offsetVal); - // Increment internal Buffer write offset - this.writeOffset += value.length; - return this; - } - /** - * Reads a null-terminated Buffer from the current read poisiton. - * - * @return { Buffer } - */ - readBufferNT() { - // Set null character position to the end SmartBuffer instance. - let nullPos = this.length; - // Find next null character (if one is not found, default from above is used) - for (let i = this.readOffset; i < this.length; i++) { - if (this.buff[i] === 0x00) { - nullPos = i; - break; - } - } - // Read value - const value = this.buff.slice(this.readOffset, nullPos); - // Increment internal Buffer read offset - this.readOffset = nullPos + 1; - return value; - } - /** - * Writes a null-terminated Buffer to the current write position. - * - * @param value { Buffer } The Buffer to write. - * @param offset { Number } The offset to write the Buffer to. - */ - writeBufferNT(value, offset) { - // Write Values - this.writeBuffer(value, offset); - this.writeUInt8(0, (typeof offset === 'number' ? offset + value.length : this.writeOffset)); - return this; - } - /** - * Clears the SmartBuffer instance to its original empty state. - */ - clear() { - this.writeOffset = 0; - this.readOffset = 0; - this.length = 0; - } - /** - * Gets the remaining data left to be read from the SmartBuffer instance. - * - * @return { Number } - */ - remaining() { - return this.length - this.readOffset; - } - /** - * Moves the read offset forward. - * - * @param amount { Number } The amount to move the read offset forward by. - */ - skip(amount) { - if (this.readOffset + amount > this.length) { - throw new Error('Target position is beyond the bounds of the SmartBuffer size.'); - } - this.readOffset += amount; - } - /** - * Moves the read offset backwards. - * - * @param amount { Number } The amount to move the read offset backwards by. - */ - rewind(amount) { - if (this.readOffset - amount < 0) { - throw new Error('Target position is beyond the bounds of the SmartBuffer size.'); - } - this.readOffset -= amount; - } - /** - * Moves the read offset to a specific position. - * - * @param position { Number } The position to move the read offset to. - */ - skipTo(position) { - this.moveTo(position); - } - /** - * Moves the read offset to a specific position. - * - * @param position { Number } The position to move the read offset to. - */ - moveTo(position) { - if (position > this.length) { - throw new Error('Target position is beyond the bounds of the SmartBuffer size.'); - } - this.readOffset = position; - } - /** - * Gets the value of the internal managed Buffer - * - * @param { Buffer } - */ - toBuffer() { - return this.buff.slice(0, this.length); - } - /** - * Gets the String value of the internal managed Buffer - * - * @param encoding { String } The BufferEncoding to display the Buffer as (defaults to instance level encoding). - */ - toString(encoding) { - const encodingVal = typeof encoding === 'string' ? encoding : this.encoding; - if (Buffer.isEncoding(encodingVal)) { - return this.buff.toString(encodingVal, 0, this.length); - } - else { - throw new Error('Invalid encoding provided. Please specify a valid encoding the internal Node.js Buffer supports.'); - } - } - /** - * Destroys the SmartBuffer instance. - */ - destroy() { - this.clear(); - } - /** - * Type checking function that determines if an object is a SmartBufferOptions object. - */ - static isSmartBufferOptions(options) { - const castOptions = options; - return castOptions && (castOptions.encoding !== undefined || castOptions.size !== undefined || castOptions.buff !== undefined); - } -} -module.exports = SmartBuffer; -//# sourceMappingURL=smartbuffer.js.map \ No newline at end of file diff --git a/node_modules/npm-registry-fetch/node_modules/smart-buffer/build/smartbuffer.js.map b/node_modules/npm-registry-fetch/node_modules/smart-buffer/build/smartbuffer.js.map deleted file mode 100644 index 60af067a2c1c7..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/smart-buffer/build/smartbuffer.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"smartbuffer.js","sourceRoot":"","sources":["../src/smartbuffer.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/npm-registry-fetch/node_modules/smart-buffer/lib/smart-buffer.js b/node_modules/npm-registry-fetch/node_modules/smart-buffer/lib/smart-buffer.js deleted file mode 100644 index ea69cfc09ab34..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/smart-buffer/lib/smart-buffer.js +++ /dev/null @@ -1,371 +0,0 @@ -var SmartBuffer = (function () { - - /** - * Constructor for SmartBuffer. - * @param arg1 {Buffer || Number || String} Buffer to read from, or expected size to write to, or encoding to use. - * @param arg2 {String} Encoding to use for writing and reading strings. Defaults to utf8. If encoding is given in arg1, this is ignored. - * @constructor - * - * There are a few ways to construct a SmartBuffer: - * - * SmartBuffer() - Defaults to utf8, 4096 pre-set internal Buffer length. - * SmartBuffer(size) - Defaults to utf8, sets internal Buffer length to the size given. - * SmartBuffer(encoding) - Sets the given encoding, defaults to 4096 pre-set internal Buffer length. - * SmartBuffer(Buffer) - Defaults to utf8, sets the internal Buffer to the given buffer (same memory). - * SmartBuffer(Buffer, encoding) - Sets the given encoding, sets the internal Buffer to the given buffer (same memory). - * - */ - function SmartBuffer(arg1, arg2) { - var type; - switch (type = typeof arg1) { - case 'number': - if (isFinite(arg1) && arg1 > 0) { - this.buff = new Buffer(Math.ceil(arg1)); - this.length = 0; - } else { - throw new Error('When specifying a size, it must be a valid number above zero.'); - } - break; - - case 'string': - if (Buffer.isEncoding(arg1)) { - this.buff = new Buffer(4096); - this.length = 0; - this.encoding = arg1; - } else { - throw new Error('Invalid Encoding'); - } - break; - - case 'object': - if (Buffer.isBuffer(arg1)) { - this.buff = arg1; - this.length = arg1.length; - } else { - throw new TypeError('First argument must be a Buffer, Number representing the size, or a String representing the encoding.'); - } - break; - - default: - this.buff = new Buffer(4096); - this.length = 0; - break; - } - - if (typeof this.encoding === 'undefined') { - if (typeof arg2 === 'string') { - if (Buffer.isEncoding(arg2)) { - this.encoding = arg2; - } else { - throw new Error('Invalid Encoding'); - } - } - } - - this._readOffset = 0; - this._writeOffset = 0; - } - - - SmartBuffer.prototype._ensureWritable = function (len, offset) { - this._ensureCapacity(this.length + len + (typeof offset === 'number' ? offset : 0)); - - if (typeof offset === 'number') { - this.buff.copy(this.buff, offset + len, offset, this.buff.length); - } - this.length = Math.max(this.length + len, (typeof offset === 'number' ? offset : 0) + len); - }; - - SmartBuffer.prototype._ensureCapacity = function (minlen) { - var oldlen = this.buff.length; - - if (minlen > oldlen) { - var data = this.buff; - var newlen = (oldlen * 3) / 2 + 1; - if (newlen < minlen) - newlen = minlen; - this.buff = new Buffer(newlen); - data.copy(this.buff, 0, 0, oldlen); - } - }; - - - var makeReader = function (func, size) { - return function () { - var ret = func.call(this.buff, this._readOffset); - this._readOffset += size; - return ret; - } - }; - - var makeWriter = function (func, size) { - return function (value, offset) { - this._ensureWritable(size, offset); - func.call(this.buff, value, typeof offset === 'number' ? offset : this._writeOffset); - this._writeOffset += size; - return this; - } - }; - - - /* - Read Operations - */ - - SmartBuffer.prototype.readInt8 = makeReader(Buffer.prototype.readInt8, 1); - SmartBuffer.prototype.readInt16BE = makeReader(Buffer.prototype.readInt16BE, 2); - SmartBuffer.prototype.readInt16LE = makeReader(Buffer.prototype.readInt16LE, 2); - SmartBuffer.prototype.readInt32BE = makeReader(Buffer.prototype.readInt32BE, 4); - SmartBuffer.prototype.readInt32LE = makeReader(Buffer.prototype.readInt32LE, 4); - - SmartBuffer.prototype.readUInt8 = makeReader(Buffer.prototype.readUInt8, 1); - SmartBuffer.prototype.readUInt16BE = makeReader(Buffer.prototype.readUInt16BE, 2); - SmartBuffer.prototype.readUInt16LE = makeReader(Buffer.prototype.readUInt16LE, 2); - SmartBuffer.prototype.readUInt32BE = makeReader(Buffer.prototype.readUInt32BE, 4); - SmartBuffer.prototype.readUInt32LE = makeReader(Buffer.prototype.readUInt32LE, 4); - - SmartBuffer.prototype.readFloatBE = makeReader(Buffer.prototype.readFloatBE, 4); - SmartBuffer.prototype.readFloatLE = makeReader(Buffer.prototype.readFloatLE, 4); - - SmartBuffer.prototype.readDoubleBE = makeReader(Buffer.prototype.readDoubleBE, 8); - SmartBuffer.prototype.readDoubleLE = makeReader(Buffer.prototype.readDoubleLE, 8); - - - /** - * Reads a string of the given length. - * @param length {Number} The length of the string to read. (Defaults to the length of the remaining data) - * @param encoding {String} The encoding to use. (Defaults to encoding set in constructor, or utf8) - * @returns {string} The string. - */ - SmartBuffer.prototype.readString = function (length, encoding) { - var len = Math.min(length, this.length - this._readOffset) || (this.length - this._readOffset); - var ret = this.buff.slice(this._readOffset, this._readOffset + len).toString(encoding || this.encoding); - this._readOffset += len; - return ret; - }; - - /** - * Reads a null terminated string from the underlying buffer. - * @param encoding {String} Encoding to use. Defaults to encoding set in constructor, or utf8. - * @returns {string} - */ - SmartBuffer.prototype.readStringNT = function (encoding) { - var nullpos = this.length; - for (var i = this._readOffset; i < this.length; i++) { - if (this.buff[i] == 0x00) { - nullpos = i; - break; - } - } - - var result = this.buff.slice(this._readOffset, nullpos); - this._readOffset = nullpos + 1; - - return result.toString(encoding || this.encoding); - }; - - - /** - * Reads a specified number of bytes. - * @param len {Number} Numbers of bytes to read. (Defaults to the remaining data length) - * @returns {Buffer} Buffer containing the read bytes. - */ - SmartBuffer.prototype.readBuffer = function (len) { - var endpoint = Math.min(this.length, this._readOffset + (typeof len === 'number' ? len : this.length)); - var ret = this.buff.slice(this._readOffset, endpoint); - this._readOffset = endpoint; - return ret; - }; - - /** - * Reads a null terminated sequence of bytes from the underlying buffer. - * @returns {Buffer} Buffer containing the read bytes. - */ - SmartBuffer.prototype.readBufferNT = function () { - var nullpos = this.length; - for (var i = this._readOffset; i < this.length; i++) { - if (this.buff[i] == 0x00) { - nullpos = i; - break; - } - } - - var ret = this.buff.slice(this._readOffset, nullpos); - this._readOffset = nullpos + 1; - - return ret; - }; - - - /* - Write Operations - */ - - - SmartBuffer.prototype.writeInt8 = makeWriter(Buffer.prototype.writeInt8, 1); - SmartBuffer.prototype.writeInt16BE = makeWriter(Buffer.prototype.writeInt16BE, 2); - SmartBuffer.prototype.writeInt16LE = makeWriter(Buffer.prototype.writeInt16LE, 2); - SmartBuffer.prototype.writeInt32BE = makeWriter(Buffer.prototype.writeInt32BE, 4); - SmartBuffer.prototype.writeInt32LE = makeWriter(Buffer.prototype.writeInt32LE, 4); - - SmartBuffer.prototype.writeUInt8 = makeWriter(Buffer.prototype.writeUInt8, 1); - SmartBuffer.prototype.writeUInt16BE = makeWriter(Buffer.prototype.writeUInt16BE, 2); - SmartBuffer.prototype.writeUInt16LE = makeWriter(Buffer.prototype.writeUInt16LE, 2); - SmartBuffer.prototype.writeUInt32BE = makeWriter(Buffer.prototype.writeUInt32BE, 4); - SmartBuffer.prototype.writeUInt32LE = makeWriter(Buffer.prototype.writeUInt32LE, 4); - - SmartBuffer.prototype.writeFloatBE = makeWriter(Buffer.prototype.writeFloatBE, 4); - SmartBuffer.prototype.writeFloatLE = makeWriter(Buffer.prototype.writeFloatLE, 4); - - SmartBuffer.prototype.writeDoubleBE = makeWriter(Buffer.prototype.writeDoubleBE, 8); - SmartBuffer.prototype.writeDoubleLE = makeWriter(Buffer.prototype.writeDoubleLE, 8); - - - /** - * Writes a string to the underlying buffer. - * @param value {String} The string to write. - * @param offset {Number} The offset to write the string to. (Encoding can also be set here in place of offset) - * @param encoding {String} The encoding to use. (Defaults to encoding set in constructor, or to utf8) - * @returns {*} - */ - SmartBuffer.prototype.writeString = function (value, offset, encoding) { - var len, _offset, type = typeof offset; - - if (type === 'number') { - _offset = offset; - } else if (type === 'string') { - encoding = offset; - offset = this._writeOffset; - } else { - encoding = undefined; - offset = this._writeOffset; - } - - len = Buffer.byteLength(value, encoding || this.encoding); - this._ensureWritable(len, _offset); - - this.buff.write(value, offset, len, encoding || this.encoding); - this._writeOffset += len; - return this; - }; - - /** - * Writes a null terminated string to the underlying buffer. - * @param value {String} The string to write. - * @param offset {Number} The offset to write the string to. (Encoding can also be set here in place of offset) - * @param encoding {String} The encoding to use. (Defaults to encoding set in constructor, or to utf8) - * @returns {*} - */ - SmartBuffer.prototype.writeStringNT = function (value, offset, encoding) { - this.writeString(value, offset, encoding); - this.writeUInt8(0x00, (typeof offset === 'number' ? offset + value.length : this._writeOffset)); - return this; - }; - - /** - * Writes a Buffer to the underlying buffer. - * @param value {Buffer} The buffer to write. - * @param offset {Number} The offset to write the Buffer to. - * @returns {*} - */ - SmartBuffer.prototype.writeBuffer = function (value, offset) { - var len = value.length; - this._ensureWritable(len, offset); - value.copy(this.buff, typeof offset === 'number' ? offset : this._writeOffset); - this._writeOffset += len; - return this; - }; - - /** - * Writes a null terminated Buffer to the underlying buffer. - * @param value {Buffer} The buffer to write. - * @param offset {Number} The offset to write the Buffer to. - * @returns {*} - */ - SmartBuffer.prototype.writeBufferNT = function (value, offset) { - this.writeBuffer(value, offset); - this.writeUInt8(0x00, (typeof offset === 'number' ? offset + value.length : this._writeOffset)); - - return this; - }; - - - /** - * Resets the Endless Buffer. - */ - SmartBuffer.prototype.clear = function () { - this._writeOffset = 0; - this._readOffset = 0; - this.length = 0; - }; - - /** - * Gets the remaining number of bytes to be read from the existing Buffer. - * @returns {number} The number of bytes remaining. - */ - SmartBuffer.prototype.remaining = function () { - return this.length - this._readOffset; - }; - - /** - * Skips the read position forward by the amount of given. - * @param amount {Number} The amount of bytes to skip forward. - */ - SmartBuffer.prototype.skip = function (amount) { - if (this._readOffset + amount > this.length) - throw new Error('Target position is beyond the bounds of the data.'); - - this._readOffset += amount; - }; - - /** - * Rewinds the read position backward by the amount given. - * @param amount {Number} The amount of bytes to reverse backward. - */ - SmartBuffer.prototype.rewind = function (amount) { - if (this._readOffset - amount < 0) - throw new Error('Target position is beyond the bounds of the data.'); - - this._readOffset -= amount; - }; - - /** - * Skips the read position to the given position. - * @param position {Number} The position to skip to. - */ - SmartBuffer.prototype.skipTo = function (position) { - if (position < 0 || position > this.length) - throw new Error('Target position is beyond the bounds of the data.'); - - this._readOffset = position; - }; - - /** - * Gets the underlying Buffer. - * @returns {*} - */ - SmartBuffer.prototype.toBuffer = function () { - return this.buff.slice(0, this.length); - }; - - /** - * Gets a string representation of the underlying Buffer. - * @param encoding {String} Encoding to use. (Defaults to encoding set in constructor, or utf8.) - * @returns {*} - */ - SmartBuffer.prototype.toString = function (encoding) { - return this.buff.toString(encoding || this.encoding, 0, this.length); - }; - - /** - * Destroys the underlying Buffer, and resets the SmartBuffer. - */ - SmartBuffer.prototype.destroy = function () { - delete this.buff; - this.clear(); - }; - - return SmartBuffer; -})(); - -module.exports = SmartBuffer; \ No newline at end of file diff --git a/node_modules/npm-registry-fetch/node_modules/smart-buffer/package.json b/node_modules/npm-registry-fetch/node_modules/smart-buffer/package.json deleted file mode 100644 index f6e183c589c4f..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/smart-buffer/package.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "_from": "smart-buffer@^1.0.13", - "_id": "smart-buffer@1.1.15", - "_inBundle": false, - "_integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", - "_location": "/npm-registry-fetch/smart-buffer", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "smart-buffer@^1.0.13", - "name": "smart-buffer", - "escapedName": "smart-buffer", - "rawSpec": "^1.0.13", - "saveSpec": null, - "fetchSpec": "^1.0.13" - }, - "_requiredBy": [ - "/npm-registry-fetch/socks" - ], - "_resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", - "_shasum": "7f114b5b65fab3e2a35aa775bb12f0d1c649bf16", - "_spec": "smart-buffer@^1.0.13", - "_where": "/Users/rebecca/code/npm/node_modules/npm-registry-fetch/node_modules/socks", - "author": { - "name": "Josh Glazebrook" - }, - "bugs": { - "url": "https://github.com/JoshGlazebrook/smart-buffer/issues" - }, - "bundleDependencies": false, - "dependencies": {}, - "deprecated": false, - "description": "A smarter Buffer that keeps track of its own read and write positions while growing endlessly.", - "devDependencies": { - "chai": "^3.5.0", - "coveralls": "^2.11.15", - "istanbul": "^0.4.3", - "mocha": "^3.2.0", - "mocha-lcov-reporter": "^1.2.0" - }, - "engines": { - "node": ">= 0.10.15", - "npm": ">= 1.3.5" - }, - "homepage": "https://github.com/JoshGlazebrook/smart-buffer/", - "keywords": [ - "buffer", - "smart", - "serialize", - "packet", - "network", - "cursor", - "simple" - ], - "license": "MIT", - "main": "lib/smart-buffer.js", - "name": "smart-buffer", - "repository": { - "type": "git", - "url": "git+https://github.com/JoshGlazebrook/smart-buffer.git" - }, - "scripts": { - "coverage": "istanbul cover node_modules/mocha/bin/_mocha recursive test", - "fullcoverage": "istanbul -include-all-sources cover node_modules/mocha/bin/_mocha recursive test", - "test": "mocha test/smart-buffer.test.js" - }, - "typings": "typings/index", - "version": "1.1.15" -} diff --git a/node_modules/npm-registry-fetch/node_modules/smart-buffer/test/smart-buffer.test.js b/node_modules/npm-registry-fetch/node_modules/smart-buffer/test/smart-buffer.test.js deleted file mode 100644 index 0897d54c2f158..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/smart-buffer/test/smart-buffer.test.js +++ /dev/null @@ -1,410 +0,0 @@ -var SmartBuffer = require('../lib/smart-buffer.js'); -var assert = require('chai').assert; - - -describe('Constructing a SmartBuffer', function () { - describe('Constructing with an existing Buffer', function () { - var buff = new Buffer([0xAA, 0xBB, 0xCC, 0xDD, 0xFF, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99]); - var reader = new SmartBuffer(buff); - - it('should have the exact same internal Buffer when constructed with a Buffer', function () { - assert.strictEqual(reader.buff, buff); - }); - - it('should return a buffer with the same content', function () { - assert.deepEqual(reader.toBuffer(), buff); - }); - }); - - describe('Constructing with an existing Buffer and setting the encoding', function () { - var buff = new Buffer([0xAA, 0xBB, 0xCC, 0xDD, 0xFF, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99]); - var reader = new SmartBuffer(buff, 'ascii'); - - it('should have the exact same internal Buffer', function () { - assert.strictEqual(reader.buff, buff); - }); - - it('should have the same encoding that was set', function () { - assert.strictEqual(reader.encoding, 'ascii'); - }); - }); - - describe('Constructing with a specified size', function () { - var size = 128; - var reader = new SmartBuffer(size); - - it('should have an internal Buffer with the same length as the size defined in the constructor', function () { - assert.strictEqual(reader.buff.length, size); - }); - }); - - describe('Constructing with a specified encoding', function () { - var encoding = 'utf8'; - - it('should have an internal encoding with the encoding given to the constructor (1st argument)', function () { - var reader = new SmartBuffer(encoding); - assert.strictEqual(reader.encoding, encoding); - }); - - it('should have an internal encoding with the encoding given to the constructor (2nd argument)', function () { - var reader = new SmartBuffer(1024, encoding); - assert.strictEqual(reader.encoding, encoding); - }); - - }); - - describe('Constructing with invalid parameters', function () { - it('should throw an exception when given an invalid number size', function () { - assert.throws(function () { - var reader = new SmartBuffer(-100); - }, Error); - }); - - it('should throw an exception when give a invalid encoding', function () { - assert.throws(function () { - var reader = new SmartBuffer('invalid'); - }, Error); - - assert.throws(function () { - var reader = new SmartBuffer(1024, 'invalid'); - }, Error); - }); - - it('should throw and exception when given an object that is not a Buffer', function () { - assert.throws(function () { - var reader = new SmartBuffer(null); - }, TypeError); - }); - }); -}); - - -describe('Reading/Writing To/From SmartBuffer', function () { - /** - * Technically, if one of these works, they all should. But they're all here anyways. - */ - - describe('Numeric Values', function () { - var reader = new SmartBuffer(); - reader.writeInt8(0x44); - reader.writeUInt8(0xFF); - reader.writeInt16BE(0x6699); - reader.writeInt16LE(0x6699); - reader.writeUInt16BE(0xFFDD); - reader.writeUInt16LE(0xFFDD); - reader.writeInt32BE(0x77889900); - reader.writeInt32LE(0x77889900); - reader.writeUInt32BE(0xFFDDCCBB); - reader.writeUInt32LE(0xFFDDCCBB); - reader.writeFloatBE(1.234); - reader.writeFloatLE(1.234); - reader.writeDoubleBE(1.234567890); - reader.writeDoubleLE(1.234567890); - - it('should equal the correct values that were written above', function () { - assert.strictEqual(reader.readInt8(), 0x44); - assert.strictEqual(reader.readUInt8(), 0xFF); - assert.strictEqual(reader.readInt16BE(), 0x6699); - assert.strictEqual(reader.readInt16LE(), 0x6699); - assert.strictEqual(reader.readUInt16BE(), 0xFFDD); - assert.strictEqual(reader.readUInt16LE(), 0xFFDD); - assert.strictEqual(reader.readInt32BE(), 0x77889900); - assert.strictEqual(reader.readInt32LE(), 0x77889900); - assert.strictEqual(reader.readUInt32BE(), 0xFFDDCCBB); - assert.strictEqual(reader.readUInt32LE(), 0xFFDDCCBB); - assert.closeTo(reader.readFloatBE(), 1.234, 0.001); - assert.closeTo(reader.readFloatLE(), 1.234, 0.001); - assert.closeTo(reader.readDoubleBE(), 1.234567890, 0.001); - assert.closeTo(reader.readDoubleLE(), 1.234567890, 0.001); - }); - - }); - - describe('Basic String Values', function () { - var reader = new SmartBuffer(); - reader.writeStringNT('hello'); - reader.writeString('world'); - reader.writeStringNT('✎✏✎✏✎✏'); - - it('should equal the correct strings that were written above', function () { - assert.strictEqual(reader.readStringNT(), 'hello'); - assert.strictEqual(reader.readString(5), 'world'); - assert.strictEqual(reader.readStringNT(), '✎✏✎✏✎✏'); - }); - }); - - describe('Mixed Encoding Strings', function () { - var reader = new SmartBuffer('ascii'); - reader.writeStringNT('some ascii text'); - reader.writeStringNT('ѕσмє υтƒ8 тєχт', 'utf8'); - - it('should equal the correct strings that were written above', function () { - assert.strictEqual(reader.readStringNT(), 'some ascii text'); - assert.strictEqual(reader.readStringNT('utf8'), 'ѕσмє υтƒ8 тєχт'); - }); - }); - - describe('Null/non-null terminating strings', function () { - var reader = new SmartBuffer(); - reader.writeString('hello\0test\0bleh'); - - it('should equal hello', function () { - assert.strictEqual(reader.readStringNT(), 'hello'); - }); - - it('should equal: test', function () { - assert.strictEqual(reader.readString(4), 'test'); - }); - - it('should have a length of zero', function () { - assert.strictEqual(reader.readStringNT().length, 0); - }); - - it('should equal: bleh', function () { - assert.strictEqual(reader.readStringNT(), 'bleh'); - }); - - - }); - - describe('Reading string without specifying length', function () { - var str = 'hello123'; - var writer = new SmartBuffer(); - writer.writeString(str); - - var reader = new SmartBuffer(writer.toBuffer()); - - assert.strictEqual(reader.readString(), str); - }); - - describe('Write string as specific position', function () { - var str = 'hello123'; - var writer = new SmartBuffer(); - writer.writeString(str, 10); - - var reader = new SmartBuffer(writer.toBuffer()); - - reader.skipTo(10); - it('Should read the correct string from the original position it was written to.', function () { - assert.strictEqual(reader.readString(), str); - }); - - - }); - - describe('Buffer Values', function () { - describe('Writing buffer to position 0', function () { - var buff = new SmartBuffer(); - var frontBuff = new Buffer([1, 2, 3, 4, 5, 6]); - buff.writeStringNT('hello'); - buff.writeBuffer(frontBuff, 0); - - it('should write the buffer to the front of the smart buffer instance', function () { - var readBuff = buff.readBuffer(frontBuff.length); - assert.deepEqual(readBuff, frontBuff); - }); - }); - - describe('Writing null terminated buffer to position 0', function () { - var buff = new SmartBuffer(); - var frontBuff = new Buffer([1, 2, 3, 4, 5, 6]); - buff.writeStringNT('hello'); - buff.writeBufferNT(frontBuff, 0); - - console.log(buff); - - it('should write the buffer to the front of the smart buffer instance', function () { - var readBuff = buff.readBufferNT(); - console.log(readBuff); - assert.deepEqual(readBuff, frontBuff); - }); - }); - - describe('Explicit lengths', function () { - var buff = new Buffer([0x01, 0x02, 0x04, 0x08, 0x16, 0x32, 0x64]); - var reader = new SmartBuffer(); - reader.writeBuffer(buff); - - it('should equal the buffer that was written above.', function () { - assert.deepEqual(reader.readBuffer(7), buff); - }); - }); - - describe('Implicit lengths', function () { - var buff = new Buffer([0x01, 0x02, 0x04, 0x08, 0x16, 0x32, 0x64]); - var reader = new SmartBuffer(); - reader.writeBuffer(buff); - - it('should equal the buffer that was written above.', function () { - assert.deepEqual(reader.readBuffer(), buff); - }); - }); - - describe('Null Terminated Buffer Reading', function () { - var buff = new SmartBuffer(); - buff.writeBuffer(new Buffer([0x01, 0x02, 0x03, 0x04, 0x00, 0x01, 0x02, 0x03])); - - var read1 = buff.readBufferNT(); - var read2 = buff.readBufferNT(); - - it('Should return a length of 4 for the four bytes before the first null in the buffer.', function () { - assert.equal(read1.length, 4); - }); - - it('Should return a length of 3 for the three bytes after the first null in the buffer after reading to end.', function () { - assert.equal(read2.length, 3); - }); - }); - - describe('Null Terminated Buffer Writing', function () { - var buff = new SmartBuffer(); - buff.writeBufferNT(new Buffer([0x01, 0x02, 0x03, 0x04])); - - var read1 = buff.readBufferNT(); - - it('Should read the correct null terminated buffer data.', function () { - assert.equal(read1.length, 4); - }); - - }) - - }); - - describe('Inserting values into specific positions', function () { - var reader = new SmartBuffer(); - - reader.writeUInt16LE(0x0060); - reader.writeStringNT('something'); - reader.writeUInt32LE(8485934); - reader.writeUInt16LE(6699); - reader.writeStringNT('else'); - reader.writeUInt16LE(reader.length - 2, 2); - - - it('should equal the size of the remaining data in the buffer', function () { - reader.readUInt16LE(); - var size = reader.readUInt16LE(); - assert.strictEqual(reader.remaining(), size); - }); - }); - - describe('Adding more data to the buffer than the internal buffer currently allows.', function () { - it('Should automatically adjust internal buffer size when needed', function () { - var writer = new SmartBuffer(); - var largeBuff = new Buffer(10000); - - writer.writeBuffer(largeBuff); - - assert.strictEqual(writer.length, largeBuff.length); - }); - }); - -}); - -describe('Skipping around data', function () { - var writer = new SmartBuffer(); - writer.writeStringNT('hello'); - writer.writeUInt16LE(6699); - writer.writeStringNT('world!'); - - it('Should equal the UInt16 that was written above', function () { - var reader = new SmartBuffer(writer.toBuffer()); - reader.skip(6); - assert.strictEqual(reader.readUInt16LE(), 6699); - reader.skipTo(0); - assert.strictEqual(reader.readStringNT(), 'hello'); - reader.rewind(6); - assert.strictEqual(reader.readStringNT(), 'hello'); - }); - - it('Should throw an error when attempting to skip more bytes than actually exist.', function () { - var reader = new SmartBuffer(writer.toBuffer()); - - assert.throws(function () { - reader.skip(10000); - }); - }); - - it('Should throw an error when attempting to skip to a position that does not exist.', function () { - var reader = new SmartBuffer(writer.toBuffer()); - - assert.throws(function () { - reader.skipTo(10000); - }); - }); - - it('Should throw an error when attempting to rewind past the start of the buffer.', function () { - var buff = new SmartBuffer(); - assert.throws(function () { - buff.rewind(10000); - }); - }); -}); - -describe('Automatic internal buffer resizing', function () { - var writer; - - it('Should not throw an error when adding data that is larger than current buffer size (internal resize algo fails)', function () { - var str = 'String larger than one byte'; - writer = new SmartBuffer(1); - writer.writeString(str); - - assert.strictEqual(writer.buff.length, str.length); - - }); - - it('Should not throw an error when adding data that is larger than current buffer size (internal resize algo succeeds)', function () { - writer = new SmartBuffer(100); - var buff = new Buffer(105); - - writer.writeBuffer(buff); - - // Test internal array growth algo. - assert.strictEqual(writer.buff.length, (100 * 3 / 2 + 1)); - }); -}); - -describe('Clearing the buffer', function () { - var writer = new SmartBuffer(); - writer.writeString('somedata'); - - it('Should contain some data.', function () { - assert.notStrictEqual(writer.length, 0); - }); - - it('Should contain zero data after being cleared.', function () { - writer.clear(); - assert.strictEqual(writer.length, 0); - }); -}); - -describe('Displaying the buffer as a string', function () { - var buff = new Buffer([1, 2, 3, 4]); - var sbuff = new SmartBuffer(buff); - - var str = buff.toString(); - var str64 = buff.toString('base64'); - - it('Should return a valid string representing the internal buffer', function () { - assert.strictEqual(str, sbuff.toString()); - }); - - it('Should return a valid base64 string representing the internal buffer', function () { - assert.strictEqual(str64, sbuff.toString('base64')); - }); -}); - -describe('Destroying the buffer', function () { - var writer = new SmartBuffer(); - writer.writeString('hello123'); - - writer.destroy(); - - it('Should have a length of zero when buffer is destroyed', function () { - assert.strictEqual(0, writer.length); - }); - - it('Should have no internal buff property when buffer is destroyed', function () { - assert.notProperty(writer, 'buff'); - }); -}); \ No newline at end of file diff --git a/node_modules/npm-registry-fetch/node_modules/smart-buffer/typings/index.d.ts b/node_modules/npm-registry-fetch/node_modules/smart-buffer/typings/index.d.ts deleted file mode 100644 index b567f1e97c285..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/smart-buffer/typings/index.d.ts +++ /dev/null @@ -1,383 +0,0 @@ -// Type definitions for smart-buffer -// Project: https://github.com/JoshGlazebrook/smart-buffer -// Definitions by: Josh Glazebrook - - - -declare class SmartBuffer { - /** - * Creates a new SmartBuffer instance (defaults to utf8 encoding) - */ - constructor(); - - /** - * Creates a new SmartBuffer instance - * - * @param arg1 { Number } The size the underlying buffer instance should be instantiated to (defaults to 4096) - * @param arg2 { String } The string encoding to use for reading/writing strings (defaults to utf8) - */ - constructor(size: number, encoding?: string); - - /** - * Creates a new SmartBuffer instance - * - * @param arg1 { String } The string encoding to use for reading/writing strings (defaults to utf8) - */ - constructor(encoding?: string); - - /** - * Creates a new SmartBuffer instance - * - * @param arg1 { Buffer } An existing buffer instance to copy to this smart buffer instance - * @param arg2 { String } The string encoding to use for reading/writing strings (defaults to utf8) - */ - constructor(buffer: Buffer, encoding?: string) - - - - // Signed number readers - - /** - * Reads a 8-bit signed integer - */ - readInt8(): number; - - /** - * Reads a 16-bit signed integer (big endian) - */ - readInt16BE(): number; - - /** - * Reads a 16-bit signed integer (little endian) - */ - readInt16LE(): number; - - /** - * Reads a 32-bit signed integer (big endian) - */ - readInt32BE(): number; - - /** - * Reads a 32-bit signed integer (little endian) - */ - readInt32LE(): number; - - // Unsigned number readers - - /** - * Reads a 8-bit unsigned integer - */ - readUInt8(): number; - - /** - * Reads a 16-bit unsigned integer (big endian) - */ - readUInt16BE(): number; - - /** - * Reads a 16-bit unsigned integer (little endian) - */ - readUInt16LE(): number; - - /** - * Reads a 32-bit unsigned integer (big endian) - */ - readUInt32BE(): number; - - /** - * Reads a 32-bit unsigned integer (little endian) - */ - readUInt32LE(): number; - - // Floating point readers - - /** - * Reads a float (big endian) - */ - readFloatBE(): number; - - /** - * Reads a float (little endian) - */ - readFloatLE(): number; - - /** - * Reads a double (big endian) - */ - readDoubleBE(): number; - - /** - * Reads a double (little endian) - */ - readDoubleLE(): number; - - // String readers - - /** - * Reads a string - * - * @param length { Number } The length of the string to read - * @param encoding { Number} The encoding to use (defaults to instance level encoding) - */ - readString(length?: number, encoding?: string): string; - - /** - * Reads a null terminated string - * - * @param encoding The encoding to use (defaults to instance level encoding) - */ - readStringNT(encoding?: string): string; - - // Buffer readers - - /** - * Reads binary data into a Buffer - * - * @param len { Number } The amount of data to read - */ - readBuffer(len?: number): Buffer; - - /** - * Reads null terminated binary data into a Buffer - */ - readBufferNT(): Buffer; - - - // Signed number writers - - /** - * Writes a 8-bit signed integer value - * - * @param value { Number } The value to write to the buffer - * @param offset { Number } The offset position to write the value to - */ - writeInt8(value: number, offset?: number): this; - - /** - * Writes a 16-bit signed integer (big endian) value - * - * @param value { Number } The value to write to the buffer - * @param offset { Number } The offset position to write the value to - */ - writeInt16BE(value: number, offset?: number): this; - - /** - * Writes a 16-bit signed integer (little endian) value - * - * @param value { Number } The value to write to the buffer - * @param offset { Number } The offset position to write the value to - */ - writeInt16LE(value: number, offset?: number): this; - - /** - * Writes a 32-bit signed integer (big endian) value - * - * @param value { Number } The value to write to the buffer - * @param offset { Number } The offset position to write the value to - */ - writeInt32BE(value: number, offset?: number): this; - - /** - * Writes a 32-bit signed integer (little endian) value - * - * @param value { Number } The value to write to the buffer - * @param offset { Number } The offset position to write the value to - */ - writeInt32LE(value: number, offset?: number): this; - - // Unsigned number writers - - /** - * Writes a 8-bit unsigned integer value - * - * @param value { Number } The value to write to the buffer - * @param offset { Number } The offset position to write the value to - */ - writeUInt8(value: number, offset?: number): this; - - /** - * Writes a 16-bit unsigned integer (big endian) value - * - * @param value { Number } The value to write to the buffer - * @param offset { Number } The offset position to write the value to - */ - writeUInt16BE(value: number, offset?: number): this; - - /** - * Writes a 16-bit unsigned integer (little endian) value - * - * @param value { Number } The value to write to the buffer - * @param offset { Number } The offset position to write the value to - */ - writeUInt16LE(value: number, offset?: number): this; - - /** - * Writes a 32-bit unsigned integer (big endian) value - * - * @param value { Number } The value to write to the buffer - * @param offset { Number } The offset position to write the value to - */ - writeUInt32BE(value: number, offset?: number): this; - - /** - * Writes a 32-bit unsigned integer (little endian) value - * - * @param value { Number } The value to write to the buffer - * @param offset { Number } The offset position to write the value to - */ - writeUInt32LE(value: number, offset?: number): this; - - // Floating point writers - - /** - * Writes a float (big endian) value - * - * @param value { Number } The value to write to the buffer - * @param offset { Number } The offset position to write the value to - */ - writeFloatBE(value: number, offset?: number): this; - - /** - * Writes a float (little endian) value - * - * @param value { Number } The value to write to the buffer - * @param offset { Number } The offset position to write the value to - */ - writeFloatLE(value: number, offset?: number): this; - - /** - * Writes a double (big endian) value - * - * @param value { Number } The value to write to the buffer - * @param offset { Number } The offset position to write the value to - */ - writeDoubleBE(value: number, offset?: number): this; - - /** - * Writes a double (little endian) value - * - * @param value { Number } The value to write to the buffer - * @param offset { Number } The offset position to write the value to - */ - writeDoubleLE(value: number, offset?: number): this; - - // String writers - - /** - * Writes a string - * - * @param value { String } The value to write to the buffer - * @param offset { Number } The offset position to write the value to - */ - /** - * Writes a string - * - * @param value { String } The value to write to the buffer - * @param offset { String } The encoding to use when writing the string (defaults to instance level encoding) - */ - /** - * Writes a string - * - * @param value { String } The value to write to the buffer - * @param offset { Number } The offset position to write the value to - * @param encoding { String } The encoding to use when writing the string (defaults to instance level encoding) - */ - writeString(value: string, offset?: number | string, encoding?: string): this; - - /** - * Writes a null terminated string - * - * @param value { String } The value to write to the buffer - * @param offset { Number } The offset position to write the value to - */ - /** - * Writes a null terminated string - * - * @param value { String } The value to write to the buffer - * @param offset { String } The encoding to use when writing the string (defaults to instance level encoding) - */ - /** - * Writes a null terminated string - * - * @param value { String } The value to write to the buffer - * @param offset { Number } The offset position to write the value to - * @param encoding { String } The encoding to use when writing the string (defaults to instance level encoding) - */ - writeStringNT(value: string, offset?: number | string, encoding?: string): this; - - // Buffer writers - - /** - * Writes a Buffer - * - * @param value { Buffer } The Buffer to write to the smart buffer - * @param offset { Number } The offset position to write the value to - */ - writeBuffer(value: Buffer, offset?: number): this; - - /** - * Writes a Buffer with null termination - * - * @param value { Buffer } The buffer to write to the smart buffer - * @param offset { Number } The offset position to write the value to - */ - writeBufferNT(value: Buffer, offset?: number): this; - - - // Misc Functions - - /** - * Clears the smart buffer - */ - clear(); - - /** - * Gets the number of bytes that remain to be read - */ - remaining(): number; - - /** - * Increases the read offset position - * - * @param amount { Number } The amount to increase the read offset position by - */ - skip(amount: number); - - /** - * Changes the read offset position - * - * @param position { Number } The position to change the read offset to - */ - skipTo(position: number); - - /** - * Decreases the read offset position - * - * @param amount { Number } The amount to decrease the read offset position by - */ - rewind(amount: number); - - /** - * Gets the underlying Buffer instance - */ - toBuffer(): Buffer; - - /** - * Gets the string representation of the underlying Buffer - * - * @param encoding { String } The encoding to use (defaults to instance level encoding) - */ - toString(encoding?: string): string; - - /** - * Destroys the smart buffer instance - */ - destroy(); - - /** - * Gets the current length of the smart buffer instance - */ - length: number; -} - -export = SmartBuffer; \ No newline at end of file diff --git a/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/.npmignore b/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/.npmignore deleted file mode 100644 index 07e6e472cc75f..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/.npmignore +++ /dev/null @@ -1 +0,0 @@ -/node_modules diff --git a/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/.travis.yml b/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/.travis.yml deleted file mode 100644 index 805d3d50d2a1f..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/.travis.yml +++ /dev/null @@ -1,22 +0,0 @@ -sudo: false - -language: node_js - -node_js: - - "4" - - "5" - - "6" - - "7" - - "8" - -install: - - PATH="`npm bin`:`npm bin -g`:$PATH" - # Install dependencies and build - - npm install - -script: - # Output useful info for debugging - - node --version - - npm --version - # Run tests - - npm test diff --git a/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/History.md b/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/History.md deleted file mode 100644 index b0266b5e35f9a..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/History.md +++ /dev/null @@ -1,96 +0,0 @@ - -3.0.1 / 2017-09-18 -================== - - * update "agent-base" to v4.1.0 - -3.0.0 / 2017-06-13 -================== - - * [BREAKING] drop support for Node < 4 - * update deps, remove `extend` dependency - * rename `socks-proxy-agent.js` to `index.js` - -2.1.1 / 2017-06-13 -================== - - * fix a bug where `close` would emit before `end` - * use "raw-body" module for tests - * prettier - -2.1.0 / 2017-05-24 -================== - - * DRY post-lookup logic - * Fix an error in readme (#13, @599316527) - * travis: test node v5 - * travis: test iojs v1, 2, 3 and node.js v4 - * test: use ssl-cert-snakeoil cert files - * Authentication support (#9, @baryshev) - -2.0.0 / 2015-07-10 -================== - - * API CHANGE! Removed `secure` boolean second argument in constructor - * upgrade to "agent-base" v2 API - * package: update "extend" to v3 - -1.0.2 / 2015-07-01 -================== - - * remove "v4a" from description - * socks-proxy-agent: cast `port` to a Number - * travis: attempt to make node v0.8 work - * travis: test node v0.12, don't test v0.11 - * test: pass `rejectUnauthorized` as a proxy opt - * test: catch http.ClientRequest errors - * test: add self-signed SSL server cert files - * test: refactor to use local SOCKS, HTTP and HTTPS servers - * README: use SVG for Travis-CI badge - -1.0.1 / 2015-03-01 -================== - - * switched from using "socks-client" to "socks" (#5, @JoshGlazebrook) - -1.0.0 / 2015-02-11 -================== - - * add client-side DNS lookup logic for 4 and 5 version socks proxies - * remove dead `onproxyconnect()` code function - * use a switch statement to decide the socks `version` - * refactor to use "socks-client" instead of "rainbowsocks" - * package: remove "rainbowsocks" dependency - * package: allow any "mocha" v2 - -0.1.2 / 2014-06-11 -================== - - * package: update "rainbowsocks" to v0.1.2 - * travis: don't test node v0.9 - -0.1.1 / 2014-04-09 -================== - - * package: update outdated dependencies - * socks-proxy-agent: pass `secure` flag when no `new` - * socks-proxy-agent: small code cleanup - -0.1.0 / 2013-11-19 -================== - - * add .travis.yml file - * socks-proxy-agent: properly mix in the proxy options - * socks-proxy-agent: coerce the `secureEndpoint` into a Boolean - * socks-proxy-agent: use "extend" module - * socks-proxy-agent: update to "agent-base" v1 API - -0.0.2 / 2013-07-24 -================== - - * socks-proxy-agent: properly set the `defaultPort` property - -0.0.1 / 2013-07-11 -================== - - * Initial release diff --git a/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/README.md b/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/README.md deleted file mode 100644 index 30d33500af43e..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/README.md +++ /dev/null @@ -1,134 +0,0 @@ -socks-proxy-agent -================ -### A SOCKS proxy `http.Agent` implementation for HTTP and HTTPS -[![Build Status](https://travis-ci.org/TooTallNate/node-socks-proxy-agent.svg?branch=master)](https://travis-ci.org/TooTallNate/node-socks-proxy-agent) - -This module provides an `http.Agent` implementation that connects to a -specified SOCKS proxy server, and can be used with the built-in `http` -or `https` modules. - -It can also be used in conjunction with the `ws` module to establish a WebSocket -connection over a SOCKS proxy. See the "Examples" section below. - -Installation ------------- - -Install with `npm`: - -``` bash -$ npm install socks-proxy-agent -``` - - -Examples --------- - -#### `http` module example - -``` js -var url = require('url'); -var http = require('http'); -var SocksProxyAgent = require('socks-proxy-agent'); - -// SOCKS proxy to connect to -var proxy = process.env.socks_proxy || 'socks://127.0.0.1:9050'; -console.log('using proxy server %j', proxy); - -// HTTP endpoint for the proxy to connect to -var endpoint = process.argv[2] || 'http://nodejs.org/api/'; -console.log('attempting to GET %j', endpoint); -var opts = url.parse(endpoint); - -// create an instance of the `SocksProxyAgent` class with the proxy server information -var agent = new SocksProxyAgent(proxy); -opts.agent = agent; - -http.get(opts, function (res) { - console.log('"response" event!', res.headers); - res.pipe(process.stdout); -}); -``` - -#### `https` module example - -``` js -var url = require('url'); -var https = require('https'); -var SocksProxyAgent = require('socks-proxy-agent'); - -// SOCKS proxy to connect to -var proxy = process.env.socks_proxy || 'socks://127.0.0.1:9050'; -console.log('using proxy server %j', proxy); - -// HTTP endpoint for the proxy to connect to -var endpoint = process.argv[2] || 'https://encrypted.google.com/'; -console.log('attempting to GET %j', endpoint); -var opts = url.parse(endpoint); - -// create an instance of the `SocksProxyAgent` class with the proxy server information -// NOTE: the `true` second argument! Means to use TLS encryption on the socket -var agent = new SocksProxyAgent(proxy, true); -opts.agent = agent; - -https.get(opts, function (res) { - console.log('"response" event!', res.headers); - res.pipe(process.stdout); -}); -``` - -#### `ws` WebSocket connection example - -``` js -var WebSocket = require('ws'); -var SocksProxyAgent = require('socks-proxy-agent'); - -// SOCKS proxy to connect to -var proxy = process.env.socks_proxy || 'socks://127.0.0.1:9050'; -console.log('using proxy server %j', proxy); - -// WebSocket endpoint for the proxy to connect to -var endpoint = process.argv[2] || 'ws://echo.websocket.org'; -console.log('attempting to connect to WebSocket %j', endpoint); - -// create an instance of the `SocksProxyAgent` class with the proxy server information -var agent = new SocksProxyAgent(proxy); - -// initiate the WebSocket connection -var socket = new WebSocket(endpoint, { agent: agent }); - -socket.on('open', function () { - console.log('"open" event!'); - socket.send('hello world'); -}); - -socket.on('message', function (data, flags) { - console.log('"message" event! %j %j', data, flags); - socket.close(); -}); -``` - -License -------- - -(The MIT License) - -Copyright (c) 2013 Nathan Rajlich <nathan@tootallnate.net> - -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/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/index.js b/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/index.js deleted file mode 100644 index 3dac18d564543..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/index.js +++ /dev/null @@ -1,141 +0,0 @@ -/** - * Module dependencies. - */ - -var tls; // lazy-loaded... -var url = require('url'); -var dns = require('dns'); -var Agent = require('agent-base'); -var SocksClient = require('socks'); -var inherits = require('util').inherits; - -/** - * Module exports. - */ - -module.exports = SocksProxyAgent; - -/** - * The `SocksProxyAgent`. - * - * @api public - */ - -function SocksProxyAgent(opts) { - if (!(this instanceof SocksProxyAgent)) return new SocksProxyAgent(opts); - if ('string' == typeof opts) opts = url.parse(opts); - if (!opts) - throw new Error( - 'a SOCKS proxy server `host` and `port` must be specified!' - ); - Agent.call(this, opts); - - var proxy = Object.assign({}, opts); - - // prefer `hostname` over `host`, because of `url.parse()` - proxy.host = proxy.hostname || proxy.host; - - // SOCKS doesn't *technically* have a default port, but this is - // the same default that `curl(1)` uses - proxy.port = +proxy.port || 1080; - - if (proxy.host && proxy.path) { - // if both a `host` and `path` are specified then it's most likely the - // result of a `url.parse()` call... we need to remove the `path` portion so - // that `net.connect()` doesn't attempt to open that as a unix socket file. - delete proxy.path; - delete proxy.pathname; - } - - // figure out if we want socks v4 or v5, based on the "protocol" used. - // Defaults to 5. - proxy.lookup = false; - switch (proxy.protocol) { - case 'socks4:': - proxy.lookup = true; - // pass through - case 'socks4a:': - proxy.version = 4; - break; - case 'socks5:': - proxy.lookup = true; - // pass through - case 'socks:': // no version specified, default to 5h - case 'socks5h:': - proxy.version = 5; - break; - default: - throw new TypeError( - 'A "socks" protocol must be specified! Got: ' + proxy.protocol - ); - } - - if (proxy.auth) { - var auth = proxy.auth.split(':'); - proxy.authentication = { username: auth[0], password: auth[1] }; - proxy.userid = auth[0]; - } - this.proxy = proxy; -} -inherits(SocksProxyAgent, Agent); - -/** - * Initiates a SOCKS connection to the specified SOCKS proxy server, - * which in turn connects to the specified remote host and port. - * - * @api public - */ - -SocksProxyAgent.prototype.callback = function connect(req, opts, fn) { - var proxy = this.proxy; - - // called once the SOCKS proxy has connected to the specified remote endpoint - function onhostconnect(err, socket) { - if (err) return fn(err); - var s = socket; - if (opts.secureEndpoint) { - // since the proxy is connecting to an SSL server, we have - // to upgrade this socket connection to an SSL connection - if (!tls) tls = require('tls'); - opts.socket = socket; - opts.servername = opts.host; - opts.host = null; - opts.hostname = null; - opts.port = null; - s = tls.connect(opts); - } - socket.resume(); - fn(null, s); - } - - // called for the `dns.lookup()` callback - function onlookup(err, ip) { - if (err) return fn(err); - options.target.host = ip; - SocksClient.createConnection(options, onhostconnect); - } - - var options = { - proxy: { - ipaddress: proxy.host, - port: +proxy.port, - type: proxy.version - }, - target: { - port: +opts.port - }, - command: 'connect' - }; - if (proxy.authentication) { - options.proxy.authentication = proxy.authentication; - options.proxy.userid = proxy.userid; - } - - if (proxy.lookup) { - // client-side DNS resolution for "4" and "5" socks proxy versions - dns.lookup(opts.host, onlookup); - } else { - // proxy hostname DNS resolution for "4a" and "5h" socks proxy servers - onlookup(null, opts.host); - } -} diff --git a/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/package.json b/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/package.json deleted file mode 100644 index 011f4a61f771b..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "_from": "socks-proxy-agent@^3.0.1", - "_id": "socks-proxy-agent@3.0.1", - "_inBundle": false, - "_integrity": "sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==", - "_location": "/npm-registry-fetch/socks-proxy-agent", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "socks-proxy-agent@^3.0.1", - "name": "socks-proxy-agent", - "escapedName": "socks-proxy-agent", - "rawSpec": "^3.0.1", - "saveSpec": null, - "fetchSpec": "^3.0.1" - }, - "_requiredBy": [ - "/npm-registry-fetch/make-fetch-happen" - ], - "_resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz", - "_shasum": "2eae7cf8e2a82d34565761539a7f9718c5617659", - "_spec": "socks-proxy-agent@^3.0.1", - "_where": "/Users/rebecca/code/npm/node_modules/npm-registry-fetch/node_modules/make-fetch-happen", - "author": { - "name": "Nathan Rajlich", - "email": "nathan@tootallnate.net", - "url": "http://n8.io/" - }, - "bugs": { - "url": "https://github.com/TooTallNate/node-socks-proxy-agent/issues" - }, - "bundleDependencies": false, - "dependencies": { - "agent-base": "^4.1.0", - "socks": "^1.1.10" - }, - "deprecated": false, - "description": "A SOCKS proxy `http.Agent` implementation for HTTP and HTTPS", - "devDependencies": { - "mocha": "^3.4.2", - "raw-body": "^2.2.0", - "socksv5": "0.0.6" - }, - "homepage": "https://github.com/TooTallNate/node-socks-proxy-agent#readme", - "keywords": [ - "socks", - "socks4", - "socks4a", - "proxy", - "http", - "https", - "agent" - ], - "license": "MIT", - "main": "./index.js", - "name": "socks-proxy-agent", - "repository": { - "type": "git", - "url": "git://github.com/TooTallNate/node-socks-proxy-agent.git" - }, - "scripts": { - "test": "mocha --reporter spec" - }, - "version": "3.0.1" -} diff --git a/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/test/ssl-cert-snakeoil.key b/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/test/ssl-cert-snakeoil.key deleted file mode 100644 index fd12501220a56..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/test/ssl-cert-snakeoil.key +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICWwIBAAKBgQCzURxIqzer0ACAbX/lHdsn4Gd9PLKrf7EeDYfIdV0HZKPD8WDr -bBx2/fBu0OW2sjnzv/SVZbJ0DAuPE/p0+eT0qb2qC10iz9iTD7ribd7gxhirVb8y -b3fBjXsxc8V8p4Ny1LcvNSqCjwUbJqdRogfoJeTiqPM58z5sNzuv5iq7iwIDAQAB -AoGAPMQy4olrP0UotlzlJ36bowLP70ffgHCwU+/f4NWs5fF78c3du0oSx1w820Dd -Z7E0JF8bgnlJJTxjumPZz0RUCugrEHBKJmzEz3cxF5E3+7NvteZcjKn9D67RrM5x -1/uSZ9cqKE9cYvY4fSuHx18diyZ4axR/wB1Pea2utjjDM+ECQQDb9ZbmmaWMiRpQ -5Up+loxP7BZNPsEVsm+DVJmEFbaFgGfncWBqSIqnPNjMwTwj0OigTwCAEGPkfRVW -T0pbYWCxAkEA0LK7SCTwzyDmhASUalk0x+3uCAA6ryFdwJf/wd8TRAvVOmkTEldX -uJ7ldLvfrONYO3v56uKTU/SoNdZYzKtO+wJAX2KM4ctXYy5BXztPpr2acz4qHa1N -Bh+vBAC34fOYhyQ76r3b1btHhWZ5jbFuZwm9F2erC94Ps5IaoqcX07DSwQJAPKGw -h2U0EPkd/3zVIZCJJQya+vgWFIs9EZcXVtvYXQyTBkVApTN66MhBIYjzkub5205J -bVQmOV37AKklY1DhwQJAA1wos0cYxro02edzatxd0DIR2r4qqOqLkw6BhYHhq6HJ -ZvIcQkHqdSXzdETFc01I1znDGGIrJHcnvKWgBPoEUg== ------END RSA PRIVATE KEY----- diff --git a/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/test/ssl-cert-snakeoil.pem b/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/test/ssl-cert-snakeoil.pem deleted file mode 100644 index b115a5e91498d..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/test/ssl-cert-snakeoil.pem +++ /dev/null @@ -1,12 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIB1TCCAT4CCQDV5mPlzm9+izANBgkqhkiG9w0BAQUFADAvMS0wKwYDVQQDEyQ3 -NTI3YmQ3Ny1hYjNlLTQ3NGItYWNlNy1lZWQ2MDUzOTMxZTcwHhcNMTUwNzA2MjI0 -NTA3WhcNMjUwNzAzMjI0NTA3WjAvMS0wKwYDVQQDEyQ3NTI3YmQ3Ny1hYjNlLTQ3 -NGItYWNlNy1lZWQ2MDUzOTMxZTcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGB -ALNRHEirN6vQAIBtf+Ud2yfgZ308sqt/sR4Nh8h1XQdko8PxYOtsHHb98G7Q5bay -OfO/9JVlsnQMC48T+nT55PSpvaoLXSLP2JMPuuJt3uDGGKtVvzJvd8GNezFzxXyn -g3LUty81KoKPBRsmp1GiB+gl5OKo8znzPmw3O6/mKruLAgMBAAEwDQYJKoZIhvcN -AQEFBQADgYEACzoHUF8UV2Z6541Q2wKEA0UFUzmUjf/E1XwBO+1P15ZZ64uw34B4 -1RwMPtAo9RY/PmICTWtNxWGxkzwb2JtDWtnxVER/lF8k2XcXPE76fxTHJF/BKk9J -QU8OTD1dd9gHCBviQB9TqntRZ5X7axjtuWjb2umY+owBYzAHZkp1HKI= ------END CERTIFICATE----- diff --git a/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/test/test.js b/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/test/test.js deleted file mode 100644 index 968ef650fb6d7..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent/test/test.js +++ /dev/null @@ -1,144 +0,0 @@ - -/** - * Module dependencies. - */ - -var fs = require('fs'); -var url = require('url'); -var http = require('http'); -var https = require('https'); -var assert = require('assert'); -var socks = require('socksv5'); -var getRawBody = require('raw-body'); -var SocksProxyAgent = require('../'); - -describe('SocksProxyAgent', function () { - var httpServer, httpPort; - var httpsServer, httpsPort; - var socksServer, socksPort; - - before(function (done) { - // setup SOCKS proxy server - socksServer = socks.createServer(function(info, accept, deny) { - accept(); - }); - socksServer.listen(0, '127.0.0.1', function() { - socksPort = socksServer.address().port; - //console.log('SOCKS server listening on port %d', socksPort); - done(); - }); - socksServer.useAuth(socks.auth.None()); - //socksServer.useAuth(socks.auth.UserPassword(function(user, password, cb) { - // cb(user === 'nodejs' && password === 'rules!'); - //})); - }); - - before(function (done) { - // setup target HTTP server - httpServer = http.createServer(); - httpServer.listen(function () { - httpPort = httpServer.address().port; - done(); - }); - }); - - before(function (done) { - // setup target SSL HTTPS server - var options = { - key: fs.readFileSync(__dirname + '/ssl-cert-snakeoil.key'), - cert: fs.readFileSync(__dirname + '/ssl-cert-snakeoil.pem') - }; - httpsServer = https.createServer(options); - httpsServer.listen(function () { - httpsPort = httpsServer.address().port; - done(); - }); - }); - - after(function (done) { - socksServer.once('close', function () { done(); }); - socksServer.close(); - }); - - after(function (done) { - httpServer.once('close', function () { done(); }); - httpServer.close(); - }); - - after(function (done) { - httpsServer.once('close', function () { done(); }); - httpsServer.close(); - }); - - describe('constructor', function () { - it('should throw an Error if no "proxy" argument is given', function () { - assert.throws(function () { - new SocksProxyAgent(); - }); - }); - it('should accept a "string" proxy argument', function () { - var agent = new SocksProxyAgent('socks://127.0.0.1:' + socksPort); - assert.equal('127.0.0.1', agent.proxy.host); - assert.equal(socksPort, agent.proxy.port); - }); - it('should accept a `url.parse()` result object argument', function () { - var opts = url.parse('socks://127.0.0.1:' + socksPort); - var agent = new SocksProxyAgent(opts); - assert.equal('127.0.0.1', agent.proxy.host); - assert.equal(socksPort, agent.proxy.port); - }); - }); - - describe('"http" module', function () { - it('should work against an HTTP endpoint', function (done) { - httpServer.once('request', function (req, res) { - assert.equal('/foo', req.url); - res.statusCode = 404; - res.end(JSON.stringify(req.headers)); - }); - - var agent = new SocksProxyAgent('socks://127.0.0.1:' + socksPort); - var opts = url.parse('http://127.0.0.1:' + httpPort + '/foo'); - opts.agent = agent; - opts.headers = { foo: 'bar' }; - var req = http.get(opts, function (res) { - assert.equal(404, res.statusCode); - getRawBody(res, 'utf8', function (err, buf) { - if (err) return done(err); - var data = JSON.parse(buf); - assert.equal('bar', data.foo); - done(); - }); - }); - req.once('error', done); - }); - }); - - describe('"https" module', function () { - it('should work against an HTTPS endpoint', function (done) { - httpsServer.once('request', function (req, res) { - assert.equal('/foo', req.url); - res.statusCode = 404; - res.end(JSON.stringify(req.headers)); - }); - - var agent = new SocksProxyAgent('socks://127.0.0.1:' + socksPort); - var opts = url.parse('https://127.0.0.1:' + httpsPort + '/foo'); - opts.agent = agent; - opts.rejectUnauthorized = false; - - opts.headers = { foo: 'bar' }; - var req = https.get(opts, function (res) { - assert.equal(404, res.statusCode); - getRawBody(res, 'utf8', function (err, buf) { - if (err) return done(err); - var data = JSON.parse(buf); - assert.equal('bar', data.foo); - done(); - }); - }); - req.once('error', done); - }); - }); - -}); diff --git a/node_modules/npm-registry-fetch/node_modules/socks/.npmignore b/node_modules/npm-registry-fetch/node_modules/socks/.npmignore deleted file mode 100644 index 7deddced8b855..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -.git* -.idea -npm-debug.log \ No newline at end of file diff --git a/node_modules/npm-registry-fetch/node_modules/socks/LICENSE b/node_modules/npm-registry-fetch/node_modules/socks/LICENSE deleted file mode 100644 index b2442a9e71326..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Josh Glazebrook - -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/node_modules/npm-registry-fetch/node_modules/socks/README.md b/node_modules/npm-registry-fetch/node_modules/socks/README.md deleted file mode 100644 index 890b7deb6aa1d..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks/README.md +++ /dev/null @@ -1,339 +0,0 @@ -socks -============= - -socks is a full client implementation of the SOCKS 4, 4a, and 5 protocols in an easy to use node.js module. - -### Notice -As of February 26th, 2015, socks is the new home of the socks-client package. - -### Why socks? - -There is not any other SOCKS proxy client library on npm that supports all three variants of the SOCKS protocol. Nor are there any that support the BIND and associate features that some versions of the SOCKS protocol supports. - -Key Features: -* Supports SOCKS 4, 4a, and 5 protocols -* Supports the connect method (simple tcp connections of SOCKS) (Client -> SOCKS Server -> Target Server) -* Supports the BIND method (4, 4a, 5) -* Supports the associate (UDP forwarding) method (5) -* Simple and easy to use (one function call to make any type of SOCKS connection) - -## Installing: - -`npm install socks` - -### Getting Started Example - -For this example, say you wanted to grab the html of google's home page. - -```javascript -var Socks = require('socks'); - -var options = { - proxy: { - ipaddress: "202.101.228.108", // Random public proxy - port: 1080, - type: 5 // type is REQUIRED. Valid types: [4, 5] (note 4 also works for 4a) - }, - target: { - host: "google.com", // can be an ip address or domain (4a and 5 only) - port: 80 - }, - command: 'connect' // This defaults to connect, so it's optional if you're not using BIND or Associate. -}; - -Socks.createConnection(options, function(err, socket, info) { - if (err) - console.log(err); - else { - // Connection has been established, we can start sending data now: - socket.write("GET / HTTP/1.1\nHost: google.com\n\n"); - socket.on('data', function(data) { - console.log(data.length); - console.log(data); - }); - - // PLEASE NOTE: sockets need to be resumed before any data will come in or out as they are paused right before this callback is fired. - socket.resume(); - - // 569 - // // This first piece of information can be ignored. - -7 - // Hello <\r\n (enter key)> - -11 - // aaaaaaaaa <\r\n (enter key)> -``` - -As you can see the data entered in the telnet terminal is routed through the SOCKS proxy and back to the original connection that was made to the proxy. - -**Note** Please pay close attention to the first piece of data that was received. - -``` - - - [005a] [PORT:2} [IP:4] -``` - -This piece of data is technically part of the SOCKS BIND specifications, but because of my design decisions that were made in an effort to keep this library simple to use, you will need to make sure to ignore and/or deal with this initial packet that is received when a connection is made to the newly opened port. - -### Associate Example: -The associate command sets up a UDP relay for the remote SOCKS proxy server to relay UDP packets to the remote host of your choice. - -```javascript -var options = { - proxy: { - ipaddress: "202.101.228.108", - port: 1080, - type: 5, - command: "associate" // Since we are using associate, we must specify it here. - }, - target: { - // When using associate, either set the ip and port to 0.0.0.0:0 or the expected source of incoming udp packets. - // Note: Some SOCKS servers MAY block associate requests with 0.0.0.0:0 endpoints. - // Note: ipv4, ipv6, and hostnames are supported here. - host: "0.0.0.0", - port: 0 - } -}; - - -Socks.createConnection(options, function(err, socket, info) { - if (err) - console.log(err); - else { - // Associate request has completed. - // info object contains the remote ip and udp port to send UDP packets to. - console.log(info); - // { port: 42803, host: '202.101.228.108' } - - var udp = new dgram.Socket('udp4'); - - // In this example we are going to send "Hello" to 1.2.3.4:2323 through the SOCKS proxy. - - var pack = Socks.createUDPFrame({ host: "1.2.3.4", port: 2323}, new Buffer("hello")); - - // Send Packet to Proxy UDP endpoint given in the info object. - udp.send(pack, 0, pack.length, info.port, info.host); - } -}); - -``` -Now assuming that the associate request went through correctly. Anything that is typed in the stdin will first be sent to the SOCKS proxy on the endpoint that was provided in the info object. Once the SOCKS proxy receives it, it will then forward on the actual UDP packet to the host you you wanted. - - -1.2.3.4:2323 should now receive our relayed UDP packet from 202.101.228.108 (SOCKS proxy) -``` -// -``` - -## Using socks as an HTTP Agent - -You can use socks as a http agent which will relay all your http -connections through the socks server. - -The object that `Socks.Agent` accepts is the same as `Socks.createConnection`, you don't need to set a target since you have to define it in `http.request` or `http.get` methods. - -The second argument is a boolean which indicates whether the remote endpoint requires TLS. - -```javascript -var socksAgent = new Socks.Agent({ - proxy: { - ipaddress: "202.101.228.108", - port: 1080, - type: 5, - }}, - true, // we are connecting to a HTTPS server, false for HTTP server - false // rejectUnauthorized option passed to tls.connect(). Only when secure is set to true -); - -http.get({ hostname: 'google.com', port: '443', agent: socksAgent}, function (res) { - // Connection header by default is keep-alive, we have to manually end the socket - socksAgent.encryptedSocket.end(); -}); -``` - -# Api Reference: - -There are only three exported functions that you will ever need to use. - -### Socks.createConnection( options, callback(err, socket, info) ) -> `Object` **Object containing options to use when creating this connection** - -> `function` **Callback that is called when connection completes or errors** - -Options: - -```javascript -var options = { - - // Information about proxy server - proxy: { - // IP Address of Proxy (Required) - ipaddress: "1.2.3.4", - - // TCP Port of Proxy (Required) - port: 1080, - - // Proxy Type [4, 5] (Required) - // Note: 4 works for both 4 and 4a. - type: 4, - - // SOCKS Connection Type (Optional) - // - defaults to 'connect' - - // 'connect' - establishes a regular SOCKS connection to the target host. - // 'bind' - establishes an open tcp port on the SOCKS for another client to connect to. - // 'associate' - establishes a udp association relay on the SOCKS server. - command: "connect", - - - // SOCKS 4 Specific: - - // UserId used when making a SOCKS 4/4a request. (Optional) - userid: "someuserid", - - // SOCKS 5 Specific: - - // Authentication used for SOCKS 5 (when it's required) (Optional) - authentication: { - username: "Josh", - password: "somepassword" - } - }, - - // Information about target host and/or expected client of a bind association. (Required) - target: { - // When using 'connect': IP Address or hostname (4a and 5 only) of a target to connect to. - // When using 'bind': IP Address of the expected client that will connect to the newly open tcp port. - // When using 'associate': IP Address and Port of the expected client that will send UDP packets to this UDP association relay. - - // Note: - // When using SOCKS 4, only an ipv4 address can be used. - // When using SOCKS 4a, an ipv4 address OR a hostname can be used. - // When using SOCKS 5, ipv4, ipv6, or a hostname can be used. - host: "1.2.3.4", - - // TCP port of target to connect to. - port: 1080 - }, - - // Amount of time to wait for a connection to be established. (Optional) - // - defaults to 10000ms (10 seconds) - timeout: 10000 -}; -``` -Callback: - -```javascript - -// err: If an error occurs, err will be an Error object, otherwise null. -// socket: Socket with established connection to your target host. -// info: If using BIND or associate, this will be the remote endpoint to use. - -function(err, socket, info) { - // Hopefully no errors :-) -} -``` - -### Socks.createUDPFrame( target, data, [frame] ) -> `Object` **Target host object containing destination for UDP packet** - -> `Buffer` **Data Buffer to send in the UDP packet** - -> `Number` **Frame number in UDP packet. (defaults to 0)** - -Creates a UDP packet frame for using with UDP association relays. - -returns `Buffer` The completed UDP packet container to be sent to the proxy for forwarding. - -target: -```javascript - -// Target host information for where the UDP packet should be sent. -var target = - { - // ipv4, ipv6, or hostname for where to have the proxy send the UDP packet. - host: "1.2.3.4", - - // udpport for where to send the UDP packet. - port: 2323 - } - -``` - -### Socks.Agent( options, tls) ) -> `Object` **Object containing options to use when creating this connection (see above in createConnection)** - -> `boolean` **Boolean indicating if we upgrade the connection to TLS on the socks server** - - -# Further Reading: -Please read the SOCKS 5 specifications for more information on how to use BIND and Associate. -http://www.ietf.org/rfc/rfc1928.txt - -# License -This work is licensed under the [MIT license](http://en.wikipedia.org/wiki/MIT_License). diff --git a/node_modules/npm-registry-fetch/node_modules/socks/examples/associate.js b/node_modules/npm-registry-fetch/node_modules/socks/examples/associate.js deleted file mode 100644 index 82d6afa97bcce..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks/examples/associate.js +++ /dev/null @@ -1,33 +0,0 @@ -var Socks = require('../index.js'); -var dgram = require('dgram'); - -var options = { - proxy: { - ipaddress: "202.101.228.108", - port: 1080, - type: 5, - command: 'associate' - }, - - target: { - host: "0.0.0.0", - port: 0 - } -}; - -Socks.createConnection(options, function(err, socket, info) { - if (err) - console.log(err); - else { - console.log("Connected"); - - // Associate request completed. - // Now we can send properly formed UDP packet frames to this endpoint for forwarding: - console.log(info); - // { port: 4381, host: '202.101.228.108' } - - var udp = new dgram.Socket('udp4'); - var packet = SocksClient.createUDPFrame({ host: "1.2.3.4", port: 5454}, new Buffer("Hello")); - udp.send(packet, 0, packet.length, info.port, info.host); - } -}); \ No newline at end of file diff --git a/node_modules/npm-registry-fetch/node_modules/socks/examples/bind.js b/node_modules/npm-registry-fetch/node_modules/socks/examples/bind.js deleted file mode 100644 index 4410dd1def53c..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks/examples/bind.js +++ /dev/null @@ -1,30 +0,0 @@ -var Socks = require('../index.js'); - -var options = { - proxy: { - ipaddress: "202.101.228.108", - port: 1080, - type: 5, - command: 'bind' - }, - - target: { - host: "0.0.0.0", - port: 0 - } -}; - -Socks.createConnection(options, function(err, socket, info) { - if (err) - console.log(err); - else { - console.log("Connected"); - - // BIND request completed, now a tcp client should connect to this endpoint: - console.log(info); - // { port: 3334, host: '202.101.228.108' } - - // Resume! You need to! - socket.resume(); - } -}); \ No newline at end of file diff --git a/node_modules/npm-registry-fetch/node_modules/socks/examples/connect.js b/node_modules/npm-registry-fetch/node_modules/socks/examples/connect.js deleted file mode 100644 index 528ad4d416001..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks/examples/connect.js +++ /dev/null @@ -1,31 +0,0 @@ -var Socks = require('../index.js'); - -var options = { - proxy: { - ipaddress: "31.193.133.9", - port: 1081, - type: 5 // (4 or 5) - }, - - target: { - host: "173.194.33.103", // (google.com) - port: 80 - } -}; - -Socks.createConnection(options, function (err, socket, info) { - if (err) - console.log(err); - else { - console.log("Connected"); - - socket.on('data', function (data) { - // do something with incoming data - }); - - // Please remember that sockets need to be resumed before any data will come in. - socket.resume(); - - // We can do whatever we want with the socket now. - } -}); \ No newline at end of file diff --git a/node_modules/npm-registry-fetch/node_modules/socks/index.js b/node_modules/npm-registry-fetch/node_modules/socks/index.js deleted file mode 100644 index 29331d4a1c830..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks/index.js +++ /dev/null @@ -1,6 +0,0 @@ -var SocksClient = require('./lib/socks-client.js'); -var SocksAgent = require('./lib/socks-agent.js'); - -exports.createConnection = SocksClient.createConnection; -exports.createUDPFrame = SocksClient.createUDPFrame; -exports.Agent = SocksAgent.Agent; diff --git a/node_modules/npm-registry-fetch/node_modules/socks/lib/socks-agent.js b/node_modules/npm-registry-fetch/node_modules/socks/lib/socks-agent.js deleted file mode 100644 index db1c301ec9e48..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks/lib/socks-agent.js +++ /dev/null @@ -1,108 +0,0 @@ -var tls = require('tls'); -var inherits = require('util').inherits; -var EventEmitter = require('events').EventEmitter; -var SocksClient = require('./socks-client.js'); - -function SocksAgent(options, secure, rejectUnauthorized) { - this.options = options; - this.secure = secure || false; - this.rejectUnauthorized = rejectUnauthorized; - - if (this.rejectUnauthorized === undefined) { - this.rejectUnauthorized = true; - } -} - -inherits(SocksAgent, EventEmitter); - -SocksAgent.prototype.createConnection = function(req, opts, fn) { - var handler = fn, host, self = this; - - this.options.target = this.options.target || {}; - - if (!this.options.target.host) { - this.options.target.host = opts.host; - } - - if (!this.options.target.port) { - this.options.target.port = opts.port; - } - - host = this.options.target.host; - - if (this.secure) { - handler = function(err, socket, info) { - var options, cleartext; - - if (err) { - return fn(err); - } - - // save encrypted socket - self.encryptedSocket = socket; - - options = { - socket: socket, - servername: host, - rejectUnauthorized: self.rejectUnauthorized - }; - - cleartext = tls.connect(options, function (err) { - return fn(err, this); - }); - cleartext.on('error', fn); - - socket.resume(); - } - } - - SocksClient.createConnection(this.options, handler); -}; - -/** - * @see https://www.npmjs.com/package/agent-base - */ -SocksAgent.prototype.addRequest = function(req, host, port, localAddress) { - var opts; - if ('object' === typeof host) { - // >= v0.11.x API - opts = host; - if (opts.host && opts.path) { - // if both a `host` and `path` are specified then it's most likely the - // result of a `url.parse()` call... we need to remove the `path` portion so - // that `net.connect()` doesn't attempt to open that as a unix socket file. - delete opts.path; - } - } else { - // <= v0.10.x API - opts = { host: host, port: port }; - if (null !== localAddress) { - opts.localAddress = localAddress; - } - } - - var sync = true; - - this.createConnection(req, opts, function (err, socket) { - function emitErr () { - req.emit('error', err); - } - if (err) { - if (sync) { - // need to defer the "error" event, when sync, because by now the `req` - // instance hasn't event been passed back to the user yet... - process.nextTick(emitErr); - } else { - emitErr(); - } - } else { - req.onSocket(socket); - //have to resume this socket when node 12 - socket.resume(); - } - }); - - sync = false; -}; - -exports.Agent = SocksAgent; diff --git a/node_modules/npm-registry-fetch/node_modules/socks/lib/socks-client.js b/node_modules/npm-registry-fetch/node_modules/socks/lib/socks-client.js deleted file mode 100644 index 4a31f62c32c9e..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks/lib/socks-client.js +++ /dev/null @@ -1,306 +0,0 @@ -var net = require('net'); -var ip = require('ip'); -var SmartBuffer = require('smart-buffer'); - -(function () { - - var COMMAND = { - Connect: 0x01, - Bind: 0x02, - Associate: 0x03 - }; - - var SOCKS4_RESPONSE = { - Granted: 0x5A, - Failed: 0x5B, - Rejected: 0x5C, - RejectedIdent: 0x5D - }; - - var SOCKS5_AUTH = { - NoAuth: 0x00, - GSSApi: 0x01, - UserPass: 0x02 - }; - - var SOCKS5_RESPONSE = { - Granted: 0x00, - Failure: 0x01, - NotAllowed: 0x02, - NetworkUnreachable: 0x03, - HostUnreachable: 0x04, - ConnectionRefused: 0x05, - TTLExpired: 0x06, - CommandNotSupported: 0x07, - AddressNotSupported: 0x08 - }; - - - exports.createConnection = function (options, callback) { - var socket = new net.Socket(), finished = false, buff = new SmartBuffer(); - - // Defaults - options.timeout = options.timeout || 10000; - options.proxy.command = commandFromString(options.proxy.command); - options.proxy.userid = options.proxy.userid || ""; - - var auth = options.proxy.authentication || {}; - auth.username = auth.username || ""; - auth.password = auth.password || ""; - - options.proxy.authentication = auth; - - // Connect & negotiation timeout - function onTimeout() { - finish(new Error("Connection Timed Out"), socket, null, callback); - } - socket.setTimeout(options.timeout, onTimeout); - - // Socket events - socket.once('close', function () { - finish(new Error("Socket Closed"), socket, null, callback); - }); - - socket.once('error', function (err) { - }); - - socket.once('connect', function () { - if (options.proxy.type === 4) { - negotiateSocks4(options, socket, callback); - } else if (options.proxy.type === 5) { - negotiateSocks5(options, socket, callback); - } else { - throw new Error("Please specify a proxy type in options.proxy.type"); - } - }); - - socket.connect(options.proxy.port, options.proxy.ipaddress); - - - // 4/4a (connect, bind) - Supports domains & ipaddress - function negotiateSocks4(options, socket, callback) { - buff.writeUInt8(0x04); - buff.writeUInt8(options.proxy.command); - buff.writeUInt16BE(options.target.port); - - // ipv4 or domain? - if (net.isIPv4(options.target.host)) { - buff.writeBuffer(ip.toBuffer(options.target.host)); - buff.writeStringNT(options.proxy.userid); - } else { - buff.writeUInt8(0x00); - buff.writeUInt8(0x00); - buff.writeUInt8(0x00); - buff.writeUInt8(0x01); - buff.writeStringNT(options.proxy.userid); - buff.writeStringNT(options.target.host); - } - - socket.once('data', receivedResponse); - socket.write(buff.toBuffer()); - - function receivedResponse(data) { - socket.pause(); - if (data.length === 8 && data[1] === SOCKS4_RESPONSE.Granted) { - - if (options.proxy.command === COMMAND.Bind) { - buff.clear(); - buff.writeBuffer(data); - buff.skip(2); - - var info = { - port: buff.readUInt16BE(), - host: buff.readUInt32BE() - }; - - if (info.host === 0) { - info.host = options.proxy.ipaddress; - } else { - info.host = ip.fromLong(info.host); - } - - finish(null, socket, info, callback); - } else { - finish(null, socket, null, callback); - } - - } else { - finish(new Error("Rejected (" + data[1] + ")"), socket, null, callback); - } - } - } - - // Socks 5 (connect, bind, associate) - Supports domains and ipv4, ipv6. - function negotiateSocks5(options, socket, callback) { - buff.writeUInt8(0x05); - buff.writeUInt8(2); - buff.writeUInt8(SOCKS5_AUTH.NoAuth); - buff.writeUInt8(SOCKS5_AUTH.UserPass); - - socket.once('data', handshake); - socket.write(buff.toBuffer()); - - function handshake(data) { - if (data.length !== 2) { - finish(new Error("Negotiation Error"), socket, null, callback); - } else if (data[0] !== 0x05) { - finish(new Error("Negotiation Error (invalid version)"), socket, null, callback); - } else if (data[1] === 0xFF) { - finish(new Error("Negotiation Error (unacceptable authentication)"), socket, null, callback); - } else { - if (data[1] === SOCKS5_AUTH.NoAuth) { - sendRequest(); - } else if (data[1] === SOCKS5_AUTH.UserPass) { - sendAuthentication(options.proxy.authentication); - } else { - finish(new Error("Negotiation Error (unknown authentication type)"), socket, null, callback); - } - } - } - - function sendAuthentication(authinfo) { - buff.clear(); - buff.writeUInt8(0x01); - buff.writeUInt8(Buffer.byteLength(authinfo.username)); - buff.writeString(authinfo.username); - buff.writeUInt8(Buffer.byteLength(authinfo.password)); - buff.writeString(authinfo.password); - - socket.once('data', authenticationResponse); - socket.write(buff.toBuffer()); - - function authenticationResponse(data) { - if (data.length === 2 && data[1] === 0x00) { - sendRequest(); - } else { - finish(new Error("Negotiation Error (authentication failed)"), socket, null, callback); - } - } - } - - function sendRequest() { - buff.clear(); - buff.writeUInt8(0x05); - buff.writeUInt8(options.proxy.command); - buff.writeUInt8(0x00); - - // ipv4, ipv6, domain? - if (net.isIPv4(options.target.host)) { - buff.writeUInt8(0x01); - buff.writeBuffer(ip.toBuffer(options.target.host)); - } else if (net.isIPv6(options.target.host)) { - buff.writeUInt8(0x04); - buff.writeBuffer(ip.toBuffer(options.target.host)); - } else { - buff.writeUInt8(0x03); - buff.writeUInt8(options.target.host.length); - buff.writeString(options.target.host); - } - buff.writeUInt16BE(options.target.port); - - socket.once('data', receivedResponse); - socket.write(buff.toBuffer()); - } - - function receivedResponse(data) { - socket.pause(); - if (data.length < 4) { - finish(new Error("Negotiation Error"), socket, null, callback); - } else if (data[0] === 0x05 && data[1] === SOCKS5_RESPONSE.Granted) { - if (options.proxy.command === COMMAND.Connect) { - finish(null, socket, null, callback); - } else if (options.proxy.command === COMMAND.Bind || options.proxy.command === COMMAND.Associate) { - buff.clear(); - buff.writeBuffer(data); - buff.skip(3); - - var info = {}; - var addrtype = buff.readUInt8(); - - try { - - if (addrtype === 0x01) { - info.host = buff.readUInt32BE(); - if (info.host === 0) - info.host = options.proxy.ipaddress; - else - info.host = ip.fromLong(info.host); - } else if (addrtype === 0x03) { - var len = buff.readUInt8(); - info.host = buff.readString(len); - } else if (addrtype === 0x04) { - info.host = buff.readBuffer(16); - } else { - finish(new Error("Negotiation Error (invalid host address)"), socket, null, callback); - } - info.port = buff.readUInt16BE(); - - finish(null, socket, info, callback); - } catch (ex) { - finish(new Error("Negotiation Error (missing data)"), socket, null, callback); - } - } - } else { - finish(new Error("Negotiation Error (" + data[1] + ")"), socket, null, callback); - } - } - } - - function finish(err, socket, info, callback) { - socket.setTimeout(0, onTimeout); - if (!finished) { - finished = true; - - if (buff instanceof SmartBuffer) - buff.destroy(); - - if (err && socket instanceof net.Socket) { - socket.removeAllListeners('close'); - socket.removeAllListeners('timeout'); - socket.removeAllListeners('data'); - socket.destroy(); - socket = null; - } - - callback(err, socket, info); - } - } - - function commandFromString(str) { - var result = COMMAND.Connect; - - if (str === "connect") { - result = COMMAND.Connect; - } else if (str === 'associate') { - result = COMMAND.Associate; - } else if (str === 'bind') { - result = COMMAND.Bind; - } - - return result; - } - }; - - - exports.createUDPFrame = function (target, data, frame) { - var buff = new SmartBuffer(); - buff.writeUInt16BE(0); - buff.writeUInt8(frame || 0x00); - - if (net.isIPv4(target.host)) { - buff.writeUInt8(0x01); - buff.writeUInt32BE(ip.toLong(target.host)); - } else if (net.isIPv6(target.host)) { - buff.writeUInt8(0x04); - buff.writeBuffer(ip.toBuffer(target.host)); - } else { - buff.writeUInt8(0x03); - buff.writeUInt8(Buffer.byteLength(target.host)); - buff.writeString(target.host); - } - - buff.writeUInt16BE(target.port); - buff.writeBuffer(data); - return buff.toBuffer(); - }; -})(); diff --git a/node_modules/npm-registry-fetch/node_modules/socks/package.json b/node_modules/npm-registry-fetch/node_modules/socks/package.json deleted file mode 100644 index e4884cd472e7f..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/socks/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "_from": "socks@^1.1.10", - "_id": "socks@1.1.10", - "_inBundle": false, - "_integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", - "_location": "/npm-registry-fetch/socks", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "socks@^1.1.10", - "name": "socks", - "escapedName": "socks", - "rawSpec": "^1.1.10", - "saveSpec": null, - "fetchSpec": "^1.1.10" - }, - "_requiredBy": [ - "/npm-registry-fetch/socks-proxy-agent" - ], - "_resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", - "_shasum": "5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a", - "_spec": "socks@^1.1.10", - "_where": "/Users/rebecca/code/npm/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent", - "author": { - "name": "Josh Glazebrook" - }, - "bugs": { - "url": "https://github.com/JoshGlazebrook/socks/issues" - }, - "bundleDependencies": false, - "contributors": [ - { - "name": "Samuel Gordalina" - } - ], - "dependencies": { - "ip": "^1.1.4", - "smart-buffer": "^1.0.13" - }, - "deprecated": false, - "description": "A SOCKS proxy client supporting SOCKS 4, 4a, and 5. (also supports BIND/Associate)", - "engines": { - "node": ">= 0.10.0", - "npm": ">= 1.3.5" - }, - "homepage": "https://github.com/JoshGlazebrook/socks", - "keywords": [ - "socks", - "proxy", - "client", - "tor", - "bind", - "associate", - "socks 4", - "socks 4a", - "socks 5", - "agent" - ], - "license": "MIT", - "main": "index.js", - "name": "socks", - "repository": { - "type": "git", - "url": "git+https://github.com/JoshGlazebrook/socks.git" - }, - "version": "1.1.10" -} diff --git a/node_modules/npm-registry-fetch/node_modules/ssri/CHANGELOG.md b/node_modules/npm-registry-fetch/node_modules/ssri/CHANGELOG.md deleted file mode 100644 index 5c068948814ed..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/ssri/CHANGELOG.md +++ /dev/null @@ -1,256 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. - - -# [5.3.0](https://github.com/zkat/ssri/compare/v5.2.4...v5.3.0) (2018-03-13) - - -### Features - -* **checkData:** optionally throw when checkData fails ([bf26b84](https://github.com/zkat/ssri/commit/bf26b84)) - - - - -## [5.2.4](https://github.com/zkat/ssri/compare/v5.2.3...v5.2.4) (2018-02-16) - - - - -## [5.2.3](https://github.com/zkat/ssri/compare/v5.2.2...v5.2.3) (2018-02-16) - - -### Bug Fixes - -* **hashes:** filter hash priority list by available hashes ([2fa30b8](https://github.com/zkat/ssri/commit/2fa30b8)) -* **integrityStream:** dedupe algorithms to generate ([d56c654](https://github.com/zkat/ssri/commit/d56c654)) - - - - -## [5.2.2](https://github.com/zkat/ssri/compare/v5.2.1...v5.2.2) (2018-02-14) - - -### Bug Fixes - -* **security:** tweak strict SRI regex ([#10](https://github.com/zkat/ssri/issues/10)) ([d0ebcdc](https://github.com/zkat/ssri/commit/d0ebcdc)) - - - - -## [5.2.1](https://github.com/zkat/ssri/compare/v5.2.0...v5.2.1) (2018-02-06) - - - - -# [5.2.0](https://github.com/zkat/ssri/compare/v5.1.0...v5.2.0) (2018-02-06) - - -### Features - -* **match:** add integrity.match() ([3c49cc4](https://github.com/zkat/ssri/commit/3c49cc4)) - - - - -# [5.1.0](https://github.com/zkat/ssri/compare/v5.0.0...v5.1.0) (2018-01-18) - - -### Bug Fixes - -* **checkStream:** integrityStream now takes opts.integrity algos into account ([d262910](https://github.com/zkat/ssri/commit/d262910)) - - -### Features - -* **sha3:** do some guesswork about upcoming sha3 ([7fdd9df](https://github.com/zkat/ssri/commit/7fdd9df)) - - - - -# [5.0.0](https://github.com/zkat/ssri/compare/v4.1.6...v5.0.0) (2017-10-23) - - -### Features - -* **license:** relicense to ISC (#9) ([c82983a](https://github.com/zkat/ssri/commit/c82983a)) - - -### BREAKING CHANGES - -* **license:** the license has been changed from CC0-1.0 to ISC. - - - - -## [4.1.6](https://github.com/zkat/ssri/compare/v4.1.5...v4.1.6) (2017-06-07) - - -### Bug Fixes - -* **checkStream:** make sure to pass all opts through ([0b1bcbe](https://github.com/zkat/ssri/commit/0b1bcbe)) - - - - -## [4.1.5](https://github.com/zkat/ssri/compare/v4.1.4...v4.1.5) (2017-06-05) - - -### Bug Fixes - -* **integrityStream:** stop crashing if opts.algorithms and opts.integrity have an algo mismatch ([fb1293e](https://github.com/zkat/ssri/commit/fb1293e)) - - - - -## [4.1.4](https://github.com/zkat/ssri/compare/v4.1.3...v4.1.4) (2017-05-31) - - -### Bug Fixes - -* **node:** older versions of node[@4](https://github.com/4) do not support base64buffer string parsing ([513df4e](https://github.com/zkat/ssri/commit/513df4e)) - - - - -## [4.1.3](https://github.com/zkat/ssri/compare/v4.1.2...v4.1.3) (2017-05-24) - - -### Bug Fixes - -* **check:** handle various bad hash corner cases better ([c2c262b](https://github.com/zkat/ssri/commit/c2c262b)) - - - - -## [4.1.2](https://github.com/zkat/ssri/compare/v4.1.1...v4.1.2) (2017-04-18) - - -### Bug Fixes - -* **stream:** _flush can be called multiple times. use on("end") ([b1c4805](https://github.com/zkat/ssri/commit/b1c4805)) - - - - -## [4.1.1](https://github.com/zkat/ssri/compare/v4.1.0...v4.1.1) (2017-04-12) - - -### Bug Fixes - -* **pickAlgorithm:** error if pickAlgorithm() is used in an empty Integrity ([fab470e](https://github.com/zkat/ssri/commit/fab470e)) - - - - -# [4.1.0](https://github.com/zkat/ssri/compare/v4.0.0...v4.1.0) (2017-04-07) - - -### Features - -* adding ssri.create for a crypto style interface (#2) ([96f52ad](https://github.com/zkat/ssri/commit/96f52ad)) - - - - -# [4.0.0](https://github.com/zkat/ssri/compare/v3.0.2...v4.0.0) (2017-04-03) - - -### Bug Fixes - -* **integrity:** should have changed the error code before. oops ([8381afa](https://github.com/zkat/ssri/commit/8381afa)) - - -### BREAKING CHANGES - -* **integrity:** EBADCHECKSUM -> EINTEGRITY for verification errors - - - - -## [3.0.2](https://github.com/zkat/ssri/compare/v3.0.1...v3.0.2) (2017-04-03) - - - - -## [3.0.1](https://github.com/zkat/ssri/compare/v3.0.0...v3.0.1) (2017-04-03) - - -### Bug Fixes - -* **package.json:** really should have these in the keywords because search ([a6ac6d0](https://github.com/zkat/ssri/commit/a6ac6d0)) - - - - -# [3.0.0](https://github.com/zkat/ssri/compare/v2.0.0...v3.0.0) (2017-04-03) - - -### Bug Fixes - -* **hashes:** IntegrityMetadata -> Hash ([d04aa1f](https://github.com/zkat/ssri/commit/d04aa1f)) - - -### Features - -* **check:** return IntegrityMetadata on check success ([2301e74](https://github.com/zkat/ssri/commit/2301e74)) -* **fromHex:** ssri.fromHex to make it easier to generate them from hex valus ([049b89e](https://github.com/zkat/ssri/commit/049b89e)) -* **hex:** utility function for getting hex version of digest ([a9f021c](https://github.com/zkat/ssri/commit/a9f021c)) -* **hexDigest:** added hexDigest method to Integrity objects too ([85208ba](https://github.com/zkat/ssri/commit/85208ba)) -* **integrity:** add .isIntegrity and .isIntegrityMetadata ([1b29e6f](https://github.com/zkat/ssri/commit/1b29e6f)) -* **integrityStream:** new stream that can both generate and check streamed data ([fd23e1b](https://github.com/zkat/ssri/commit/fd23e1b)) -* **parse:** allow parsing straight into a single IntegrityMetadata object ([c8ddf48](https://github.com/zkat/ssri/commit/c8ddf48)) -* **pickAlgorithm:** Intergrity#pickAlgorithm() added ([b97a796](https://github.com/zkat/ssri/commit/b97a796)) -* **size:** calculate and update stream sizes ([02ed1ad](https://github.com/zkat/ssri/commit/02ed1ad)) - - -### BREAKING CHANGES - -* **hashes:** `.isIntegrityMetadata` is now `.isHash`. Also, any references to `IntegrityMetadata` now refer to `Hash`. -* **integrityStream:** createCheckerStream has been removed and replaced with a general-purpose integrityStream. - -To convert existing createCheckerStream code, move the `sri` argument into `opts.integrity` in integrityStream. All other options should be the same. -* **check:** `checkData`, `checkStream`, and `createCheckerStream` now yield a whole IntegrityMetadata instance representing the first successful hash match. - - - - -# [2.0.0](https://github.com/zkat/ssri/compare/v1.0.0...v2.0.0) (2017-03-24) - - -### Bug Fixes - -* **strict-mode:** make regexes more rigid ([122a32c](https://github.com/zkat/ssri/commit/122a32c)) - - -### Features - -* **api:** added serialize alias for unparse ([999b421](https://github.com/zkat/ssri/commit/999b421)) -* **concat:** add Integrity#concat() ([cae12c7](https://github.com/zkat/ssri/commit/cae12c7)) -* **pickAlgo:** pick the strongest algorithm provided, by default ([58c18f7](https://github.com/zkat/ssri/commit/58c18f7)) -* **strict-mode:** strict SRI support ([3f0b64c](https://github.com/zkat/ssri/commit/3f0b64c)) -* **stringify:** replaced unparse/serialize with stringify ([4acad30](https://github.com/zkat/ssri/commit/4acad30)) -* **verification:** add opts.pickAlgorithm ([f72e658](https://github.com/zkat/ssri/commit/f72e658)) - - -### BREAKING CHANGES - -* **pickAlgo:** ssri will prioritize specific hashes now -* **stringify:** serialize and unparse have been removed. Use ssri.stringify instead. -* **strict-mode:** functions that accepted an optional `sep` argument now expect `opts.sep`. - - - - -# 1.0.0 (2017-03-23) - - -### Features - -* **api:** implemented initial api ([4fbb16b](https://github.com/zkat/ssri/commit/4fbb16b)) - - -### BREAKING CHANGES - -* **api:** Initial API established. diff --git a/node_modules/npm-registry-fetch/node_modules/ssri/LICENSE.md b/node_modules/npm-registry-fetch/node_modules/ssri/LICENSE.md deleted file mode 100644 index 8d28acf866d93..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/ssri/LICENSE.md +++ /dev/null @@ -1,16 +0,0 @@ -ISC License - -Copyright (c) npm, Inc. - -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 COPYRIGHT HOLDER DISCLAIMS -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -COPYRIGHT HOLDER 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/node_modules/npm-registry-fetch/node_modules/ssri/README.md b/node_modules/npm-registry-fetch/node_modules/ssri/README.md deleted file mode 100644 index a6c07e7409b81..0000000000000 --- a/node_modules/npm-registry-fetch/node_modules/ssri/README.md +++ /dev/null @@ -1,488 +0,0 @@ -# ssri [![npm version](https://img.shields.io/npm/v/ssri.svg)](https://npm.im/ssri) [![license](https://img.shields.io/npm/l/ssri.svg)](https://npm.im/ssri) [![Travis](https://img.shields.io/travis/zkat/ssri.svg)](https://travis-ci.org/zkat/ssri) [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/zkat/ssri?svg=true)](https://ci.appveyor.com/project/zkat/ssri) [![Coverage Status](https://coveralls.io/repos/github/zkat/ssri/badge.svg?branch=latest)](https://coveralls.io/github/zkat/ssri?branch=latest) - -[`ssri`](https://github.com/zkat/ssri), short for Standard Subresource -Integrity, is a Node.js utility for parsing, manipulating, serializing, -generating, and verifying [Subresource -Integrity](https://w3c.github.io/webappsec/specs/subresourceintegrity/) hashes. - -## Install - -`$ npm install --save ssri` - -## Table of Contents - -* [Example](#example) -* [Features](#features) -* [Contributing](#contributing) -* [API](#api) - * Parsing & Serializing - * [`parse`](#parse) - * [`stringify`](#stringify) - * [`Integrity#concat`](#integrity-concat) - * [`Integrity#toString`](#integrity-to-string) - * [`Integrity#toJSON`](#integrity-to-json) - * [`Integrity#match`](#integrity-match) - * [`Integrity#pickAlgorithm`](#integrity-pick-algorithm) - * [`Integrity#hexDigest`](#integrity-hex-digest) - * Integrity Generation - * [`fromHex`](#from-hex) - * [`fromData`](#from-data) - * [`fromStream`](#from-stream) - * [`create`](#create) - * Integrity Verification - * [`checkData`](#check-data) - * [`checkStream`](#check-stream) - * [`integrityStream`](#integrity-stream) - -### Example - -```javascript -const ssri = require('ssri') - -const integrity = 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo' - -// Parsing and serializing -const parsed = ssri.parse(integrity) -ssri.stringify(parsed) // === integrity (works on non-Integrity objects) -parsed.toString() // === integrity - -// Async stream functions -ssri.checkStream(fs.createReadStream('./my-file'), integrity).then(...) -ssri.fromStream(fs.createReadStream('./my-file')).then(sri => { - sri.toString() === integrity -}) -fs.createReadStream('./my-file').pipe(ssri.createCheckerStream(sri)) - -// Sync data functions -ssri.fromData(fs.readFileSync('./my-file')) // === parsed -ssri.checkData(fs.readFileSync('./my-file'), integrity) // => 'sha512' -``` - -### Features - -* Parses and stringifies SRI strings. -* Generates SRI strings from raw data or Streams. -* Strict standard compliance. -* `?foo` metadata option support. -* Multiple entries for the same algorithm. -* Object-based integrity hash manipulation. -* Small footprint: no dependencies, concise implementation. -* Full test coverage. -* Customizable algorithm picker. - -### Contributing - -The ssri team enthusiastically welcomes contributions and project participation! -There's a bunch of things you can do if you want to contribute! The [Contributor -Guide](CONTRIBUTING.md) has all the information you need for everything from -reporting bugs to contributing entire new features. Please don't hesitate to -jump in if you'd like to, or even ask us questions if something isn't clear. - -### API - -#### `> ssri.parse(sri, [opts]) -> Integrity` - -Parses `sri` into an `Integrity` data structure. `sri` can be an integrity -string, an `Hash`-like with `digest` and `algorithm` fields and an optional -`options` field, or an `Integrity`-like object. The resulting object will be an -`Integrity` instance that has this shape: - -```javascript -{ - 'sha1': [{algorithm: 'sha1', digest: 'deadbeef', options: []}], - 'sha512': [ - {algorithm: 'sha512', digest: 'c0ffee', options: []}, - {algorithm: 'sha512', digest: 'bad1dea', options: ['foo']} - ], -} -``` - -If `opts.single` is truthy, a single `Hash` object will be returned. That is, a -single object that looks like `{algorithm, digest, options}`, as opposed to a -larger object with multiple of these. - -If `opts.strict` is truthy, the resulting object will be filtered such that -it strictly follows the Subresource Integrity spec, throwing away any entries -with any invalid components. This also means a restricted set of algorithms -will be used -- the spec limits them to `sha256`, `sha384`, and `sha512`. - -Strict mode is recommended if the integrity strings are intended for use in -browsers, or in other situations where strict adherence to the spec is needed. - -##### Example - -```javascript -ssri.parse('sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo') // -> Integrity object -``` - -#### `> ssri.stringify(sri, [opts]) -> String` - -This function is identical to [`Integrity#toString()`](#integrity-to-string), -except it can be used on _any_ object that [`parse`](#parse) can handle -- that -is, a string, an `Hash`-like, or an `Integrity`-like. - -The `opts.sep` option defines the string to use when joining multiple entries -together. To be spec-compliant, this _must_ be whitespace. The default is a -single space (`' '`). - -If `opts.strict` is true, the integrity string will be created using strict -parsing rules. See [`ssri.parse`](#parse). - -##### Example - -```javascript -// Useful for cleaning up input SRI strings: -ssri.stringify('\n\rsha512-foo\n\t\tsha384-bar') -// -> 'sha512-foo sha384-bar' - -// Hash-like: only a single entry. -ssri.stringify({ - algorithm: 'sha512', - digest:'9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==', - options: ['foo'] -}) -// -> -// 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo' - -// Integrity-like: full multi-entry syntax. Similar to output of `ssri.parse` -ssri.stringify({ - 'sha512': [ - { - algorithm: 'sha512', - digest:'9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==', - options: ['foo'] - } - ] -}) -// -> -// 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo' -``` - -#### `> Integrity#concat(otherIntegrity, [opts]) -> Integrity` - -Concatenates an `Integrity` object with another IntegrityLike, or an integrity -string. - -This is functionally equivalent to concatenating the string format of both -integrity arguments, and calling [`ssri.parse`](#ssri-parse) on the new string. - -If `opts.strict` is true, the new `Integrity` will be created using strict -parsing rules. See [`ssri.parse`](#parse). - -##### Example - -```javascript -// This will combine the integrity checks for two different versions of -// your index.js file so you can use a single integrity string and serve -// either of these to clients, from a single ` + + + + diff --git a/node_modules/pacote/node_modules/unique-filename/coverage/__root__/index.js.html b/node_modules/pacote/node_modules/unique-filename/coverage/__root__/index.js.html new file mode 100644 index 0000000000000..02e5768d3fb64 --- /dev/null +++ b/node_modules/pacote/node_modules/unique-filename/coverage/__root__/index.js.html @@ -0,0 +1,69 @@ + + + + Code coverage report for index.js + + + + + + +
+

Code coverage report for index.js

+

+ Statements: 100% (4 / 4)      + Branches: 100% (2 / 2)      + Functions: 100% (1 / 1)      + Lines: 100% (4 / 4)      + Ignored: none      +

+
All files » __root__/ » index.js
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9  +1 +  +1 +  +1 +6 +  + 
'use strict'
+var path = require('path')
+ 
+var uniqueSlug = require('unique-slug')
+ 
+module.exports = function (filepath, prefix, uniq) {
+  return path.join(filepath, (prefix ? prefix + '-' : '') + uniqueSlug(uniq))
+}
+ 
+ +
+ + + + + + diff --git a/node_modules/pacote/node_modules/unique-filename/coverage/base.css b/node_modules/pacote/node_modules/unique-filename/coverage/base.css new file mode 100644 index 0000000000000..a6a2f3284d022 --- /dev/null +++ b/node_modules/pacote/node_modules/unique-filename/coverage/base.css @@ -0,0 +1,182 @@ +body, html { + margin:0; padding: 0; +} +body { + font-family: Helvetica Neue, Helvetica,Arial; + font-size: 10pt; +} +div.header, div.footer { + background: #eee; + padding: 1em; +} +div.header { + z-index: 100; + position: fixed; + top: 0; + border-bottom: 1px solid #666; + width: 100%; +} +div.footer { + border-top: 1px solid #666; +} +div.body { + margin-top: 10em; +} +div.meta { + font-size: 90%; + text-align: center; +} +h1, h2, h3 { + font-weight: normal; +} +h1 { + font-size: 12pt; +} +h2 { + font-size: 10pt; +} +pre { + font-family: Consolas, Menlo, Monaco, monospace; + margin: 0; + padding: 0; + line-height: 1.3; + font-size: 14px; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} + +div.path { font-size: 110%; } +div.path a:link, div.path a:visited { color: #000; } +table.coverage { border-collapse: collapse; margin:0; padding: 0 } + +table.coverage td { + margin: 0; + padding: 0; + color: #111; + vertical-align: top; +} +table.coverage td.line-count { + width: 50px; + text-align: right; + padding-right: 5px; +} +table.coverage td.line-coverage { + color: #777 !important; + text-align: right; + border-left: 1px solid #666; + border-right: 1px solid #666; +} + +table.coverage td.text { +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 40px; +} +table.coverage td span.cline-neutral { + background: #eee; +} +table.coverage td span.cline-yes { + background: #b5d592; + color: #999; +} +table.coverage td span.cline-no { + background: #fc8c84; +} + +.cstat-yes { color: #111; } +.cstat-no { background: #fc8c84; color: #111; } +.fstat-no { background: #ffc520; color: #111 !important; } +.cbranch-no { background: yellow !important; color: #111; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +.missing-if-branch { + display: inline-block; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: black; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} + +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} + +.entity, .metric { font-weight: bold; } +.metric { display: inline-block; border: 1px solid #333; padding: 0.3em; background: white; } +.metric small { font-size: 80%; font-weight: normal; color: #666; } + +div.coverage-summary table { border-collapse: collapse; margin: 3em; font-size: 110%; } +div.coverage-summary td, div.coverage-summary table th { margin: 0; padding: 0.25em 1em; border-top: 1px solid #666; border-bottom: 1px solid #666; } +div.coverage-summary th { text-align: left; border: 1px solid #666; background: #eee; font-weight: normal; } +div.coverage-summary th.file { border-right: none !important; } +div.coverage-summary th.pic { border-left: none !important; text-align: right; } +div.coverage-summary th.pct { border-right: none !important; } +div.coverage-summary th.abs { border-left: none !important; text-align: right; } +div.coverage-summary td.pct { text-align: right; border-left: 1px solid #666; } +div.coverage-summary td.abs { text-align: right; font-size: 90%; color: #444; border-right: 1px solid #666; } +div.coverage-summary td.file { border-left: 1px solid #666; white-space: nowrap; } +div.coverage-summary td.pic { min-width: 120px !important; } +div.coverage-summary a:link { text-decoration: none; color: #000; } +div.coverage-summary a:visited { text-decoration: none; color: #777; } +div.coverage-summary a:hover { text-decoration: underline; } +div.coverage-summary tfoot td { border-top: 1px solid #666; } + +div.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +div.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +div.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} + +.high { background: #b5d592 !important; } +.medium { background: #ffe87c !important; } +.low { background: #fc8c84 !important; } + +span.cover-fill, span.cover-empty { + display:inline-block; + border:1px solid #444; + background: white; + height: 12px; +} +span.cover-fill { + background: #ccc; + border-right: 1px solid #444; +} +span.cover-empty { + background: white; + border-left: none; +} +span.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } diff --git a/node_modules/pacote/node_modules/unique-filename/coverage/index.html b/node_modules/pacote/node_modules/unique-filename/coverage/index.html new file mode 100644 index 0000000000000..b10d186cc3978 --- /dev/null +++ b/node_modules/pacote/node_modules/unique-filename/coverage/index.html @@ -0,0 +1,73 @@ + + + + Code coverage report for All files + + + + + + +
+

Code coverage report for All files

+

+ Statements: 100% (4 / 4)      + Branches: 100% (2 / 2)      + Functions: 100% (1 / 1)      + Lines: 100% (4 / 4)      + Ignored: none      +

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
__root__/100%(4 / 4)100%(2 / 2)100%(1 / 1)100%(4 / 4)
+
+
+ + + + + + diff --git a/node_modules/pacote/node_modules/unique-filename/coverage/prettify.css b/node_modules/pacote/node_modules/unique-filename/coverage/prettify.css new file mode 100644 index 0000000000000..b317a7cda31a4 --- /dev/null +++ b/node_modules/pacote/node_modules/unique-filename/coverage/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/node_modules/pacote/node_modules/unique-filename/coverage/prettify.js b/node_modules/pacote/node_modules/unique-filename/coverage/prettify.js new file mode 100644 index 0000000000000..ef51e03866898 --- /dev/null +++ b/node_modules/pacote/node_modules/unique-filename/coverage/prettify.js @@ -0,0 +1 @@ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/node_modules/pacote/node_modules/unique-filename/coverage/sort-arrow-sprite.png b/node_modules/pacote/node_modules/unique-filename/coverage/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..03f704a609c6fd0dbfdac63466a7d7c958b5cbf3 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jii$m5978H@?Fn+^JD|Y9yzj{W`447Gxa{7*dM7nnnD-Lb z6^}Hx2)'; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function (a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function (a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function () { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i =0 ; i < cols.length; i += 1) { + if (cols[i].sortable) { + el = getNthColumn(i).querySelector('.sorter'); + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function () { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(cols); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/node_modules/pacote/node_modules/unique-filename/index.js b/node_modules/pacote/node_modules/unique-filename/index.js new file mode 100644 index 0000000000000..02bf1e273143c --- /dev/null +++ b/node_modules/pacote/node_modules/unique-filename/index.js @@ -0,0 +1,8 @@ +'use strict' +var path = require('path') + +var uniqueSlug = require('unique-slug') + +module.exports = function (filepath, prefix, uniq) { + return path.join(filepath, (prefix ? prefix + '-' : '') + uniqueSlug(uniq)) +} diff --git a/node_modules/pacote/node_modules/unique-filename/package.json b/node_modules/pacote/node_modules/unique-filename/package.json new file mode 100644 index 0000000000000..5778e9c213575 --- /dev/null +++ b/node_modules/pacote/node_modules/unique-filename/package.json @@ -0,0 +1,56 @@ +{ + "_from": "unique-filename@^1.1.1", + "_id": "unique-filename@1.1.1", + "_inBundle": false, + "_integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "_location": "/pacote/unique-filename", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "unique-filename@^1.1.1", + "name": "unique-filename", + "escapedName": "unique-filename", + "rawSpec": "^1.1.1", + "saveSpec": null, + "fetchSpec": "^1.1.1" + }, + "_requiredBy": [ + "/pacote" + ], + "_resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "_shasum": "1d69769369ada0583103a1e6ae87681b56573230", + "_spec": "unique-filename@^1.1.1", + "_where": "/Users/zkat/Documents/code/work/npm/node_modules/pacote", + "author": { + "name": "Rebecca Turner", + "email": "me@re-becca.org", + "url": "http://re-becca.org/" + }, + "bugs": { + "url": "https://github.com/iarna/unique-filename/issues" + }, + "bundleDependencies": false, + "dependencies": { + "unique-slug": "^2.0.0" + }, + "deprecated": false, + "description": "Generate a unique filename for use in temporary directories or caches.", + "devDependencies": { + "standard": "^5.4.1", + "tap": "^2.3.1" + }, + "homepage": "https://github.com/iarna/unique-filename", + "keywords": [], + "license": "ISC", + "main": "index.js", + "name": "unique-filename", + "repository": { + "type": "git", + "url": "git+https://github.com/iarna/unique-filename.git" + }, + "scripts": { + "test": "standard && tap test" + }, + "version": "1.1.1" +} diff --git a/node_modules/pacote/node_modules/unique-filename/test/index.js b/node_modules/pacote/node_modules/unique-filename/test/index.js new file mode 100644 index 0000000000000..105b4e52e8b40 --- /dev/null +++ b/node_modules/pacote/node_modules/unique-filename/test/index.js @@ -0,0 +1,23 @@ +'sue strict' +var t = require('tap') +var uniqueFilename = require('../index.js') + +t.plan(6) + +var randomTmpfile = uniqueFilename('tmp') +t.like(randomTmpfile, /^tmp.[a-f0-9]{8}$/, 'random tmp file') + +var randomAgain = uniqueFilename('tmp') +t.notEqual(randomAgain, randomTmpfile, 'random tmp files are not the same') + +var randomPrefixedTmpfile = uniqueFilename('tmp', 'my-test') +t.like(randomPrefixedTmpfile, /^tmp.my-test-[a-f0-9]{8}$/, 'random prefixed tmp file') + +var randomPrefixedAgain = uniqueFilename('tmp', 'my-test') +t.notEqual(randomPrefixedAgain, randomPrefixedTmpfile, 'random prefixed tmp files are not the same') + +var uniqueTmpfile = uniqueFilename('tmp', 'testing', '/my/thing/to/uniq/on') +t.like(uniqueTmpfile, /^tmp.testing-7ddd44c0$/, 'unique filename') + +var uniqueAgain = uniqueFilename('tmp', 'testing', '/my/thing/to/uniq/on') +t.is(uniqueTmpfile, uniqueAgain, 'same unique string component produces same filename') diff --git a/node_modules/pacote/node_modules/yallist/LICENSE b/node_modules/pacote/node_modules/yallist/LICENSE new file mode 100644 index 0000000000000..19129e315fe59 --- /dev/null +++ b/node_modules/pacote/node_modules/yallist/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/node_modules/pacote/node_modules/yallist/README.md b/node_modules/pacote/node_modules/yallist/README.md new file mode 100644 index 0000000000000..f586101869668 --- /dev/null +++ b/node_modules/pacote/node_modules/yallist/README.md @@ -0,0 +1,204 @@ +# yallist + +Yet Another Linked List + +There are many doubly-linked list implementations like it, but this +one is mine. + +For when an array would be too big, and a Map can't be iterated in +reverse order. + + +[![Build Status](https://travis-ci.org/isaacs/yallist.svg?branch=master)](https://travis-ci.org/isaacs/yallist) [![Coverage Status](https://coveralls.io/repos/isaacs/yallist/badge.svg?service=github)](https://coveralls.io/github/isaacs/yallist) + +## basic usage + +```javascript +var yallist = require('yallist') +var myList = yallist.create([1, 2, 3]) +myList.push('foo') +myList.unshift('bar') +// of course pop() and shift() are there, too +console.log(myList.toArray()) // ['bar', 1, 2, 3, 'foo'] +myList.forEach(function (k) { + // walk the list head to tail +}) +myList.forEachReverse(function (k, index, list) { + // walk the list tail to head +}) +var myDoubledList = myList.map(function (k) { + return k + k +}) +// now myDoubledList contains ['barbar', 2, 4, 6, 'foofoo'] +// mapReverse is also a thing +var myDoubledListReverse = myList.mapReverse(function (k) { + return k + k +}) // ['foofoo', 6, 4, 2, 'barbar'] + +var reduced = myList.reduce(function (set, entry) { + set += entry + return set +}, 'start') +console.log(reduced) // 'startfoo123bar' +``` + +## api + +The whole API is considered "public". + +Functions with the same name as an Array method work more or less the +same way. + +There's reverse versions of most things because that's the point. + +### Yallist + +Default export, the class that holds and manages a list. + +Call it with either a forEach-able (like an array) or a set of +arguments, to initialize the list. + +The Array-ish methods all act like you'd expect. No magic length, +though, so if you change that it won't automatically prune or add +empty spots. + +### Yallist.create(..) + +Alias for Yallist function. Some people like factories. + +#### yallist.head + +The first node in the list + +#### yallist.tail + +The last node in the list + +#### yallist.length + +The number of nodes in the list. (Change this at your peril. It is +not magic like Array length.) + +#### yallist.toArray() + +Convert the list to an array. + +#### yallist.forEach(fn, [thisp]) + +Call a function on each item in the list. + +#### yallist.forEachReverse(fn, [thisp]) + +Call a function on each item in the list, in reverse order. + +#### yallist.get(n) + +Get the data at position `n` in the list. If you use this a lot, +probably better off just using an Array. + +#### yallist.getReverse(n) + +Get the data at position `n`, counting from the tail. + +#### yallist.map(fn, thisp) + +Create a new Yallist with the result of calling the function on each +item. + +#### yallist.mapReverse(fn, thisp) + +Same as `map`, but in reverse. + +#### yallist.pop() + +Get the data from the list tail, and remove the tail from the list. + +#### yallist.push(item, ...) + +Insert one or more items to the tail of the list. + +#### yallist.reduce(fn, initialValue) + +Like Array.reduce. + +#### yallist.reduceReverse + +Like Array.reduce, but in reverse. + +#### yallist.reverse + +Reverse the list in place. + +#### yallist.shift() + +Get the data from the list head, and remove the head from the list. + +#### yallist.slice([from], [to]) + +Just like Array.slice, but returns a new Yallist. + +#### yallist.sliceReverse([from], [to]) + +Just like yallist.slice, but the result is returned in reverse. + +#### yallist.toArray() + +Create an array representation of the list. + +#### yallist.toArrayReverse() + +Create a reversed array representation of the list. + +#### yallist.unshift(item, ...) + +Insert one or more items to the head of the list. + +#### yallist.unshiftNode(node) + +Move a Node object to the front of the list. (That is, pull it out of +wherever it lives, and make it the new head.) + +If the node belongs to a different list, then that list will remove it +first. + +#### yallist.pushNode(node) + +Move a Node object to the end of the list. (That is, pull it out of +wherever it lives, and make it the new tail.) + +If the node belongs to a list already, then that list will remove it +first. + +#### yallist.removeNode(node) + +Remove a node from the list, preserving referential integrity of head +and tail and other nodes. + +Will throw an error if you try to have a list remove a node that +doesn't belong to it. + +### Yallist.Node + +The class that holds the data and is actually the list. + +Call with `var n = new Node(value, previousNode, nextNode)` + +Note that if you do direct operations on Nodes themselves, it's very +easy to get into weird states where the list is broken. Be careful :) + +#### node.next + +The next node in the list. + +#### node.prev + +The previous node in the list. + +#### node.value + +The data the node contains. + +#### node.list + +The list to which this node belongs. (Null if it does not belong to +any list.) diff --git a/node_modules/pacote/node_modules/yallist/iterator.js b/node_modules/pacote/node_modules/yallist/iterator.js new file mode 100644 index 0000000000000..d41c97a19f984 --- /dev/null +++ b/node_modules/pacote/node_modules/yallist/iterator.js @@ -0,0 +1,8 @@ +'use strict' +module.exports = function (Yallist) { + Yallist.prototype[Symbol.iterator] = function* () { + for (let walker = this.head; walker; walker = walker.next) { + yield walker.value + } + } +} diff --git a/node_modules/pacote/node_modules/yallist/package.json b/node_modules/pacote/node_modules/yallist/package.json new file mode 100644 index 0000000000000..9dd5bf96b017c --- /dev/null +++ b/node_modules/pacote/node_modules/yallist/package.json @@ -0,0 +1,62 @@ +{ + "_from": "yallist@^3.0.0", + "_id": "yallist@3.0.3", + "_inBundle": false, + "_integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "_location": "/pacote/yallist", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "yallist@^3.0.0", + "name": "yallist", + "escapedName": "yallist", + "rawSpec": "^3.0.0", + "saveSpec": null, + "fetchSpec": "^3.0.0" + }, + "_requiredBy": [ + "/pacote/minipass" + ], + "_resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "_shasum": "b4b049e314be545e3ce802236d6cd22cd91c3de9", + "_spec": "yallist@^3.0.0", + "_where": "/Users/zkat/Documents/code/work/npm/node_modules/pacote/node_modules/minipass", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/isaacs/yallist/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "Yet Another Linked List", + "devDependencies": { + "tap": "^12.1.0" + }, + "directories": { + "test": "test" + }, + "files": [ + "yallist.js", + "iterator.js" + ], + "homepage": "https://github.com/isaacs/yallist#readme", + "license": "ISC", + "main": "yallist.js", + "name": "yallist", + "repository": { + "type": "git", + "url": "git+https://github.com/isaacs/yallist.git" + }, + "scripts": { + "postpublish": "git push origin --all; git push origin --tags", + "postversion": "npm publish", + "preversion": "npm test", + "test": "tap test/*.js --100" + }, + "version": "3.0.3" +} diff --git a/node_modules/pacote/node_modules/yallist/yallist.js b/node_modules/pacote/node_modules/yallist/yallist.js new file mode 100644 index 0000000000000..b0ab36cf31b7a --- /dev/null +++ b/node_modules/pacote/node_modules/yallist/yallist.js @@ -0,0 +1,376 @@ +'use strict' +module.exports = Yallist + +Yallist.Node = Node +Yallist.create = Yallist + +function Yallist (list) { + var self = this + if (!(self instanceof Yallist)) { + self = new Yallist() + } + + self.tail = null + self.head = null + self.length = 0 + + if (list && typeof list.forEach === 'function') { + list.forEach(function (item) { + self.push(item) + }) + } else if (arguments.length > 0) { + for (var i = 0, l = arguments.length; i < l; i++) { + self.push(arguments[i]) + } + } + + return self +} + +Yallist.prototype.removeNode = function (node) { + if (node.list !== this) { + throw new Error('removing node which does not belong to this list') + } + + var next = node.next + var prev = node.prev + + if (next) { + next.prev = prev + } + + if (prev) { + prev.next = next + } + + if (node === this.head) { + this.head = next + } + if (node === this.tail) { + this.tail = prev + } + + node.list.length-- + node.next = null + node.prev = null + node.list = null +} + +Yallist.prototype.unshiftNode = function (node) { + if (node === this.head) { + return + } + + if (node.list) { + node.list.removeNode(node) + } + + var head = this.head + node.list = this + node.next = head + if (head) { + head.prev = node + } + + this.head = node + if (!this.tail) { + this.tail = node + } + this.length++ +} + +Yallist.prototype.pushNode = function (node) { + if (node === this.tail) { + return + } + + if (node.list) { + node.list.removeNode(node) + } + + var tail = this.tail + node.list = this + node.prev = tail + if (tail) { + tail.next = node + } + + this.tail = node + if (!this.head) { + this.head = node + } + this.length++ +} + +Yallist.prototype.push = function () { + for (var i = 0, l = arguments.length; i < l; i++) { + push(this, arguments[i]) + } + return this.length +} + +Yallist.prototype.unshift = function () { + for (var i = 0, l = arguments.length; i < l; i++) { + unshift(this, arguments[i]) + } + return this.length +} + +Yallist.prototype.pop = function () { + if (!this.tail) { + return undefined + } + + var res = this.tail.value + this.tail = this.tail.prev + if (this.tail) { + this.tail.next = null + } else { + this.head = null + } + this.length-- + return res +} + +Yallist.prototype.shift = function () { + if (!this.head) { + return undefined + } + + var res = this.head.value + this.head = this.head.next + if (this.head) { + this.head.prev = null + } else { + this.tail = null + } + this.length-- + return res +} + +Yallist.prototype.forEach = function (fn, thisp) { + thisp = thisp || this + for (var walker = this.head, i = 0; walker !== null; i++) { + fn.call(thisp, walker.value, i, this) + walker = walker.next + } +} + +Yallist.prototype.forEachReverse = function (fn, thisp) { + thisp = thisp || this + for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { + fn.call(thisp, walker.value, i, this) + walker = walker.prev + } +} + +Yallist.prototype.get = function (n) { + for (var i = 0, walker = this.head; walker !== null && i < n; i++) { + // abort out of the list early if we hit a cycle + walker = walker.next + } + if (i === n && walker !== null) { + return walker.value + } +} + +Yallist.prototype.getReverse = function (n) { + for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { + // abort out of the list early if we hit a cycle + walker = walker.prev + } + if (i === n && walker !== null) { + return walker.value + } +} + +Yallist.prototype.map = function (fn, thisp) { + thisp = thisp || this + var res = new Yallist() + for (var walker = this.head; walker !== null;) { + res.push(fn.call(thisp, walker.value, this)) + walker = walker.next + } + return res +} + +Yallist.prototype.mapReverse = function (fn, thisp) { + thisp = thisp || this + var res = new Yallist() + for (var walker = this.tail; walker !== null;) { + res.push(fn.call(thisp, walker.value, this)) + walker = walker.prev + } + return res +} + +Yallist.prototype.reduce = function (fn, initial) { + var acc + var walker = this.head + if (arguments.length > 1) { + acc = initial + } else if (this.head) { + walker = this.head.next + acc = this.head.value + } else { + throw new TypeError('Reduce of empty list with no initial value') + } + + for (var i = 0; walker !== null; i++) { + acc = fn(acc, walker.value, i) + walker = walker.next + } + + return acc +} + +Yallist.prototype.reduceReverse = function (fn, initial) { + var acc + var walker = this.tail + if (arguments.length > 1) { + acc = initial + } else if (this.tail) { + walker = this.tail.prev + acc = this.tail.value + } else { + throw new TypeError('Reduce of empty list with no initial value') + } + + for (var i = this.length - 1; walker !== null; i--) { + acc = fn(acc, walker.value, i) + walker = walker.prev + } + + return acc +} + +Yallist.prototype.toArray = function () { + var arr = new Array(this.length) + for (var i = 0, walker = this.head; walker !== null; i++) { + arr[i] = walker.value + walker = walker.next + } + return arr +} + +Yallist.prototype.toArrayReverse = function () { + var arr = new Array(this.length) + for (var i = 0, walker = this.tail; walker !== null; i++) { + arr[i] = walker.value + walker = walker.prev + } + return arr +} + +Yallist.prototype.slice = function (from, to) { + to = to || this.length + if (to < 0) { + to += this.length + } + from = from || 0 + if (from < 0) { + from += this.length + } + var ret = new Yallist() + if (to < from || to < 0) { + return ret + } + if (from < 0) { + from = 0 + } + if (to > this.length) { + to = this.length + } + for (var i = 0, walker = this.head; walker !== null && i < from; i++) { + walker = walker.next + } + for (; walker !== null && i < to; i++, walker = walker.next) { + ret.push(walker.value) + } + return ret +} + +Yallist.prototype.sliceReverse = function (from, to) { + to = to || this.length + if (to < 0) { + to += this.length + } + from = from || 0 + if (from < 0) { + from += this.length + } + var ret = new Yallist() + if (to < from || to < 0) { + return ret + } + if (from < 0) { + from = 0 + } + if (to > this.length) { + to = this.length + } + for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { + walker = walker.prev + } + for (; walker !== null && i > from; i--, walker = walker.prev) { + ret.push(walker.value) + } + return ret +} + +Yallist.prototype.reverse = function () { + var head = this.head + var tail = this.tail + for (var walker = head; walker !== null; walker = walker.prev) { + var p = walker.prev + walker.prev = walker.next + walker.next = p + } + this.head = tail + this.tail = head + return this +} + +function push (self, item) { + self.tail = new Node(item, self.tail, null, self) + if (!self.head) { + self.head = self.tail + } + self.length++ +} + +function unshift (self, item) { + self.head = new Node(item, null, self.head, self) + if (!self.tail) { + self.tail = self.head + } + self.length++ +} + +function Node (value, prev, next, list) { + if (!(this instanceof Node)) { + return new Node(value, prev, next, list) + } + + this.list = list + this.value = value + + if (prev) { + prev.next = this + this.prev = prev + } else { + this.prev = null + } + + if (next) { + next.prev = this + this.next = next + } else { + this.next = null + } +} + +try { + // add if support for Symbol.iterator is present + require('./iterator.js')(Yallist) +} catch (er) {} diff --git a/node_modules/pacote/package.json b/node_modules/pacote/package.json index 6f7e4cc4583e9..1df323dd3621d 100644 --- a/node_modules/pacote/package.json +++ b/node_modules/pacote/package.json @@ -1,10 +1,15 @@ { "_from": "pacote@latest", - "_id": "pacote@9.1.0", + "_id": "pacote@9.2.3", "_inBundle": false, - "_integrity": "sha512-AFXaSWhOtQf3jHqEvg+ZYH/dfT8TKq6TKspJ4qEFwVVuh5aGvMIk6SNF8vqfzz+cBceDIs9drOcpBbrPai7i+g==", + "_integrity": "sha512-Y3+yY3nBRAxMlZWvr62XLJxOwCmG9UmkGZkFurWHoCjqF0cZL72cTOCRJTvWw8T4OhJS2RTg13x4oYYriauvEw==", "_location": "/pacote", - "_phantomChildren": {}, + "_phantomChildren": { + "figgy-pudding": "3.5.1", + "npm-package-arg": "6.1.0", + "safe-buffer": "5.1.2", + "unique-slug": "2.0.0" + }, "_requested": { "type": "tag", "registry": true, @@ -17,10 +22,11 @@ }, "_requiredBy": [ "#USER", - "/" + "/", + "/libcipm" ], - "_resolved": "https://registry.npmjs.org/pacote/-/pacote-9.1.0.tgz", - "_shasum": "59810859bbd72984dcb267269259375d32f391e5", + "_resolved": "https://registry.npmjs.org/pacote/-/pacote-9.2.3.tgz", + "_shasum": "48cfe87beb9177acd6594355a584a538835424b3", "_spec": "pacote@latest", "_where": "/Users/zkat/Documents/code/work/npm", "author": { @@ -42,46 +48,46 @@ } ], "dependencies": { - "bluebird": "^3.5.1", - "cacache": "^11.0.2", - "figgy-pudding": "^3.2.1", - "get-stream": "^3.0.0", - "glob": "^7.1.2", + "bluebird": "^3.5.2", + "cacache": "^11.2.0", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", "lru-cache": "^4.1.3", "make-fetch-happen": "^4.0.1", "minimatch": "^3.0.4", - "minipass": "^2.3.3", + "minipass": "^2.3.5", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "normalize-package-data": "^2.4.0", "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.10", - "npm-pick-manifest": "^2.1.0", - "npm-registry-fetch": "^3.0.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^3.8.0", "osenv": "^0.1.5", "promise-inflight": "^1.0.1", "promise-retry": "^1.1.1", - "protoduck": "^5.0.0", + "protoduck": "^5.0.1", "rimraf": "^2.6.2", "safe-buffer": "^5.1.2", - "semver": "^5.5.0", - "ssri": "^6.0.0", - "tar": "^4.4.3", - "unique-filename": "^1.1.0", - "which": "^1.3.0" + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.6", + "unique-filename": "^1.1.1", + "which": "^1.3.1" }, "deprecated": false, "description": "JavaScript package downloader", "devDependencies": { - "nock": "^9.2.6", + "nock": "^10.0.1", "npmlog": "^4.1.2", - "nyc": "^11.8.0", + "nyc": "^13.1.0", "require-inject": "^1.4.3", - "standard": "^11.0.1", + "standard": "^12.0.1", "standard-version": "^4.4.0", - "tacks": "^1.2.6", + "tacks": "^1.2.7", "tap": "^12.0.1", - "tar-stream": "^1.6.1", + "tar-stream": "^1.6.2", "weallbehave": "^1.2.0", "weallcontribute": "^1.0.7" }, @@ -112,5 +118,5 @@ "update-coc": "weallbehave -o . && git add CODE_OF_CONDUCT.md && git commit -m 'docs(coc): updated CODE_OF_CONDUCT.md'", "update-contrib": "weallcontribute -o . && git add CONTRIBUTING.md && git commit -m 'docs(contributing): updated CONTRIBUTING.md'" }, - "version": "9.1.0" + "version": "9.2.3" } diff --git a/node_modules/pacote/packument.js b/node_modules/pacote/packument.js index dbeaa8335f717..0606b266f972a 100644 --- a/node_modules/pacote/packument.js +++ b/node_modules/pacote/packument.js @@ -23,7 +23,7 @@ function packument (spec, opts) { return fetchPackument(spec, opts) }).then(p => { const elapsedTime = Date.now() - startTime - opts.log.silly('pacote', `${spec.type} packument for ${spec.name}@${spec.saveSpec || spec.fetchSpec} fetched in ${elapsedTime}ms`) + opts.log.silly('pacote', `${spec.registry ? 'registry' : spec.type} packument for ${spec.name}@${spec.saveSpec || spec.fetchSpec} fetched in ${elapsedTime}ms`) return p }) } diff --git a/node_modules/pacote/prefetch.js b/node_modules/pacote/prefetch.js index d17725993f9de..9e6b5af12d727 100644 --- a/node_modules/pacote/prefetch.js +++ b/node_modules/pacote/prefetch.js @@ -15,7 +15,7 @@ function prefetch (spec, opts) { const startTime = Date.now() if (!opts.cache) { opts.log.info('prefetch', 'skipping prefetch: no cache provided') - return BB.resolve({spec}) + return BB.resolve({ spec }) } if (opts.integrity && !opts.preferOnline) { opts.log.silly('prefetch', 'checking if', opts.integrity, 'is already cached') diff --git a/node_modules/protoduck/CHANGELOG.md b/node_modules/protoduck/CHANGELOG.md index dd7669aa13e2f..f4902ab2d0267 100644 --- a/node_modules/protoduck/CHANGELOG.md +++ b/node_modules/protoduck/CHANGELOG.md @@ -2,6 +2,17 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [5.0.1](https://github.com/zkat/protoduck/compare/v5.0.0...v5.0.1) (2018-10-26) + + +### Bug Fixes + +* **security:** npm audit fix ([55a2007](https://github.com/zkat/protoduck/commit/55a2007)) +* **standard:** standard --fix ([2dedbb8](https://github.com/zkat/protoduck/commit/2dedbb8)) + + + # [5.0.0](https://github.com/zkat/protoduck/compare/v4.0.0...v5.0.0) (2017-12-12) diff --git a/node_modules/protoduck/index.js b/node_modules/protoduck/index.js index 3596bb3299d5c..b6a83e1f79012 100644 --- a/node_modules/protoduck/index.js +++ b/node_modules/protoduck/index.js @@ -52,8 +52,8 @@ class Duck extends Function { gf = arg[fns[i]] if (!gf || (gf.hasMethod - ? !gf.hasMethod.apply(gf, args) - : typeof gf === 'function')) { + ? !gf.hasMethod.apply(gf, args) + : typeof gf === 'function')) { return false } } @@ -81,7 +81,7 @@ Duck.prototype.isProtocol = true const Protoduck = module.exports = define(['duck'], { createGenfun: ['duck', _metaCreateGenfun], addMethod: ['duck', _metaAddMethod] -}, {name: 'Protoduck'}) +}, { name: 'Protoduck' }) const noImplFound = module.exports.noImplFound = genfun.noApplicableMethod @@ -168,22 +168,22 @@ function defineMethod (duck, name, target, types, impls) { if (!Object.prototype.hasOwnProperty.call(target, name)) { // Make a genfun if there's nothing there const gf = useMetaobject - ? duck._metaobject.createGenfun(duck, target, name, null) - : _metaCreateGenfun(duck, target, name, null) + ? duck._metaobject.createGenfun(duck, target, name, null) + : _metaCreateGenfun(duck, target, name, null) target[name] = gf } else if (typeof target[name] === 'function' && !target[name].isGenfun) { // Turn non-gf functions into genfuns const gf = useMetaobject - ? duck._metaobject.createGenfun(duck, target, name, target[name]) - : _metaCreateGenfun(duck, target, name, target[name]) + ? duck._metaobject.createGenfun(duck, target, name, target[name]) + : _metaCreateGenfun(duck, target, name, target[name]) target[name] = gf } const fn = impls[name] || duck._defaultImpls[name] if (fn) { // checkImpls made sure this is safe useMetaobject - ? duck._metaobject.addMethod(duck, target, name, methodTypes, fn) - : _metaAddMethod(duck, target, name, methodTypes, fn) + ? duck._metaobject.addMethod(duck, target, name, methodTypes, fn) + : _metaAddMethod(duck, target, name, methodTypes, fn) } } @@ -256,8 +256,8 @@ function installMethodErrorMessage (proto, gf, target, name) { proto.name ? `${proto.name}#` : '' }${name}(${[].map.call(args, typeName).join(', ')}). You must implement ${ proto.name - ? formatMethod(proto, name, true) - : `the protocol ${formatMethod(proto, name)} belongs to` + ? formatMethod(proto, name, true) + : `the protocol ${formatMethod(proto, name)} belongs to` } in order to call ${typeName(thisArg)}#${name}(${ [].map.call(args, typeName).join(', ') }).` @@ -330,8 +330,8 @@ class Constraint { const thisType = ( this.thisIdx === 'this' || this.thisIdx == null ) - ? target - : types[this.thisIdx] + ? target + : types[this.thisIdx] const parentTypes = this.indices.map(idx => { if (idx === 'this') { return target diff --git a/node_modules/protoduck/package.json b/node_modules/protoduck/package.json index 2211df2086f94..3ee47ac6adbaa 100644 --- a/node_modules/protoduck/package.json +++ b/node_modules/protoduck/package.json @@ -1,28 +1,27 @@ { - "_from": "protoduck@^5.0.0", - "_id": "protoduck@5.0.0", + "_from": "protoduck@^5.0.1", + "_id": "protoduck@5.0.1", "_inBundle": false, - "_integrity": "sha512-agsGWD8/RZrS4ga6v82Fxb0RHIS2RZnbsSue6A9/MBRhB/jcqOANAMNrqM9900b8duj+Gx+T/JMy5IowDoO/hQ==", + "_integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", "_location": "/protoduck", "_phantomChildren": {}, "_requested": { "type": "range", "registry": true, - "raw": "protoduck@^5.0.0", + "raw": "protoduck@^5.0.1", "name": "protoduck", "escapedName": "protoduck", - "rawSpec": "^5.0.0", + "rawSpec": "^5.0.1", "saveSpec": null, - "fetchSpec": "^5.0.0" + "fetchSpec": "^5.0.1" }, "_requiredBy": [ - "/libcipm", "/pacote" ], - "_resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.0.tgz", - "_shasum": "752145e6be0ad834cb25716f670a713c860dce70", - "_spec": "protoduck@^5.0.0", - "_where": "/Users/rebecca/code/npm/node_modules/libcipm", + "_resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "_shasum": "03c3659ca18007b69a50fd82a7ebcc516261151f", + "_spec": "protoduck@^5.0.1", + "_where": "/Users/zkat/Documents/code/work/npm/node_modules/pacote", "author": { "name": "Kat Marchán", "email": "kzm@sykosomatic.org" @@ -32,16 +31,16 @@ }, "bundleDependencies": false, "dependencies": { - "genfun": "^4.0.1" + "genfun": "^5.0.0" }, "deprecated": false, "description": "Fancy duck typing for the most serious of ducks.", "devDependencies": { - "mocha": "^3.2.0", - "nyc": "^10.2.0", - "standard": "^10.0.2", + "mocha": "^5.2.0", + "nyc": "^13.1.0", + "standard": "^12.0.1", "standard-version": "^4.0.0", - "tap": "^10.3.2", + "tap": "^12.0.1", "weallbehave": "^1.0.3", "weallcontribute": "^1.0.8" }, @@ -85,5 +84,5 @@ "update-coc": "weallbehave -o . && git add CODE_OF_CONDUCT.md && git commit -m 'docs(coc): updated CODE_OF_CONDUCT.md'", "update-contrib": "weallcontribute -o . && git add CONTRIBUTING.md && git commit -m 'docs(contributing): updated CONTRIBUTING.md'" }, - "version": "5.0.0" + "version": "5.0.1" } diff --git a/package-lock.json b/package-lock.json index bcfc4c685d9f9..6f84a492b305d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1647,7 +1647,7 @@ }, "fs-access": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { @@ -1758,9 +1758,9 @@ } }, "genfun": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-4.0.1.tgz", - "integrity": "sha1-7RAEHy5KfxsKOEZtF6XD4n3x38E=" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==" }, "gentle-fs": { "version": "2.0.1", @@ -2454,27 +2454,28 @@ } }, "libnpm": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/libnpm/-/libnpm-1.4.0.tgz", - "integrity": "sha512-Ja6WdFpIEvGmxL34fvAzNma/Kjl303nDIRolpOhHoVbi+s93ZIPyap3RvM8IYINEoeF06P1mGWagZDEedq3NEg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/libnpm/-/libnpm-2.0.1.tgz", + "integrity": "sha512-qTKoxyJvpBxHZQB6k0AhSLajyXq9ZE/lUsZzuHAplr2Bpv9G+k4YuYlExYdUCeVRRGqcJt8hvkPh4tBwKoV98w==", "requires": { "bin-links": "^1.1.2", + "bluebird": "^3.5.3", "find-npm-prefix": "^1.0.2", - "libnpmaccess": "^2.0.0", - "libnpmconfig": "^1.1.1", - "libnpmhook": "^5.0.0", + "libnpmaccess": "^3.0.1", + "libnpmconfig": "^1.2.1", + "libnpmhook": "^5.0.2", "libnpmorg": "^1.0.0", - "libnpmpublish": "^1.0.1", + "libnpmpublish": "^1.1.0", "libnpmsearch": "^2.0.0", - "libnpmteam": "^1.0.0", + "libnpmteam": "^1.0.1", "lock-verify": "^2.0.2", "npm-lifecycle": "^2.1.0", "npm-logical-tree": "^1.2.1", "npm-package-arg": "^6.1.0", - "npm-profile": "^4.0.0", - "npm-registry-fetch": "^3.3.0", + "npm-profile": "^4.0.1", + "npm-registry-fetch": "^3.8.0", "npmlog": "^4.1.2", - "pacote": "^9.1.0", + "pacote": "^9.2.3", "read-package-json": "^2.0.13", "stringify-package": "^1.0.0" }, @@ -2498,9 +2499,9 @@ } }, "libnpmaccess": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-2.0.1.tgz", - "integrity": "sha512-WJRlA7YGGCBK6zubJ8eajD7Wm6SaywiR0jnMjwp8QBwt1QxQOY+CCKpERw30opPkShjoesBLzQJ9Wf3MpXGR/A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-3.0.1.tgz", + "integrity": "sha512-RlZ7PNarCBt+XbnP7R6PoVgOq9t+kou5rvhaInoNibhPO7eMlRfS0B8yjatgn2yaHIwWNyoJDolC/6Lc5L/IQA==", "requires": { "aproba": "^2.0.0", "get-stream": "^4.0.0", @@ -6069,43 +6070,75 @@ } }, "pacote": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.1.0.tgz", - "integrity": "sha512-AFXaSWhOtQf3jHqEvg+ZYH/dfT8TKq6TKspJ4qEFwVVuh5aGvMIk6SNF8vqfzz+cBceDIs9drOcpBbrPai7i+g==", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.2.3.tgz", + "integrity": "sha512-Y3+yY3nBRAxMlZWvr62XLJxOwCmG9UmkGZkFurWHoCjqF0cZL72cTOCRJTvWw8T4OhJS2RTg13x4oYYriauvEw==", "requires": { - "bluebird": "^3.5.1", - "cacache": "^11.0.2", - "figgy-pudding": "^3.2.1", - "get-stream": "^3.0.0", - "glob": "^7.1.2", + "bluebird": "^3.5.2", + "cacache": "^11.2.0", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", "lru-cache": "^4.1.3", "make-fetch-happen": "^4.0.1", "minimatch": "^3.0.4", - "minipass": "^2.3.3", + "minipass": "^2.3.5", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "normalize-package-data": "^2.4.0", "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.10", - "npm-pick-manifest": "^2.1.0", - "npm-registry-fetch": "^3.0.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^3.8.0", "osenv": "^0.1.5", "promise-inflight": "^1.0.1", "promise-retry": "^1.1.1", - "protoduck": "^5.0.0", + "protoduck": "^5.0.1", "rimraf": "^2.6.2", "safe-buffer": "^5.1.2", - "semver": "^5.5.0", - "ssri": "^6.0.0", - "tar": "^4.4.3", - "unique-filename": "^1.1.0", - "which": "^1.3.0" + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.6", + "unique-filename": "^1.1.1", + "which": "^1.3.1" }, "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "npm-pick-manifest": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" } } }, @@ -6366,11 +6399,11 @@ "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" }, "protoduck": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.0.tgz", - "integrity": "sha512-agsGWD8/RZrS4ga6v82Fxb0RHIS2RZnbsSue6A9/MBRhB/jcqOANAMNrqM9900b8duj+Gx+T/JMy5IowDoO/hQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", "requires": { - "genfun": "^4.0.1" + "genfun": "^5.0.0" } }, "prr": { diff --git a/package.json b/package.json index 1dcb9feb003b5..dbfc17b4f0f7e 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "json-parse-better-errors": "^1.0.2", "lazy-property": "~1.0.0", "libcipm": "^3.0.2", - "libnpm": "^1.4.0", + "libnpm": "^2.0.1", "libnpx": "^10.2.0", "lock-verify": "^2.0.2", "lockfile": "^1.0.4", @@ -103,7 +103,7 @@ "once": "~1.4.0", "opener": "^1.5.1", "osenv": "^0.1.5", - "pacote": "^9.1.0", + "pacote": "^9.2.3", "path-is-inside": "~1.0.2", "promise-inflight": "~1.0.1", "qrcode-terminal": "^0.12.0", From 1c3b226ff37159c426e855e83c8f6c361603901d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kat=20March=C3=A1n?= Date: Tue, 27 Nov 2018 11:03:45 -0800 Subject: [PATCH 44/97] config: remove some config checks --- test/tap/config-meta.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/test/tap/config-meta.js b/test/tap/config-meta.js index 735c161fb87e2..97918b8897f8f 100644 --- a/test/tap/config-meta.js +++ b/test/tap/config-meta.js @@ -110,25 +110,26 @@ test('check configs', function (t) { } } - for (var c2 in DOC) { - if (c2 !== 'versions' && c2 !== 'version' && c2 !== 'init.version' && c2 !== 'ham-it-up') { - t.ok(CONFS[c2], 'config in doc should be used somewhere ' + c2) - t.ok(types.indexOf(c2) !== -1, 'should be defined in npmconf ' + c2) - t.ok(defaults.indexOf(c2) !== -1, 'should have default in npmconf ' + c2) - } - } + // TODO - needs better figgy-pudding introspection + // for (var c2 in DOC) { + // if (c2 !== 'versions' && c2 !== 'version' && c2 !== 'init.version' && c2 !== 'ham-it-up') { + // t.ok(CONFS[c2], 'config in doc should be used somewhere ' + c2) + // t.ok(types.indexOf(c2) !== -1, 'should be defined in npmconf ' + c2) + // t.ok(defaults.indexOf(c2) !== -1, 'should have default in npmconf ' + c2) + // } + // } types.forEach(function (c) { if (!c.match(/^_/) && c !== 'argv' && !c.match(/^versions?$/) && c !== 'ham-it-up') { t.ok(DOC[c], 'defined type should be documented ' + c) - t.ok(CONFS[c], 'defined type should be used ' + c) + // t.ok(CONFS[c], 'defined type should be used ' + c) } }) defaults.forEach(function (c) { if (!c.match(/^_/) && c !== 'argv' && !c.match(/^versions?$/) && c !== 'ham-it-up') { t.ok(DOC[c], 'defaulted type should be documented ' + c) - t.ok(CONFS[c], 'defaulted type should be used ' + c) + // t.ok(CONFS[c], 'defaulted type should be used ' + c) } }) From 3c0a7b06b6473fe068fc8ae8466c07a177975b87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kat=20March=C3=A1n?= Date: Tue, 27 Nov 2018 11:05:38 -0800 Subject: [PATCH 45/97] install: fix circular dependency with config stuff --- lib/fetch-package-metadata.js | 8 +++++++- lib/install/action/extract.js | 5 ++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/fetch-package-metadata.js b/lib/fetch-package-metadata.js index 69ae78e51e3f2..78eed42bdf000 100644 --- a/lib/fetch-package-metadata.js +++ b/lib/fetch-package-metadata.js @@ -8,7 +8,7 @@ const rimraf = require('rimraf') const validate = require('aproba') const npa = require('npm-package-arg') const npm = require('./npm') -const npmConfig = require('./config/figgy-config.js') +let npmConfig const npmlog = require('npmlog') const limit = require('call-limit') const tempFilename = require('./utils/temp-filename') @@ -52,6 +52,9 @@ function fetchPackageMetadata (spec, where, opts, done) { err.code = 'EWINDOWSPATH' return logAndFinish(err) } + if (!npmConfig) { + npmConfig = require('./config/figgy-config.js') + } pacote.manifest(dep, npmConfig({ annotate: true, fullMetadata: opts.fullMetadata, @@ -95,6 +98,9 @@ function addBundled (pkg, next) { } pkg._bundled = null const target = tempFilename('unpack') + if (!npmConfig) { + npmConfig = require('./config/figgy-config.js') + } const opts = npmConfig({integrity: pkg._integrity}) pacote.extract(pkg._resolved || pkg._requested || npa.resolve(pkg.name, pkg.version), target, opts).then(() => { log.silly('addBundled', 'read tarball') diff --git a/lib/install/action/extract.js b/lib/install/action/extract.js index 0e84e157670cf..c1c17cdf6c4f3 100644 --- a/lib/install/action/extract.js +++ b/lib/install/action/extract.js @@ -10,7 +10,7 @@ const moduleStagingPath = require('../module-staging-path.js') const move = require('../../utils/move.js') const npa = require('npm-package-arg') const npm = require('../../npm.js') -const npmConfig = require('../../config/figgy-config.js') +let npmConfig const packageId = require('../../utils/package-id.js') const path = require('path') const localWorker = require('./extract-worker.js') @@ -47,6 +47,9 @@ module.exports = extract function extract (staging, pkg, log) { log.silly('extract', packageId(pkg)) const extractTo = moduleStagingPath(staging, pkg) + if (!npmConfig) { + npmConfig = require('../../config/figgy-config.js') + } let opts = ExtractOpts(npmConfig()).concat({ integrity: pkg.package._integrity, resolved: pkg.package._resolved From 08fcb3f0f26e025702b35253ed70a527ab69977f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kat=20March=C3=A1n?= Date: Tue, 4 Dec 2018 19:19:07 -0800 Subject: [PATCH 46/97] test: update cache add test output --- test/tap/cache-add-unpublished.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/tap/cache-add-unpublished.js b/test/tap/cache-add-unpublished.js index 8966e43ae40a2..0e8a9de8bfa67 100644 --- a/test/tap/cache-add-unpublished.js +++ b/test/tap/cache-add-unpublished.js @@ -18,7 +18,7 @@ test('cache add', function (t) { if (er) throw er t.ok(c, 'got non-zero exit code') t.equal(so, '', 'nothing printed to stdout') - t.similar(se, /404 Not Found: superfoo/, 'got expected error') + t.similar(se, /404 Not Found.*superfoo/, 'got expected error') s.close() t.end() } From c8135d97a424b38363dc4530c45e4583471e9849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kat=20March=C3=A1n?= Date: Tue, 4 Dec 2018 19:20:31 -0800 Subject: [PATCH 47/97] test: remove get.js test for n-r-c --- test/tap/get.js | 103 ------------------------------------------------ 1 file changed, 103 deletions(-) delete mode 100644 test/tap/get.js diff --git a/test/tap/get.js b/test/tap/get.js deleted file mode 100644 index c939ed071e800..0000000000000 --- a/test/tap/get.js +++ /dev/null @@ -1,103 +0,0 @@ -var common = require('../common-tap.js') -var test = require('tap').test -var npm = require('../../') -var rimraf = require('rimraf') -var path = require('path') -var mr = require('npm-registry-mock') - -function nop () {} - -var URI = 'https://npm.registry:8043/rewrite' -var TIMEOUT = 3600 -var FOLLOW = false -var STALE_OK = true -var TOKEN = 'lolbutts' -var AUTH = { token: TOKEN } -var PARAMS = { - timeout: TIMEOUT, - follow: FOLLOW, - staleOk: STALE_OK, - auth: AUTH -} -var PKG_DIR = path.resolve(__dirname, 'get-basic') -var BIGCO_SAMPLE = { - name: '@bigco/sample', - version: '1.2.3' -} - -// mock server reference -var server - -var mocks = { - 'get': { - '/@bigco%2fsample/1.2.3': [200, BIGCO_SAMPLE] - } -} - -test('setup', function (t) { - mr({port: common.port, mocks: mocks}, function (er, s) { - t.ifError(er) - npm.load({registry: common.registry}, function (er) { - t.ifError(er) - server = s - t.end() - }) - }) -}) - -test('get call contract', function (t) { - t.throws(function () { - npm.registry.get(undefined, PARAMS, nop) - }, 'requires a URI') - - t.throws(function () { - npm.registry.get([], PARAMS, nop) - }, 'requires URI to be a string') - - t.throws(function () { - npm.registry.get(URI, undefined, nop) - }, 'requires params object') - - t.throws(function () { - npm.registry.get(URI, '', nop) - }, 'params must be object') - - t.throws(function () { - npm.registry.get(URI, PARAMS, undefined) - }, 'requires callback') - - t.throws(function () { - npm.registry.get(URI, PARAMS, 'callback') - }, 'callback must be function') - - t.end() -}) - -test('basic request', function (t) { - t.plan(6) - - var versioned = common.registry + '/underscore/1.3.3' - npm.registry.get(versioned, PARAMS, function (er, data) { - t.ifError(er, 'loaded specified version underscore data') - t.equal(data.version, '1.3.3') - }) - - var rollup = common.registry + '/underscore' - npm.registry.get(rollup, PARAMS, function (er, data) { - t.ifError(er, 'loaded all metadata') - t.deepEqual(data.name, 'underscore') - }) - - var scoped = common.registry + '/@bigco%2fsample/1.2.3' - npm.registry.get(scoped, PARAMS, function (er, data) { - t.ifError(er, 'loaded all metadata') - t.equal(data.name, '@bigco/sample') - }) -}) - -test('cleanup', function (t) { - server.close() - rimraf.sync(PKG_DIR) - - t.end() -}) From ae936f22ce80614287f2769e9aaa9a155f03cc15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kat=20March=C3=A1n?= Date: Wed, 5 Dec 2018 09:17:23 -0800 Subject: [PATCH 48/97] config: fix passing of referer value --- lib/config/figgy-config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/config/figgy-config.js b/lib/config/figgy-config.js index 2da085f40673d..9e9ca0ba561ef 100644 --- a/lib/config/figgy-config.js +++ b/lib/config/figgy-config.js @@ -36,7 +36,7 @@ function mkConfig (...providers) { log, 'npm-session': npmSession, 'project-scope': npm.projectScope, - refer: npm.refer, + refer: npm.referer, dmode: npm.modes.exec, fmode: npm.modes.file, umask: npm.modes.umask, From 569491b8042f939dc13986b6adb2a0a260f95b63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kat=20March=C3=A1n?= Date: Tue, 11 Dec 2018 13:50:24 -0800 Subject: [PATCH 49/97] licensee@5.0.0 --- node_modules/.bin/mkdirp | 1 - node_modules/.bin/nopt | 1 - node_modules/.bin/opener | 1 - node_modules/.bin/rimraf | 1 - node_modules/.bin/semver | 1 - node_modules/.bin/which | 1 - node_modules/.gitignore | 1 - node_modules/array-find-index/index.js | 25 - node_modules/array-find-index/license | 21 - node_modules/array-find-index/package.json | 71 - node_modules/array-find-index/readme.md | 30 - node_modules/docopt/.editorconfig | 11 - node_modules/docopt/.npmignore | 2 - node_modules/docopt/.travis.yml | 12 - node_modules/docopt/LICENSE-MIT | 20 - node_modules/docopt/README.md | 99 -- node_modules/docopt/coffeelint.json | 120 -- node_modules/docopt/docopt.coffee | 588 ------- node_modules/docopt/docopt.js | 1202 --------------- node_modules/docopt/package.json | 88 -- node_modules/docopt/test/test.coffee | 736 --------- node_modules/docopt/test/testcases.coffee | 63 - node_modules/docopt/test/testcases.docopt | 957 ------------ node_modules/fs-access/index.js | 41 - node_modules/fs-access/license | 21 - node_modules/fs-access/package.json | 78 - node_modules/fs-access/readme.md | 51 - node_modules/json-parse-errback/LICENSE | 24 - node_modules/json-parse-errback/README.md | 13 - node_modules/json-parse-errback/index.js | 13 - node_modules/json-parse-errback/package.json | 59 - node_modules/licensee/LICENSE | 202 --- node_modules/licensee/README.md | 132 -- node_modules/licensee/index.js | 212 --- node_modules/licensee/licensee | 242 --- node_modules/licensee/package.json | 83 - node_modules/null-check/index.js | 19 - node_modules/null-check/license | 21 - node_modules/null-check/package.json | 72 - node_modules/null-check/readme.md | 34 - node_modules/simple-concat/.travis.yml | 3 - node_modules/simple-concat/LICENSE | 20 - node_modules/simple-concat/README.md | 42 - node_modules/simple-concat/index.js | 14 - node_modules/simple-concat/package.json | 62 - node_modules/simple-concat/test/basic.js | 41 - node_modules/spdx-compare/LICENSE.md | 9 - node_modules/spdx-compare/README.md | 20 - node_modules/spdx-compare/index.js | 60 - node_modules/spdx-compare/package.json | 69 - node_modules/spdx-compare/test.log | 4 - node_modules/spdx-expression-validate/LICENSE | 22 - .../spdx-expression-validate/README.md | 44 - .../spdx-expression-validate/index.js | 20 - .../spdx-expression-parse/AUTHORS | 3 - .../spdx-expression-parse/LICENSE | 22 - .../spdx-expression-parse/README.md | 83 - .../spdx-expression-parse/index.js | 5 - .../spdx-expression-parse/package.json | 93 -- .../spdx-expression-parse/parser.js | 1357 ----------------- .../spdx-expression-validate/package.json | 73 - node_modules/spdx-ranges/LICENSE.md | 9 - node_modules/spdx-ranges/README.md | 38 - node_modules/spdx-ranges/index.json | 233 --- node_modules/spdx-ranges/package.json | 60 - node_modules/spdx-ranges/test.log | 4 - node_modules/spdx-satisfies/LICENSE.md | 9 - node_modules/spdx-satisfies/README.md | 31 - node_modules/spdx-satisfies/index.js | 112 -- node_modules/spdx-satisfies/package.json | 72 - package-lock.json | 6 +- package.json | 2 +- 72 files changed, 3 insertions(+), 8008 deletions(-) delete mode 120000 node_modules/.bin/mkdirp delete mode 120000 node_modules/.bin/nopt delete mode 120000 node_modules/.bin/opener delete mode 120000 node_modules/.bin/rimraf delete mode 120000 node_modules/.bin/semver delete mode 120000 node_modules/.bin/which delete mode 100644 node_modules/array-find-index/index.js delete mode 100644 node_modules/array-find-index/license delete mode 100644 node_modules/array-find-index/package.json delete mode 100644 node_modules/array-find-index/readme.md delete mode 100644 node_modules/docopt/.editorconfig delete mode 100644 node_modules/docopt/.npmignore delete mode 100644 node_modules/docopt/.travis.yml delete mode 100644 node_modules/docopt/LICENSE-MIT delete mode 100644 node_modules/docopt/README.md delete mode 100644 node_modules/docopt/coffeelint.json delete mode 100644 node_modules/docopt/docopt.coffee delete mode 100644 node_modules/docopt/docopt.js delete mode 100644 node_modules/docopt/package.json delete mode 100644 node_modules/docopt/test/test.coffee delete mode 100644 node_modules/docopt/test/testcases.coffee delete mode 100644 node_modules/docopt/test/testcases.docopt delete mode 100644 node_modules/fs-access/index.js delete mode 100644 node_modules/fs-access/license delete mode 100644 node_modules/fs-access/package.json delete mode 100644 node_modules/fs-access/readme.md delete mode 100644 node_modules/json-parse-errback/LICENSE delete mode 100644 node_modules/json-parse-errback/README.md delete mode 100644 node_modules/json-parse-errback/index.js delete mode 100644 node_modules/json-parse-errback/package.json delete mode 100644 node_modules/licensee/LICENSE delete mode 100644 node_modules/licensee/README.md delete mode 100644 node_modules/licensee/index.js delete mode 100755 node_modules/licensee/licensee delete mode 100644 node_modules/licensee/package.json delete mode 100644 node_modules/null-check/index.js delete mode 100644 node_modules/null-check/license delete mode 100644 node_modules/null-check/package.json delete mode 100644 node_modules/null-check/readme.md delete mode 100644 node_modules/simple-concat/.travis.yml delete mode 100644 node_modules/simple-concat/LICENSE delete mode 100644 node_modules/simple-concat/README.md delete mode 100644 node_modules/simple-concat/index.js delete mode 100644 node_modules/simple-concat/package.json delete mode 100644 node_modules/simple-concat/test/basic.js delete mode 100644 node_modules/spdx-compare/LICENSE.md delete mode 100644 node_modules/spdx-compare/README.md delete mode 100644 node_modules/spdx-compare/index.js delete mode 100644 node_modules/spdx-compare/package.json delete mode 100644 node_modules/spdx-compare/test.log delete mode 100644 node_modules/spdx-expression-validate/LICENSE delete mode 100644 node_modules/spdx-expression-validate/README.md delete mode 100644 node_modules/spdx-expression-validate/index.js delete mode 100644 node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/AUTHORS delete mode 100644 node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/LICENSE delete mode 100644 node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/README.md delete mode 100644 node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/index.js delete mode 100644 node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/package.json delete mode 100644 node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/parser.js delete mode 100644 node_modules/spdx-expression-validate/package.json delete mode 100644 node_modules/spdx-ranges/LICENSE.md delete mode 100644 node_modules/spdx-ranges/README.md delete mode 100644 node_modules/spdx-ranges/index.json delete mode 100644 node_modules/spdx-ranges/package.json delete mode 100644 node_modules/spdx-ranges/test.log delete mode 100644 node_modules/spdx-satisfies/LICENSE.md delete mode 100644 node_modules/spdx-satisfies/README.md delete mode 100644 node_modules/spdx-satisfies/index.js delete mode 100644 node_modules/spdx-satisfies/package.json diff --git a/node_modules/.bin/mkdirp b/node_modules/.bin/mkdirp deleted file mode 120000 index 017896cebb141..0000000000000 --- a/node_modules/.bin/mkdirp +++ /dev/null @@ -1 +0,0 @@ -../mkdirp/bin/cmd.js \ No newline at end of file diff --git a/node_modules/.bin/nopt b/node_modules/.bin/nopt deleted file mode 120000 index 6b6566ea7febb..0000000000000 --- a/node_modules/.bin/nopt +++ /dev/null @@ -1 +0,0 @@ -../nopt/bin/nopt.js \ No newline at end of file diff --git a/node_modules/.bin/opener b/node_modules/.bin/opener deleted file mode 120000 index 891b847f9117f..0000000000000 --- a/node_modules/.bin/opener +++ /dev/null @@ -1 +0,0 @@ -../opener/bin/opener-bin.js \ No newline at end of file diff --git a/node_modules/.bin/rimraf b/node_modules/.bin/rimraf deleted file mode 120000 index 4cd49a49ddfc1..0000000000000 --- a/node_modules/.bin/rimraf +++ /dev/null @@ -1 +0,0 @@ -../rimraf/bin.js \ No newline at end of file diff --git a/node_modules/.bin/semver b/node_modules/.bin/semver deleted file mode 120000 index 317eb293d8e12..0000000000000 --- a/node_modules/.bin/semver +++ /dev/null @@ -1 +0,0 @@ -../semver/bin/semver \ No newline at end of file diff --git a/node_modules/.bin/which b/node_modules/.bin/which deleted file mode 120000 index f62471c8511ba..0000000000000 --- a/node_modules/.bin/which +++ /dev/null @@ -1 +0,0 @@ -../which/bin/which \ No newline at end of file diff --git a/node_modules/.gitignore b/node_modules/.gitignore index ab6f39da16d7e..196f8f1209ac2 100644 --- a/node_modules/.gitignore +++ b/node_modules/.gitignore @@ -84,7 +84,6 @@ /function-loop /functional-red-black-tree /get-stdin -/get-stream /globals /globby /has diff --git a/node_modules/array-find-index/index.js b/node_modules/array-find-index/index.js deleted file mode 100644 index e2dcd9a09c2bb..0000000000000 --- a/node_modules/array-find-index/index.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; -module.exports = function (arr, predicate, ctx) { - if (typeof Array.prototype.findIndex === 'function') { - return arr.findIndex(predicate, ctx); - } - - if (typeof predicate !== 'function') { - throw new TypeError('predicate must be a function'); - } - - var list = Object(arr); - var len = list.length; - - if (len === 0) { - return -1; - } - - for (var i = 0; i < len; i++) { - if (predicate.call(ctx, list[i], i, list)) { - return i; - } - } - - return -1; -}; diff --git a/node_modules/array-find-index/license b/node_modules/array-find-index/license deleted file mode 100644 index 654d0bfe94343..0000000000000 --- a/node_modules/array-find-index/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -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/node_modules/array-find-index/package.json b/node_modules/array-find-index/package.json deleted file mode 100644 index 5c210da93e245..0000000000000 --- a/node_modules/array-find-index/package.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "_args": [ - [ - "array-find-index@1.0.2", - "/Users/zkat/Documents/code/work/npm" - ] - ], - "_development": true, - "_from": "array-find-index@1.0.2", - "_id": "array-find-index@1.0.2", - "_inBundle": false, - "_integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "_location": "/array-find-index", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "array-find-index@1.0.2", - "name": "array-find-index", - "escapedName": "array-find-index", - "rawSpec": "1.0.2", - "saveSpec": null, - "fetchSpec": "1.0.2" - }, - "_requiredBy": [ - "/spdx-compare" - ], - "_resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "_spec": "1.0.2", - "_where": "/Users/zkat/Documents/code/work/npm", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "bugs": { - "url": "https://github.com/sindresorhus/array-find-index/issues" - }, - "description": "ES2015 `Array#findIndex()` ponyfill", - "devDependencies": { - "ava": "*", - "xo": "*" - }, - "engines": { - "node": ">=0.10.0" - }, - "files": [ - "index.js" - ], - "homepage": "https://github.com/sindresorhus/array-find-index#readme", - "keywords": [ - "es2015", - "ponyfill", - "polyfill", - "shim", - "find", - "index", - "findindex", - "array" - ], - "license": "MIT", - "name": "array-find-index", - "repository": { - "type": "git", - "url": "git+https://github.com/sindresorhus/array-find-index.git" - }, - "scripts": { - "test": "xo && ava" - }, - "version": "1.0.2" -} diff --git a/node_modules/array-find-index/readme.md b/node_modules/array-find-index/readme.md deleted file mode 100644 index 31663411c3120..0000000000000 --- a/node_modules/array-find-index/readme.md +++ /dev/null @@ -1,30 +0,0 @@ -# array-find-index [![Build Status](https://travis-ci.org/sindresorhus/array-find-index.svg?branch=master)](https://travis-ci.org/sindresorhus/array-find-index) - -> ES2015 [`Array#findIndex()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex) [ponyfill](https://ponyfill.com) - - -## Install - -``` -$ npm install --save array-find-index -``` - - -## Usage - -```js -const arrayFindIndex = require('array-find-index'); - -arrayFindIndex(['rainbow', 'unicorn', 'pony'], x => x === 'unicorn'); -//=> 1 -``` - - -## API - -Same as `Array#findIndex()`, but with the input array as the first argument. - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/docopt/.editorconfig b/node_modules/docopt/.editorconfig deleted file mode 100644 index 2ac4f2e33f757..0000000000000 --- a/node_modules/docopt/.editorconfig +++ /dev/null @@ -1,11 +0,0 @@ -# editorconfig.org - -root = true - -[package.json] -indent_style = space -indent_size = 2 - -[*.coffee] -indent_style = space -indent_size = 4 diff --git a/node_modules/docopt/.npmignore b/node_modules/docopt/.npmignore deleted file mode 100644 index 5bdd25d6992d3..0000000000000 --- a/node_modules/docopt/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -language_agnostic_tests -examples diff --git a/node_modules/docopt/.travis.yml b/node_modules/docopt/.travis.yml deleted file mode 100644 index 32c3c455c3206..0000000000000 --- a/node_modules/docopt/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: node_js -sudo: false -node_js: - - "0.12" - - "0.11" - - "0.10" - - "iojs" -script: - - npm run test - - npm run lint -notifications: - email: false diff --git a/node_modules/docopt/LICENSE-MIT b/node_modules/docopt/LICENSE-MIT deleted file mode 100644 index a063aa7b8cdf5..0000000000000 --- a/node_modules/docopt/LICENSE-MIT +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2012 Vladimir Keleshev, - Andrew Kassen, - -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/node_modules/docopt/README.md b/node_modules/docopt/README.md deleted file mode 100644 index bbcf584dbf69d..0000000000000 --- a/node_modules/docopt/README.md +++ /dev/null @@ -1,99 +0,0 @@ -`docopt` – a command line option parser that will make you smile [![Build Status](https://travis-ci.org/stuartcarnie/docopt.coffee.svg)](https://travis-ci.org/stuartcarnie/docopt.coffee) -=============================================================== - -> [docopt](http://docopt.org) is a language for description of command-line -> interfaces. This is `docopt` implementation in CoffeeScript, that could -> be used for server-side CoffeeScript and JavaScript programs. - -Isn't it awesome how modern command-line arguments parsers generate -help message based on your code?! - -**Hell no!** You know what's awesome? When the option parser *is* generated -based on the help message that you write yourself! This way you don't need to -write this stupid repeatable parser-code, and instead can write a beautiful -help message (the way you want it!), which adds readability to your code. - -Now you can write an awesome, readable, clean, DRY code like *this*: - -```coffeescript -doc = """ -Usage: - quick_example.coffee tcp [--timeout=] - quick_example.coffee serial [--baud=9600] [--timeout=] - quick_example.coffee -h | --help | --version - -""" -{docopt} = require '../docopt' - -console.log docopt(doc, version: '0.1.1rc') -``` - -Hell yeah! The option parser is generated based on `doc` string above, that you -pass to the `docopt` function. - - - -API `{docopt} = require 'docopt'` ---------------------------------- - -### `options = docopt(doc, {argv: process.argv[2..], help: true, version: null, options_first: false, exit: true})` - -`docopt` takes 1 required argument, and 3 optional keyword arguments: - -* `doc` (required) should be a string with the help message, written according -to rules of the [docopt language](http://docopt.org). Here's a quick example: - - ```bash - Usage: your_program [options] - - -h --help Show this. - -v --verbose Print more text. - --quiet Print less text. - -o FILE Specify output file [default: ./test.txt]. - ``` - -* `argv` is an optional argument vector. It defaults to the arguments passed -to your program (`process.argv[2..]`). You can also supply it with an array -of strings, as with `process.argv`. For example: `['--verbose', '-o', 'hai.txt']`. - -* `help` (default:`true`) specifies whether the parser should automatically -print the help message (supplied as `doc`) in case `-h` or `--help` options -are encountered. After showing the usage-message, the program will terminate. -If you want to handle `-h` or `--help` options manually (the same as other options), -set `help=false`. - -* `version` (default:`null`) is an optional argument that specifies the -version of your program. If supplied, then, if the parser encounters -`--version` option, it will print the supplied version and terminate. -`version` could be any printable object, but most likely a string, -e.g. `'2.1.0rc1'`. - -* `options_first`, by default `false`. If set to `true` will -disallow mixing options and positional argument. I.e. after first -positional argument, all arguments will be interpreted as positional -even if the look like options. This can be used for strict -compatibility with POSIX, or if you want to dispatch your arguments -to other programs. - -* `exit`, by default `true`. If set to `false` will -cause docopt to throw exceptions instead of printing the error to console and terminating the application. -This flag is mainly for testing purposes. - -**Note:** Although `docopt` automatically handles `-h`, `--help` and `--version` options, -you still need to mention them in the options description (`doc`) for your users to -know about them. - -The **return** value is an `Object` with properties (giving long options precedence), -like this: - -```javascript -{'--timeout': '10', - '--baud': '4800', - '--version': false, - '--help': false, - '-h': false, - serial: true, - tcp: false, - '': false, - '': '/dev/ttyr01'} -``` diff --git a/node_modules/docopt/coffeelint.json b/node_modules/docopt/coffeelint.json deleted file mode 100644 index 99eba698119ec..0000000000000 --- a/node_modules/docopt/coffeelint.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "arrow_spacing": { - "level": "ignore" - }, - "braces_spacing": { - "level": "ignore", - "spaces": 0 - }, - "camel_case_classes": { - "level": "error" - }, - "coffeescript_error": { - "level": "error" - }, - "colon_assignment_spacing": { - "level": "ignore", - "spacing": { - "left": 0, - "right": 0 - } - }, - "cyclomatic_complexity": { - "value": 10, - "level": "ignore" - }, - "duplicate_key": { - "level": "error" - }, - "empty_constructor_needs_parens": { - "level": "ignore" - }, - "ensure_comprehensions": { - "level": "warn" - }, - "indentation": { - "value": 4, - "level": "error" - }, - "line_endings": { - "level": "ignore", - "value": "unix" - }, - "max_line_length": { - "value": 80, - "level": "ignore", - "limitComments": true - }, - "missing_fat_arrows": { - "level": "ignore" - }, - "newlines_after_classes": { - "value": 3, - "level": "ignore" - }, - "no_backticks": { - "level": "error" - }, - "no_debugger": { - "level": "warn" - }, - "no_empty_functions": { - "level": "ignore" - }, - "no_empty_param_list": { - "level": "ignore" - }, - "no_implicit_braces": { - "level": "ignore", - "strict": true - }, - "no_implicit_parens": { - "strict": true, - "level": "ignore" - }, - "no_interpolation_in_single_quotes": { - "level": "ignore" - }, - "no_plusplus": { - "level": "ignore" - }, - "no_stand_alone_at": { - "level": "ignore" - }, - "no_tabs": { - "level": "error" - }, - "no_throwing_strings": { - "level": "error" - }, - "no_trailing_semicolons": { - "level": "error" - }, - "no_trailing_whitespace": { - "level": "error", - "allowed_in_comments": false, - "allowed_in_empty_lines": true - }, - "no_unnecessary_double_quotes": { - "level": "ignore" - }, - "no_unnecessary_fat_arrows": { - "level": "warn" - }, - "non_empty_constructor_needs_parens": { - "level": "ignore" - }, - "prefer_english_operator": { - "level": "ignore", - "doubleNotLevel": "ignore" - }, - "space_operators": { - "level": "ignore" - }, - "spacing_after_comma": { - "level": "ignore" - }, - "transform_messes_up_line_numbers": { - "level": "warn" - } -} diff --git a/node_modules/docopt/docopt.coffee b/node_modules/docopt/docopt.coffee deleted file mode 100644 index 89aceea17c876..0000000000000 --- a/node_modules/docopt/docopt.coffee +++ /dev/null @@ -1,588 +0,0 @@ -print = -> console.log [].join.call arguments, ' ' - -enumerate = (array) -> - i = 0 - ([i++, item] for item in array) - -any = (array) -> - return true in array - -zip = (args...) -> - lengthArray = (arr.length for arr in args) - length = Math.min(lengthArray...) - for i in [0...length] - arr[i] for arr in args - -String::partition = (separator) -> - self = this - if self.indexOf(separator) >= 0 - parts = self.split(separator) - return [parts[0], separator, parts.slice(1).join(separator)] - else - return [String(self), '', ''] - -String::startsWith = (searchString, position) -> - position = position || 0 - return this.lastIndexOf(searchString, position) == position - -String::endsWith = (searchString, position) -> - subjectString = this.toString() - if (position == undefined || position > subjectString.length) - position = subjectString.length - position -= searchString.length - lastIndex = subjectString.indexOf(searchString, position) - return lastIndex != -1 && lastIndex == position - -String::_split = -> - this.trim().split(/\s+/).filter (i) -> i != '' - -String::isUpper = -> - /^[A-Z]+$/g.exec(this) - -Number.isInteger = Number.isInteger || (value) -> - return typeof value == "number" && - isFinite(value) && - Math.floor(value) == value - -class DocoptLanguageError extends Error - constructor: (@message) -> - super @message - -class DocoptExit extends Error - constructor: (@message) -> - super @message - -class Pattern extends Object - - fix: -> - @fix_identities() - @fix_repeating_arguments() - @ - - fix_identities: (uniq=null) -> - """Make pattern-tree tips point to same object if they are equal.""" - - if not @hasOwnProperty 'children' then return @ - if uniq is null - [uniq, flat] = [{}, @flat()] - uniq[k] = k for k in flat - - for [i, c] in enumerate(@children) - if not c.hasOwnProperty 'children' - console.assert(uniq.hasOwnProperty(c)) - @children[i] = uniq[c] - else - c.fix_identities uniq - @ - - fix_repeating_arguments: -> - """Fix elements that should accumulate/increment values.""" - - either = (child.children for child in transform(@).children) - for mycase in either - counts = {} - for c in mycase - counts[c] = (if counts[c] then counts[c] else 0) + 1 - for e in (child for child in mycase when counts[child] > 1) - if e.constructor is Argument or e.constructor is Option and e.argcount - if e.value is null - e.value = [] - else if e.value.constructor isnt Array - e.value = e.value._split() - if e.constructor is Command or e.constructor is Option and e.argcount == 0 - e.value = 0 - @ - - -transform = (pattern) -> - """Expand pattern into an (almost) equivalent one, but with single Either. - - Example: ((-a | -b) (-c | -d)) => (-a -c | -a -d | -b -c | -b -d) - Quirks: [-a] => (-a), (-a...) => (-a -a) - - """ - result = [] - groups = [[pattern]] - while groups.length - children = groups.shift() - parents = [Required, Optional, OptionsShortcut, Either, OneOrMore] - if (any((t in (children.map (c) -> c.constructor)) for t in parents)) - child = (c for c in children when c.constructor in parents)[0] - index = children.indexOf(child) - if index >= 0 - children.splice(index, 1) - if child.constructor is Either - for c in child.children - groups.push([c].concat children) - else if child.constructor is OneOrMore - groups.push((child.children.concat(child.children)).concat children) - else - groups.push(child.children.concat children) - else - result.push(children) - - return new Either(new Required e for e in result) - - -class LeafPattern extends Pattern - """Leaf/terminal node of a pattern tree.""" - - constructor: (@name, @value=null) -> - - toString: -> "#{@.constructor.name}(#{@name}, #{@value})" - - flat: (types=[]) -> - types = if types instanceof Array then types else [types] - if not types.length or @.constructor in types - return [@] - else return [] - - match: (left, collected=null) -> - collected = [] if collected is null - [pos, match] = @.singleMatch left - if match is null - return [false, left, collected] - left_ = left.slice(0, pos).concat(left.slice(pos + 1)) - same_name = (a for a in collected when a.name == @.name) - if Number.isInteger(@value) or @value instanceof Array - if Number.isInteger(@value) - increment = 1 - else - increment = if typeof match.value == 'string' then [match.value] else match.value - if not same_name.length - match.value = increment - return [true, left_, collected.concat(match)] - if Number.isInteger(@value) - same_name[0].value += increment - else - same_name[0].value = [].concat(same_name[0].value, increment) - return [true, left_, collected] - return [true, left_, collected.concat(match)] - - -class BranchPattern extends Pattern - """Branch/inner node of a pattern tree.""" - - constructor: (children) -> - @children = if children instanceof Array then children else [children] - - toString: -> "#{@.constructor.name}(#{(a for a in @children).join(', ')})" - - flat: (types=[]) -> - types = if types instanceof Array then types else [types] - if @.constructor in types then return [@] - return (child.flat(types) for child in @children when child instanceof Pattern).reduce(((pv, cv) -> return [].concat pv, cv), []) - - -class Argument extends LeafPattern - - singleMatch: (left) -> - for [n, pattern] in enumerate(left) - if pattern.constructor is Argument - return [n, new Argument(@name, pattern.value)] - return [null, null] - - @parse: (source) -> - name = /(<\S*?>)/ig.exec(source)[1] - value = /\[default:\s+(.*)\]/ig.exec(source) - return new Argument(name, if value then value[1] else null) - - -class Command extends Argument - - constructor: (@name, @value=false) -> - - singleMatch: (left) -> - for [n, pattern] in enumerate(left) - if pattern.constructor is Argument - if pattern.value == @name - return [n, new Command(@name, true)] - else - break - return [null, null] - -class Option extends LeafPattern - - constructor: (@short=null, @long=null, @argcount=0, value=false) -> - console.assert(@argcount in [0,1]) - @value = if value is false and @argcount > 0 then null else value - @name = @long or @short - - toString: -> "Option(#{@short}, #{@long}, #{@argcount}, #{@value})" - - @parse: (option_description) -> - [short, long, argcount, value] = [null, null, 0, false] - [options, _, description] = option_description.trim().partition(' ') - options = options.replace /,|=/g, ' ' - for s in options._split() # split on spaces - if s.startsWith('--') - long = s - else if s.startsWith('-') - short = s - else - argcount = 1 - if argcount > 0 - matched = /\[default:\s+(.*)\]/ig.exec(description) - value = if matched then matched[1] else null - new Option short, long, argcount, value - - singleMatch: (left) -> - for [n, pattern] in enumerate(left) - if @name == pattern.name - return [n, pattern] - return [null, null] - - -class Required extends BranchPattern - - match: (left, collected=null) -> - collected = [] if collected is null - l = left #copy(left) - c = collected #copy(collected) - for p in @children - [matched, l, c] = p.match(l, c) - if not matched - return [false, left, collected] - [true, l, c] - - -class Optional extends BranchPattern - - match: (left, collected=null) -> - collected = [] if collected is null - #left = copy(left) - for p in @children - [m, left, collected] = p.match(left, collected) - [true, left, collected] - - -class OptionsShortcut extends Optional - """Marker/placeholder for [options] shortcut.""" - - -class OneOrMore extends BranchPattern - - match: (left, collected=null) -> - console.assert(@children.length == 1) - collected = [] if collected is null - l = left #copy(left) - c = collected #copy(collected) - l_ = [] - matched = true - times = 0 - while matched - # could it be that something didn't match but changed l or c? - [matched, l, c] = @children[0].match(l, c) - times += if matched then 1 else 0 - if l_.join(', ') == l.join(', ') then break - l_ = l #copy(l) - if times >= 1 then return [true, l, c] - [false, left, collected] - - -class Either extends BranchPattern - - match: (left, collected=null) -> - collected = [] if collected is null - outcomes = [] - for p in @children - outcome = p.match(left, collected) - if outcome[0] then outcomes.push(outcome) - if outcomes.length > 0 - outcomes.sort((a,b) -> - if a[1].length > b[1].length - 1 - else if a[1].length < b[1].length - -1 - else - 0) - return outcomes[0] - [false, left, collected] - - -# same as Tokens in python -class Tokens extends Array - - constructor: (source, @error=DocoptExit) -> - stream = if source.constructor is String then source._split() else source - @push.apply @, stream - - move: -> if @.length then [].shift.apply(@) else null - - current: -> if @.length then @[0] else null - - @from_pattern: (source) -> - source = source.replace(/([\[\]\(\)\|]|\.\.\.)/g, ' $1 ') - source = (s for s in source.split(/\s+|(\S*<.*?>)/) when s) - return new Tokens source, DocoptLanguageError - - -parse_section = (name, source) -> - matches = source.match new RegExp('^([^\n]*' + name + '[^\n]*\n?(?:[ \t].*?(?:\n|$))*)', 'igm') - if matches - return (s.trim() for s in matches) - return [] - - -parse_shorts = (tokens, options) -> - """shorts ::= '-' ( chars )* [ [ ' ' ] chars ] ;""" - token = tokens.move() - console.assert token.startsWith('-') and not token.startsWith('--') - left = token.replace(/^-+/g, '') - parsed = [] - while left != '' - [short, left] = ['-' + left[0], left[1..]] - similar = (o for o in options when o.short == short) - if similar.length > 1 - throw new tokens.error("#{short} is specified ambiguously #{similar.length} times") - else if similar.length < 1 - o = new Option(short, null, 0) - options.push(o) - if tokens.error is DocoptExit - o = new Option(short, null, 0, true) - else # why copying is necessary here? - o = new Option(short, similar[0].long, similar[0].argcount, similar[0].value) - value = null - if o.argcount != 0 - if left == '' - if tokens.current() in [null, '--'] - throw new tokens.error("#{short} requires argument") - value = tokens.move() - else - value = left - left = '' - if tokens.error is DocoptExit - o.value = if value isnt null then value else true - parsed.push(o) - return parsed - - -parse_long = (tokens, options) -> - """long ::= '--' chars [ ( ' ' | '=' ) chars ] ;""" - [long, eq, value] = tokens.move().partition('=') - console.assert long.startsWith('--') - value = null if (eq == value and value == '') - similar = (o for o in options when o.long == long) - if tokens.error is DocoptExit and similar.length == 0 # if no exact match - similar = (o for o in options when o.long and o.long.startsWith(long)) - if similar.length > 1 # might be simply specified ambiguously 2+ times? - longs = (o.long for o in similar).join(', ') - throw new tokens.error("#{long} is not a unique prefix: #{longs}?") - else if similar.length < 1 - argcount = if (eq == '=') then 1 else 0 - o = new Option(null, long, argcount) - options.push(o) - if tokens.error is DocoptExit - o = new Option(null, long, argcount, if argcount > 0 then value else true) - else - o = new Option(similar[0].short, similar[0].long, similar[0].argcount, similar[0].value) - if o.argcount == 0 - if value isnt null - throw new tokens.error("#{o.long} must not have an argument") - else - if value is null - if tokens.current() in [null, '--'] - throw new tokens.error("#{o.long} requires argument") - value = tokens.move() - if tokens.error is DocoptExit - o.value = if value isnt null then value else true - return [o] - - -parse_pattern = (source, options) -> - tokens = Tokens.from_pattern source - result = parse_expr tokens, options - if tokens.current() isnt null - throw new tokens.error 'unexpected ending: ' + (tokens.join ' ') - new Required result - - -parse_expr = (tokens, options) -> - """expr ::= seq ( '|' seq )* ;""" - seq = parse_seq tokens, options - - if tokens.current() != '|' - return seq - - result = if seq.length > 1 then [new Required seq] else seq - while tokens.current() is '|' - tokens.move() - seq = parse_seq tokens, options - result = result.concat(if seq.length > 1 then [new Required seq] else seq) - - return if result.length > 1 then [new Either result] else result - - -parse_seq = (tokens, options) -> - """seq ::= ( atom [ '...' ] )* ;""" - - result = [] - while tokens.current() not in [null, ']', ')', '|'] - atom = parse_atom tokens, options - if tokens.current() is '...' - atom = [new OneOrMore atom] - tokens.move() - result = result.concat atom - return result - - -parse_atom = (tokens, options) -> - """atom ::= '(' expr ')' | '[' expr ']' | 'options' - | long | shorts | argument | command ; - """ - - token = tokens.current() - result = [] - if token in '([' - tokens.move() - [matching, patternType] = {'(': [')', Required], '[': [']', Optional]}[token] - result = new patternType parse_expr(tokens, options) - if tokens.move() != matching - throw new tokens.error "Unmatched '"+token+"'" - return [result] - else if token is 'options' - tokens.move() - return [new OptionsShortcut] - else if token.startsWith('--') and token != '--' - return parse_long tokens, options - else if token.startsWith('-') and token not in ['-', '--'] - return parse_shorts(tokens, options) - else if token.startsWith('<') and token.endsWith('>') or token.isUpper() - return [new Argument(tokens.move())] - else - [new Command tokens.move()] - - -parse_argv = (tokens, options, options_first=false) -> - """Parse command-line argument vector. - If options_first: - argv ::= [ long | shorts ]* [ argument ]* [ '--' [ argument ]* ] ; - else: - argv ::= [ long | shorts | argument ]* [ '--' [ argument ]* ] ; - """ - parsed = [] - while tokens.current() isnt null - if tokens.current() == '--' - return parsed.concat(new Argument(null, v) for v in tokens) - else if tokens.current().startsWith('--') - parsed = parsed.concat(parse_long(tokens, options)) - else if tokens.current().startsWith('-') and tokens.current() != '-' - parsed = parsed.concat(parse_shorts(tokens, options)) - else if options_first - return parsed.concat(new Argument(null, v) for v in tokens) - else - parsed.push(new Argument(null, tokens.move())) - return parsed - -parse_defaults = (doc) -> - defaults = [] - for s in parse_section('options:', doc) - # FIXME corner case "bla: options: --foo" - [_, _, s] = s.partition(':') # get rid of "options:" - split = ('\n' + s).split(new RegExp('\\n[ \\t]*(-\\S+?)')).slice(1) - odd = (v for v in split by 2) - even = (v for v in split[1..] by 2) - split = (s1 + s2 for [s1, s2] in zip(odd, even)) - options = (Option.parse(s) for s in split when s.startsWith('-')) - defaults.push.apply(defaults, options) - return defaults - -formal_usage = (section) -> - [_, _, section] = section.partition ':' # drop "usage:" - pu = section._split() - return '( ' + ((if s == pu[0] then ') | (' else s) for s in pu[1..]).join(' ') + ' )' - -extras = (help, version, options, doc) -> - if help and any((o.name in ['--help', '-h']) and o.value for o in options) - return doc.replace /^\s*|\s*$/, '' - if version and any((o.name == '--version') and o.value for o in options) - return version - return "" - -class Dict extends Object - - constructor: (pairs) -> - @[key] = value for [key, value] in pairs - - toObject: () -> - dict = {} - dict[name] = @[name] for name in Object.keys(@).sort() - return dict - -docopt = (doc, kwargs={}) -> - allowedargs = ['argv', 'name', 'help', 'version', 'options_first', 'exit'] - throw new Error "unrecognized argument to docopt: " for arg of kwargs \ - when arg not in allowedargs - - argv = if kwargs.argv is undefined \ - then process.argv[2..] else kwargs.argv - name = if kwargs.name is undefined \ - then null else kwargs.name - help = if kwargs.help is undefined \ - then true else kwargs.help - version = if kwargs.version is undefined \ - then null else kwargs.version - options_first = if kwargs.options_first is undefined \ - then false else kwargs.options_first - exit = if kwargs.exit is undefined \ - then true else kwargs.exit - - try - usage_sections = parse_section 'usage:', doc - if usage_sections.length == 0 - throw new DocoptLanguageError '"usage:" (case-insensitive) not found.' - if usage_sections.length > 1 - throw new DocoptLanguageError 'More than one "usage:" (case-insensitive).' - DocoptExit.usage = usage_sections[0] - - options = parse_defaults doc - pattern = parse_pattern formal_usage(DocoptExit.usage), options - - argv = parse_argv new Tokens(argv), options, options_first - pattern_options = pattern.flat(Option) - for options_shortcut in pattern.flat(OptionsShortcut) - doc_options = parse_defaults(doc) - pattern_options_strings = (i.toString() for i in pattern_options) - options_shortcut.children = doc_options.filter((item) -> return item.toString() not in pattern_options_strings) - - output = extras help, version, argv, doc - if output - if exit - print output - process.exit() - else - throw new Error output - [matched, left, collected] = pattern.fix().match argv - if matched and left.length is 0 # better message if left? - return new Dict([a.name, a.value] for a in ([].concat pattern.flat(), collected)).toObject() - throw new DocoptExit DocoptExit.usage - catch e - if (!exit) - throw e - else - print e.message if e.message - process.exit(1) - -module.exports = - docopt : docopt - DocoptLanguageError : DocoptLanguageError - DocoptExit : DocoptExit - Option : Option - Argument : Argument - Command : Command - Required : Required - OptionsShortcut : OptionsShortcut - Either : Either - Optional : Optional - Pattern : Pattern - OneOrMore : OneOrMore - Tokens : Tokens - Dict : Dict - transform : transform - formal_usage : formal_usage - parse_section : parse_section - parse_defaults: parse_defaults - parse_pattern: parse_pattern - parse_long : parse_long - parse_shorts : parse_shorts - parse_argv : parse_argv diff --git a/node_modules/docopt/docopt.js b/node_modules/docopt/docopt.js deleted file mode 100644 index 9f302f9c0e194..0000000000000 --- a/node_modules/docopt/docopt.js +++ /dev/null @@ -1,1202 +0,0 @@ -// Generated by CoffeeScript 1.9.1 -(function() { - var Argument, BranchPattern, Command, Dict, DocoptExit, DocoptLanguageError, Either, LeafPattern, OneOrMore, Option, Optional, OptionsShortcut, Pattern, Required, Tokens, any, docopt, enumerate, extras, formal_usage, parse_argv, parse_atom, parse_defaults, parse_expr, parse_long, parse_pattern, parse_section, parse_seq, parse_shorts, print, transform, zip, - indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, - slice = [].slice, - extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - hasProp = {}.hasOwnProperty; - - print = function() { - return console.log([].join.call(arguments, ' ')); - }; - - enumerate = function(array) { - var i, item, j, len, results; - i = 0; - results = []; - for (j = 0, len = array.length; j < len; j++) { - item = array[j]; - results.push([i++, item]); - } - return results; - }; - - any = function(array) { - return indexOf.call(array, true) >= 0; - }; - - zip = function() { - var args, arr, i, j, length, lengthArray, ref, results; - args = 1 <= arguments.length ? slice.call(arguments, 0) : []; - lengthArray = (function() { - var j, len, results; - results = []; - for (j = 0, len = args.length; j < len; j++) { - arr = args[j]; - results.push(arr.length); - } - return results; - })(); - length = Math.min.apply(Math, lengthArray); - results = []; - for (i = j = 0, ref = length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) { - results.push((function() { - var len, q, results1; - results1 = []; - for (q = 0, len = args.length; q < len; q++) { - arr = args[q]; - results1.push(arr[i]); - } - return results1; - })()); - } - return results; - }; - - String.prototype.partition = function(separator) { - var parts, self; - self = this; - if (self.indexOf(separator) >= 0) { - parts = self.split(separator); - return [parts[0], separator, parts.slice(1).join(separator)]; - } else { - return [String(self), '', '']; - } - }; - - String.prototype.startsWith = function(searchString, position) { - position = position || 0; - return this.lastIndexOf(searchString, position) === position; - }; - - String.prototype.endsWith = function(searchString, position) { - var lastIndex, subjectString; - subjectString = this.toString(); - if (position === void 0 || position > subjectString.length) { - position = subjectString.length; - } - position -= searchString.length; - lastIndex = subjectString.indexOf(searchString, position); - return lastIndex !== -1 && lastIndex === position; - }; - - String.prototype._split = function() { - return this.trim().split(/\s+/).filter(function(i) { - return i !== ''; - }); - }; - - String.prototype.isUpper = function() { - return /^[A-Z]+$/g.exec(this); - }; - - Number.isInteger = Number.isInteger || function(value) { - return typeof value === "number" && isFinite(value) && Math.floor(value) === value; - }; - - DocoptLanguageError = (function(superClass) { - extend(DocoptLanguageError, superClass); - - function DocoptLanguageError(message) { - this.message = message; - DocoptLanguageError.__super__.constructor.call(this, this.message); - } - - return DocoptLanguageError; - - })(Error); - - DocoptExit = (function(superClass) { - extend(DocoptExit, superClass); - - function DocoptExit(message) { - this.message = message; - DocoptExit.__super__.constructor.call(this, this.message); - } - - return DocoptExit; - - })(Error); - - Pattern = (function(superClass) { - extend(Pattern, superClass); - - function Pattern() { - return Pattern.__super__.constructor.apply(this, arguments); - } - - Pattern.prototype.fix = function() { - this.fix_identities(); - this.fix_repeating_arguments(); - return this; - }; - - Pattern.prototype.fix_identities = function(uniq) { - var c, flat, i, j, k, len, len1, q, ref, ref1, ref2; - if (uniq == null) { - uniq = null; - } - "Make pattern-tree tips point to same object if they are equal."; - if (!this.hasOwnProperty('children')) { - return this; - } - if (uniq === null) { - ref = [{}, this.flat()], uniq = ref[0], flat = ref[1]; - for (j = 0, len = flat.length; j < len; j++) { - k = flat[j]; - uniq[k] = k; - } - } - ref1 = enumerate(this.children); - for (q = 0, len1 = ref1.length; q < len1; q++) { - ref2 = ref1[q], i = ref2[0], c = ref2[1]; - if (!c.hasOwnProperty('children')) { - console.assert(uniq.hasOwnProperty(c)); - this.children[i] = uniq[c]; - } else { - c.fix_identities(uniq); - } - } - return this; - }; - - Pattern.prototype.fix_repeating_arguments = function() { - "Fix elements that should accumulate/increment values."; - var c, child, counts, e, either, j, len, len1, len2, mycase, q, r, ref; - either = (function() { - var j, len, ref, results; - ref = transform(this).children; - results = []; - for (j = 0, len = ref.length; j < len; j++) { - child = ref[j]; - results.push(child.children); - } - return results; - }).call(this); - for (j = 0, len = either.length; j < len; j++) { - mycase = either[j]; - counts = {}; - for (q = 0, len1 = mycase.length; q < len1; q++) { - c = mycase[q]; - counts[c] = (counts[c] ? counts[c] : 0) + 1; - } - ref = (function() { - var len2, results, u; - results = []; - for (u = 0, len2 = mycase.length; u < len2; u++) { - child = mycase[u]; - if (counts[child] > 1) { - results.push(child); - } - } - return results; - })(); - for (r = 0, len2 = ref.length; r < len2; r++) { - e = ref[r]; - if (e.constructor === Argument || e.constructor === Option && e.argcount) { - if (e.value === null) { - e.value = []; - } else if (e.value.constructor !== Array) { - e.value = e.value._split(); - } - } - if (e.constructor === Command || e.constructor === Option && e.argcount === 0) { - e.value = 0; - } - } - } - return this; - }; - - return Pattern; - - })(Object); - - transform = function(pattern) { - "Expand pattern into an (almost) equivalent one, but with single Either.\n\nExample: ((-a | -b) (-c | -d)) => (-a -c | -a -d | -b -c | -b -d)\nQuirks: [-a] => (-a), (-a...) => (-a -a)\n"; - var c, child, children, e, groups, index, j, len, parents, ref, result, t; - result = []; - groups = [[pattern]]; - while (groups.length) { - children = groups.shift(); - parents = [Required, Optional, OptionsShortcut, Either, OneOrMore]; - if (any((function() { - var j, len, results; - results = []; - for (j = 0, len = parents.length; j < len; j++) { - t = parents[j]; - results.push(indexOf.call(children.map(function(c) { - return c.constructor; - }), t) >= 0); - } - return results; - })())) { - child = ((function() { - var j, len, ref, results; - results = []; - for (j = 0, len = children.length; j < len; j++) { - c = children[j]; - if (ref = c.constructor, indexOf.call(parents, ref) >= 0) { - results.push(c); - } - } - return results; - })())[0]; - index = children.indexOf(child); - if (index >= 0) { - children.splice(index, 1); - } - if (child.constructor === Either) { - ref = child.children; - for (j = 0, len = ref.length; j < len; j++) { - c = ref[j]; - groups.push([c].concat(children)); - } - } else if (child.constructor === OneOrMore) { - groups.push((child.children.concat(child.children)).concat(children)); - } else { - groups.push(child.children.concat(children)); - } - } else { - result.push(children); - } - } - return new Either((function() { - var len1, q, results; - results = []; - for (q = 0, len1 = result.length; q < len1; q++) { - e = result[q]; - results.push(new Required(e)); - } - return results; - })()); - }; - - LeafPattern = (function(superClass) { - "Leaf/terminal node of a pattern tree."; - extend(LeafPattern, superClass); - - function LeafPattern(name1, value1) { - this.name = name1; - this.value = value1 != null ? value1 : null; - } - - LeafPattern.prototype.toString = function() { - return this.constructor.name + "(" + this.name + ", " + this.value + ")"; - }; - - LeafPattern.prototype.flat = function(types) { - var ref; - if (types == null) { - types = []; - } - types = types instanceof Array ? types : [types]; - if (!types.length || (ref = this.constructor, indexOf.call(types, ref) >= 0)) { - return [this]; - } else { - return []; - } - }; - - LeafPattern.prototype.match = function(left, collected) { - var a, increment, left_, match, pos, ref, same_name; - if (collected == null) { - collected = null; - } - if (collected === null) { - collected = []; - } - ref = this.singleMatch(left), pos = ref[0], match = ref[1]; - if (match === null) { - return [false, left, collected]; - } - left_ = left.slice(0, pos).concat(left.slice(pos + 1)); - same_name = (function() { - var j, len, results; - results = []; - for (j = 0, len = collected.length; j < len; j++) { - a = collected[j]; - if (a.name === this.name) { - results.push(a); - } - } - return results; - }).call(this); - if (Number.isInteger(this.value) || this.value instanceof Array) { - if (Number.isInteger(this.value)) { - increment = 1; - } else { - increment = typeof match.value === 'string' ? [match.value] : match.value; - } - if (!same_name.length) { - match.value = increment; - return [true, left_, collected.concat(match)]; - } - if (Number.isInteger(this.value)) { - same_name[0].value += increment; - } else { - same_name[0].value = [].concat(same_name[0].value, increment); - } - return [true, left_, collected]; - } - return [true, left_, collected.concat(match)]; - }; - - return LeafPattern; - - })(Pattern); - - BranchPattern = (function(superClass) { - "Branch/inner node of a pattern tree."; - extend(BranchPattern, superClass); - - function BranchPattern(children) { - this.children = children instanceof Array ? children : [children]; - } - - BranchPattern.prototype.toString = function() { - var a; - return this.constructor.name + "(" + (((function() { - var j, len, ref, results; - ref = this.children; - results = []; - for (j = 0, len = ref.length; j < len; j++) { - a = ref[j]; - results.push(a); - } - return results; - }).call(this)).join(', ')) + ")"; - }; - - BranchPattern.prototype.flat = function(types) { - var child, ref; - if (types == null) { - types = []; - } - types = types instanceof Array ? types : [types]; - if (ref = this.constructor, indexOf.call(types, ref) >= 0) { - return [this]; - } - return ((function() { - var j, len, ref1, results; - ref1 = this.children; - results = []; - for (j = 0, len = ref1.length; j < len; j++) { - child = ref1[j]; - if (child instanceof Pattern) { - results.push(child.flat(types)); - } - } - return results; - }).call(this)).reduce((function(pv, cv) { - return [].concat(pv, cv); - }), []); - }; - - return BranchPattern; - - })(Pattern); - - Argument = (function(superClass) { - extend(Argument, superClass); - - function Argument() { - return Argument.__super__.constructor.apply(this, arguments); - } - - Argument.prototype.singleMatch = function(left) { - var j, len, n, pattern, ref, ref1; - ref = enumerate(left); - for (j = 0, len = ref.length; j < len; j++) { - ref1 = ref[j], n = ref1[0], pattern = ref1[1]; - if (pattern.constructor === Argument) { - return [n, new Argument(this.name, pattern.value)]; - } - } - return [null, null]; - }; - - Argument.parse = function(source) { - var name, value; - name = /(<\S*?>)/ig.exec(source)[1]; - value = /\[default:\s+(.*)\]/ig.exec(source); - return new Argument(name, value ? value[1] : null); - }; - - return Argument; - - })(LeafPattern); - - Command = (function(superClass) { - extend(Command, superClass); - - function Command(name1, value1) { - this.name = name1; - this.value = value1 != null ? value1 : false; - } - - Command.prototype.singleMatch = function(left) { - var j, len, n, pattern, ref, ref1; - ref = enumerate(left); - for (j = 0, len = ref.length; j < len; j++) { - ref1 = ref[j], n = ref1[0], pattern = ref1[1]; - if (pattern.constructor === Argument) { - if (pattern.value === this.name) { - return [n, new Command(this.name, true)]; - } else { - break; - } - } - } - return [null, null]; - }; - - return Command; - - })(Argument); - - Option = (function(superClass) { - extend(Option, superClass); - - function Option(short1, long1, argcount1, value) { - var ref; - this.short = short1 != null ? short1 : null; - this.long = long1 != null ? long1 : null; - this.argcount = argcount1 != null ? argcount1 : 0; - if (value == null) { - value = false; - } - console.assert((ref = this.argcount) === 0 || ref === 1); - this.value = value === false && this.argcount > 0 ? null : value; - this.name = this.long || this.short; - } - - Option.prototype.toString = function() { - return "Option(" + this.short + ", " + this.long + ", " + this.argcount + ", " + this.value + ")"; - }; - - Option.parse = function(option_description) { - var _, argcount, description, j, len, long, matched, options, ref, ref1, ref2, s, short, value; - ref = [null, null, 0, false], short = ref[0], long = ref[1], argcount = ref[2], value = ref[3]; - ref1 = option_description.trim().partition(' '), options = ref1[0], _ = ref1[1], description = ref1[2]; - options = options.replace(/,|=/g, ' '); - ref2 = options._split(); - for (j = 0, len = ref2.length; j < len; j++) { - s = ref2[j]; - if (s.startsWith('--')) { - long = s; - } else if (s.startsWith('-')) { - short = s; - } else { - argcount = 1; - } - } - if (argcount > 0) { - matched = /\[default:\s+(.*)\]/ig.exec(description); - value = matched ? matched[1] : null; - } - return new Option(short, long, argcount, value); - }; - - Option.prototype.singleMatch = function(left) { - var j, len, n, pattern, ref, ref1; - ref = enumerate(left); - for (j = 0, len = ref.length; j < len; j++) { - ref1 = ref[j], n = ref1[0], pattern = ref1[1]; - if (this.name === pattern.name) { - return [n, pattern]; - } - } - return [null, null]; - }; - - return Option; - - })(LeafPattern); - - Required = (function(superClass) { - extend(Required, superClass); - - function Required() { - return Required.__super__.constructor.apply(this, arguments); - } - - Required.prototype.match = function(left, collected) { - var c, j, l, len, matched, p, ref, ref1; - if (collected == null) { - collected = null; - } - if (collected === null) { - collected = []; - } - l = left; - c = collected; - ref = this.children; - for (j = 0, len = ref.length; j < len; j++) { - p = ref[j]; - ref1 = p.match(l, c), matched = ref1[0], l = ref1[1], c = ref1[2]; - if (!matched) { - return [false, left, collected]; - } - } - return [true, l, c]; - }; - - return Required; - - })(BranchPattern); - - Optional = (function(superClass) { - extend(Optional, superClass); - - function Optional() { - return Optional.__super__.constructor.apply(this, arguments); - } - - Optional.prototype.match = function(left, collected) { - var j, len, m, p, ref, ref1; - if (collected == null) { - collected = null; - } - if (collected === null) { - collected = []; - } - ref = this.children; - for (j = 0, len = ref.length; j < len; j++) { - p = ref[j]; - ref1 = p.match(left, collected), m = ref1[0], left = ref1[1], collected = ref1[2]; - } - return [true, left, collected]; - }; - - return Optional; - - })(BranchPattern); - - OptionsShortcut = (function(superClass) { - "Marker/placeholder for [options] shortcut."; - extend(OptionsShortcut, superClass); - - function OptionsShortcut() { - return OptionsShortcut.__super__.constructor.apply(this, arguments); - } - - return OptionsShortcut; - - })(Optional); - - OneOrMore = (function(superClass) { - extend(OneOrMore, superClass); - - function OneOrMore() { - return OneOrMore.__super__.constructor.apply(this, arguments); - } - - OneOrMore.prototype.match = function(left, collected) { - var c, l, l_, matched, ref, times; - if (collected == null) { - collected = null; - } - console.assert(this.children.length === 1); - if (collected === null) { - collected = []; - } - l = left; - c = collected; - l_ = []; - matched = true; - times = 0; - while (matched) { - ref = this.children[0].match(l, c), matched = ref[0], l = ref[1], c = ref[2]; - times += matched ? 1 : 0; - if (l_.join(', ') === l.join(', ')) { - break; - } - l_ = l; - } - if (times >= 1) { - return [true, l, c]; - } - return [false, left, collected]; - }; - - return OneOrMore; - - })(BranchPattern); - - Either = (function(superClass) { - extend(Either, superClass); - - function Either() { - return Either.__super__.constructor.apply(this, arguments); - } - - Either.prototype.match = function(left, collected) { - var j, len, outcome, outcomes, p, ref; - if (collected == null) { - collected = null; - } - if (collected === null) { - collected = []; - } - outcomes = []; - ref = this.children; - for (j = 0, len = ref.length; j < len; j++) { - p = ref[j]; - outcome = p.match(left, collected); - if (outcome[0]) { - outcomes.push(outcome); - } - } - if (outcomes.length > 0) { - outcomes.sort(function(a, b) { - if (a[1].length > b[1].length) { - return 1; - } else if (a[1].length < b[1].length) { - return -1; - } else { - return 0; - } - }); - return outcomes[0]; - } - return [false, left, collected]; - }; - - return Either; - - })(BranchPattern); - - Tokens = (function(superClass) { - extend(Tokens, superClass); - - function Tokens(source, error) { - var stream; - this.error = error != null ? error : DocoptExit; - stream = source.constructor === String ? source._split() : source; - this.push.apply(this, stream); - } - - Tokens.prototype.move = function() { - if (this.length) { - return [].shift.apply(this); - } else { - return null; - } - }; - - Tokens.prototype.current = function() { - if (this.length) { - return this[0]; - } else { - return null; - } - }; - - Tokens.from_pattern = function(source) { - var s; - source = source.replace(/([\[\]\(\)\|]|\.\.\.)/g, ' $1 '); - source = (function() { - var j, len, ref, results; - ref = source.split(/\s+|(\S*<.*?>)/); - results = []; - for (j = 0, len = ref.length; j < len; j++) { - s = ref[j]; - if (s) { - results.push(s); - } - } - return results; - })(); - return new Tokens(source, DocoptLanguageError); - }; - - return Tokens; - - })(Array); - - parse_section = function(name, source) { - var matches, s; - matches = source.match(new RegExp('^([^\n]*' + name + '[^\n]*\n?(?:[ \t].*?(?:\n|$))*)', 'igm')); - if (matches) { - return (function() { - var j, len, results; - results = []; - for (j = 0, len = matches.length; j < len; j++) { - s = matches[j]; - results.push(s.trim()); - } - return results; - })(); - } - return []; - }; - - parse_shorts = function(tokens, options) { - "shorts ::= '-' ( chars )* [ [ ' ' ] chars ] ;"; - var left, o, parsed, ref, ref1, short, similar, token, value; - token = tokens.move(); - console.assert(token.startsWith('-') && !token.startsWith('--')); - left = token.replace(/^-+/g, ''); - parsed = []; - while (left !== '') { - ref = ['-' + left[0], left.slice(1)], short = ref[0], left = ref[1]; - similar = (function() { - var j, len, results; - results = []; - for (j = 0, len = options.length; j < len; j++) { - o = options[j]; - if (o.short === short) { - results.push(o); - } - } - return results; - })(); - if (similar.length > 1) { - throw new tokens.error(short + " is specified ambiguously " + similar.length + " times"); - } else if (similar.length < 1) { - o = new Option(short, null, 0); - options.push(o); - if (tokens.error === DocoptExit) { - o = new Option(short, null, 0, true); - } - } else { - o = new Option(short, similar[0].long, similar[0].argcount, similar[0].value); - value = null; - if (o.argcount !== 0) { - if (left === '') { - if ((ref1 = tokens.current()) === null || ref1 === '--') { - throw new tokens.error(short + " requires argument"); - } - value = tokens.move(); - } else { - value = left; - left = ''; - } - } - if (tokens.error === DocoptExit) { - o.value = value !== null ? value : true; - } - } - parsed.push(o); - } - return parsed; - }; - - parse_long = function(tokens, options) { - "long ::= '--' chars [ ( ' ' | '=' ) chars ] ;"; - var argcount, eq, long, longs, o, ref, ref1, similar, value; - ref = tokens.move().partition('='), long = ref[0], eq = ref[1], value = ref[2]; - console.assert(long.startsWith('--')); - if (eq === value && value === '') { - value = null; - } - similar = (function() { - var j, len, results; - results = []; - for (j = 0, len = options.length; j < len; j++) { - o = options[j]; - if (o.long === long) { - results.push(o); - } - } - return results; - })(); - if (tokens.error === DocoptExit && similar.length === 0) { - similar = (function() { - var j, len, results; - results = []; - for (j = 0, len = options.length; j < len; j++) { - o = options[j]; - if (o.long && o.long.startsWith(long)) { - results.push(o); - } - } - return results; - })(); - } - if (similar.length > 1) { - longs = ((function() { - var j, len, results; - results = []; - for (j = 0, len = similar.length; j < len; j++) { - o = similar[j]; - results.push(o.long); - } - return results; - })()).join(', '); - throw new tokens.error(long + " is not a unique prefix: " + longs + "?"); - } else if (similar.length < 1) { - argcount = eq === '=' ? 1 : 0; - o = new Option(null, long, argcount); - options.push(o); - if (tokens.error === DocoptExit) { - o = new Option(null, long, argcount, argcount > 0 ? value : true); - } - } else { - o = new Option(similar[0].short, similar[0].long, similar[0].argcount, similar[0].value); - if (o.argcount === 0) { - if (value !== null) { - throw new tokens.error(o.long + " must not have an argument"); - } - } else { - if (value === null) { - if ((ref1 = tokens.current()) === null || ref1 === '--') { - throw new tokens.error(o.long + " requires argument"); - } - value = tokens.move(); - } - } - if (tokens.error === DocoptExit) { - o.value = value !== null ? value : true; - } - } - return [o]; - }; - - parse_pattern = function(source, options) { - var result, tokens; - tokens = Tokens.from_pattern(source); - result = parse_expr(tokens, options); - if (tokens.current() !== null) { - throw new tokens.error('unexpected ending: ' + (tokens.join(' '))); - } - return new Required(result); - }; - - parse_expr = function(tokens, options) { - "expr ::= seq ( '|' seq )* ;"; - var result, seq; - seq = parse_seq(tokens, options); - if (tokens.current() !== '|') { - return seq; - } - result = seq.length > 1 ? [new Required(seq)] : seq; - while (tokens.current() === '|') { - tokens.move(); - seq = parse_seq(tokens, options); - result = result.concat(seq.length > 1 ? [new Required(seq)] : seq); - } - if (result.length > 1) { - return [new Either(result)]; - } else { - return result; - } - }; - - parse_seq = function(tokens, options) { - "seq ::= ( atom [ '...' ] )* ;"; - var atom, ref, result; - result = []; - while ((ref = tokens.current()) !== null && ref !== ']' && ref !== ')' && ref !== '|') { - atom = parse_atom(tokens, options); - if (tokens.current() === '...') { - atom = [new OneOrMore(atom)]; - tokens.move(); - } - result = result.concat(atom); - } - return result; - }; - - parse_atom = function(tokens, options) { - "atom ::= '(' expr ')' | '[' expr ']' | 'options'\n| long | shorts | argument | command ;"; - var matching, patternType, ref, result, token; - token = tokens.current(); - result = []; - if (indexOf.call('([', token) >= 0) { - tokens.move(); - ref = { - '(': [')', Required], - '[': [']', Optional] - }[token], matching = ref[0], patternType = ref[1]; - result = new patternType(parse_expr(tokens, options)); - if (tokens.move() !== matching) { - throw new tokens.error("Unmatched '" + token + "'"); - } - return [result]; - } else if (token === 'options') { - tokens.move(); - return [new OptionsShortcut]; - } else if (token.startsWith('--') && token !== '--') { - return parse_long(tokens, options); - } else if (token.startsWith('-') && (token !== '-' && token !== '--')) { - return parse_shorts(tokens, options); - } else if (token.startsWith('<') && token.endsWith('>') || token.isUpper()) { - return [new Argument(tokens.move())]; - } else { - return [new Command(tokens.move())]; - } - }; - - parse_argv = function(tokens, options, options_first) { - var parsed, v; - if (options_first == null) { - options_first = false; - } - "Parse command-line argument vector.\nIf options_first:\n argv ::= [ long | shorts ]* [ argument ]* [ '--' [ argument ]* ] ;\nelse:\n argv ::= [ long | shorts | argument ]* [ '--' [ argument ]* ] ;"; - parsed = []; - while (tokens.current() !== null) { - if (tokens.current() === '--') { - return parsed.concat((function() { - var j, len, results; - results = []; - for (j = 0, len = tokens.length; j < len; j++) { - v = tokens[j]; - results.push(new Argument(null, v)); - } - return results; - })()); - } else if (tokens.current().startsWith('--')) { - parsed = parsed.concat(parse_long(tokens, options)); - } else if (tokens.current().startsWith('-') && tokens.current() !== '-') { - parsed = parsed.concat(parse_shorts(tokens, options)); - } else if (options_first) { - return parsed.concat((function() { - var j, len, results; - results = []; - for (j = 0, len = tokens.length; j < len; j++) { - v = tokens[j]; - results.push(new Argument(null, v)); - } - return results; - })()); - } else { - parsed.push(new Argument(null, tokens.move())); - } - } - return parsed; - }; - - parse_defaults = function(doc) { - var _, defaults, even, j, len, odd, options, ref, ref1, s, s1, s2, split, v; - defaults = []; - ref = parse_section('options:', doc); - for (j = 0, len = ref.length; j < len; j++) { - s = ref[j]; - ref1 = s.partition(':'), _ = ref1[0], _ = ref1[1], s = ref1[2]; - split = ('\n' + s).split(new RegExp('\\n[ \\t]*(-\\S+?)')).slice(1); - odd = (function() { - var len1, q, results; - results = []; - for (q = 0, len1 = split.length; q < len1; q += 2) { - v = split[q]; - results.push(v); - } - return results; - })(); - even = (function() { - var len1, q, ref2, results; - ref2 = split.slice(1); - results = []; - for (q = 0, len1 = ref2.length; q < len1; q += 2) { - v = ref2[q]; - results.push(v); - } - return results; - })(); - split = (function() { - var len1, q, ref2, ref3, results; - ref2 = zip(odd, even); - results = []; - for (q = 0, len1 = ref2.length; q < len1; q++) { - ref3 = ref2[q], s1 = ref3[0], s2 = ref3[1]; - results.push(s1 + s2); - } - return results; - })(); - options = (function() { - var len1, q, results; - results = []; - for (q = 0, len1 = split.length; q < len1; q++) { - s = split[q]; - if (s.startsWith('-')) { - results.push(Option.parse(s)); - } - } - return results; - })(); - defaults.push.apply(defaults, options); - } - return defaults; - }; - - formal_usage = function(section) { - var _, pu, ref, s; - ref = section.partition(':'), _ = ref[0], _ = ref[1], section = ref[2]; - pu = section._split(); - return '( ' + ((function() { - var j, len, ref1, results; - ref1 = pu.slice(1); - results = []; - for (j = 0, len = ref1.length; j < len; j++) { - s = ref1[j]; - results.push(s === pu[0] ? ') | (' : s); - } - return results; - })()).join(' ') + ' )'; - }; - - extras = function(help, version, options, doc) { - var o; - if (help && any((function() { - var j, len, ref, results; - results = []; - for (j = 0, len = options.length; j < len; j++) { - o = options[j]; - results.push(((ref = o.name) === '--help' || ref === '-h') && o.value); - } - return results; - })())) { - return doc.replace(/^\s*|\s*$/, ''); - } - if (version && any((function() { - var j, len, results; - results = []; - for (j = 0, len = options.length; j < len; j++) { - o = options[j]; - results.push((o.name === '--version') && o.value); - } - return results; - })())) { - return version; - } - return ""; - }; - - Dict = (function(superClass) { - extend(Dict, superClass); - - function Dict(pairs) { - var j, key, len, ref, value; - for (j = 0, len = pairs.length; j < len; j++) { - ref = pairs[j], key = ref[0], value = ref[1]; - this[key] = value; - } - } - - Dict.prototype.toObject = function() { - var dict, j, len, name, ref; - dict = {}; - ref = Object.keys(this).sort(); - for (j = 0, len = ref.length; j < len; j++) { - name = ref[j]; - dict[name] = this[name]; - } - return dict; - }; - - return Dict; - - })(Object); - - docopt = function(doc, kwargs) { - var a, allowedargs, arg, argv, collected, doc_options, e, exit, help, i, j, left, len, matched, name, options, options_first, options_shortcut, output, pattern, pattern_options, pattern_options_strings, ref, ref1, usage_sections, version; - if (kwargs == null) { - kwargs = {}; - } - allowedargs = ['argv', 'name', 'help', 'version', 'options_first', 'exit']; - for (arg in kwargs) { - if (indexOf.call(allowedargs, arg) < 0) { - throw new Error("unrecognized argument to docopt: "); - } - } - argv = kwargs.argv === void 0 ? process.argv.slice(2) : kwargs.argv; - name = kwargs.name === void 0 ? null : kwargs.name; - help = kwargs.help === void 0 ? true : kwargs.help; - version = kwargs.version === void 0 ? null : kwargs.version; - options_first = kwargs.options_first === void 0 ? false : kwargs.options_first; - exit = kwargs.exit === void 0 ? true : kwargs.exit; - try { - usage_sections = parse_section('usage:', doc); - if (usage_sections.length === 0) { - throw new DocoptLanguageError('"usage:" (case-insensitive) not found.'); - } - if (usage_sections.length > 1) { - throw new DocoptLanguageError('More than one "usage:" (case-insensitive).'); - } - DocoptExit.usage = usage_sections[0]; - options = parse_defaults(doc); - pattern = parse_pattern(formal_usage(DocoptExit.usage), options); - argv = parse_argv(new Tokens(argv), options, options_first); - pattern_options = pattern.flat(Option); - ref = pattern.flat(OptionsShortcut); - for (j = 0, len = ref.length; j < len; j++) { - options_shortcut = ref[j]; - doc_options = parse_defaults(doc); - pattern_options_strings = (function() { - var len1, q, results; - results = []; - for (q = 0, len1 = pattern_options.length; q < len1; q++) { - i = pattern_options[q]; - results.push(i.toString()); - } - return results; - })(); - options_shortcut.children = doc_options.filter(function(item) { - var ref1; - return ref1 = item.toString(), indexOf.call(pattern_options_strings, ref1) < 0; - }); - } - output = extras(help, version, argv, doc); - if (output) { - if (exit) { - print(output); - process.exit(); - } else { - throw new Error(output); - } - } - ref1 = pattern.fix().match(argv), matched = ref1[0], left = ref1[1], collected = ref1[2]; - if (matched && left.length === 0) { - return new Dict((function() { - var len1, q, ref2, results; - ref2 = [].concat(pattern.flat(), collected); - results = []; - for (q = 0, len1 = ref2.length; q < len1; q++) { - a = ref2[q]; - results.push([a.name, a.value]); - } - return results; - })()).toObject(); - } - throw new DocoptExit(DocoptExit.usage); - } catch (_error) { - e = _error; - if (!exit) { - throw e; - } else { - if (e.message) { - print(e.message); - } - return process.exit(1); - } - } - }; - - module.exports = { - docopt: docopt, - DocoptLanguageError: DocoptLanguageError, - DocoptExit: DocoptExit, - Option: Option, - Argument: Argument, - Command: Command, - Required: Required, - OptionsShortcut: OptionsShortcut, - Either: Either, - Optional: Optional, - Pattern: Pattern, - OneOrMore: OneOrMore, - Tokens: Tokens, - Dict: Dict, - transform: transform, - formal_usage: formal_usage, - parse_section: parse_section, - parse_defaults: parse_defaults, - parse_pattern: parse_pattern, - parse_long: parse_long, - parse_shorts: parse_shorts, - parse_argv: parse_argv - }; - -}).call(this); diff --git a/node_modules/docopt/package.json b/node_modules/docopt/package.json deleted file mode 100644 index e2104dc5c4abe..0000000000000 --- a/node_modules/docopt/package.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "_args": [ - [ - "docopt@0.6.2", - "/Users/zkat/Documents/code/work/npm" - ] - ], - "_development": true, - "_from": "docopt@0.6.2", - "_id": "docopt@0.6.2", - "_inBundle": false, - "_integrity": "sha1-so6eIiDaXsSffqW7JKR3h0Be6xE=", - "_location": "/docopt", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "docopt@0.6.2", - "name": "docopt", - "escapedName": "docopt", - "rawSpec": "0.6.2", - "saveSpec": null, - "fetchSpec": "0.6.2" - }, - "_requiredBy": [ - "/licensee" - ], - "_resolved": "https://registry.npmjs.org/docopt/-/docopt-0.6.2.tgz", - "_spec": "0.6.2", - "_where": "/Users/zkat/Documents/code/work/npm", - "author": { - "name": "Vladimir Keleshev", - "email": "vladimir@keleshev.com" - }, - "bugs": { - "url": "https://github.com/scarnie/docopt.coffee/issues" - }, - "contributors": [ - { - "name": "Andrew Kassen", - "email": "atkassen@berkeley.edu" - }, - { - "name": "Vladimir Keleshev", - "email": "vladimir@keleshev.com" - }, - { - "name": "Stuart Carnie", - "email": "stuart.carnie@gmail.com" - }, - { - "name": "Matthias Rolke", - "email": "mr.amtrack@gmail.com" - } - ], - "description": "a command line option parser that will make you smile", - "devDependencies": { - "chai": "^2.2.0", - "coffee-script": "^1.9.1", - "coffeelint": "^1.9.2", - "mocha": "^2.2.1" - }, - "engines": { - "node": ">=0.10.0" - }, - "homepage": "https://github.com/scarnie/docopt.coffee#readme", - "keywords": [ - "command", - "options", - "argument", - "args", - "cli", - "commandline" - ], - "licenses": "MIT", - "main": "docopt.js", - "name": "docopt", - "repository": { - "type": "git", - "url": "git://github.com/scarnie/docopt.coffee.git" - }, - "scripts": { - "lint": "coffeelint docopt.coffee test/*.coffee", - "prepublish": "coffee -c docopt.coffee", - "test": "mocha --compilers coffee:coffee-script/register" - }, - "version": "0.6.2" -} diff --git a/node_modules/docopt/test/test.coffee b/node_modules/docopt/test/test.coffee deleted file mode 100644 index 12c45e322df43..0000000000000 --- a/node_modules/docopt/test/test.coffee +++ /dev/null @@ -1,736 +0,0 @@ -chai = require 'chai' -assert = chai.assert -docopt = require '../docopt.coffee' - -describe "test.coffee", -> - - it "test_pattern_flat", -> - assert.deepEqual( - new docopt.Required([new docopt.OneOrMore([new docopt.Argument('N')]), new docopt.Option('-a'), new docopt.Argument('M')]).flat() - [new docopt.Argument('N'), new docopt.Option('-a'), new docopt.Argument('M')] - ) - assert.deepEqual( - new docopt.Required([new docopt.Optional([new docopt.OptionsShortcut([])]), new docopt.Optional([new docopt.Option('-a', null)])]).flat(docopt.OptionsShortcut) - [new docopt.OptionsShortcut([])] - ) - - - it "test_option", -> - assert.deepEqual new docopt.Option.parse('-h'), new docopt.Option('-h', null) - assert.deepEqual new docopt.Option.parse('--help'), new docopt.Option(null, '--help') - assert.deepEqual new docopt.Option.parse('-h --help'), new docopt.Option('-h', '--help') - assert.deepEqual new docopt.Option.parse('-h, --help'), new docopt.Option('-h', '--help') - - assert.deepEqual new docopt.Option.parse('-h TOPIC'), new docopt.Option('-h', null, 1) - assert.deepEqual new docopt.Option.parse('--help TOPIC'), new docopt.Option(null, '--help', 1) - assert.deepEqual new docopt.Option.parse('-h TOPIC --help TOPIC'), new docopt.Option('-h', '--help', 1) - assert.deepEqual new docopt.Option.parse('-h TOPIC, --help TOPIC'), new docopt.Option('-h', '--help', 1) - assert.deepEqual new docopt.Option.parse('-h TOPIC, --help=TOPIC'), new docopt.Option('-h', '--help', 1) - - assert.deepEqual new docopt.Option.parse('-h Description...'), new docopt.Option('-h', null) - assert.deepEqual new docopt.Option.parse('-h --help Description...'), new docopt.Option('-h', '--help') - assert.deepEqual new docopt.Option.parse('-h TOPIC Description...'), new docopt.Option('-h', null, 1) - - assert.deepEqual new docopt.Option.parse(' -h'), new docopt.Option('-h', null) - - assert.deepEqual( - new docopt.Option.parse('-h TOPIC Descripton... [default: 2]') - new docopt.Option('-h', null, 1, '2') - ) - assert.deepEqual( - new docopt.Option.parse('-h TOPIC Descripton... [default: topic-1]') - new docopt.Option('-h', null, 1, 'topic-1') - ) - assert.deepEqual( - new docopt.Option.parse('--help=TOPIC ... [default: 3.14]') - new docopt.Option(null, '--help', 1, '3.14') - ) - assert.deepEqual( - new docopt.Option.parse('-h, --help=DIR ... [default: ./]') - new docopt.Option('-h', '--help', 1, "./") - ) - assert.deepEqual( - new docopt.Option.parse('-h TOPIC Descripton... [dEfAuLt: 2]') - new docopt.Option('-h', null, 1, '2') - ) - - - it "test_option_name", -> - assert.deepEqual new docopt.Option('-h', null).name, '-h' - assert.deepEqual new docopt.Option('-h', '--help').name, '--help' - assert.deepEqual new docopt.Option(null, '--help').name, '--help' - - - it "test_commands", -> - assert.deepEqual docopt.docopt('Usage: prog add', {argv: 'add', exit: false}), {'add': true} - assert.deepEqual docopt.docopt('Usage: prog [add]', {argv: '', exit: false}), {'add': false} - assert.deepEqual docopt.docopt('Usage: prog [add]', {argv: 'add', exit: false}), {'add': true} - assert.deepEqual docopt.docopt('Usage: prog (add|rm)', {argv: 'add', exit: false}), {'add': true, 'rm': false} - assert.deepEqual docopt.docopt('Usage: prog (add|rm)', {argv: 'rm', exit: false}), {'add': false, 'rm': true} - assert.deepEqual docopt.docopt('Usage: prog a b', {argv: 'a b', exit: false}), {'a': true, 'b': true} - assert.throws( - () -> - docopt.docopt('Usage: prog a b', {argv: 'b a', exit: false}) - , - docopt.DocoptExit - ) - - - it "test_formal_usage", -> - doc = """ - Usage: prog [-hv] ARG - prog N M - - prog is a program.""" - [usage] = docopt.parse_section('usage:', doc) - assert.deepEqual usage, "Usage: prog [-hv] ARG\n prog N M" - assert.deepEqual docopt.formal_usage(usage), "( [-hv] ARG ) | ( N M )" - - - it "test_parse_argv", -> - o = [new docopt.Option('-h'), new docopt.Option('-v', '--verbose'), new docopt.Option('-f', '--file', 1)] - TS = (s) -> new docopt.Tokens(s, docopt.DocoptExit) - assert.deepEqual docopt.parse_argv(TS(''), o), [] - assert.deepEqual docopt.parse_argv(TS('-h'), o), [new docopt.Option('-h', null, 0, true)] - assert.deepEqual( - docopt.parse_argv(TS('-h --verbose'), o) - [new docopt.Option('-h', null, 0, true), new docopt.Option('-v', '--verbose', 0, true)] - ) - assert.deepEqual( - docopt.parse_argv(TS('-h --file f.txt'), o) - [new docopt.Option('-h', null, 0, true), new docopt.Option('-f', '--file', 1, 'f.txt')] - ) - assert.deepEqual( - docopt.parse_argv(TS('-h --file f.txt arg'), o) - [new docopt.Option('-h', null, 0, true), new docopt.Option('-f', '--file', 1, 'f.txt'), new docopt.Argument(null, 'arg')] - ) - assert.deepEqual( - docopt.parse_argv(TS('-h --file f.txt arg arg2'), o) - [new docopt.Option('-h', null, 0, true), new docopt.Option('-f', '--file', 1, 'f.txt'), new docopt.Argument(null, 'arg'), new docopt.Argument(null, 'arg2')] - ) - assert.deepEqual( - docopt.parse_argv(TS('-h arg -- -v'), o) - [new docopt.Option('-h', null, 0, true), new docopt.Argument(null, 'arg'), new docopt.Argument(null, '--'), new docopt.Argument(null, '-v')] - ) - - it "test_parse_pattern", -> - o = [new docopt.Option('-h'), new docopt.Option('-v', '--verbose'), new docopt.Option('-f', '--file', 1)] - assert.deepEqual( - docopt.parse_pattern('[ -h ]', o) - new docopt.Required([new docopt.Optional([new docopt.Option('-h')])]) - ) - assert.deepEqual( - docopt.parse_pattern('[ ARG ... ]', o) - new docopt.Required([new docopt.Optional([new docopt.OneOrMore([new docopt.Argument('ARG')])])]) - ) - assert.deepEqual( - docopt.parse_pattern('[ -h | -v ]', o) - new docopt.Required([new docopt.Optional([new docopt.Either([new docopt.Option('-h'), new docopt.Option('-v', '--verbose')])])]) - ) - assert.deepEqual( - docopt.parse_pattern('( -h | -v [ --file ] )', o), - new docopt.Required([new docopt.Required(new docopt.Either([new docopt.Option('-h'), new docopt.Required([new docopt.Option('-v', '--verbose'), new docopt.Optional([new docopt.Option('-f', '--file', 1, null)])])]))]) - ) - assert.deepEqual( - docopt.parse_pattern('(-h|-v[--file=]N...)', o), - new docopt.Required([new docopt.Required([new docopt.Either([new docopt.Option('-h'), new docopt.Required([new docopt.Option('-v', '--verbose'), new docopt.Optional([new docopt.Option('-f', '--file', 1, null)]), new docopt.OneOrMore([new docopt.Argument('N')])])])])]) - ) - assert.deepEqual( - docopt.parse_pattern('(N [M | (K | L)] | O P)', []), - new docopt.Required([new docopt.Required([new docopt.Either([new docopt.Required([new docopt.Argument('N'), new docopt.Optional([new docopt.Either([new docopt.Argument('M'), new docopt.Required([new docopt.Either([new docopt.Argument('K'), new docopt.Argument('L')])])])])]), new docopt.Required([new docopt.Argument('O'), new docopt.Argument('P')])])])]) - ) - assert.deepEqual( - docopt.parse_pattern('[ -h ] [N]', o), - new docopt.Required([new docopt.Optional([new docopt.Option('-h')]), new docopt.Optional([new docopt.Argument('N')])]) - ) - assert.deepEqual( - docopt.parse_pattern('[options]', o), - new docopt.Required([new docopt.Optional([new docopt.OptionsShortcut()])]) - ) - assert.deepEqual( - docopt.parse_pattern('[options] A', o), - new docopt.Required([new docopt.Optional([new docopt.OptionsShortcut()]), new docopt.Argument('A')]) - ) - assert.deepEqual( - docopt.parse_pattern('-v [options]', o), - new docopt.Required([new docopt.Option('-v', '--verbose'), new docopt.Optional([new docopt.OptionsShortcut()])]) - ) - assert.deepEqual docopt.parse_pattern('ADD', o), new docopt.Required([new docopt.Argument('ADD')]) - assert.deepEqual docopt.parse_pattern('', o), new docopt.Required([new docopt.Argument('')]) - assert.deepEqual docopt.parse_pattern('add', o), new docopt.Required([new docopt.Command('add')]) - - - it "test_option_match", -> - assert.deepEqual new docopt.Option('-a').match([new docopt.Option('-a', null, 0, true)]), [true, [], [new docopt.Option('-a', null, 0, true)]] - assert.deepEqual new docopt.Option('-a').match([new docopt.Option('-x')]), [false, [new docopt.Option('-x')], []] - assert.deepEqual new docopt.Option('-a').match([new docopt.Argument('N')]), [false, [new docopt.Argument('N')], []] - assert.deepEqual( - new docopt.Option('-a').match([new docopt.Option('-x'), new docopt.Option('-a'), new docopt.Argument('N')]), - [true, [new docopt.Option('-x'), new docopt.Argument('N')], [new docopt.Option('-a')]] - ) - assert.deepEqual( - new docopt.Option('-a').match([new docopt.Option('-a', null, 0, true), new docopt.Option('-a')]), - [true, [new docopt.Option('-a')], [new docopt.Option('-a', null, 0, true)]] - ) - - - it "test_argument_match", -> - assert.deepEqual new docopt.Argument('N').match([new docopt.Argument(null, 9)]), [true, [], [new docopt.Argument('N', 9)]] - assert.deepEqual new docopt.Argument('N').match([new docopt.Option('-x')]), [false, [new docopt.Option('-x')], []] - assert.deepEqual( - new docopt.Argument('N').match([new docopt.Option('-x'), new docopt.Option('-a'), new docopt.Argument(null, 5)]) - [true, [new docopt.Option('-x'), new docopt.Option('-a')], [new docopt.Argument('N', 5)]] - ) - assert.deepEqual( - new docopt.Argument('N').match([new docopt.Argument(null, 9), new docopt.Argument(null, 0)]) - [true, [new docopt.Argument(null, 0)], [new docopt.Argument('N', 9)]] - ) - - - it "test_command_match", -> - assert.deepEqual( - new docopt.Command('c').match([new docopt.Argument(null, 'c')]) - [true, [], [new docopt.Command('c', true)]] - ) - assert.deepEqual new docopt.Command('c').match([new docopt.Option('-x')]), [false, [new docopt.Option('-x')], []] - assert.deepEqual( - new docopt.Command('c').match([new docopt.Option('-x'), new docopt.Option('-a'), new docopt.Argument(null, 'c')]) - [true, [new docopt.Option('-x'), new docopt.Option('-a')], [new docopt.Command('c', true)]] - ) - assert.deepEqual( - new docopt.Either([new docopt.Command('add', false), new docopt.Command('rm', false)]).match([new docopt.Argument(null, 'rm')]) - [true, [], [new docopt.Command('rm', true)]] - ) - - - it "test_optional_match", -> - assert.deepEqual( - new docopt.Optional([new docopt.Option('-a')]).match([new docopt.Option('-a')]) - [true, [], [new docopt.Option('-a')]] - ) - assert.deepEqual new docopt.Optional([new docopt.Option('-a')]).match([]), [true, [], []] - assert.deepEqual( - new docopt.Optional([new docopt.Option('-a')]).match([new docopt.Option('-x')]), - [true, [new docopt.Option('-x')], []] - ) - assert.deepEqual( - new docopt.Optional([new docopt.Option('-a'), new docopt.Option('-b')]).match([new docopt.Option('-a')]), - [true, [], [new docopt.Option('-a')]] - ) - assert.deepEqual( - new docopt.Optional([new docopt.Option('-a'), new docopt.Option('-b')]).match([new docopt.Option('-b')]), - [true, [], [new docopt.Option('-b')]] - ) - assert.deepEqual( - new docopt.Optional([new docopt.Option('-a'), new docopt.Option('-b')]).match([new docopt.Option('-x')]), - [true, [new docopt.Option('-x')], []] - ) - assert.deepEqual( - new docopt.Optional([new docopt.Argument('N')]).match([new docopt.Argument(null, 9)]), - [true, [], [new docopt.Argument('N', 9)]] - ) - assert.deepEqual( - new docopt.Optional([new docopt.Option('-a'), new docopt.Option('-b')]).match([new docopt.Option('-b'), new docopt.Option('-x'), new docopt.Option('-a')]), - [true, [new docopt.Option('-x')], [new docopt.Option('-a'), new docopt.Option('-b')]] - ) - - - it "test_required_match", -> - assert.deepEqual( - new docopt.Required([new docopt.Option('-a')]).match([new docopt.Option('-a')]) - [true, [], [new docopt.Option('-a')]] - ) - assert.deepEqual new docopt.Required([new docopt.Option('-a')]).match([]), [false, [], []] - assert.deepEqual( - new docopt.Required([new docopt.Option('-a')]).match([new docopt.Option('-x')]) - [false, [new docopt.Option('-x')], []] - ) - assert.deepEqual( - new docopt.Required([new docopt.Option('-a'), new docopt.Option('-b')]).match([new docopt.Option('-a')]) - [false, [new docopt.Option('-a')], []] - ) - - - it "test_either_match", -> - assert.deepEqual( - new docopt.Either([new docopt.Option('-a'), new docopt.Option('-b')]).match([new docopt.Option('-a')]) - [true, [], [new docopt.Option('-a')]] - ) - assert.deepEqual( - new docopt.Either([new docopt.Option('-a'), new docopt.Option('-b')]).match([new docopt.Option('-a'), new docopt.Option('-b')]), - [true, [new docopt.Option('-b')], [new docopt.Option('-a')]] - ) - assert.deepEqual( - new docopt.Either([new docopt.Option('-a'), new docopt.Option('-b')]).match([new docopt.Option('-x')]), - [false, [new docopt.Option('-x')], []] - ) - assert.deepEqual( - new docopt.Either([new docopt.Option('-a'), new docopt.Option('-b'), new docopt.Option('-c')]).match([new docopt.Option('-x'), new docopt.Option('-b')]), - [true, [new docopt.Option('-x')], [new docopt.Option('-b')]] - ) - assert.deepEqual( - new docopt.Either([new docopt.Argument('M'), new docopt.Required([new docopt.Argument('N'), new docopt.Argument('M')])]).match( [new docopt.Argument(null, 1), new docopt.Argument(null, 2)]), - [true, [], [new docopt.Argument('N', 1), new docopt.Argument('M', 2)]] - ) - - - it "test_one_or_more_match", -> - assert.deepEqual( - new docopt.OneOrMore([new docopt.Argument('N')]).match([new docopt.Argument(null, 9)]) - [true, [], [new docopt.Argument('N', 9)]] - ) - assert.deepEqual new docopt.OneOrMore([new docopt.Argument('N')]).match([]), [false, [], []] - assert.deepEqual( - new docopt.OneOrMore([new docopt.Argument('N')]).match([new docopt.Option('-x')]), - [false, [new docopt.Option('-x')], []] - ) - assert.deepEqual( - new docopt.OneOrMore([new docopt.Argument('N')]).match([new docopt.Argument(null, 9), new docopt.Argument(null, 8)]), - [true, [], [new docopt.Argument('N', 9), new docopt.Argument('N', 8)]] - ) - assert.deepEqual( - new docopt.OneOrMore([new docopt.Argument('N')]).match([new docopt.Argument(null, 9), new docopt.Option('-x'), new docopt.Argument(null, 8)]), - [true, [new docopt.Option('-x')], [new docopt.Argument('N', 9), new docopt.Argument('N', 8)]] - ) - assert.deepEqual( - new docopt.OneOrMore([new docopt.Option('-a')]).match([new docopt.Option('-a'), new docopt.Argument(null, 8), new docopt.Option('-a')]), - [true, [new docopt.Argument(null, 8)], [new docopt.Option('-a'), new docopt.Option('-a')]] - ) - assert.deepEqual( - new docopt.OneOrMore([new docopt.Option('-a')]).match([new docopt.Argument(null, 8), new docopt.Option('-x')]), - [false, [new docopt.Argument(null, 8), new docopt.Option('-x')], []] - ) - assert.deepEqual( - new docopt.OneOrMore([new docopt.Required([new docopt.Option('-a'), new docopt.Argument('N')])]).match([new docopt.Option('-a'), new docopt.Argument(null, 1), new docopt.Option('-x'), new docopt.Option('-a'), new docopt.Argument(null, 2)]), - [true, [new docopt.Option('-x')], [new docopt.Option('-a'), new docopt.Argument('N', 1), new docopt.Option('-a'), new docopt.Argument('N', 2)]] - ) - assert.deepEqual( - new docopt.OneOrMore([new docopt.Optional([new docopt.Argument('N')])]).match([new docopt.Argument(null, 9)]), - [true, [], [new docopt.Argument('N', 9)]] - ) - - - it "test_list_argument_match", -> - assert.deepEqual( - new docopt.Required([new docopt.Argument('N'), new docopt.Argument('N')]).fix().match([new docopt.Argument(null, '1'), new docopt.Argument(null, '2')]) - [true, [], [new docopt.Argument('N', ['1', '2'])]] - ) - assert.deepEqual( - new docopt.OneOrMore([new docopt.Argument('N')]).fix().match([new docopt.Argument(null, '1'), new docopt.Argument(null, '2'), new docopt.Argument(null, '3')]) - [true, [], [new docopt.Argument('N', ['1', '2', '3'])]] - ) - assert.deepEqual( - new docopt.Required([new docopt.Argument('N'), new docopt.OneOrMore([new docopt.Argument('N')])]).fix().match([new docopt.Argument(null, '1'), new docopt.Argument(null, '2'), new docopt.Argument(null, '3')]) - [true, [], [new docopt.Argument('N', ['1', '2', '3'])]] - ) - assert.deepEqual( - new docopt.Required([new docopt.Argument('N'), new docopt.Required([new docopt.Argument('N')])]).fix().match([new docopt.Argument(null, '1'), new docopt.Argument(null, '2')]), - [true, [], [new docopt.Argument('N', ['1', '2'])]] - ) - - - it "test_basic_pattern_matching", -> - # ( -a N [ -x Z ] ) - pattern = new docopt.Required([new docopt.Option('-a'), new docopt.Argument('N'), new docopt.Optional([new docopt.Option('-x'), new docopt.Argument('Z')])]) - # -a N - assert.deepEqual( - pattern.match([new docopt.Option('-a'), new docopt.Argument(null, 9)]), - [true, [], [new docopt.Option('-a'), new docopt.Argument('N', 9)]] - ) - # -a -x N Z - assert.deepEqual( - pattern.match([new docopt.Option('-a'), new docopt.Option('-x'), new docopt.Argument(null, 9), new docopt.Argument(null, 5)]), - [true, [], [new docopt.Option('-a'), new docopt.Argument('N', 9), new docopt.Option('-x'), new docopt.Argument('Z', 5)]] - ) - # -x N Z # BZZ! - assert.deepEqual( - pattern.match([new docopt.Option('-x'), new docopt.Argument(null, 9), new docopt.Argument(null, 5)]), - [false, [new docopt.Option('-x'), new docopt.Argument(null, 9), new docopt.Argument(null, 5)], []] - ) - - - it "test_pattern_either", -> - assert.deepEqual docopt.transform(new docopt.Option('-a')), new docopt.Either([new docopt.Required([new docopt.Option('-a')])]) - assert.deepEqual docopt.transform(new docopt.Argument('A')), new docopt.Either([new docopt.Required([new docopt.Argument('A')])]) - assert.deepEqual( - docopt.transform(new docopt.Required([new docopt.Either([new docopt.Option('-a'), new docopt.Option('-b')]), new docopt.Option('-c')])) - new docopt.Either([new docopt.Required([new docopt.Option('-a'), new docopt.Option('-c')]), new docopt.Required([new docopt.Option('-b'), new docopt.Option('-c')])]) - ) - assert.deepEqual( - docopt.transform(new docopt.Optional([new docopt.Option('-a'), new docopt.Either([new docopt.Option('-b'), new docopt.Option('-c')])])) - new docopt.Either([new docopt.Required([new docopt.Option('-b'), new docopt.Option('-a')]), new docopt.Required([new docopt.Option('-c'), new docopt.Option('-a')])]) - ) - assert.deepEqual( - docopt.transform(new docopt.Either([new docopt.Option('-x'), new docopt.Either([new docopt.Option('-y'), new docopt.Option('-z')])])) - new docopt.Either([new docopt.Required([new docopt.Option('-x')]), new docopt.Required([new docopt.Option('-y')]), new docopt.Required([new docopt.Option('-z')])]) - ) - assert.deepEqual( - docopt.transform(new docopt.OneOrMore([new docopt.Argument('N'), new docopt.Argument('M')])) - new docopt.Either([new docopt.Required([new docopt.Argument('N'), new docopt.Argument('M'), new docopt.Argument('N'), new docopt.Argument('M')])]) - ) - - - it "test_pattern_fix_repeating_arguments", -> - assert.deepEqual new docopt.Option('-a').fix_repeating_arguments(), new docopt.Option('-a') - assert.deepEqual new docopt.Argument('N', null).fix_repeating_arguments(), new docopt.Argument('N', null) - assert.deepEqual( - new docopt.Required([new docopt.Argument('N'), new docopt.Argument('N')]).fix_repeating_arguments() - new docopt.Required([new docopt.Argument('N', []), new docopt.Argument('N', [])]) - ) - assert.deepEqual( - new docopt.Either([new docopt.Argument('N'), new docopt.OneOrMore([new docopt.Argument('N')])]).fix() - new docopt.Either([new docopt.Argument('N', []), new docopt.OneOrMore([new docopt.Argument('N', [])])]) - ) - - - # it "test_set", -> - # assert.deepEqual new docopt.Argument('N'), new docopt.Argument('N') - # assert.deepEqual new Set([new docopt.Argument('N'), new docopt.Argument('N')]), new Set([new docopt.Argument('N')]) - - - it "test_pattern_fix_identities_1", -> - pattern = new docopt.Required([new docopt.Argument('N'), new docopt.Argument('N')]) - assert.deepEqual pattern.children[0], pattern.children[1] - assert.notEqual pattern.children[0], pattern.children[1] - pattern.fix_identities() - assert.equal pattern.children[0], pattern.children[1] - - - it "test_pattern_fix_identities_2", -> - pattern = new docopt.Required([new docopt.Optional([new docopt.Argument('X'), new docopt.Argument('N')]), new docopt.Argument('N')]) - assert.deepEqual pattern.children[0].children[1], pattern.children[1] - assert.notEqual pattern.children[0].children[1], pattern.children[1] - pattern.fix_identities() - assert.equal pattern.children[0].children[1], pattern.children[1] - - - it "test_long_options_error_handling", -> - assert.throws( - () -> - docopt.docopt('Usage: prog', {argv: '--non-existent', exit: false}) - , - docopt.DocoptExit - ) - assert.throws( - () -> - docopt.docopt('Usage: prog [--version --verbose]\nOptions: --version\n --verbose', {argv: '--ver', exit: false}) - , - docopt.DocoptExit - ) - assert.throws( - () -> - docopt.docopt('Usage: prog --long\nOptions: --long ARG', {argv: '', exit: false}) - , - docopt.DocoptLanguageError - ) - assert.throws( - () -> - docopt.docopt('Usage: prog --long ARG\nOptions: --long ARG', {argv: '--long', exit: false}) - , - docopt.DocoptExit - ) - assert.throws( - () -> - docopt.docopt('Usage: prog --long=ARG\nOptions: --long', {argv: '', exit: false}) - , - docopt.DocoptLanguageError - ) - assert.throws( - () -> - docopt.docopt('Usage: prog --long\nOptions: --long', {argv: '--long=ARG', exit: false}) - , - docopt.DocoptExit - ) - - - it "test_short_options_error_handling", -> - assert.throws( - () -> - docopt.docopt('Usage: prog -x\nOptions: -x this\n -x that', {argv: '', exit: false}) - , - docopt.DocoptLanguageError - ) - assert.throws( - () -> - docopt.docopt('Usage: prog', {argv: '-x', exit: false}) - , - docopt.DocoptExit - ) - assert.throws( - () -> - docopt.docopt('Usage: prog -o\nOptions: -o ARG', {argv: '', exit: false}) - , - docopt.DocoptLanguageError - ) - assert.throws( - () -> - docopt.docopt('Usage: prog -o ARG\nOptions: -o ARG', {argv: '-o', exit: false}) - , - docopt.DocoptExit - ) - - - it "test_matching_paren", -> - assert.throws( - () -> - docopt.docopt('Usage: prog [a [b]', {argv: '', exit: false}) - , - docopt.DocoptLanguageError - ) - assert.throws( - () -> - docopt.docopt('Usage: prog [a [b] ] c )', {argv: '', exit: false}) - , - docopt.DocoptLanguageError - ) - - - it "test_allow_double_dash", -> - assert.deepEqual( - docopt.docopt('usage: prog [-o] [--] \nkptions: -o', {argv: '-- -o', exit: false}), - {'-o': false, '': '-o', '--': true} - ) - assert.deepEqual( - docopt.docopt('usage: prog [-o] [--] \nkptions: -o', {argv: '-o 1', exit: false}), - {'-o': true, '': '1', '--': false} - ) - assert.throws( - () -> - docopt.docopt('usage: prog [-o] \nOptions:-o', {argv: '-- -o', exit: false}) - , - docopt.DocoptExit # "--" is not allowed; FIXME? - ) - - - it "test_docopt", -> - doc = '''Usage: prog [-v] A - - Options: -v Be verbose.''' - assert.deepEqual docopt.docopt(doc, {argv: 'arg', exit: false}), {'-v': false, 'A': 'arg'} - assert.deepEqual docopt.docopt(doc, {argv: '-v arg', exit: false}), {'-v': true, 'A': 'arg'} - - doc = """Usage: prog [-vqr] [FILE] - prog INPUT OUTPUT - prog --help - - Options: - -v print status messages - -q report only file names - -r show all occurrences of the same error - --help - - """ - assert.deepEqual( - docopt.docopt(doc, {argv: '-v file.py', exit: false}) - {'-v': true, '-q': false, '-r': false, '--help': false, 'FILE': 'file.py', 'INPUT': null, 'OUTPUT': null} - ) - assert.deepEqual( - docopt.docopt(doc, {argv: '-v', exit: false}) - {'-v': true, '-q': false, '-r': false, '--help': false, 'FILE': null, 'INPUT': null, 'OUTPUT': null} - ) - assert.throws( - () -> - docopt.docopt(doc, {argv: '-v input.py output.py', exit: false}) - , - docopt.DocoptExit - ) - assert.throws( - () -> - docopt.docopt(doc, {argv: '--fake', exit: false}) - , - docopt.DocoptExit - ) - assert.throws( - () -> - docopt.docopt(doc, {argv: '--hel', exit: false}) - , - Error - ) - - - it "test_language_errors", -> - assert.throws( - () -> - docopt.docopt('no usage with colon here', {argv: '', exit: false}) - , - docopt.DocoptLanguageError - ) - assert.throws( - () -> - docopt.docopt('usage: here \n\n and again usage: here', {argv: '', exit: false}) - , - docopt.DocoptLanguageError - ) - - - it "test_issue_40", -> - assert.throws( - () -> - docopt.docopt('usage: prog --help-commands | --help', {argv: '--help', exit: false}) - , - Error - ) - assert.deepEqual( - docopt.docopt('usage: prog --aabb | --aa', {argv: '--aa', exit: false}), - {'--aabb': false, '--aa': true} - ) - - - # it "test_issue34_unicode_strings", -> - # try: - # assert.deepEqual docopt.docopt(eval("u'usage: prog [-o ]'"), ''), - # {'-o': false, '': null} - # except SyntaxError: - # pass # Python 3 - - - it "test_count_multiple_flags", -> - assert.deepEqual docopt.docopt('usage: prog [-v]', {argv: '-v', exit: false}), {'-v': true} - assert.deepEqual docopt.docopt('usage: prog [-vv]', {argv: '', exit: false}), {'-v': 0} - assert.deepEqual docopt.docopt('usage: prog [-vv]', {argv: '-v', exit: false}), {'-v': 1} - assert.deepEqual docopt.docopt('usage: prog [-vv]', {argv: '-vv', exit: false}), {'-v': 2} - assert.throws( - () -> - docopt.docopt('usage: prog [-vv]', {argv: '-vvv', exit: false}) - , - docopt.DocoptExit - ) - assert.deepEqual docopt.docopt('usage: prog [-v | -vv | -vvv]', {argv: '-vvv', exit: false}), {'-v': 3} - assert.deepEqual docopt.docopt('usage: prog -v...', {argv: '-vvvvvv', exit: false}), {'-v': 6} - assert.deepEqual docopt.docopt('usage: prog [--ver --ver]', {argv: '--ver --ver', exit: false}), {'--ver': 2} - - - it "test_any_options_parameter", -> - assert.throws( - () -> - docopt.docopt('usage: prog [options]', {argv: '-foo --bar --spam=eggs', exit: false}) - , - docopt.DocoptExit - ) - assert.throws( - () -> - docopt.docopt('usage: prog [options]', {argv: '--foo --bar --bar', exit: false}) - , - docopt.DocoptExit - ) - assert.throws( - () -> - docopt.docopt('usage: prog [options]', {argv: '--bar --bar --bar -ffff', exit: false}) - , - docopt.DocoptExit - ) - assert.throws( - () -> - docopt.docopt('usage: prog [options]', {argv: '--long=arg --long=another', exit: false}) - , - docopt.DocoptExit - ) - - - it "test_default_value_for_positional_arguments", -> - doc = """Usage: prog [--data=...]\n - Options:\n\t-d --data= Input data [default: x] - """ - a = docopt.docopt(doc, {argv: '', exit: false}) - assert.deepEqual a, {'--data': ['x']} - doc = """Usage: prog [--data=...]\n - Options:\n\t-d --data= Input data [default: x y] - """ - a = docopt.docopt(doc, {argv: '', exit: false}) - assert.deepEqual a, {'--data': ['x', 'y']} - doc = """Usage: prog [--data=...]\n - Options:\n\t-d --data= Input data [default: x y] - """ - a = docopt.docopt(doc, {argv: '--data=this', exit: false}) - assert.deepEqual a, {'--data': ['this']} - - - it "test_issue_59", -> - assert.deepEqual docopt.docopt('usage: prog --long=', {argv: '--long=', exit: false}), {'--long': ''} - assert.deepEqual docopt.docopt('usage: prog -l \nOptions: -l ', {argv: ['-l', ''], exit: false}), {'-l': ''} - - - it "test_options_first", -> - assert.deepEqual( - docopt.docopt('usage: prog [--opt] [...]', {argv: '--opt this that', exit: false}) - {'--opt': true, '': ['this', 'that']} - ) - assert.deepEqual( - docopt.docopt('usage: prog [--opt] [...]', {argv: 'this that --opt', exit: false}) - {'--opt': true, '': ['this', 'that']} - ) - assert.deepEqual( - docopt.docopt('usage: prog [--opt] [...]', {argv: 'this that --opt', exit: false, options_first: true}) - {'--opt': false, '': ['this', 'that', '--opt']} - ) - - - it "test_issue_68_options_shortcut_does_not_include_options_in_usage_pattern", -> - args = docopt.docopt('usage: prog [-ab] [options]\nOptions: -x\n -y', {argv: '-ax', exit: false}) - # Need to use `is` (not `==`) since we want to make sure - # that they are not 1/0, but strictly true/false: - assert.equal args['-a'], true - assert.equal args['-b'], false - assert.equal args['-x'], true - assert.equal args['-y'], false - - - it "test_issue_65_evaluate_argv_when_called_not_when_imported", -> - process.argv = ['node', 'prog', '-a'] - assert.deepEqual docopt.docopt('usage: prog [-ab]', {exit: false}), {'-a': true, '-b': false} - process.argv = ['node', 'prog', '-b'] - assert.deepEqual docopt.docopt('usage: prog [-ab]', {exit: false}), {'-a': false, '-b': true} - - - it "test_issue_71_double_dash_is_not_a_valid_option_argument", -> - assert.throws( - () -> - docopt.docopt('usage: prog [--log=LEVEL] [--] ...', {argv: '--log -- 1 2', exit: false}) - , - docopt.DocoptExit - ) - assert.throws( - () -> - docopt.docopt('''usage: prog [-l LEVEL] [--] ... - Options: -l LEVEL''', {argv: '-l -- 1 2', exit: false}) - , - docopt.DocoptExit - ) - - usage = '''usage: this - - usage:hai - usage: this that - - usage: foo - bar - - PROGRAM USAGE: - foo - bar - usage: - \ttoo - \ttar - Usage: eggs spam - BAZZ - usage: pit stop''' - - it "test_parse_section", -> - assert.deepEqual docopt.parse_section('usage:', 'foo bar fizz buzz'), [] - assert.deepEqual docopt.parse_section('usage:', 'usage: prog'), ['usage: prog'] - assert.deepEqual docopt.parse_section('usage:', 'usage: -x\n -y'), ['usage: -x\n -y'] - assert.deepEqual docopt.parse_section('usage:', usage), [ - 'usage: this', - 'usage:hai', - 'usage: this that', - 'usage: foo\n bar', - 'PROGRAM USAGE:\n foo\n bar', - 'usage:\n\ttoo\n\ttar', - 'Usage: eggs spam', - 'usage: pit stop', - ] - - - it "test_issue_126_defaults_not_parsed_correctly_when_tabs", -> - section = 'Options:\n\t--foo= [default: bar]' - assert.deepEqual docopt.parse_defaults(section), [new docopt.Option(null, '--foo', 1, 'bar')] diff --git a/node_modules/docopt/test/testcases.coffee b/node_modules/docopt/test/testcases.coffee deleted file mode 100644 index 05b006d63b447..0000000000000 --- a/node_modules/docopt/test/testcases.coffee +++ /dev/null @@ -1,63 +0,0 @@ -assert = require 'assert' -path = require 'path' -fs = require 'fs' -docopt = require '../docopt.coffee' - -partition = (text, delimiter) -> - parts = text.split delimiter - return [parts[0], delimiter, parts[1..].join(delimiter)] - -load_test_cases = () -> - testcases_path = path.resolve './test/testcases.docopt' - if fs.existsSync testcases_path - try - return fs.readFileSync(testcases_path).toString() - catch err - return console.error "Could not read ./test/testcases.docopt file" - else - return console.error "./test/testcases.docopt not exists" - -parse_test = (raw) -> - raw = raw.replace(/#.*/gm, '').trim() - if (raw.indexOf '"""') is 0 - raw = raw[3..] - - tests = [] - for fixture in raw.split('r"""') - name = '' - [doc, _, body] = partition fixture, '"""' - cases = [] - for mycase in body.split('$')[1..] - [argv, _, expect] = partition mycase.trim(), '\n' - expect = JSON.parse(expect) - [prog, _, argv] = partition argv.trim(), ' ' - cases.push([prog, argv, expect]) - tests.push [name, doc, cases] - return tests - -collect = () -> - index = 1 - collected = [] - testcases = load_test_cases() - for [name, doc, cases] in parse_test testcases - name = 'testcases.docopt' - for mycase in cases - collected.push [[name, index], doc, mycase] - index++ - return collected - - -describe 'testcases.coffee', -> - collected = collect() - collected.forEach (c) -> - [test_file, index] = c[0] - doc = c[1] - [prog, argv, expected] = c[2] - it "testcase #{index} `#{[prog, argv].join(' ')}`", -> - try - result = docopt.docopt(doc, {name: prog, argv: argv, exit: false}) - catch e - if e.constructor is docopt.DocoptExit - result = 'user-error' - finally - assert.deepEqual result, expected diff --git a/node_modules/docopt/test/testcases.docopt b/node_modules/docopt/test/testcases.docopt deleted file mode 100644 index efe9a07f608eb..0000000000000 --- a/node_modules/docopt/test/testcases.docopt +++ /dev/null @@ -1,957 +0,0 @@ -r"""Usage: prog - -""" -$ prog -{} - -$ prog --xxx -"user-error" - - -r"""Usage: prog [options] - -Options: -a All. - -""" -$ prog -{"-a": false} - -$ prog -a -{"-a": true} - -$ prog -x -"user-error" - - -r"""Usage: prog [options] - -Options: --all All. - -""" -$ prog -{"--all": false} - -$ prog --all -{"--all": true} - -$ prog --xxx -"user-error" - - -r"""Usage: prog [options] - -Options: -v, --verbose Verbose. - -""" -$ prog --verbose -{"--verbose": true} - -$ prog --ver -{"--verbose": true} - -$ prog -v -{"--verbose": true} - - -r"""Usage: prog [options] - -Options: -p PATH - -""" -$ prog -p home/ -{"-p": "home/"} - -$ prog -phome/ -{"-p": "home/"} - -$ prog -p -"user-error" - - -r"""Usage: prog [options] - -Options: --path - -""" -$ prog --path home/ -{"--path": "home/"} - -$ prog --path=home/ -{"--path": "home/"} - -$ prog --pa home/ -{"--path": "home/"} - -$ prog --pa=home/ -{"--path": "home/"} - -$ prog --path -"user-error" - - -r"""Usage: prog [options] - -Options: -p PATH, --path= Path to files. - -""" -$ prog -proot -{"--path": "root"} - - -r"""Usage: prog [options] - -Options: -p --path PATH Path to files. - -""" -$ prog -p root -{"--path": "root"} - -$ prog --path root -{"--path": "root"} - - -r"""Usage: prog [options] - -Options: - -p PATH Path to files [default: ./] - -""" -$ prog -{"-p": "./"} - -$ prog -phome -{"-p": "home"} - - -r"""UsAgE: prog [options] - -OpTiOnS: --path= Path to files - [dEfAuLt: /root] - -""" -$ prog -{"--path": "/root"} - -$ prog --path=home -{"--path": "home"} - - -r"""usage: prog [options] - -options: - -a Add - -r Remote - -m Message - -""" -$ prog -a -r -m Hello -{"-a": true, - "-r": true, - "-m": "Hello"} - -$ prog -armyourass -{"-a": true, - "-r": true, - "-m": "yourass"} - -$ prog -a -r -{"-a": true, - "-r": true, - "-m": null} - - -r"""Usage: prog [options] - -Options: --version - --verbose - -""" -$ prog --version -{"--version": true, - "--verbose": false} - -$ prog --verbose -{"--version": false, - "--verbose": true} - -$ prog --ver -"user-error" - -$ prog --verb -{"--version": false, - "--verbose": true} - - -r"""usage: prog [-a -r -m ] - -options: - -a Add - -r Remote - -m Message - -""" -$ prog -armyourass -{"-a": true, - "-r": true, - "-m": "yourass"} - - -r"""usage: prog [-armmsg] - -options: -a Add - -r Remote - -m Message - -""" -$ prog -a -r -m Hello -{"-a": true, - "-r": true, - "-m": "Hello"} - - -r"""usage: prog -a -b - -options: - -a - -b - -""" -$ prog -a -b -{"-a": true, "-b": true} - -$ prog -b -a -{"-a": true, "-b": true} - -$ prog -a -"user-error" - -$ prog -"user-error" - - -r"""usage: prog (-a -b) - -options: -a - -b - -""" -$ prog -a -b -{"-a": true, "-b": true} - -$ prog -b -a -{"-a": true, "-b": true} - -$ prog -a -"user-error" - -$ prog -"user-error" - - -r"""usage: prog [-a] -b - -options: -a - -b - -""" -$ prog -a -b -{"-a": true, "-b": true} - -$ prog -b -a -{"-a": true, "-b": true} - -$ prog -a -"user-error" - -$ prog -b -{"-a": false, "-b": true} - -$ prog -"user-error" - - -r"""usage: prog [(-a -b)] - -options: -a - -b - -""" -$ prog -a -b -{"-a": true, "-b": true} - -$ prog -b -a -{"-a": true, "-b": true} - -$ prog -a -"user-error" - -$ prog -b -"user-error" - -$ prog -{"-a": false, "-b": false} - - -r"""usage: prog (-a|-b) - -options: -a - -b - -""" -$ prog -a -b -"user-error" - -$ prog -"user-error" - -$ prog -a -{"-a": true, "-b": false} - -$ prog -b -{"-a": false, "-b": true} - - -r"""usage: prog [ -a | -b ] - -options: -a - -b - -""" -$ prog -a -b -"user-error" - -$ prog -{"-a": false, "-b": false} - -$ prog -a -{"-a": true, "-b": false} - -$ prog -b -{"-a": false, "-b": true} - - -r"""usage: prog """ -$ prog 10 -{"": "10"} - -$ prog 10 20 -"user-error" - -$ prog -"user-error" - - -r"""usage: prog []""" -$ prog 10 -{"": "10"} - -$ prog 10 20 -"user-error" - -$ prog -{"": null} - - -r"""usage: prog """ -$ prog 10 20 40 -{"": "10", "": "20", "": "40"} - -$ prog 10 20 -"user-error" - -$ prog -"user-error" - - -r"""usage: prog [ ]""" -$ prog 10 20 40 -{"": "10", "": "20", "": "40"} - -$ prog 10 20 -{"": "10", "": "20", "": null} - -$ prog -"user-error" - - -r"""usage: prog [ | ]""" -$ prog 10 20 40 -"user-error" - -$ prog 20 40 -{"": null, "": "20", "": "40"} - -$ prog -{"": null, "": null, "": null} - - -r"""usage: prog ( --all | ) - -options: - --all - -""" -$ prog 10 --all -{"": "10", "--all": true, "": null} - -$ prog 10 -{"": null, "--all": false, "": "10"} - -$ prog -"user-error" - - -r"""usage: prog [ ]""" -$ prog 10 20 -{"": ["10", "20"]} - -$ prog 10 -{"": ["10"]} - -$ prog -{"": []} - - -r"""usage: prog [( )]""" -$ prog 10 20 -{"": ["10", "20"]} - -$ prog 10 -"user-error" - -$ prog -{"": []} - - -r"""usage: prog NAME...""" -$ prog 10 20 -{"NAME": ["10", "20"]} - -$ prog 10 -{"NAME": ["10"]} - -$ prog -"user-error" - - -r"""usage: prog [NAME]...""" -$ prog 10 20 -{"NAME": ["10", "20"]} - -$ prog 10 -{"NAME": ["10"]} - -$ prog -{"NAME": []} - - -r"""usage: prog [NAME...]""" -$ prog 10 20 -{"NAME": ["10", "20"]} - -$ prog 10 -{"NAME": ["10"]} - -$ prog -{"NAME": []} - - -r"""usage: prog [NAME [NAME ...]]""" -$ prog 10 20 -{"NAME": ["10", "20"]} - -$ prog 10 -{"NAME": ["10"]} - -$ prog -{"NAME": []} - - -r"""usage: prog (NAME | --foo NAME) - -options: --foo - -""" -$ prog 10 -{"NAME": "10", "--foo": false} - -$ prog --foo 10 -{"NAME": "10", "--foo": true} - -$ prog --foo=10 -"user-error" - - -r"""usage: prog (NAME | --foo) [--bar | NAME] - -options: --foo -options: --bar - -""" -$ prog 10 -{"NAME": ["10"], "--foo": false, "--bar": false} - -$ prog 10 20 -{"NAME": ["10", "20"], "--foo": false, "--bar": false} - -$ prog --foo --bar -{"NAME": [], "--foo": true, "--bar": true} - - -r"""Naval Fate. - -Usage: - prog ship new ... - prog ship [] move [--speed=] - prog ship shoot - prog mine (set|remove) [--moored|--drifting] - prog -h | --help - prog --version - -Options: - -h --help Show this screen. - --version Show version. - --speed= Speed in knots [default: 10]. - --moored Mored (anchored) mine. - --drifting Drifting mine. - -""" -$ prog ship Guardian move 150 300 --speed=20 -{"--drifting": false, - "--help": false, - "--moored": false, - "--speed": "20", - "--version": false, - "": ["Guardian"], - "": "150", - "": "300", - "mine": false, - "move": true, - "new": false, - "remove": false, - "set": false, - "ship": true, - "shoot": false} - - -r"""usage: prog --hello""" -$ prog --hello -{"--hello": true} - - -r"""usage: prog [--hello=]""" -$ prog -{"--hello": null} - -$ prog --hello wrld -{"--hello": "wrld"} - - -r"""usage: prog [-o]""" -$ prog -{"-o": false} - -$ prog -o -{"-o": true} - - -r"""usage: prog [-opr]""" -$ prog -op -{"-o": true, "-p": true, "-r": false} - - -r"""usage: prog --aabb | --aa""" -$ prog --aa -{"--aabb": false, "--aa": true} - -$ prog --a -"user-error" # not a unique prefix - -# -# Counting number of flags -# - -r"""Usage: prog -v""" -$ prog -v -{"-v": true} - - -r"""Usage: prog [-v -v]""" -$ prog -{"-v": 0} - -$ prog -v -{"-v": 1} - -$ prog -vv -{"-v": 2} - - -r"""Usage: prog -v ...""" -$ prog -"user-error" - -$ prog -v -{"-v": 1} - -$ prog -vv -{"-v": 2} - -$ prog -vvvvvv -{"-v": 6} - - -r"""Usage: prog [-v | -vv | -vvv] - -This one is probably most readable user-friednly variant. - -""" -$ prog -{"-v": 0} - -$ prog -v -{"-v": 1} - -$ prog -vv -{"-v": 2} - -$ prog -vvvv -"user-error" - - -r"""usage: prog [--ver --ver]""" -$ prog --ver --ver -{"--ver": 2} - - -# -# Counting commands -# - -r"""usage: prog [go]""" -$ prog go -{"go": true} - - -r"""usage: prog [go go]""" -$ prog -{"go": 0} - -$ prog go -{"go": 1} - -$ prog go go -{"go": 2} - -$ prog go go go -"user-error" - -r"""usage: prog go...""" -$ prog go go go go go -{"go": 5} - -# -# [options] does not include options from usage-pattern -# -r"""usage: prog [options] [-a] - -options: -a - -b -""" -$ prog -a -{"-a": true, "-b": false} - -$ prog -aa -"user-error" - -# -# Test [options] shourtcut -# - -r"""Usage: prog [options] A -Options: - -q Be quiet - -v Be verbose. - -""" -$ prog arg -{"A": "arg", "-v": false, "-q": false} - -$ prog -v arg -{"A": "arg", "-v": true, "-q": false} - -$ prog -q arg -{"A": "arg", "-v": false, "-q": true} - -# -# Test single dash -# - -r"""usage: prog [-]""" - -$ prog - -{"-": true} - -$ prog -{"-": false} - -# -# If argument is repeated, its value should always be a list -# - -r"""usage: prog [NAME [NAME ...]]""" - -$ prog a b -{"NAME": ["a", "b"]} - -$ prog -{"NAME": []} - -# -# Option's argument defaults to null/None -# - -r"""usage: prog [options] -options: - -a Add - -m Message - -""" -$ prog -a -{"-m": null, "-a": true} - -# -# Test options without description -# - -r"""usage: prog --hello""" -$ prog --hello -{"--hello": true} - -r"""usage: prog [--hello=]""" -$ prog -{"--hello": null} - -$ prog --hello wrld -{"--hello": "wrld"} - -r"""usage: prog [-o]""" -$ prog -{"-o": false} - -$ prog -o -{"-o": true} - -r"""usage: prog [-opr]""" -$ prog -op -{"-o": true, "-p": true, "-r": false} - -r"""usage: git [-v | --verbose]""" -$ prog -v -{"-v": true, "--verbose": false} - -r"""usage: git remote [-v | --verbose]""" -$ prog remote -v -{"remote": true, "-v": true, "--verbose": false} - -# -# Test empty usage pattern -# - -r"""usage: prog""" -$ prog -{} - -r"""usage: prog - prog -""" -$ prog 1 2 -{"": "1", "": "2"} - -$ prog -{"": null, "": null} - -r"""usage: prog - prog -""" -$ prog -{"": null, "": null} - -# -# Option's argument should not capture default value from usage pattern -# - -r"""usage: prog [--file=]""" -$ prog -{"--file": null} - -r"""usage: prog [--file=] - -options: --file - -""" -$ prog -{"--file": null} - -r"""Usage: prog [-a ] - -Options: -a, --address TCP address [default: localhost:6283]. - -""" -$ prog -{"--address": "localhost:6283"} - -# -# If option with argument could be repeated, -# its arguments should be accumulated into a list -# - -r"""usage: prog --long= ...""" - -$ prog --long one -{"--long": ["one"]} - -$ prog --long one --long two -{"--long": ["one", "two"]} - -# -# Test multiple elements repeated at once -# - -r"""usage: prog (go --speed=)...""" -$ prog go left --speed=5 go right --speed=9 -{"go": 2, "": ["left", "right"], "--speed": ["5", "9"]} - -# -# Required options should work with option shortcut -# - -r"""usage: prog [options] -a - -options: -a - -""" -$ prog -a -{"-a": true} - -# -# If option could be repeated its defaults should be split into a list -# - -r"""usage: prog [-o ]... - -options: -o [default: x] - -""" -$ prog -o this -o that -{"-o": ["this", "that"]} - -$ prog -{"-o": ["x"]} - -r"""usage: prog [-o ]... - -options: -o [default: x y] - -""" -$ prog -o this -{"-o": ["this"]} - -$ prog -{"-o": ["x", "y"]} - -# -# Test stacked option's argument -# - -r"""usage: prog -pPATH - -options: -p PATH - -""" -$ prog -pHOME -{"-p": "HOME"} - -# -# Issue 56: Repeated mutually exclusive args give nested lists sometimes -# - -r"""Usage: foo (--xx=x|--yy=y)...""" -$ prog --xx=1 --yy=2 -{"--xx": ["1"], "--yy": ["2"]} - -# -# POSIXly correct tokenization -# - -r"""usage: prog []""" -$ prog f.txt -{"": "f.txt"} - -r"""usage: prog [--input=]...""" -$ prog --input a.txt --input=b.txt -{"--input": ["a.txt", "b.txt"]} - -# -# Issue 85: `[options]` shourtcut with multiple subcommands -# - -r"""usage: prog good [options] - prog fail [options] - -options: --loglevel=N - -""" -$ prog fail --loglevel 5 -{"--loglevel": "5", "fail": true, "good": false} - -# -# Usage-section syntax -# - -r"""usage:prog --foo""" -$ prog --foo -{"--foo": true} - -r"""PROGRAM USAGE: prog --foo""" -$ prog --foo -{"--foo": true} - -r"""Usage: prog --foo - prog --bar -NOT PART OF SECTION""" -$ prog --foo -{"--foo": true, "--bar": false} - -r"""Usage: - prog --foo - prog --bar - -NOT PART OF SECTION""" -$ prog --foo -{"--foo": true, "--bar": false} - -r"""Usage: - prog --foo - prog --bar -NOT PART OF SECTION""" -$ prog --foo -{"--foo": true, "--bar": false} - -# -# Options-section syntax -# - -r"""Usage: prog [options] - -global options: --foo -local options: --baz - --bar -other options: - --egg - --spam --not-an-option- - -""" -$ prog --baz --egg -{"--foo": false, "--baz": true, "--bar": false, "--egg": true, "--spam": false} diff --git a/node_modules/fs-access/index.js b/node_modules/fs-access/index.js deleted file mode 100644 index 094537a455d7b..0000000000000 --- a/node_modules/fs-access/index.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; -var fs = require('fs'); -var nullCheck = require('null-check'); - -var access = module.exports = function (pth, mode, cb) { - if (typeof pth !== 'string') { - throw new TypeError('path must be a string'); - } - - if (typeof mode === 'function') { - cb = mode; - mode = access.F_OK; - } else if (typeof cb !== 'function') { - throw new TypeError('callback must be a function'); - } - - if (!nullCheck(pth, cb)) { - return; - } - - mode = mode | 0; - - if (mode === access.F_OK) { - fs.stat(pth, cb); - } -}; - -access.sync = function (pth, mode) { - nullCheck(pth); - - mode = mode === undefined ? access.F_OK : mode | 0; - - if (mode === access.F_OK) { - fs.statSync(pth); - } -}; - -access.F_OK = 0; -access.R_OK = 4; -access.W_OK = 2; -access.X_OK = 1; diff --git a/node_modules/fs-access/license b/node_modules/fs-access/license deleted file mode 100644 index 654d0bfe94343..0000000000000 --- a/node_modules/fs-access/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -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/node_modules/fs-access/package.json b/node_modules/fs-access/package.json deleted file mode 100644 index f98df6784e423..0000000000000 --- a/node_modules/fs-access/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "_args": [ - [ - "fs-access@1.0.1", - "/Users/zkat/Documents/code/work/npm" - ] - ], - "_development": true, - "_from": "fs-access@1.0.1", - "_id": "fs-access@1.0.1", - "_inBundle": false, - "_integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", - "_location": "/fs-access", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "fs-access@1.0.1", - "name": "fs-access", - "escapedName": "fs-access", - "rawSpec": "1.0.1", - "saveSpec": null, - "fetchSpec": "1.0.1" - }, - "_requiredBy": [ - "/licensee" - ], - "_resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "_spec": "1.0.1", - "_where": "/Users/zkat/Documents/code/work/npm", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "bugs": { - "url": "https://github.com/sindresorhus/fs-access/issues" - }, - "dependencies": { - "null-check": "^1.0.0" - }, - "description": "Node.js 0.12 fs.access() & fs.accessSync() ponyfill", - "devDependencies": { - "os-tmpdir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "files": [ - "index.js" - ], - "homepage": "https://github.com/sindresorhus/fs-access#readme", - "keywords": [ - "built-in", - "core", - "ponyfill", - "polyfill", - "shim", - "fs", - "access", - "stat", - "mode", - "permission", - "user", - "process", - "check" - ], - "license": "MIT", - "name": "fs-access", - "repository": { - "type": "git", - "url": "git+https://github.com/sindresorhus/fs-access.git" - }, - "scripts": { - "test": "node test.js" - }, - "version": "1.0.1" -} diff --git a/node_modules/fs-access/readme.md b/node_modules/fs-access/readme.md deleted file mode 100644 index 89e96e750bacc..0000000000000 --- a/node_modules/fs-access/readme.md +++ /dev/null @@ -1,51 +0,0 @@ -# fs-access [![Build Status](https://travis-ci.org/sindresorhus/fs-access.svg?branch=master)](https://travis-ci.org/sindresorhus/fs-access) - -> Node.js 0.12 [`fs.access()`](https://nodejs.org/api/fs.html#fs_fs_access_path_mode_callback) & [`fs.accessSync()`](https://nodejs.org/api/fs.html#fs_fs_accesssync_path_mode) [ponyfill](https://ponyfill.com) - - -## Install - -``` -$ npm install --save fs-access -``` - - -## Usage - -```js -var fsAccess = require('fs-access'); - -fsAccess('unicorn.txt', function (err) { - if (err) { - console.error('no access'); - return; - } - - console.log('access'); -}); -``` - -```js -var fsAccess = require('fs-access'); - -try { - fsAccess.sync('unicorn.txt'); - console.log('access'); -} catch (err) { - console.error('no access'); -} -``` - - -## API - -See the [`fs.access()` & `fs.accessSync()` docs](https://nodejs.org/api/fs.html#fs_fs_access_path_mode_callback). - -Mode flags are on the `fsAccess` instance instead of `fs`. - -Only the `F_OK` mode is supported for now. [Help welcome for additional modes.](https://github.com/sindresorhus/fs-access/issues/1) - - -## License - -MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/json-parse-errback/LICENSE b/node_modules/json-parse-errback/LICENSE deleted file mode 100644 index 2966484fe8b7d..0000000000000 --- a/node_modules/json-parse-errback/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -SPDX:MIT - -MIT License - -Copyright (c) 2016 Kyle E. Mitchell - -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/node_modules/json-parse-errback/README.md b/node_modules/json-parse-errback/README.md deleted file mode 100644 index bddd4cee61bba..0000000000000 --- a/node_modules/json-parse-errback/README.md +++ /dev/null @@ -1,13 +0,0 @@ -```javascript -module.exports = function (input, callback) { - var result - try { - result = JSON.parse(input) - } catch (error) { - return callback(error) - } - callback(null, result) -} -``` - -"That's all, folks!" diff --git a/node_modules/json-parse-errback/index.js b/node_modules/json-parse-errback/index.js deleted file mode 100644 index 2dfd5cb1f7d18..0000000000000 --- a/node_modules/json-parse-errback/index.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = function (input, callback) { - var result - try { - result = JSON.parse(input) - } catch (error) { - return callback(error) - } - callback(null, result) -} - - - - diff --git a/node_modules/json-parse-errback/package.json b/node_modules/json-parse-errback/package.json deleted file mode 100644 index 141509a6fbc01..0000000000000 --- a/node_modules/json-parse-errback/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "_args": [ - [ - "json-parse-errback@2.0.1", - "/Users/zkat/Documents/code/work/npm" - ] - ], - "_development": true, - "_from": "json-parse-errback@2.0.1", - "_id": "json-parse-errback@2.0.1", - "_inBundle": false, - "_integrity": "sha1-x6nCvjqFWzQvgqv8ibyFk1tYhPo=", - "_location": "/json-parse-errback", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "json-parse-errback@2.0.1", - "name": "json-parse-errback", - "escapedName": "json-parse-errback", - "rawSpec": "2.0.1", - "saveSpec": null, - "fetchSpec": "2.0.1" - }, - "_requiredBy": [ - "/licensee" - ], - "_resolved": "https://registry.npmjs.org/json-parse-errback/-/json-parse-errback-2.0.1.tgz", - "_spec": "2.0.1", - "_where": "/Users/zkat/Documents/code/work/npm", - "author": { - "name": "Kyle E. Mitchell", - "email": "kyle@kemitchell.com", - "url": "https://kemitchell.com/" - }, - "bugs": { - "url": "https://github.com/kemitchell/json-parse-errback.js/issues" - }, - "description": "parse(input, function(error, object) { ... })", - "devDependencies": { - "defence-cli": "^1.0.5" - }, - "files": [ - "LICENSE", - "README.md", - "index.js" - ], - "homepage": "https://github.com/kemitchell/json-parse-errback.js#readme", - "license": "MIT", - "name": "json-parse-errback", - "repository": { - "type": "git", - "url": "git+https://github.com/kemitchell/json-parse-errback.js.git" - }, - "scripts": { - "prepublish": "defence < README.md > index.js" - }, - "version": "2.0.1" -} diff --git a/node_modules/licensee/LICENSE b/node_modules/licensee/LICENSE deleted file mode 100644 index d645695673349..0000000000000 --- a/node_modules/licensee/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/node_modules/licensee/README.md b/node_modules/licensee/README.md deleted file mode 100644 index e401e27d6c0bc..0000000000000 --- a/node_modules/licensee/README.md +++ /dev/null @@ -1,132 +0,0 @@ -Check npm package dependency license metadata against rules. - -# Configuration - -Licensee accepts two kinds of configuration: - -1. a rule about permitted licenses -2. a package whitelist of name-and-range pairs - -You can set configuration with command flags or a `.licensee.json` -file at the root of your package, like so: - -```json -{ - "license": "(MIT OR BSD-2-Clause OR BSD-3-Clause OR Apache-2.0)", - "whitelist": { - "optimist": "<=0.6.1" - } -} -``` - -The `license` property is an SPDX license expression that -[spdx-expression-parse][parse] can parse. Any package with [standard -license metadata][metadata] that satisfies the SPDX license expression -according to [spdx-satisfies][satisfies] will not cause an error. - -[parse]: https://www.npmjs.com/package/spdx-expression-parse -[satisfies]: https://www.npmjs.com/package/spdx-satisfies - -The `whitelist` is a map from package name to a [node-semver][semver] -Semantic Versioning range. Packages whose license metadata don't match -the SPDX license expression in `license` but have a name and version -described in `whitelist` will not cause an error. - -[metadata]: https://docs.npmjs.com/files/package.json#license -[semver]: https://www.npmjs.com/package/semver - -# Use - -To install and use `licensee` globally: - -```bash -npm install --global licensee -cd your-package -licensee --init -licensee -``` - -The `licensee` script prints a report about dependencies and their -license terms to standard output. It exits with status `0` when all -packages in `./node_modules` meet the configured licensing criteria -and `1` when one or more do not. - -To install it as a development dependency of your package: - -```bash -cd your-package -npm install --save-dev licensee -``` - -Consider adding `licensee` to your npm scripts: - -```json -{ - "scripts": { - "posttest": "licensee" - } -} -``` - -For output as newline-delimited JSON objects, for further processing: - -```json -{ - "scripts": { - "posttest": "licensee --ndjson" - } -} -``` - -To skip the readout of license information: - -```json -{ - "scripts": { - "posttest": "licensee --quiet" - } -} -``` - -If you want a readout of dependency information, but don't want -your continuous integration going red, you can ignore `licensee`'s -exit code: - -```json -{ - "scripts": { - "posttest": "licensee || true" - } -} -``` - -To save the readout of license information to a file: - -```json -{ - "scripts": { - "posttest": "licensee | tee LICENSES || true" - } -} -``` - -Alternatively, for a readout of just packages without approved licenses: - -```json -{ - "scripts": { - "posttest": "licensee --errors-only" - } -} -``` - -# JavaScript Module - -The package exports an asynchronous function of three arguments: - -1. A configuration object in the same form as `.licensee.json`. - -2. The path of the package to check. - -3. An error-first callback that yields an array of objects, one per - dependency. diff --git a/node_modules/licensee/index.js b/node_modules/licensee/index.js deleted file mode 100644 index fc02d0a269353..0000000000000 --- a/node_modules/licensee/index.js +++ /dev/null @@ -1,212 +0,0 @@ -module.exports = licensee - -var licenseSatisfies = require('spdx-satisfies') -var parseJSON = require('json-parse-errback') -var readPackageTree = require('read-package-tree') -var runParallel = require('run-parallel') -var satisfies = require('semver').satisfies -var simpleConcat = require('simple-concat') -var spawn = require('child_process').spawn -var validSPDX = require('spdx-expression-validate') - -function licensee (configuration, path, callback) { - if (!validConfiguration(configuration)) { - callback(new Error('Invalid configuration')) - } else if (!validSPDX(configuration.license)) { - callback(new Error('Invalid license expression')) - } else { - if (configuration.productionOnly) { - // In order to ignore devDependencies, we need to read: - // - // 1. the dependencies-only dependency graph, from - // `npm ls --json --production` - // - // 2. the structure of `node_modules` and `package.json` - // files within it, with read-package-tree. - // - // `npm ls` calls read-package-tree internally, but does - // lots of npm-specific post-processing to produce the - // dependency tree. Calling read-package-tree twice, at - // the same time, is far from efficient. But it works, - // and doing so helps keep this package small. - runParallel({ - dependencies: readDependencyList, - packages: readFilesystemTree - }, function (error, trees) { - if (error) callback(error) - else withTrees(trees.packages, trees.dependencies) - }) - } else { - // If we are analyzing _all_ installed dependencies, - // and don't care whether they're devDependencies - // or not, just read `node_modules`. We don't need - // the dependency graph. - readFilesystemTree(function (error, packages) { - if (error) callback(error) - else withTrees(packages, false) - }) - } - } - - function withTrees (packages, dependencies) { - callback(null, findIssues( - configuration, packages, dependencies, [] - )) - } - - function readDependencyList (done) { - var child = spawn( - 'npm', ['ls', '--production', '--json'], {cwd: path} - ) - var outputError - var json - simpleConcat(child.stdout, function (error, buffer) { - if (error) outputError = error - else json = buffer - }) - child.once('close', function (code) { - if (code !== 0) { - done(new Error('npm exited with status ' + code)) - } else if (outputError) { - done(outputError) - } else { - parseJSON(json, function (error, graph) { - if (error) return done(error) - if (!graph.hasOwnProperty('dependencies')) { - done(new Error('cannot interpret npm ls --json output')) - } else { - var flattened = {} - flattenDependencyTree(graph.dependencies, flattened) - done(null, flattened) - } - }) - } - }) - } - - function readFilesystemTree (done) { - readPackageTree(path, function (error, tree) { - if (error) return done(error) - done(null, tree.children) - }) - } -} - -var KEY_PREFIX = '.' - -function flattenDependencyTree (graph, object) { - Object.keys(graph).forEach(function (name) { - var node = graph[name] - var version = node.version - var key = KEY_PREFIX + name - if ( - object.hasOwnProperty(key) && - object[key].indexOf(version) === -1 - ) { - object[key].push(version) - } else { - object[key] = [version] - } - if (node.hasOwnProperty('dependencies')) { - flattenDependencyTree(node.dependencies, object) - } - }) -} - -function validConfiguration (configuration) { - return ( - isObject(configuration) && - // Validate `license` property. - configuration.hasOwnProperty('license') && - isString(configuration.license) && - configuration.license.length > 0 && ( - configuration.hasOwnProperty('whitelist') - ? ( - // Validate `whitelist` property. - isObject(configuration.whitelist) && - Object.keys(configuration.whitelist) - .every(function (key) { - return isString(configuration.whitelist[key]) - }) - ) : true - ) - ) -} - -function isObject (argument) { - return typeof argument === 'object' -} - -function isString (argument) { - return typeof argument === 'string' -} - -function findIssues (configuration, children, dependencies, results) { - if (Array.isArray(children)) { - children.forEach(function (child) { - if ( - !configuration.productionOnly || - appearsIn(child, dependencies) - ) { - results.push(resultForPackage(configuration, child)) - findIssues(configuration, child, dependencies, results) - } - if (child.children) { - findIssues(configuration, child.children, dependencies, results) - } - }) - return results - } else return results -} - -function appearsIn (installed, dependencies) { - var name = installed.package.name - var key = KEY_PREFIX + name - var version = installed.package.version - return ( - dependencies.hasOwnProperty(key) && - dependencies[key].indexOf(version) !== -1 - ) -} - -function resultForPackage (configuration, tree) { - var licenseExpression = configuration.license - var whitelist = configuration.whitelist || {} - var result = { - name: tree.package.name, - license: tree.package.license, - author: tree.package.author, - contributors: tree.package.contributors, - repository: tree.package.repository, - homepage: tree.package.homepage, - version: tree.package.version, - parent: tree.parent, - path: tree.path - } - var whitelisted = Object.keys(whitelist).some(function (name) { - return ( - tree.package.name === name && - satisfies(tree.package.version, whitelist[name]) === true - ) - }) - if (whitelisted) { - result.approved = true - result.whitelisted = true - } else { - var matchesRule = ( - licenseExpression && - validSPDX(licenseExpression) && - tree.package.license && - typeof tree.package.license === 'string' && - validSPDX(tree.package.license) && - licenseSatisfies(tree.package.license, licenseExpression) - ) - if (matchesRule) { - result.approved = true - result.rule = true - } else { - result.approved = false - } - } - return result -} diff --git a/node_modules/licensee/licensee b/node_modules/licensee/licensee deleted file mode 100755 index 297798ef0643f..0000000000000 --- a/node_modules/licensee/licensee +++ /dev/null @@ -1,242 +0,0 @@ -#!/usr/bin/env node -var access = require('fs-access') -var docopt = require('docopt') -var fs = require('fs') -var path = require('path') -var validSPDX = require('spdx-expression-validate') - -var USAGE = [ - 'Check npm package dependency license metadata against rules.', - '', - 'Usage:', - ' licensee [options]', - ' licensee --license=EXPRESSION [--whitelist=LIST] [options]', - '', - 'Options:', - ' --init Create a .licensee.json file.', - ' --license EXPRESSION Permit licenses matching SPDX expression.', - ' --whitelist LIST Permit comma-delimited name@range.', - ' --errors-only Only show NOT APPROVED packages.', - ' --production Do not check devDependencies.', - ' --ndjson Print newline-delimited JSON objects.', - ' --quiet Quiet mode, only exit(0/1).', - ' -h, --help Print this screen to standard output.', - ' -v, --version Print version to standard output.' -].join('\n') - -var options = docopt.docopt(USAGE, { - version: require('./package.json').version -}) - -var cwd = process.cwd() -var configuration -var configurationPath = path.join(cwd, '.licensee.json') - -if (options['--init']) { - fs.writeFile( - configurationPath, - JSON.stringify({ - license: ( - options['--expression'] || - '(MIT OR BSD-2-Clause OR BSD-3-Clause OR Apache-2.0)' - ), - whitelist: ( - options['--whitelist'] - ? parseWhitelist(options['--whitelist']) - : {optimist: '<=0.6.1'} - ) - }, null, 2) + '\n', - { - encoding: 'utf8', - flag: 'wx' - }, - function (error) { - if (error) { - if (error.code === 'EEXIST') { - die(configurationPath + ' already exists.') - } else { - die('Could not create ' + configurationPath + '.') - } - } else { - process.stdout.write('Created ' + configurationPath + '.\n') - process.exit(0) - } - } - ) -} else if (options['--license'] || options['--whitelist']) { - configuration = { - license: options['--license'] || undefined, - whitelist: options['--whitelist'] - ? parseWhitelist(options['--whitelist']) - : {} - } - checkDependencies() -} else { - access(configurationPath, function (error) { - if (error) { - die( - [ - 'Cannot read ' + configurationPath + '.', - 'Create ' + configurationPath + ' with licensee --init', - 'or configure with --license and --whitelist.', - 'See licensee --help for more information.' - ].join('\n') - ) - } else { - fs.readFile(configurationPath, function (error, data) { - if (error) { - die('Error reading ' + configurationPath) - } else { - try { - configuration = JSON.parse(data) - } catch (error) { - die('Error parsing ' + configurationPath) - } - checkDependencies() - } - }) - } - }) -} - -function checkDependencies () { - configuration.productionOnly = options['--production'] - require('./')(configuration, cwd, function (error, dependencies) { - if (error) { - die(error.message + '\n') - } else { - if (dependencies.length === 0) { - process.exit(0) - } else { - var errorsOnly = !!options['--errors-only'] - var quiet = !!options['--quiet'] - var ndjson = !!options['--ndjson'] - var haveIssue = false - dependencies.forEach(function (dependency) { - if (!dependency.approved) { - haveIssue = true - } - if (!quiet) { - if (errorsOnly) { - if (!dependency.approved) { - print(dependency, ndjson) - } - } else { - print(dependency, ndjson) - } - } - }) - process.exit(haveIssue ? 1 : 0) - } - } - }) -} - -function print (dependency, ndjson) { - if (ndjson) { - process.stdout.write(toJSON(dependency) + '\n') - } else { - process.stdout.write(toText(dependency) + '\n') - } -} - -function toText (result) { - return ( - result.name + '@' + result.version + '\n' + - ( - result.approved - ? ( - ' Approved by ' + - (result.whitelisted ? 'whitelist' : 'rule') + '\n' - ) - : ' NOT APPROVED\n' - ) + - ' Terms: ' + displayLicense(result.license) + '\n' + - ' Repository: ' + formatRepo(result.repository) + '\n' + - ' Homepage: ' + formatRepo(result.homepage) + '\n' + - ' Author: ' + formatPerson(result.author) + '\n' + - ' Contributors:' + formatPeople(result.contributors) + '\n' - ) -} - -function toJSON (dependency) { - var returned = {} - Object.keys(dependency).forEach(function (key) { - if (key !== 'parent') { - returned[key] = dependency[key] - } - }) - return JSON.stringify(returned) -} - -function displayLicense (license) { - if (typeof license === 'string') { - if (validSPDX(license)) { - return license - } else { - return 'Invalid SPDX expression "' + license + '"' - } - } else if (Array.isArray(license)) { - return JSON.stringify(license) - } else { - return 'Invalid license metadata' - } -} - -function formatPeople (people) { - if (Array.isArray(people)) { - return '\n' + people - .map(function (person) { - return ' ' + formatPerson(person) - }) - .join('\n') - } else if (typeof people === 'string') { - return ' ' + people - } else { - return ' None listed' - } -} - -function formatPerson (person) { - if (!person) { - return 'None listed' - } else if (typeof person === 'string') { - return person - } else { - return ( - person.name + - (person.email ? ' <' + person.email + '>' : '') + - (person.url ? ' (' + person.url + ')' : '') - ) - } -} - -function formatRepo (repo) { - if (repo) { - if (typeof repo === 'string') { - return repo - } else if (repo.hasOwnProperty('url')) { - return repo.url - } - } else { - return 'None listed' - } -} - -function die (message) { - process.stderr.write(message + '\n') - process.exit(1) -} - -function parseWhitelist (string) { - return string - .split(',') - .map(function (string) { - return string.trim() - }) - .reduce(function (whitelist, string) { - var split = string.split('@') - whitelist[split[0]] = split[1] - return whitelist - }, {}) -} diff --git a/node_modules/licensee/package.json b/node_modules/licensee/package.json deleted file mode 100644 index 8319cbe87e88a..0000000000000 --- a/node_modules/licensee/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "_args": [ - [ - "licensee@5.0.0", - "/Users/zkat/Documents/code/work/npm" - ] - ], - "_development": true, - "_from": "licensee@5.0.0", - "_id": "licensee@5.0.0", - "_inBundle": false, - "_integrity": "sha512-g243BLsJYWWyNhwDEMewc2f6Ebyy1yiJmMDgO8MCQtLOXA8JO4O2/kbJ1QwwWdlmrwDgYECdl9CJBrKsr4ZezA==", - "_location": "/licensee", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "licensee@5.0.0", - "name": "licensee", - "escapedName": "licensee", - "rawSpec": "5.0.0", - "saveSpec": null, - "fetchSpec": "5.0.0" - }, - "_requiredBy": [ - "#DEV:/" - ], - "_resolved": "https://registry.npmjs.org/licensee/-/licensee-5.0.0.tgz", - "_spec": "5.0.0", - "_where": "/Users/zkat/Documents/code/work/npm", - "author": { - "name": "Kyle E. Mitchell", - "email": "kyle@kemitchell.com", - "url": "https://kemitchell.com/" - }, - "bin": { - "licensee": "./licensee" - }, - "bugs": { - "url": "https://github.com/jslicense/licensee.js/issues" - }, - "contributors": [ - { - "name": "Jakob Krigovsky", - "email": "jakob@krigovsky.com" - } - ], - "dependencies": { - "docopt": "^0.6.2", - "fs-access": "^1.0.0", - "json-parse-errback": "^2.0.1", - "read-package-tree": "^5.2.1", - "run-parallel": "^1.1.9", - "semver": "^5.5.0", - "simple-concat": "^1.0.0", - "spdx-expression-validate": "^1.0.1", - "spdx-satisfies": "^4.0.0" - }, - "description": "check dependency licenses against rules", - "devDependencies": { - "spawn-sync": "^1.0.15", - "standard": "^11.0.1", - "tap": "^12.0.1" - }, - "files": [ - "LICENSE", - "NOTICE", - "index.js", - "licensee" - ], - "homepage": "https://github.com/jslicense/licensee.js#readme", - "license": "Apache-2.0", - "name": "licensee", - "repository": { - "type": "git", - "url": "git+https://github.com/jslicense/licensee.js.git" - }, - "scripts": { - "style": "standard", - "test": "tap tests/**/test.js" - }, - "version": "5.0.0" -} diff --git a/node_modules/null-check/index.js b/node_modules/null-check/index.js deleted file mode 100644 index 6befbeb3f9f42..0000000000000 --- a/node_modules/null-check/index.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict'; -module.exports = function (pth, cb) { - if (String(pth).indexOf('\u0000') !== -1) { - var err = new Error('Path must be a string without null bytes.'); - err.code = 'ENOENT'; - - if (typeof cb !== 'function') { - throw err; - } - - process.nextTick(function () { - cb(err); - }); - - return false; - } - - return true; -} diff --git a/node_modules/null-check/license b/node_modules/null-check/license deleted file mode 100644 index 654d0bfe94343..0000000000000 --- a/node_modules/null-check/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -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/node_modules/null-check/package.json b/node_modules/null-check/package.json deleted file mode 100644 index e269dca66d02f..0000000000000 --- a/node_modules/null-check/package.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "_args": [ - [ - "null-check@1.0.0", - "/Users/zkat/Documents/code/work/npm" - ] - ], - "_development": true, - "_from": "null-check@1.0.0", - "_id": "null-check@1.0.0", - "_inBundle": false, - "_integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", - "_location": "/null-check", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "null-check@1.0.0", - "name": "null-check", - "escapedName": "null-check", - "rawSpec": "1.0.0", - "saveSpec": null, - "fetchSpec": "1.0.0" - }, - "_requiredBy": [ - "/fs-access" - ], - "_resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "_spec": "1.0.0", - "_where": "/Users/zkat/Documents/code/work/npm", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "bugs": { - "url": "https://github.com/sindresorhus/null-check/issues" - }, - "description": "Ensure a path doesn't contain null bytes", - "devDependencies": { - "ava": "0.0.4" - }, - "engines": { - "node": ">=0.10.0" - }, - "files": [ - "index.js" - ], - "homepage": "https://github.com/sindresorhus/null-check#readme", - "keywords": [ - "built-in", - "core", - "ponyfill", - "polyfill", - "shim", - "fs", - "path", - "null", - "bytes", - "check" - ], - "license": "MIT", - "name": "null-check", - "repository": { - "type": "git", - "url": "git+https://github.com/sindresorhus/null-check.git" - }, - "scripts": { - "test": "node test.js" - }, - "version": "1.0.0" -} diff --git a/node_modules/null-check/readme.md b/node_modules/null-check/readme.md deleted file mode 100644 index dfb55a3101abe..0000000000000 --- a/node_modules/null-check/readme.md +++ /dev/null @@ -1,34 +0,0 @@ -# null-check [![Build Status](https://travis-ci.org/sindresorhus/null-check.svg?branch=master)](https://travis-ci.org/sindresorhus/null-check) - -> Ensure a path doesn't contain [null bytes](http://en.wikipedia.org/wiki/Null_character) - -The same check as done in all the core [`fs` methods](https://github.com/iojs/io.js/blob/18d457bd3408557a48b453f13b2b99e1ab5e7159/lib/fs.js#L88-L102). - - -## Install - -``` -$ npm install --save null-check -``` - - -## Usage - -```js -var nullCheck = require('null-check'); - -nullCheck('unicorn.png\u0000', function (err) { - console.log(err); - //=> { [Error: Path must be a string without null bytes.] code: 'ENOENT' } -}); -//=> false - -// the method is sync without a callback -nullCheck('unicorn.png'); -//=> true -``` - - -## License - -MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/simple-concat/.travis.yml b/node_modules/simple-concat/.travis.yml deleted file mode 100644 index f178ec0d85db2..0000000000000 --- a/node_modules/simple-concat/.travis.yml +++ /dev/null @@ -1,3 +0,0 @@ -language: node_js -node_js: - - 'node' diff --git a/node_modules/simple-concat/LICENSE b/node_modules/simple-concat/LICENSE deleted file mode 100644 index c7e6852752b72..0000000000000 --- a/node_modules/simple-concat/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Feross Aboukhadijeh - -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/node_modules/simple-concat/README.md b/node_modules/simple-concat/README.md deleted file mode 100644 index 572e99c7c2105..0000000000000 --- a/node_modules/simple-concat/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# simple-concat [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] - -[travis-image]: https://img.shields.io/travis/feross/simple-concat/master.svg -[travis-url]: https://travis-ci.org/feross/simple-concat -[npm-image]: https://img.shields.io/npm/v/simple-concat.svg -[npm-url]: https://npmjs.org/package/simple-concat -[downloads-image]: https://img.shields.io/npm/dm/simple-concat.svg -[downloads-url]: https://npmjs.org/package/simple-concat - -### Super-minimalist version of `concat-stream`. Less than 15 lines! - -## install - -``` -npm install simple-concat -``` - -## usage - -This example is longer than the implementation. - -```js -var s = new stream.PassThrough() -concat(s, function (err, buf) { - if (err) throw err - console.error(buf) -}) -s.write('abc') -setTimeout(function () { - s.write('123') -}, 10) -setTimeout(function () { - s.write('456') -}, 20) -setTimeout(function () { - s.end('789') -}, 30) -``` - -## license - -MIT. Copyright (c) [Feross Aboukhadijeh](http://feross.org). diff --git a/node_modules/simple-concat/index.js b/node_modules/simple-concat/index.js deleted file mode 100644 index c2d88600ca589..0000000000000 --- a/node_modules/simple-concat/index.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = function (stream, cb) { - var chunks = [] - stream.on('data', function (chunk) { - chunks.push(chunk) - }) - stream.once('end', function () { - if (cb) cb(null, Buffer.concat(chunks)) - cb = null - }) - stream.once('error', function (err) { - if (cb) cb(err) - cb = null - }) -} diff --git a/node_modules/simple-concat/package.json b/node_modules/simple-concat/package.json deleted file mode 100644 index 81f0174e2e878..0000000000000 --- a/node_modules/simple-concat/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "_args": [ - [ - "simple-concat@1.0.0", - "/Users/zkat/Documents/code/work/npm" - ] - ], - "_development": true, - "_from": "simple-concat@1.0.0", - "_id": "simple-concat@1.0.0", - "_inBundle": false, - "_integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", - "_location": "/simple-concat", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "simple-concat@1.0.0", - "name": "simple-concat", - "escapedName": "simple-concat", - "rawSpec": "1.0.0", - "saveSpec": null, - "fetchSpec": "1.0.0" - }, - "_requiredBy": [ - "/licensee" - ], - "_resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "_spec": "1.0.0", - "_where": "/Users/zkat/Documents/code/work/npm", - "author": { - "name": "Feross Aboukhadijeh", - "email": "feross@feross.org", - "url": "http://feross.org/" - }, - "bugs": { - "url": "https://github.com/feross/simple-concat/issues" - }, - "dependencies": {}, - "description": "Super-minimalist version of `concat-stream`. Less than 15 lines!", - "devDependencies": { - "standard": "^6.0.8", - "tape": "^4.0.0" - }, - "homepage": "https://github.com/feross/simple-concat", - "keywords": [ - "concat", - "concat-stream", - "concat stream" - ], - "license": "MIT", - "main": "index.js", - "name": "simple-concat", - "repository": { - "type": "git", - "url": "git://github.com/feross/simple-concat.git" - }, - "scripts": { - "test": "standard && tape test/*.js" - }, - "version": "1.0.0" -} diff --git a/node_modules/simple-concat/test/basic.js b/node_modules/simple-concat/test/basic.js deleted file mode 100644 index f781294a3c8df..0000000000000 --- a/node_modules/simple-concat/test/basic.js +++ /dev/null @@ -1,41 +0,0 @@ -var concat = require('../') -var stream = require('stream') -var test = require('tape') - -test('basic', function (t) { - t.plan(2) - var s = new stream.PassThrough() - concat(s, function (err, buf) { - t.error(err) - t.deepEqual(buf, new Buffer('abc123456789')) - }) - s.write('abc') - setTimeout(function () { - s.write('123') - }, 10) - setTimeout(function () { - s.write('456') - }, 20) - setTimeout(function () { - s.end('789') - }, 30) -}) - -test('error', function (t) { - t.plan(2) - var s = new stream.PassThrough() - concat(s, function (err, buf) { - t.ok(err, 'got expected error') - t.ok(!buf) - }) - s.write('abc') - setTimeout(function () { - s.write('123') - }, 10) - setTimeout(function () { - s.write('456') - }, 20) - setTimeout(function () { - s.emit('error', new Error('error')) - }, 30) -}) diff --git a/node_modules/spdx-compare/LICENSE.md b/node_modules/spdx-compare/LICENSE.md deleted file mode 100644 index 6c255589566ff..0000000000000 --- a/node_modules/spdx-compare/LICENSE.md +++ /dev/null @@ -1,9 +0,0 @@ -The MIT License - -Copyright (c) 2015 Kyle E. Mitchell - -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/node_modules/spdx-compare/README.md b/node_modules/spdx-compare/README.md deleted file mode 100644 index 20d79c9bf34f1..0000000000000 --- a/node_modules/spdx-compare/README.md +++ /dev/null @@ -1,20 +0,0 @@ -```javascript -var assert = require('assert') -var compare = require('spdx-compare') - -assert(compare.gt('GPL-3.0', 'GPL-2.0')) -assert(compare.gt('GPL-3.0-only', 'GPL-2.0-only')) -assert(compare.gt('GPL-2.0-or-later', 'GPL-2.0-only')) -assert(compare.eq('GPL-3.0-or-later', 'GPL-3.0-only')) -assert(compare.lt('MPL-1.0', 'MPL-2.0')) - -assert(compare.gt('LPPL-1.3a', 'LPPL-1.0')) -assert(compare.gt('LPPL-1.3c', 'LPPL-1.3a')) -assert(!compare.gt('MIT', 'ISC')) -assert(!compare.gt('OSL-1.0', 'OPL-1.0')) -assert(compare.gt('AGPL-3.0', 'AGPL-1.0')) - -assert.throws(function () { - compare.gt('(MIT OR ISC)', 'GPL-3.0') -}, '"(MIT OR ISC)" is not a simple license identifier') -``` diff --git a/node_modules/spdx-compare/index.js b/node_modules/spdx-compare/index.js deleted file mode 100644 index 7b33349f8f650..0000000000000 --- a/node_modules/spdx-compare/index.js +++ /dev/null @@ -1,60 +0,0 @@ -var arrayFindIndex = require('array-find-index') -var parse = require('spdx-expression-parse') - -var ranges = require('spdx-ranges') - -var notALicenseIdentifier = ' is not a simple license identifier' - -var rangeComparison = function (comparison) { - return function (first, second) { - var firstAST = parse(first) - if (!firstAST.hasOwnProperty('license')) { - throw new Error('"' + first + '"' + notALicenseIdentifier) - } - var secondAST = parse(second) - if (!secondAST.hasOwnProperty('license')) { - throw new Error('"' + second + '"' + notALicenseIdentifier) - } - return ranges.some(function (range) { - var firstLicense = firstAST.license - var indexOfFirst = arrayFindIndex(range, function (element) { - return ( - element === firstLicense || - ( - Array.isArray(element) && - element.indexOf(firstLicense) !== -1 - ) - ) - }) - if (indexOfFirst < 0) { - return false - } - var secondLicense = secondAST.license - var indexOfSecond = arrayFindIndex(range, function (element) { - return ( - element === secondLicense || - ( - Array.isArray(element) && - element.indexOf(secondLicense) !== -1 - ) - ) - }) - if (indexOfSecond < 0) { - return false - } - return comparison(indexOfFirst, indexOfSecond) - }) - } -} - -exports.gt = rangeComparison(function (first, second) { - return first > second -}) - -exports.lt = rangeComparison(function (first, second) { - return first < second -}) - -exports.eq = rangeComparison(function (first, second) { - return first === second -}) diff --git a/node_modules/spdx-compare/package.json b/node_modules/spdx-compare/package.json deleted file mode 100644 index 82f0291cf4a3a..0000000000000 --- a/node_modules/spdx-compare/package.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "_args": [ - [ - "spdx-compare@1.0.0", - "/Users/zkat/Documents/code/work/npm" - ] - ], - "_development": true, - "_from": "spdx-compare@1.0.0", - "_id": "spdx-compare@1.0.0", - "_inBundle": false, - "_integrity": "sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==", - "_location": "/spdx-compare", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "spdx-compare@1.0.0", - "name": "spdx-compare", - "escapedName": "spdx-compare", - "rawSpec": "1.0.0", - "saveSpec": null, - "fetchSpec": "1.0.0" - }, - "_requiredBy": [ - "/spdx-satisfies" - ], - "_resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz", - "_spec": "1.0.0", - "_where": "/Users/zkat/Documents/code/work/npm", - "author": { - "name": "Kyle E. Mitchell", - "email": "kyle@kemitchell.com", - "url": "https://kemitchell.com" - }, - "bugs": { - "url": "https://github.com/kemitchell/spdx-compare.js/issues" - }, - "dependencies": { - "array-find-index": "^1.0.2", - "spdx-expression-parse": "^3.0.0", - "spdx-ranges": "^2.0.0" - }, - "description": "compare SPDX license expressions", - "devDependencies": { - "defence-cli": "^2.0.1" - }, - "homepage": "https://github.com/kemitchell/spdx-compare.js#readme", - "keywords": [ - "SPDX", - "law", - "legal", - "license", - "metadata", - "package", - "package.json", - "standards" - ], - "license": "MIT", - "name": "spdx-compare", - "repository": { - "type": "git", - "url": "git+https://github.com/kemitchell/spdx-compare.js.git" - }, - "scripts": { - "test": "defence -i javascript README.md | sed 's!spdx-compare!./!' | node" - }, - "version": "1.0.0" -} diff --git a/node_modules/spdx-compare/test.log b/node_modules/spdx-compare/test.log deleted file mode 100644 index 66ec4ccee4953..0000000000000 --- a/node_modules/spdx-compare/test.log +++ /dev/null @@ -1,4 +0,0 @@ - -> spdx-compare@0.1.2 test /home/kyle/spdx-compare.js -> defence -i javascript README.md | sed 's!spdx-compare!./!' | node - diff --git a/node_modules/spdx-expression-validate/LICENSE b/node_modules/spdx-expression-validate/LICENSE deleted file mode 100644 index d3791f13c94aa..0000000000000 --- a/node_modules/spdx-expression-validate/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License - -Copyright (c) 2015 Kyle E. Mitchell - -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/node_modules/spdx-expression-validate/README.md b/node_modules/spdx-expression-validate/README.md deleted file mode 100644 index 489816777372b..0000000000000 --- a/node_modules/spdx-expression-validate/README.md +++ /dev/null @@ -1,44 +0,0 @@ -```javascript -var assert = require('assert') -var valid = require('spdx-expression-validate') -``` - -# Simple License Expressions -```javascript -assert(!valid('Invalid-Identifier')) -assert(valid('GPL-2.0')) -assert(valid('GPL-2.0+')) -assert(valid('LicenseRef-23')) -assert(valid('LicenseRef-MIT-Style-1')) -assert(valid('DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2')) -``` - -# Composite License Expressions - -## Disjunctive `OR` Operator -```javascript -assert(valid('(LGPL-2.1 OR MIT)')) -assert(valid('(LGPL-2.1 OR MIT OR BSD-3-Clause)')) -``` - -## Conjunctive `AND` Operator -```javascript -assert(valid('(LGPL-2.1 AND MIT)')) -assert(valid('(LGPL-2.1 AND MIT AND BSD-2-Clause)')) -``` - -## Exception `WITH` Operator -```javascript -assert(valid('(GPL-2.0+ WITH Bison-exception-2.2)')) -``` - -# Strict Whitespace Rules -```javascript -assert(!valid('MIT ')) -assert(!valid(' MIT')) -assert(!valid('MIT AND BSD-3-Clause')) -``` - ---- - -[The Software Package Data Exchange (SPDX) specification](http://spdx.org) is the work of the [Linux Foundation](http://www.linuxfoundation.org) and its contributors, and is licensed under the terms of [the Creative Commons Attribution License 3.0 Unported (SPDX: "CC-BY-3.0")](http://spdx.org/licenses/CC-BY-3.0). "SPDX" is a United States federally registered trademark of the Linux Foundation. diff --git a/node_modules/spdx-expression-validate/index.js b/node_modules/spdx-expression-validate/index.js deleted file mode 100644 index e01ec5df6453a..0000000000000 --- a/node_modules/spdx-expression-validate/index.js +++ /dev/null @@ -1,20 +0,0 @@ -var parse = require('spdx-expression-parse') - -var containsRepeatedSpace = /\s{2,}/ - -module.exports = function spdxExpressionValidate (argument) { - var fatString = ( - argument.trim() !== argument || - containsRepeatedSpace.test(argument) - ) - if (fatString) { - return false - } else { - try { - parse(argument) - return true - } catch (e) { - return false - } - } -} diff --git a/node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/AUTHORS b/node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/AUTHORS deleted file mode 100644 index 155f0f66c076a..0000000000000 --- a/node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -C. Scott Ananian (http://cscott.net) -Kyle E. Mitchell (https://kemitchell.com) -Shinnosuke Watanabe diff --git a/node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/LICENSE b/node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/LICENSE deleted file mode 100644 index 831618eaba6c8..0000000000000 --- a/node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License - -Copyright (c) 2015 Kyle E. Mitchell & other authors listed in AUTHORS - -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/node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/README.md b/node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/README.md deleted file mode 100644 index 9928cdccfcd8a..0000000000000 --- a/node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/README.md +++ /dev/null @@ -1,83 +0,0 @@ -This package parses SPDX license expression strings describing license terms, like [package.json license strings](https://docs.npmjs.com/files/package.json#license), into consistently structured ECMAScript objects. The npm command-line interface depends on this package, as do many automatic license-audit tools. - -In a nutshell: - -```javascript -var parse = require('spdx-expression-parse') -var assert = require('assert') - -assert.deepEqual( - // Licensed under the terms of the Two-Clause BSD License. - parse('BSD-2-Clause'), - {license: 'BSD-2-Clause'} -) - -assert.throws(function () { - // An invalid SPDX license expression. - // Should be `Apache-2.0`. - parse('Apache 2') -}) - -assert.deepEqual( - // Dual licensed under LGPL 2.1 or a combination of the Three-Clause - // BSD License and the MIT License. - parse('(LGPL-2.1 OR BSD-3-Clause AND MIT)'), - { - left: {license: 'LGPL-2.1'}, - conjunction: 'or', - right: { - left: {license: 'BSD-3-Clause'}, - conjunction: 'and', - right: {license: 'MIT'} - } - } -) -``` - -The syntax comes from the [Software Package Data eXchange (SPDX)](https://spdx.org/), a standard from the [Linux Foundation](https://www.linuxfoundation.org) for shareable data about software package license terms. SPDX aims to make sharing and auditing license data easy, especially for users of open-source software. - -The bulk of the SPDX standard describes syntax and semantics of XML metadata files. This package implements two lightweight, plain-text components of that larger standard: - -1. The [license list](https://spdx.org/licenses), a mapping from specific string identifiers, like `Apache-2.0`, to standard form license texts and bolt-on license exceptions. The [spdx-license-ids](https://www.npmjs.com/package/spdx-exceptions) and [spdx-exceptions](https://www.npmjs.com/package/spdx-license-ids) packages implement the license list. They are development dependencies of this package. - - Any license identifier from the license list is a valid license expression: - - ```javascript - require('spdx-license-ids').forEach(function (id) { - assert.deepEqual(parse(id), {license: id}) - }) - ``` - - So is any license identifier `WITH` a standardized license exception: - - ```javascript - require('spdx-license-ids').forEach(function (id) { - require('spdx-exceptions').forEach(function (e) { - assert.deepEqual( - parse(id + ' WITH ' + e), - {license: id, exception: e} - ) - }) - }) - ``` - -2. The license expression language, for describing simple and complex license terms, like `MIT` for MIT-licensed and `(GPL-2.0 OR Apache-2.0)` for dual-licensing under GPL 2.0 and Apache 2.0. This package implements the license expression language. - - ```javascript - assert.deepEqual( - // Licensed under a combination of the MIT License and a combination - // of LGPL 2.1 (or a later version) and the Three-Clause BSD License. - parse('(MIT AND (LGPL-2.1+ AND BSD-3-Clause))'), - { - left: {license: 'MIT'}, - conjunction: 'and', - right: { - left: {license: 'LGPL-2.1', plus: true}, - conjunction: 'and', - right: {license: 'BSD-3-Clause'} - } - } - ) - ``` - -The Linux Foundation and its contributors license the SPDX standard under the terms of [the Creative Commons Attribution License 3.0 Unported (SPDX: "CC-BY-3.0")](http://spdx.org/licenses/CC-BY-3.0). "SPDX" is a United States federally registered trademark of the Linux Foundation. The authors of this package license their work under the terms of the MIT License. diff --git a/node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/index.js b/node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/index.js deleted file mode 100644 index 56a9b50c659f5..0000000000000 --- a/node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/index.js +++ /dev/null @@ -1,5 +0,0 @@ -var parser = require('./parser').parser - -module.exports = function (argument) { - return parser.parse(argument) -} diff --git a/node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/package.json b/node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/package.json deleted file mode 100644 index 64926dc22d7f8..0000000000000 --- a/node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/package.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "_args": [ - [ - "spdx-expression-parse@1.0.4", - "/Users/zkat/Documents/code/work/npm" - ] - ], - "_development": true, - "_from": "spdx-expression-parse@1.0.4", - "_id": "spdx-expression-parse@1.0.4", - "_inBundle": false, - "_integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "_location": "/spdx-expression-validate/spdx-expression-parse", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "spdx-expression-parse@1.0.4", - "name": "spdx-expression-parse", - "escapedName": "spdx-expression-parse", - "rawSpec": "1.0.4", - "saveSpec": null, - "fetchSpec": "1.0.4" - }, - "_requiredBy": [ - "/spdx-expression-validate" - ], - "_resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "_spec": "1.0.4", - "_where": "/Users/zkat/Documents/code/work/npm", - "author": { - "name": "Kyle E. Mitchell", - "email": "kyle@kemitchell.com", - "url": "http://kemitchell.com" - }, - "bugs": { - "url": "https://github.com/kemitchell/spdx-expression-parse.js/issues" - }, - "contributors": [ - { - "name": "C. Scott Ananian", - "email": "cscott@cscott.net", - "url": "http://cscott.net" - }, - { - "name": "Kyle E. Mitchell", - "email": "kyle@kemitchell.com", - "url": "https://kemitchell.com" - }, - { - "name": "Shinnosuke Watanabe", - "email": "snnskwtnb@gmail.com" - } - ], - "description": "parse SPDX license expressions", - "devDependencies": { - "defence-cli": "^1.0.1", - "jison": "^0.4.15", - "replace-require-self": "^1.0.0", - "spdx-exceptions": "^1.0.4", - "spdx-license-ids": "^1.0.0", - "standard": "^8.0.0" - }, - "files": [ - "AUTHORS", - "index.js", - "parser.js" - ], - "homepage": "https://github.com/kemitchell/spdx-expression-parse.js#readme", - "keywords": [ - "SPDX", - "law", - "legal", - "license", - "metadata", - "package", - "package.json", - "standards" - ], - "license": "(MIT AND CC-BY-3.0)", - "name": "spdx-expression-parse", - "repository": { - "type": "git", - "url": "git+https://github.com/kemitchell/spdx-expression-parse.js.git" - }, - "scripts": { - "lint": "standard", - "prepublish": "node generate-parser.js > parser.js", - "pretest": "npm run prepublish", - "test": "defence -i javascript README.md | replace-require-self | node" - }, - "version": "1.0.4" -} diff --git a/node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/parser.js b/node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/parser.js deleted file mode 100644 index a5e2edbaa27e0..0000000000000 --- a/node_modules/spdx-expression-validate/node_modules/spdx-expression-parse/parser.js +++ /dev/null @@ -1,1357 +0,0 @@ -/* parser generated by jison 0.4.17 */ -/* - Returns a Parser object of the following structure: - - Parser: { - yy: {} - } - - Parser.prototype: { - yy: {}, - trace: function(), - symbols_: {associative list: name ==> number}, - terminals_: {associative list: number ==> name}, - productions_: [...], - performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), - table: [...], - defaultActions: {...}, - parseError: function(str, hash), - parse: function(input), - - lexer: { - EOF: 1, - parseError: function(str, hash), - setInput: function(input), - input: function(), - unput: function(str), - more: function(), - less: function(n), - pastInput: function(), - upcomingInput: function(), - showPosition: function(), - test_match: function(regex_match_array, rule_index), - next: function(), - lex: function(), - begin: function(condition), - popState: function(), - _currentRules: function(), - topState: function(), - pushState: function(condition), - - options: { - ranges: boolean (optional: true ==> token location info will include a .range[] member) - flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) - backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) - }, - - performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), - rules: [...], - conditions: {associative list: name ==> set}, - } - } - - - token location info (@$, _$, etc.): { - first_line: n, - last_line: n, - first_column: n, - last_column: n, - range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) - } - - - the parseError function receives a 'hash' object with these members for lexer and parser errors: { - text: (matched text) - token: (the produced terminal token, if any) - line: (yylineno) - } - while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { - loc: (yylloc) - expected: (string describing the set of expected tokens) - recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) - } -*/ -var spdxparse = (function(){ -var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,5],$V1=[1,6],$V2=[1,7],$V3=[1,4],$V4=[1,9],$V5=[1,10],$V6=[5,14,15,17],$V7=[5,12,14,15,17]; -var parser = {trace: function trace() { }, -yy: {}, -symbols_: {"error":2,"start":3,"expression":4,"EOS":5,"simpleExpression":6,"LICENSE":7,"PLUS":8,"LICENSEREF":9,"DOCUMENTREF":10,"COLON":11,"WITH":12,"EXCEPTION":13,"AND":14,"OR":15,"OPEN":16,"CLOSE":17,"$accept":0,"$end":1}, -terminals_: {2:"error",5:"EOS",7:"LICENSE",8:"PLUS",9:"LICENSEREF",10:"DOCUMENTREF",11:"COLON",12:"WITH",13:"EXCEPTION",14:"AND",15:"OR",16:"OPEN",17:"CLOSE"}, -productions_: [0,[3,2],[6,1],[6,2],[6,1],[6,3],[4,1],[4,3],[4,3],[4,3],[4,3]], -performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { -/* this == yyval */ - -var $0 = $$.length - 1; -switch (yystate) { -case 1: -return this.$ = $$[$0-1] -break; -case 2: case 4: case 5: -this.$ = {license: yytext} -break; -case 3: -this.$ = {license: $$[$0-1], plus: true} -break; -case 6: -this.$ = $$[$0] -break; -case 7: -this.$ = {exception: $$[$0]} -this.$.license = $$[$0-2].license -if ($$[$0-2].hasOwnProperty('plus')) { - this.$.plus = $$[$0-2].plus -} -break; -case 8: -this.$ = {conjunction: 'and', left: $$[$0-2], right: $$[$0]} -break; -case 9: -this.$ = {conjunction: 'or', left: $$[$0-2], right: $$[$0]} -break; -case 10: -this.$ = $$[$0-1] -break; -} -}, -table: [{3:1,4:2,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{1:[3]},{5:[1,8],14:$V4,15:$V5},o($V6,[2,6],{12:[1,11]}),{4:12,6:3,7:$V0,9:$V1,10:$V2,16:$V3},o($V7,[2,2],{8:[1,13]}),o($V7,[2,4]),{11:[1,14]},{1:[2,1]},{4:15,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{4:16,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{13:[1,17]},{14:$V4,15:$V5,17:[1,18]},o($V7,[2,3]),{9:[1,19]},o($V6,[2,8]),o([5,15,17],[2,9],{14:$V4}),o($V6,[2,7]),o($V6,[2,10]),o($V7,[2,5])], -defaultActions: {8:[2,1]}, -parseError: function parseError(str, hash) { - if (hash.recoverable) { - this.trace(str); - } else { - function _parseError (msg, hash) { - this.message = msg; - this.hash = hash; - } - _parseError.prototype = Error; - - throw new _parseError(str, hash); - } -}, -parse: function parse(input) { - var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; - var args = lstack.slice.call(arguments, 1); - var lexer = Object.create(this.lexer); - var sharedState = { yy: {} }; - for (var k in this.yy) { - if (Object.prototype.hasOwnProperty.call(this.yy, k)) { - sharedState.yy[k] = this.yy[k]; - } - } - lexer.setInput(input, sharedState.yy); - sharedState.yy.lexer = lexer; - sharedState.yy.parser = this; - if (typeof lexer.yylloc == 'undefined') { - lexer.yylloc = {}; - } - var yyloc = lexer.yylloc; - lstack.push(yyloc); - var ranges = lexer.options && lexer.options.ranges; - if (typeof sharedState.yy.parseError === 'function') { - this.parseError = sharedState.yy.parseError; - } else { - this.parseError = Object.getPrototypeOf(this).parseError; - } - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - _token_stack: - var lex = function () { - var token; - token = lexer.lex() || EOF; - if (typeof token !== 'number') { - token = self.symbols_[token] || token; - } - return token; - }; - var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; - while (true) { - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol === null || typeof symbol == 'undefined') { - symbol = lex(); - } - action = table[state] && table[state][symbol]; - } - if (typeof action === 'undefined' || !action.length || !action[0]) { - var errStr = ''; - expected = []; - for (p in table[state]) { - if (this.terminals_[p] && p > TERROR) { - expected.push('\'' + this.terminals_[p] + '\''); - } - } - if (lexer.showPosition) { - errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; - } else { - errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); - } - this.parseError(errStr, { - text: lexer.match, - token: this.terminals_[symbol] || symbol, - line: lexer.yylineno, - loc: yyloc, - expected: expected - }); - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(lexer.yytext); - lstack.push(lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = lexer.yyleng; - yytext = lexer.yytext; - yylineno = lexer.yylineno; - yyloc = lexer.yylloc; - if (recovering > 0) { - recovering--; - } - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = { - first_line: lstack[lstack.length - (len || 1)].first_line, - last_line: lstack[lstack.length - 1].last_line, - first_column: lstack[lstack.length - (len || 1)].first_column, - last_column: lstack[lstack.length - 1].last_column - }; - if (ranges) { - yyval._$.range = [ - lstack[lstack.length - (len || 1)].range[0], - lstack[lstack.length - 1].range[1] - ]; - } - r = this.performAction.apply(yyval, [ - yytext, - yyleng, - yylineno, - sharedState.yy, - action[1], - vstack, - lstack - ].concat(args)); - if (typeof r !== 'undefined') { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; -}}; -/* generated by jison-lex 0.3.4 */ -var lexer = (function(){ -var lexer = ({ - -EOF:1, - -parseError:function parseError(str, hash) { - if (this.yy.parser) { - this.yy.parser.parseError(str, hash); - } else { - throw new Error(str); - } - }, - -// resets the lexer, sets new input -setInput:function (input, yy) { - this.yy = yy || this.yy || {}; - this._input = input; - this._more = this._backtrack = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ''; - this.conditionStack = ['INITIAL']; - this.yylloc = { - first_line: 1, - first_column: 0, - last_line: 1, - last_column: 0 - }; - if (this.options.ranges) { - this.yylloc.range = [0,0]; - } - this.offset = 0; - return this; - }, - -// consumes and returns one char from the input -input:function () { - var ch = this._input[0]; - this.yytext += ch; - this.yyleng++; - this.offset++; - this.match += ch; - this.matched += ch; - var lines = ch.match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno++; - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - if (this.options.ranges) { - this.yylloc.range[1]++; - } - - this._input = this._input.slice(1); - return ch; - }, - -// unshifts one char (or a string) into the input -unput:function (ch) { - var len = ch.length; - var lines = ch.split(/(?:\r\n?|\n)/g); - - this._input = ch + this._input; - this.yytext = this.yytext.substr(0, this.yytext.length - len); - //this.yyleng -= len; - this.offset -= len; - var oldLines = this.match.split(/(?:\r\n?|\n)/g); - this.match = this.match.substr(0, this.match.length - 1); - this.matched = this.matched.substr(0, this.matched.length - 1); - - if (lines.length - 1) { - this.yylineno -= lines.length - 1; - } - var r = this.yylloc.range; - - this.yylloc = { - first_line: this.yylloc.first_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.first_column, - last_column: lines ? - (lines.length === oldLines.length ? this.yylloc.first_column : 0) - + oldLines[oldLines.length - lines.length].length - lines[0].length : - this.yylloc.first_column - len - }; - - if (this.options.ranges) { - this.yylloc.range = [r[0], r[0] + this.yyleng - len]; - } - this.yyleng = this.yytext.length; - return this; - }, - -// When called from action, caches matched text and appends it on next action -more:function () { - this._more = true; - return this; - }, - -// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. -reject:function () { - if (this.options.backtrack_lexer) { - this._backtrack = true; - } else { - return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), { - text: "", - token: null, - line: this.yylineno - }); - - } - return this; - }, - -// retain first n characters of the match -less:function (n) { - this.unput(this.match.slice(n)); - }, - -// displays already matched input, i.e. for error messages -pastInput:function () { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); - }, - -// displays upcoming input, i.e. for error messages -upcomingInput:function () { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20-next.length); - } - return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); - }, - -// displays the character position where the lexing error occurred, i.e. for error messages -showPosition:function () { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c + "^"; - }, - -// test the lexed token: return FALSE when not a match, otherwise return token -test_match:function (match, indexed_rule) { - var token, - lines, - backup; - - if (this.options.backtrack_lexer) { - // save context - backup = { - yylineno: this.yylineno, - yylloc: { - first_line: this.yylloc.first_line, - last_line: this.last_line, - first_column: this.yylloc.first_column, - last_column: this.yylloc.last_column - }, - yytext: this.yytext, - match: this.match, - matches: this.matches, - matched: this.matched, - yyleng: this.yyleng, - offset: this.offset, - _more: this._more, - _input: this._input, - yy: this.yy, - conditionStack: this.conditionStack.slice(0), - done: this.done - }; - if (this.options.ranges) { - backup.yylloc.range = this.yylloc.range.slice(0); - } - } - - lines = match[0].match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno += lines.length; - } - this.yylloc = { - first_line: this.yylloc.last_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.last_column, - last_column: lines ? - lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : - this.yylloc.last_column + match[0].length - }; - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - if (this.options.ranges) { - this.yylloc.range = [this.offset, this.offset += this.yyleng]; - } - this._more = false; - this._backtrack = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); - if (this.done && this._input) { - this.done = false; - } - if (token) { - return token; - } else if (this._backtrack) { - // recover context - for (var k in backup) { - this[k] = backup[k]; - } - return false; // rule action called reject() implying the next rule should be tested instead. - } - return false; - }, - -// return next match in input -next:function () { - if (this.done) { - return this.EOF; - } - if (!this._input) { - this.done = true; - } - - var token, - match, - tempMatch, - index; - if (!this._more) { - this.yytext = ''; - this.match = ''; - } - var rules = this._currentRules(); - for (var i = 0; i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (this.options.backtrack_lexer) { - token = this.test_match(tempMatch, rules[i]); - if (token !== false) { - return token; - } else if (this._backtrack) { - match = false; - continue; // rule action called reject() implying a rule MISmatch. - } else { - // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) - return false; - } - } else if (!this.options.flex) { - break; - } - } - } - if (match) { - token = this.test_match(match, rules[index]); - if (token !== false) { - return token; - } - // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) - return false; - } - if (this._input === "") { - return this.EOF; - } else { - return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { - text: "", - token: null, - line: this.yylineno - }); - } - }, - -// return next match that has a token -lex:function lex() { - var r = this.next(); - if (r) { - return r; - } else { - return this.lex(); - } - }, - -// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) -begin:function begin(condition) { - this.conditionStack.push(condition); - }, - -// pop the previously active lexer condition state off the condition stack -popState:function popState() { - var n = this.conditionStack.length - 1; - if (n > 0) { - return this.conditionStack.pop(); - } else { - return this.conditionStack[0]; - } - }, - -// produce the lexer rule set which is active for the currently active lexer condition state -_currentRules:function _currentRules() { - if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { - return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; - } else { - return this.conditions["INITIAL"].rules; - } - }, - -// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available -topState:function topState(n) { - n = this.conditionStack.length - 1 - Math.abs(n || 0); - if (n >= 0) { - return this.conditionStack[n]; - } else { - return "INITIAL"; - } - }, - -// alias for begin(condition) -pushState:function pushState(condition) { - this.begin(condition); - }, - -// return the number of states currently on the stack -stateStackSize:function stateStackSize() { - return this.conditionStack.length; - }, -options: {}, -performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { -var YYSTATE=YY_START; -switch($avoiding_name_collisions) { -case 0:return 5 -break; -case 1:/* skip whitespace */ -break; -case 2:return 8 -break; -case 3:return 16 -break; -case 4:return 17 -break; -case 5:return 11 -break; -case 6:return 10 -break; -case 7:return 9 -break; -case 8:return 14 -break; -case 9:return 15 -break; -case 10:return 12 -break; -case 11:return 7 -break; -case 12:return 7 -break; -case 13:return 7 -break; -case 14:return 7 -break; -case 15:return 7 -break; -case 16:return 7 -break; -case 17:return 7 -break; -case 18:return 7 -break; -case 19:return 7 -break; -case 20:return 7 -break; -case 21:return 7 -break; -case 22:return 7 -break; -case 23:return 7 -break; -case 24:return 13 -break; -case 25:return 13 -break; -case 26:return 13 -break; -case 27:return 13 -break; -case 28:return 13 -break; -case 29:return 13 -break; -case 30:return 13 -break; -case 31:return 13 -break; -case 32:return 7 -break; -case 33:return 13 -break; -case 34:return 7 -break; -case 35:return 13 -break; -case 36:return 7 -break; -case 37:return 13 -break; -case 38:return 13 -break; -case 39:return 7 -break; -case 40:return 13 -break; -case 41:return 13 -break; -case 42:return 13 -break; -case 43:return 13 -break; -case 44:return 13 -break; -case 45:return 7 -break; -case 46:return 13 -break; -case 47:return 7 -break; -case 48:return 7 -break; -case 49:return 7 -break; -case 50:return 7 -break; -case 51:return 7 -break; -case 52:return 7 -break; -case 53:return 7 -break; -case 54:return 7 -break; -case 55:return 7 -break; -case 56:return 7 -break; -case 57:return 7 -break; -case 58:return 7 -break; -case 59:return 7 -break; -case 60:return 7 -break; -case 61:return 7 -break; -case 62:return 7 -break; -case 63:return 13 -break; -case 64:return 7 -break; -case 65:return 7 -break; -case 66:return 13 -break; -case 67:return 7 -break; -case 68:return 7 -break; -case 69:return 7 -break; -case 70:return 7 -break; -case 71:return 7 -break; -case 72:return 7 -break; -case 73:return 13 -break; -case 74:return 7 -break; -case 75:return 13 -break; -case 76:return 7 -break; -case 77:return 7 -break; -case 78:return 7 -break; -case 79:return 7 -break; -case 80:return 7 -break; -case 81:return 7 -break; -case 82:return 7 -break; -case 83:return 7 -break; -case 84:return 7 -break; -case 85:return 7 -break; -case 86:return 7 -break; -case 87:return 7 -break; -case 88:return 7 -break; -case 89:return 7 -break; -case 90:return 7 -break; -case 91:return 7 -break; -case 92:return 7 -break; -case 93:return 7 -break; -case 94:return 7 -break; -case 95:return 7 -break; -case 96:return 7 -break; -case 97:return 7 -break; -case 98:return 7 -break; -case 99:return 7 -break; -case 100:return 7 -break; -case 101:return 7 -break; -case 102:return 7 -break; -case 103:return 7 -break; -case 104:return 7 -break; -case 105:return 7 -break; -case 106:return 7 -break; -case 107:return 7 -break; -case 108:return 7 -break; -case 109:return 7 -break; -case 110:return 7 -break; -case 111:return 7 -break; -case 112:return 7 -break; -case 113:return 7 -break; -case 114:return 7 -break; -case 115:return 7 -break; -case 116:return 7 -break; -case 117:return 7 -break; -case 118:return 7 -break; -case 119:return 7 -break; -case 120:return 7 -break; -case 121:return 7 -break; -case 122:return 7 -break; -case 123:return 7 -break; -case 124:return 7 -break; -case 125:return 7 -break; -case 126:return 7 -break; -case 127:return 7 -break; -case 128:return 7 -break; -case 129:return 7 -break; -case 130:return 7 -break; -case 131:return 7 -break; -case 132:return 7 -break; -case 133:return 7 -break; -case 134:return 7 -break; -case 135:return 7 -break; -case 136:return 7 -break; -case 137:return 7 -break; -case 138:return 7 -break; -case 139:return 7 -break; -case 140:return 7 -break; -case 141:return 7 -break; -case 142:return 7 -break; -case 143:return 7 -break; -case 144:return 7 -break; -case 145:return 7 -break; -case 146:return 7 -break; -case 147:return 7 -break; -case 148:return 7 -break; -case 149:return 7 -break; -case 150:return 7 -break; -case 151:return 7 -break; -case 152:return 7 -break; -case 153:return 7 -break; -case 154:return 7 -break; -case 155:return 7 -break; -case 156:return 7 -break; -case 157:return 7 -break; -case 158:return 7 -break; -case 159:return 7 -break; -case 160:return 7 -break; -case 161:return 7 -break; -case 162:return 7 -break; -case 163:return 7 -break; -case 164:return 7 -break; -case 165:return 7 -break; -case 166:return 7 -break; -case 167:return 7 -break; -case 168:return 7 -break; -case 169:return 7 -break; -case 170:return 7 -break; -case 171:return 7 -break; -case 172:return 7 -break; -case 173:return 7 -break; -case 174:return 7 -break; -case 175:return 7 -break; -case 176:return 7 -break; -case 177:return 7 -break; -case 178:return 7 -break; -case 179:return 7 -break; -case 180:return 7 -break; -case 181:return 7 -break; -case 182:return 7 -break; -case 183:return 7 -break; -case 184:return 7 -break; -case 185:return 7 -break; -case 186:return 7 -break; -case 187:return 7 -break; -case 188:return 7 -break; -case 189:return 7 -break; -case 190:return 7 -break; -case 191:return 7 -break; -case 192:return 7 -break; -case 193:return 7 -break; -case 194:return 7 -break; -case 195:return 7 -break; -case 196:return 7 -break; -case 197:return 7 -break; -case 198:return 7 -break; -case 199:return 7 -break; -case 200:return 7 -break; -case 201:return 7 -break; -case 202:return 7 -break; -case 203:return 7 -break; -case 204:return 7 -break; -case 205:return 7 -break; -case 206:return 7 -break; -case 207:return 7 -break; -case 208:return 7 -break; -case 209:return 7 -break; -case 210:return 7 -break; -case 211:return 7 -break; -case 212:return 7 -break; -case 213:return 7 -break; -case 214:return 7 -break; -case 215:return 7 -break; -case 216:return 7 -break; -case 217:return 7 -break; -case 218:return 7 -break; -case 219:return 7 -break; -case 220:return 7 -break; -case 221:return 7 -break; -case 222:return 7 -break; -case 223:return 7 -break; -case 224:return 7 -break; -case 225:return 7 -break; -case 226:return 7 -break; -case 227:return 7 -break; -case 228:return 7 -break; -case 229:return 7 -break; -case 230:return 7 -break; -case 231:return 7 -break; -case 232:return 7 -break; -case 233:return 7 -break; -case 234:return 7 -break; -case 235:return 7 -break; -case 236:return 7 -break; -case 237:return 7 -break; -case 238:return 7 -break; -case 239:return 7 -break; -case 240:return 7 -break; -case 241:return 7 -break; -case 242:return 7 -break; -case 243:return 7 -break; -case 244:return 7 -break; -case 245:return 7 -break; -case 246:return 7 -break; -case 247:return 7 -break; -case 248:return 7 -break; -case 249:return 7 -break; -case 250:return 7 -break; -case 251:return 7 -break; -case 252:return 7 -break; -case 253:return 7 -break; -case 254:return 7 -break; -case 255:return 7 -break; -case 256:return 7 -break; -case 257:return 7 -break; -case 258:return 7 -break; -case 259:return 7 -break; -case 260:return 7 -break; -case 261:return 7 -break; -case 262:return 7 -break; -case 263:return 7 -break; -case 264:return 7 -break; -case 265:return 7 -break; -case 266:return 7 -break; -case 267:return 7 -break; -case 268:return 7 -break; -case 269:return 7 -break; -case 270:return 7 -break; -case 271:return 7 -break; -case 272:return 7 -break; -case 273:return 7 -break; -case 274:return 7 -break; -case 275:return 7 -break; -case 276:return 7 -break; -case 277:return 7 -break; -case 278:return 7 -break; -case 279:return 7 -break; -case 280:return 7 -break; -case 281:return 7 -break; -case 282:return 7 -break; -case 283:return 7 -break; -case 284:return 7 -break; -case 285:return 7 -break; -case 286:return 7 -break; -case 287:return 7 -break; -case 288:return 7 -break; -case 289:return 7 -break; -case 290:return 7 -break; -case 291:return 7 -break; -case 292:return 7 -break; -case 293:return 7 -break; -case 294:return 7 -break; -case 295:return 7 -break; -case 296:return 7 -break; -case 297:return 7 -break; -case 298:return 7 -break; -case 299:return 7 -break; -case 300:return 7 -break; -case 301:return 7 -break; -case 302:return 7 -break; -case 303:return 7 -break; -case 304:return 7 -break; -case 305:return 7 -break; -case 306:return 7 -break; -case 307:return 7 -break; -case 308:return 7 -break; -case 309:return 7 -break; -case 310:return 7 -break; -case 311:return 7 -break; -case 312:return 7 -break; -case 313:return 7 -break; -case 314:return 7 -break; -case 315:return 7 -break; -case 316:return 7 -break; -case 317:return 7 -break; -case 318:return 7 -break; -case 319:return 7 -break; -case 320:return 7 -break; -case 321:return 7 -break; -case 322:return 7 -break; -case 323:return 7 -break; -case 324:return 7 -break; -case 325:return 7 -break; -case 326:return 7 -break; -case 327:return 7 -break; -case 328:return 7 -break; -case 329:return 7 -break; -case 330:return 7 -break; -case 331:return 7 -break; -case 332:return 7 -break; -case 333:return 7 -break; -case 334:return 7 -break; -case 335:return 7 -break; -case 336:return 7 -break; -case 337:return 7 -break; -case 338:return 7 -break; -case 339:return 7 -break; -case 340:return 7 -break; -case 341:return 7 -break; -case 342:return 7 -break; -case 343:return 7 -break; -case 344:return 7 -break; -case 345:return 7 -break; -case 346:return 7 -break; -case 347:return 7 -break; -case 348:return 7 -break; -case 349:return 7 -break; -case 350:return 7 -break; -case 351:return 7 -break; -case 352:return 7 -break; -case 353:return 7 -break; -case 354:return 7 -break; -case 355:return 7 -break; -case 356:return 7 -break; -case 357:return 7 -break; -case 358:return 7 -break; -case 359:return 7 -break; -case 360:return 7 -break; -case 361:return 7 -break; -case 362:return 7 -break; -case 363:return 7 -break; -case 364:return 7 -break; -} -}, -rules: [/^(?:$)/,/^(?:\s+)/,/^(?:\+)/,/^(?:\()/,/^(?:\))/,/^(?::)/,/^(?:DocumentRef-([0-9A-Za-z-+.]+))/,/^(?:LicenseRef-([0-9A-Za-z-+.]+))/,/^(?:AND)/,/^(?:OR)/,/^(?:WITH)/,/^(?:BSD-3-Clause-No-Nuclear-License-2014)/,/^(?:BSD-3-Clause-No-Nuclear-Warranty)/,/^(?:GPL-2\.0-with-classpath-exception)/,/^(?:GPL-3\.0-with-autoconf-exception)/,/^(?:GPL-2\.0-with-autoconf-exception)/,/^(?:BSD-3-Clause-No-Nuclear-License)/,/^(?:MPL-2\.0-no-copyleft-exception)/,/^(?:GPL-2\.0-with-bison-exception)/,/^(?:GPL-2\.0-with-font-exception)/,/^(?:GPL-2\.0-with-GCC-exception)/,/^(?:CNRI-Python-GPL-Compatible)/,/^(?:GPL-3\.0-with-GCC-exception)/,/^(?:BSD-3-Clause-Attribution)/,/^(?:Classpath-exception-2\.0)/,/^(?:WxWindows-exception-3\.1)/,/^(?:freertos-exception-2\.0)/,/^(?:Autoconf-exception-3\.0)/,/^(?:i2p-gpl-java-exception)/,/^(?:gnu-javamail-exception)/,/^(?:Nokia-Qt-exception-1\.1)/,/^(?:Autoconf-exception-2\.0)/,/^(?:BSD-2-Clause-FreeBSD)/,/^(?:u-boot-exception-2\.0)/,/^(?:zlib-acknowledgement)/,/^(?:Bison-exception-2\.2)/,/^(?:BSD-2-Clause-NetBSD)/,/^(?:CLISP-exception-2\.0)/,/^(?:eCos-exception-2\.0)/,/^(?:BSD-3-Clause-Clear)/,/^(?:Font-exception-2\.0)/,/^(?:FLTK-exception-2\.0)/,/^(?:GCC-exception-2\.0)/,/^(?:Qwt-exception-1\.0)/,/^(?:Libtool-exception)/,/^(?:BSD-3-Clause-LBNL)/,/^(?:GCC-exception-3\.1)/,/^(?:Artistic-1\.0-Perl)/,/^(?:Artistic-1\.0-cl8)/,/^(?:CC-BY-NC-SA-2\.5)/,/^(?:MIT-advertising)/,/^(?:BSD-Source-Code)/,/^(?:CC-BY-NC-SA-4\.0)/,/^(?:LiLiQ-Rplus-1\.1)/,/^(?:CC-BY-NC-SA-3\.0)/,/^(?:BSD-4-Clause-UC)/,/^(?:CC-BY-NC-SA-2\.0)/,/^(?:CC-BY-NC-SA-1\.0)/,/^(?:CC-BY-NC-ND-4\.0)/,/^(?:CC-BY-NC-ND-3\.0)/,/^(?:CC-BY-NC-ND-2\.5)/,/^(?:CC-BY-NC-ND-2\.0)/,/^(?:CC-BY-NC-ND-1\.0)/,/^(?:LZMA-exception)/,/^(?:BitTorrent-1\.1)/,/^(?:CrystalStacker)/,/^(?:FLTK-exception)/,/^(?:SugarCRM-1\.1\.3)/,/^(?:BSD-Protection)/,/^(?:BitTorrent-1\.0)/,/^(?:HaskellReport)/,/^(?:Interbase-1\.0)/,/^(?:StandardML-NJ)/,/^(?:mif-exception)/,/^(?:Frameworx-1\.0)/,/^(?:389-exception)/,/^(?:CC-BY-NC-2\.0)/,/^(?:CC-BY-NC-2\.5)/,/^(?:CC-BY-NC-3\.0)/,/^(?:CC-BY-NC-4\.0)/,/^(?:W3C-19980720)/,/^(?:CC-BY-SA-1\.0)/,/^(?:CC-BY-SA-2\.0)/,/^(?:CC-BY-SA-2\.5)/,/^(?:CC-BY-ND-2\.0)/,/^(?:CC-BY-SA-4\.0)/,/^(?:CC-BY-SA-3\.0)/,/^(?:Artistic-1\.0)/,/^(?:Artistic-2\.0)/,/^(?:CC-BY-ND-2\.5)/,/^(?:CC-BY-ND-3\.0)/,/^(?:CC-BY-ND-4\.0)/,/^(?:CC-BY-ND-1\.0)/,/^(?:BSD-4-Clause)/,/^(?:BSD-3-Clause)/,/^(?:BSD-2-Clause)/,/^(?:CC-BY-NC-1\.0)/,/^(?:bzip2-1\.0\.6)/,/^(?:Unicode-TOU)/,/^(?:CNRI-Jython)/,/^(?:ImageMagick)/,/^(?:Adobe-Glyph)/,/^(?:CUA-OPL-1\.0)/,/^(?:OLDAP-2\.2\.2)/,/^(?:LiLiQ-R-1\.1)/,/^(?:bzip2-1\.0\.5)/,/^(?:LiLiQ-P-1\.1)/,/^(?:OLDAP-2\.0\.1)/,/^(?:OLDAP-2\.2\.1)/,/^(?:CNRI-Python)/,/^(?:XFree86-1\.1)/,/^(?:OSET-PL-2\.1)/,/^(?:Apache-2\.0)/,/^(?:Watcom-1\.0)/,/^(?:PostgreSQL)/,/^(?:Python-2\.0)/,/^(?:RHeCos-1\.1)/,/^(?:EUDatagrid)/,/^(?:Spencer-99)/,/^(?:Intel-ACPI)/,/^(?:CECILL-1\.0)/,/^(?:CECILL-1\.1)/,/^(?:JasPer-2\.0)/,/^(?:CECILL-2\.0)/,/^(?:CECILL-2\.1)/,/^(?:gSOAP-1\.3b)/,/^(?:Spencer-94)/,/^(?:Apache-1\.1)/,/^(?:Spencer-86)/,/^(?:Apache-1\.0)/,/^(?:ClArtistic)/,/^(?:TORQUE-1\.1)/,/^(?:CATOSL-1\.1)/,/^(?:Adobe-2006)/,/^(?:Zimbra-1\.4)/,/^(?:Zimbra-1\.3)/,/^(?:Condor-1\.1)/,/^(?:CC-BY-3\.0)/,/^(?:CC-BY-2\.5)/,/^(?:OLDAP-2\.4)/,/^(?:SGI-B-1\.1)/,/^(?:SISSL-1\.2)/,/^(?:SGI-B-1\.0)/,/^(?:OLDAP-2\.3)/,/^(?:CC-BY-4\.0)/,/^(?:Crossword)/,/^(?:SimPL-2\.0)/,/^(?:OLDAP-2\.2)/,/^(?:OLDAP-2\.1)/,/^(?:ErlPL-1\.1)/,/^(?:LPPL-1\.3a)/,/^(?:LPPL-1\.3c)/,/^(?:OLDAP-2\.0)/,/^(?:Leptonica)/,/^(?:CPOL-1\.02)/,/^(?:OLDAP-1\.4)/,/^(?:OLDAP-1\.3)/,/^(?:CC-BY-2\.0)/,/^(?:Unlicense)/,/^(?:OLDAP-2\.8)/,/^(?:OLDAP-1\.2)/,/^(?:MakeIndex)/,/^(?:OLDAP-2\.7)/,/^(?:OLDAP-1\.1)/,/^(?:Sleepycat)/,/^(?:D-FSL-1\.0)/,/^(?:CC-BY-1\.0)/,/^(?:OLDAP-2\.6)/,/^(?:WXwindows)/,/^(?:NPOSL-3\.0)/,/^(?:FreeImage)/,/^(?:SGI-B-2\.0)/,/^(?:OLDAP-2\.5)/,/^(?:Beerware)/,/^(?:Newsletr)/,/^(?:NBPL-1\.0)/,/^(?:NASA-1\.3)/,/^(?:NLOD-1\.0)/,/^(?:AGPL-1\.0)/,/^(?:OCLC-2\.0)/,/^(?:ODbL-1\.0)/,/^(?:PDDL-1\.0)/,/^(?:Motosoto)/,/^(?:Afmparse)/,/^(?:ANTLR-PD)/,/^(?:LPL-1\.02)/,/^(?:Abstyles)/,/^(?:eCos-2\.0)/,/^(?:APSL-1\.0)/,/^(?:LPPL-1\.2)/,/^(?:LPPL-1\.1)/,/^(?:LPPL-1\.0)/,/^(?:APSL-1\.1)/,/^(?:APSL-2\.0)/,/^(?:Info-ZIP)/,/^(?:Zend-2\.0)/,/^(?:IBM-pibs)/,/^(?:LGPL-2\.0)/,/^(?:LGPL-3\.0)/,/^(?:LGPL-2\.1)/,/^(?:GFDL-1\.3)/,/^(?:PHP-3\.01)/,/^(?:GFDL-1\.2)/,/^(?:GFDL-1\.1)/,/^(?:AGPL-3\.0)/,/^(?:Giftware)/,/^(?:EUPL-1\.1)/,/^(?:RPSL-1\.0)/,/^(?:EUPL-1\.0)/,/^(?:MIT-enna)/,/^(?:CECILL-B)/,/^(?:diffmark)/,/^(?:CECILL-C)/,/^(?:CDDL-1\.0)/,/^(?:Sendmail)/,/^(?:CDDL-1\.1)/,/^(?:CPAL-1\.0)/,/^(?:APSL-1\.2)/,/^(?:NPL-1\.1)/,/^(?:AFL-1\.2)/,/^(?:Caldera)/,/^(?:AFL-2\.0)/,/^(?:FSFULLR)/,/^(?:AFL-2\.1)/,/^(?:VSL-1\.0)/,/^(?:VOSTROM)/,/^(?:UPL-1\.0)/,/^(?:Dotseqn)/,/^(?:CPL-1\.0)/,/^(?:dvipdfm)/,/^(?:EPL-1\.0)/,/^(?:OCCT-PL)/,/^(?:ECL-1\.0)/,/^(?:Latex2e)/,/^(?:ECL-2\.0)/,/^(?:GPL-1\.0)/,/^(?:GPL-2\.0)/,/^(?:GPL-3\.0)/,/^(?:AFL-3\.0)/,/^(?:LAL-1\.2)/,/^(?:LAL-1\.3)/,/^(?:EFL-1\.0)/,/^(?:EFL-2\.0)/,/^(?:gnuplot)/,/^(?:Aladdin)/,/^(?:LPL-1\.0)/,/^(?:libtiff)/,/^(?:Entessa)/,/^(?:AMDPLPA)/,/^(?:IPL-1\.0)/,/^(?:OPL-1\.0)/,/^(?:OSL-1\.0)/,/^(?:OSL-1\.1)/,/^(?:OSL-2\.0)/,/^(?:OSL-2\.1)/,/^(?:OSL-3\.0)/,/^(?:OpenSSL)/,/^(?:ZPL-2\.1)/,/^(?:PHP-3\.0)/,/^(?:ZPL-2\.0)/,/^(?:ZPL-1\.1)/,/^(?:CC0-1\.0)/,/^(?:SPL-1\.0)/,/^(?:psutils)/,/^(?:MPL-1\.0)/,/^(?:QPL-1\.0)/,/^(?:MPL-1\.1)/,/^(?:MPL-2\.0)/,/^(?:APL-1\.0)/,/^(?:RPL-1\.1)/,/^(?:RPL-1\.5)/,/^(?:MIT-CMU)/,/^(?:Multics)/,/^(?:Eurosym)/,/^(?:BSL-1\.0)/,/^(?:MIT-feh)/,/^(?:Saxpath)/,/^(?:Borceux)/,/^(?:OFL-1\.1)/,/^(?:OFL-1\.0)/,/^(?:AFL-1\.1)/,/^(?:YPL-1\.1)/,/^(?:YPL-1\.0)/,/^(?:NPL-1\.0)/,/^(?:iMatix)/,/^(?:mpich2)/,/^(?:APAFML)/,/^(?:Bahyph)/,/^(?:RSA-MD)/,/^(?:psfrag)/,/^(?:Plexus)/,/^(?:eGenix)/,/^(?:Glulxe)/,/^(?:SAX-PD)/,/^(?:Imlib2)/,/^(?:Wsuipa)/,/^(?:LGPLLR)/,/^(?:Libpng)/,/^(?:xinetd)/,/^(?:MITNFA)/,/^(?:NetCDF)/,/^(?:Naumen)/,/^(?:SMPPL)/,/^(?:Nunit)/,/^(?:FSFUL)/,/^(?:GL2PS)/,/^(?:SMLNJ)/,/^(?:Rdisc)/,/^(?:Noweb)/,/^(?:Nokia)/,/^(?:SISSL)/,/^(?:Qhull)/,/^(?:Intel)/,/^(?:Glide)/,/^(?:Xerox)/,/^(?:AMPAS)/,/^(?:WTFPL)/,/^(?:MS-PL)/,/^(?:XSkat)/,/^(?:MS-RL)/,/^(?:MirOS)/,/^(?:RSCPL)/,/^(?:TMate)/,/^(?:OGTSL)/,/^(?:FSFAP)/,/^(?:NCSA)/,/^(?:Zlib)/,/^(?:SCEA)/,/^(?:SNIA)/,/^(?:NGPL)/,/^(?:NOSL)/,/^(?:ADSL)/,/^(?:MTLL)/,/^(?:NLPL)/,/^(?:Ruby)/,/^(?:JSON)/,/^(?:Barr)/,/^(?:0BSD)/,/^(?:Xnet)/,/^(?:Cube)/,/^(?:curl)/,/^(?:DSDP)/,/^(?:Fair)/,/^(?:HPND)/,/^(?:TOSL)/,/^(?:IJG)/,/^(?:SWL)/,/^(?:Vim)/,/^(?:FTL)/,/^(?:ICU)/,/^(?:OML)/,/^(?:NRL)/,/^(?:DOC)/,/^(?:TCL)/,/^(?:W3C)/,/^(?:NTP)/,/^(?:IPA)/,/^(?:ISC)/,/^(?:X11)/,/^(?:AAL)/,/^(?:AML)/,/^(?:xpp)/,/^(?:Zed)/,/^(?:MIT)/,/^(?:Mup)/], -conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364],"inclusive":true}} -}); -return lexer; -})(); -parser.lexer = lexer; -function Parser () { - this.yy = {}; -} -Parser.prototype = parser;parser.Parser = Parser; -return new Parser; -})(); - - -if (typeof require !== 'undefined' && typeof exports !== 'undefined') { -exports.parser = spdxparse; -exports.Parser = spdxparse.Parser; -exports.parse = function () { return spdxparse.parse.apply(spdxparse, arguments); }; -exports.main = function commonjsMain(args) { - if (!args[1]) { - console.log('Usage: '+args[0]+' FILE'); - process.exit(1); - } - var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8"); - return exports.parser.parse(source); -}; -if (typeof module !== 'undefined' && require.main === module) { - exports.main(process.argv.slice(1)); -} -} diff --git a/node_modules/spdx-expression-validate/package.json b/node_modules/spdx-expression-validate/package.json deleted file mode 100644 index 530b3f515620d..0000000000000 --- a/node_modules/spdx-expression-validate/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "_args": [ - [ - "spdx-expression-validate@1.0.2", - "/Users/zkat/Documents/code/work/npm" - ] - ], - "_development": true, - "_from": "spdx-expression-validate@1.0.2", - "_id": "spdx-expression-validate@1.0.2", - "_inBundle": false, - "_integrity": "sha1-Wk5NdhbtHJuIFQNmtCF/dnwn6eM=", - "_location": "/spdx-expression-validate", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "spdx-expression-validate@1.0.2", - "name": "spdx-expression-validate", - "escapedName": "spdx-expression-validate", - "rawSpec": "1.0.2", - "saveSpec": null, - "fetchSpec": "1.0.2" - }, - "_requiredBy": [ - "/licensee" - ], - "_resolved": "https://registry.npmjs.org/spdx-expression-validate/-/spdx-expression-validate-1.0.2.tgz", - "_spec": "1.0.2", - "_where": "/Users/zkat/Documents/code/work/npm", - "author": { - "name": "Kyle E. Mitchell", - "email": "kyle@kemitchell.com", - "url": "http://kemitchell.com" - }, - "bugs": { - "url": "https://github.com/kemitchell/spdx-expression-validate.js/issues" - }, - "dependencies": { - "spdx-expression-parse": "^1.0.0" - }, - "description": "validate SPDX license expressions", - "devDependencies": { - "defence-cli": "^1.0.1", - "replace-require-self": "^1.0.0", - "standard": "^8.3.0" - }, - "files": [ - "index.js" - ], - "homepage": "https://github.com/kemitchell/spdx.js", - "keywords": [ - "SPDX", - "law", - "legal", - "license", - "metadata", - "package", - "package.json", - "standards" - ], - "license": "(MIT AND CC-BY-3.0)", - "name": "spdx-expression-validate", - "repository": { - "type": "git", - "url": "git+https://github.com/kemitchell/spdx-expression-validate.js.git" - }, - "scripts": { - "lint": "standard", - "test": "defence -i javascript README.md | replace-require-self | node" - }, - "version": "1.0.2" -} diff --git a/node_modules/spdx-ranges/LICENSE.md b/node_modules/spdx-ranges/LICENSE.md deleted file mode 100644 index 6c255589566ff..0000000000000 --- a/node_modules/spdx-ranges/LICENSE.md +++ /dev/null @@ -1,9 +0,0 @@ -The MIT License - -Copyright (c) 2015 Kyle E. Mitchell - -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/node_modules/spdx-ranges/README.md b/node_modules/spdx-ranges/README.md deleted file mode 100644 index 46c95af1d4da2..0000000000000 --- a/node_modules/spdx-ranges/README.md +++ /dev/null @@ -1,38 +0,0 @@ -```javascript -var assert = require('assert') -var ranges = require('spdx-ranges') - -assert( - Array.isArray(ranges), - 'module is an Array' -) - -assert( - ranges.length > 0, - 'the Array has elements' -) - -assert( - ranges.every(function (e) { - return Array.isArray(e) - }), - 'each Array element is an Array' -) - -assert( - ranges.every(function (range) { - return range.every(function (element) { - return ( - typeof element === 'string' || - ( - Array.isArray(element) && - element.every(function (element) { - return typeof element === 'string' - }) - ) - ) - }) - }), - 'elements of Array-elements are strings or Arrays of Strings' -) -``` diff --git a/node_modules/spdx-ranges/index.json b/node_modules/spdx-ranges/index.json deleted file mode 100644 index 5593f89bf5169..0000000000000 --- a/node_modules/spdx-ranges/index.json +++ /dev/null @@ -1,233 +0,0 @@ -[ - [ - "AFL-1.1", - "AFL-1.2", - "AFL-2.0", - "AFL-2.1", - "AFL-3.0" - ], - [ - "AGPL-1.0", - [ - "AGPL-3.0", - "AGPL-3.0-only" - ] - ], - [ - "Apache-1.0", - "Apache-1.1", - "Apache-2.0" - ], - [ - "APSL-1.0", - "APSL-1.1", - "APSL-1.2", - "APSL-2.0" - ], - [ - "Artistic-1.0", - "Artistic-2.0" - ], - [ - "BitTorrent-1.0", - "BitTorrent-1.1" - ], - [ - "CC-BY-1.0", - "CC-BY-2.0", - "CC-BY-2.5", - "CC-BY-3.0", - "CC-BY-4.0" - ], - [ - "CC-BY-NC-1.0", - "CC-BY-NC-2.0", - "CC-BY-NC-2.5", - "CC-BY-NC-3.0", - "CC-BY-NC-4.0" - ], - [ - "CC-BY-NC-ND-1.0", - "CC-BY-NC-ND-2.0", - "CC-BY-NC-ND-2.5", - "CC-BY-NC-ND-3.0", - "CC-BY-NC-ND-4.0" - ], - [ - "CC-BY-NC-SA-1.0", - "CC-BY-NC-SA-2.0", - "CC-BY-NC-SA-2.5", - "CC-BY-NC-SA-3.0", - "CC-BY-NC-SA-4.0" - ], - [ - "CC-BY-ND-1.0", - "CC-BY-ND-2.0", - "CC-BY-ND-2.5", - "CC-BY-ND-3.0", - "CC-BY-ND-4.0" - ], - [ - "CC-BY-SA-1.0", - "CC-BY-SA-2.0", - "CC-BY-SA-2.5", - "CC-BY-SA-3.0", - "CC-BY-SA-4.0" - ], - [ - "CDDL-1.0", - "CDDL-1.1" - ], - [ - "CECILL-1.0", - "CECILL-1.1", - "CECILL-2.0" - ], - [ - "ECL-1.0", - "ECL-2.0" - ], - [ - "EFL-1.0", - "EFL-2.0" - ], - [ - "EUPL-1.0", - "EUPL-1.1" - ], - [ - [ - "GFDL-1.1", - "GFDL-1.1-only" - ], - [ - "GFDL-1.2", - "GFDL-1.2-only" - ], - [ - "GFDL-1.1-or-later", - "GFDL-1.2-or-later", - "GFDL-1.3", - "GFDL-1.3-only", - "GFDL-1.3-or-later" - ] - ], - [ - [ - "GPL-1.0", - "GPL-1.0-only" - ], - [ - "GPL-2.0", - "GPL-2.0-only" - ], - [ - "GPL-1.0-or-later", - "GPL-2.0-or-later", - "GPL-3.0", - "GPL-3.0-only", - "GPL-3.0-or-later" - ] - ], - [ - [ - "LGPL-2.0", - "LGPL-2.0-only" - ], - [ - "LGPL-2.1", - "LGPL-2.1-only" - ], - [ - "LGPL-2.0-or-later", - "LGPL-2.1-or-later", - "LGPL-3.0", - "LGPL-3.0-only", - "LGPL-3.0-or-later" - ] - ], - [ - "LPL-1.0", - "LPL-1.02" - ], - [ - "LPPL-1.0", - "LPPL-1.1", - "LPPL-1.2", - "LPPL-1.3a", - "LPPL-1.3c" - ], - [ - "MPL-1.0", - "MPL-1.1", - "MPL-2.0" - ], - [ - "MPL-1.0", - "MPL-1.1", - "MPL-2.0-no-copyleft-exception" - ], - [ - "NPL-1.0", - "NPL-1.1" - ], - [ - "OFL-1.0", - "OFL-1.1" - ], - [ - "OLDAP-1.1", - "OLDAP-1.2", - "OLDAP-1.3", - "OLDAP-1.4", - "OLDAP-2.0", - "OLDAP-2.0.1", - "OLDAP-2.1", - "OLDAP-2.2", - "OLDAP-2.2.1", - "OLDAP-2.2.2", - "OLDAP-2.3", - "OLDAP-2.4", - "OLDAP-2.5", - "OLDAP-2.6", - "OLDAP-2.7", - "OLDAP-2.8" - ], - [ - "OSL-1.0", - "OSL-1.1", - "OSL-2.0", - "OSL-2.1", - "OSL-3.0" - ], - [ - "PHP-3.0", - "PHP-3.01" - ], - [ - "RPL-1.1", - "RPL-1.5" - ], - [ - "SGI-B-1.0", - "SGI-B-1.1", - "SGI-B-2.0" - ], - [ - "YPL-1.0", - "YPL-1.1" - ], - [ - "ZPL-1.1", - "ZPL-2.0", - "ZPL-2.1" - ], - [ - "Zimbra-1.3", - "Zimbra-1.4" - ], - [ - "bzip2-1.0.5", - "bzip2-1.0.6" - ] -] diff --git a/node_modules/spdx-ranges/package.json b/node_modules/spdx-ranges/package.json deleted file mode 100644 index 6dd46a69ace28..0000000000000 --- a/node_modules/spdx-ranges/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "_args": [ - [ - "spdx-ranges@2.0.0", - "/Users/zkat/Documents/code/work/npm" - ] - ], - "_development": true, - "_from": "spdx-ranges@2.0.0", - "_id": "spdx-ranges@2.0.0", - "_inBundle": false, - "_integrity": "sha512-AUUXLfqkwD7GlzZkXv8ePPCpPjeVWI9xJCfysL8re/uKb6H10umMnC7bFRsHmLJan4fslUtekAgpHlSgLc/7mA==", - "_location": "/spdx-ranges", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "spdx-ranges@2.0.0", - "name": "spdx-ranges", - "escapedName": "spdx-ranges", - "rawSpec": "2.0.0", - "saveSpec": null, - "fetchSpec": "2.0.0" - }, - "_requiredBy": [ - "/spdx-compare", - "/spdx-satisfies" - ], - "_resolved": "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.0.0.tgz", - "_spec": "2.0.0", - "_where": "/Users/zkat/Documents/code/work/npm", - "author": { - "name": "The Linux Foundation" - }, - "bugs": { - "url": "https://github.com/kemitchell/spdx-ranges.js/issues" - }, - "contributors": [ - { - "name": "Kyle E. Mitchell", - "email": "kyle@kemitchell.com", - "url": "https://kemitchell.com/" - } - ], - "description": "list of SPDX standard license ranges", - "devDependencies": { - "defence-cli": "^1.0.1" - }, - "homepage": "https://github.com/kemitchell/spdx-ranges.js#readme", - "license": "CC-BY-3.0", - "name": "spdx-ranges", - "repository": { - "type": "git", - "url": "git+https://github.com/kemitchell/spdx-ranges.js.git" - }, - "scripts": { - "test": "defence -i javascript README.md | sed 's!spdx-ranges!./!' | node" - }, - "version": "2.0.0" -} diff --git a/node_modules/spdx-ranges/test.log b/node_modules/spdx-ranges/test.log deleted file mode 100644 index 90608d1cbe7cf..0000000000000 --- a/node_modules/spdx-ranges/test.log +++ /dev/null @@ -1,4 +0,0 @@ - -> spdx-ranges@1.0.1 test /home/kyle/spdx-ranges.js -> defence -i javascript README.md | sed 's!spdx-ranges!./!' | node - diff --git a/node_modules/spdx-satisfies/LICENSE.md b/node_modules/spdx-satisfies/LICENSE.md deleted file mode 100644 index 6c255589566ff..0000000000000 --- a/node_modules/spdx-satisfies/LICENSE.md +++ /dev/null @@ -1,9 +0,0 @@ -The MIT License - -Copyright (c) 2015 Kyle E. Mitchell - -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/node_modules/spdx-satisfies/README.md b/node_modules/spdx-satisfies/README.md deleted file mode 100644 index 2d175ea8a1aae..0000000000000 --- a/node_modules/spdx-satisfies/README.md +++ /dev/null @@ -1,31 +0,0 @@ -```javascript -var assert = require('assert') -var satisfies = require('spdx-satisfies') - -assert(satisfies('MIT', 'MIT')) - -assert(satisfies('MIT', '(ISC OR MIT)')) -assert(satisfies('Zlib', '(ISC OR (MIT OR Zlib))')) -assert(!satisfies('GPL-3.0', '(ISC OR MIT)')) - -assert(satisfies('GPL-2.0', 'GPL-2.0+')) -assert(satisfies('GPL-3.0', 'GPL-2.0+')) -assert(satisfies('GPL-1.0+', 'GPL-2.0+')) -assert(!satisfies('GPL-1.0', 'GPL-2.0+')) -assert(satisfies('GPL-2.0-only', 'GPL-2.0-only')) -assert(satisfies('GPL-3.0-only', 'GPL-2.0+')) - -assert(!satisfies( - 'GPL-2.0', - 'GPL-2.0+ WITH Bison-exception-2.2' -)) - -assert(satisfies( - 'GPL-3.0 WITH Bison-exception-2.2', - 'GPL-2.0+ WITH Bison-exception-2.2' -)) - -assert(satisfies('(MIT OR GPL-2.0)', '(ISC OR MIT)')) -assert(satisfies('(MIT AND GPL-2.0)', '(MIT OR GPL-2.0)')) -assert(!satisfies('(MIT AND GPL-2.0)', '(ISC OR GPL-2.0)')) -``` diff --git a/node_modules/spdx-satisfies/index.js b/node_modules/spdx-satisfies/index.js deleted file mode 100644 index 2eb22a6b37cc1..0000000000000 --- a/node_modules/spdx-satisfies/index.js +++ /dev/null @@ -1,112 +0,0 @@ -var compare = require('spdx-compare') -var parse = require('spdx-expression-parse') -var ranges = require('spdx-ranges') - -var rangesAreCompatible = function (first, second) { - return ( - first.license === second.license || - ranges.some(function (range) { - return ( - licenseInRange(first.license, range) && - licenseInRange(second.license, range) - ) - }) - ) -} - -function licenseInRange (license, range) { - return ( - range.indexOf(license) !== -1 || - range.some(function (element) { - return ( - Array.isArray(element) && - element.indexOf(license) !== -1 - ) - }) - ) -} - -var identifierInRange = function (identifier, range) { - return ( - identifier.license === range.license || - compare.gt(identifier.license, range.license) || - compare.eq(identifier.license, range.license) - ) -} - -var licensesAreCompatible = function (first, second) { - if (first.exception !== second.exception) { - return false - } else if (second.hasOwnProperty('license')) { - if (second.hasOwnProperty('plus')) { - if (first.hasOwnProperty('plus')) { - // first+, second+ - return rangesAreCompatible(first, second) - } else { - // first, second+ - return identifierInRange(first, second) - } - } else { - if (first.hasOwnProperty('plus')) { - // first+, second - return identifierInRange(second, first) - } else { - // first, second - return first.license === second.license - } - } - } -} - -var recurseLeftAndRight = function (first, second) { - var firstConjunction = first.conjunction - if (firstConjunction === 'and') { - return ( - recurse(first.left, second) && - recurse(first.right, second) - ) - } else if (firstConjunction === 'or') { - return ( - recurse(first.left, second) || - recurse(first.right, second) - ) - } -} - -var recurse = function (first, second) { - if (first.hasOwnProperty('conjunction')) { - return recurseLeftAndRight(first, second) - } else if (second.hasOwnProperty('conjunction')) { - return recurseLeftAndRight(second, first) - } else { - return licensesAreCompatible(first, second) - } -} - -function normalizeGPLIdentifiers (argument) { - var license = argument.license - if (license) { - if (endsWith(license, '-or-later')) { - argument.license = license.replace('-or-later', '') - argument.plus = true - } else if (endsWith(license, '-only')) { - argument.license = license.replace('-or-later', '') - delete argument.plus - } - } else { - argument.left = normalizeGPLIdentifiers(argument.left) - argument.right = normalizeGPLIdentifiers(argument.right) - } - return argument -} - -function endsWith (string, substring) { - return string.indexOf(substring) === string.length - 1 -} - -module.exports = function (first, second) { - return recurse( - normalizeGPLIdentifiers(parse(first)), - normalizeGPLIdentifiers(parse(second)) - ) -} diff --git a/node_modules/spdx-satisfies/package.json b/node_modules/spdx-satisfies/package.json deleted file mode 100644 index 3354a86bcd227..0000000000000 --- a/node_modules/spdx-satisfies/package.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "_args": [ - [ - "spdx-satisfies@4.0.0", - "/Users/zkat/Documents/code/work/npm" - ] - ], - "_development": true, - "_from": "spdx-satisfies@4.0.0", - "_id": "spdx-satisfies@4.0.0", - "_inBundle": false, - "_integrity": "sha512-OcARj6U1OuVv98SVrRqgrR30sVocONtoPpnX8Xz4vXNrFVedqtbgkA+0KmQoXIQ2xjfltPPRVIMeNzKEFLWWKQ==", - "_location": "/spdx-satisfies", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "spdx-satisfies@4.0.0", - "name": "spdx-satisfies", - "escapedName": "spdx-satisfies", - "rawSpec": "4.0.0", - "saveSpec": null, - "fetchSpec": "4.0.0" - }, - "_requiredBy": [ - "/licensee" - ], - "_resolved": "https://registry.npmjs.org/spdx-satisfies/-/spdx-satisfies-4.0.0.tgz", - "_spec": "4.0.0", - "_where": "/Users/zkat/Documents/code/work/npm", - "author": { - "name": "Kyle E. Mitchell", - "email": "kyle@kemitchell.com", - "url": "https://kemitchell.com" - }, - "bugs": { - "url": "https://github.com/kemitchell/spdx-satisfies.js/issues" - }, - "dependencies": { - "spdx-compare": "^1.0.0", - "spdx-expression-parse": "^3.0.0", - "spdx-ranges": "^2.0.0" - }, - "description": "test whether SPDX expressions satisfy licensing criteria", - "devDependencies": { - "defence-cli": "^2.0.1", - "replace-require-self": "^1.1.1", - "standard": "^11.0.0" - }, - "homepage": "https://github.com/kemitchell/spdx-satisfies.js#readme", - "keywords": [ - "SPDX", - "law", - "legal", - "license", - "metadata", - "package", - "package.json", - "standards" - ], - "license": "MIT", - "name": "spdx-satisfies", - "repository": { - "type": "git", - "url": "git+https://github.com/kemitchell/spdx-satisfies.js.git" - }, - "scripts": { - "lint": "standard", - "test": "defence -i javascript README.md | replace-require-self | node" - }, - "version": "4.0.0" -} diff --git a/package-lock.json b/package-lock.json index 6f84a492b305d..9b9d63ef379e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1647,7 +1647,7 @@ }, "fs-access": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { @@ -3317,7 +3317,6 @@ "version": "0.1.4", "bundled": true, "dev": true, - "optional": true, "requires": { "kind-of": "^3.0.2", "longest": "^1.0.1", @@ -4500,8 +4499,7 @@ "longest": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "loose-envify": { "version": "1.3.1", diff --git a/package.json b/package.json index dbfc17b4f0f7e..b22f8804e6e6c 100644 --- a/package.json +++ b/package.json @@ -267,8 +267,8 @@ ], "devDependencies": { "deep-equal": "~1.0.1", - "licensee": "^5.0.0", "get-stream": "^4.1.0", + "licensee": "^5.0.0", "marked": "^0.5.0", "marked-man": "~0.2.1", "npm-registry-couchapp": "^2.7.1", From a3ba0ccf1fa86aec56b1ad49883abf28c1f56b3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kat=20March=C3=A1n?= Date: Tue, 11 Dec 2018 14:37:32 -0800 Subject: [PATCH 50/97] deps: move rimraf to prod deps --- node_modules/rimraf/package.json | 27 +++++++++++---------------- package.json | 2 +- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/node_modules/rimraf/package.json b/node_modules/rimraf/package.json index 758856bf6fcdc..a22d103bbb734 100644 --- a/node_modules/rimraf/package.json +++ b/node_modules/rimraf/package.json @@ -1,27 +1,22 @@ { - "_args": [ - [ - "rimraf@2.6.2", - "/Users/rebecca/code/npm" - ] - ], - "_from": "rimraf@2.6.2", + "_from": "rimraf@*", "_id": "rimraf@2.6.2", "_inBundle": false, "_integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "_location": "/rimraf", "_phantomChildren": {}, "_requested": { - "type": "version", + "type": "range", "registry": true, - "raw": "rimraf@2.6.2", + "raw": "rimraf@*", "name": "rimraf", "escapedName": "rimraf", - "rawSpec": "2.6.2", + "rawSpec": "*", "saveSpec": null, - "fetchSpec": "2.6.2" + "fetchSpec": "*" }, "_requiredBy": [ + "#USER", "/", "/cacache", "/copy-concurrently", @@ -32,15 +27,13 @@ "/libnpx", "/move-concurrently", "/node-gyp", - "/npm-profile/cacache", - "/npm-registry-fetch/cacache", "/pacote", - "/tacks", "/tap" ], "_resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "_spec": "2.6.2", - "_where": "/Users/rebecca/code/npm", + "_shasum": "2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36", + "_spec": "rimraf@*", + "_where": "/Users/zkat/Documents/code/work/npm", "author": { "name": "Isaac Z. Schlueter", "email": "i@izs.me", @@ -52,9 +45,11 @@ "bugs": { "url": "https://github.com/isaacs/rimraf/issues" }, + "bundleDependencies": false, "dependencies": { "glob": "^7.0.5" }, + "deprecated": false, "description": "A deep deletion module for node (like `rm -rf`)", "devDependencies": { "mkdirp": "^0.5.1", diff --git a/package.json b/package.json index b22f8804e6e6c..1f3984c8cea8f 100644 --- a/package.json +++ b/package.json @@ -117,7 +117,7 @@ "readable-stream": "^2.3.6", "request": "^2.88.0", "retry": "^0.12.0", - "rimraf": "~2.6.2", + "rimraf": "^2.6.2", "safe-buffer": "^5.1.2", "semver": "^5.5.1", "sha": "~2.0.1", From 0fad6cef59e08bb88ce1b99f590ff843fe391dad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kat=20March=C3=A1n?= Date: Wed, 12 Dec 2018 13:18:26 -0800 Subject: [PATCH 51/97] deps: alpha-order bundleDeps --- package.json | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 1f3984c8cea8f..d862808cc8470 100644 --- a/package.json +++ b/package.json @@ -147,13 +147,15 @@ "ansistyles", "aproba", "archy", + "bin-links", + "bluebird", "byte-size", "cacache", "call-limit", - "bluebird", - "bin-links", "chownr", "ci-info", + "cli-columns", + "cli-table3", "cmd-shim", "columnify", "config-chain", @@ -182,8 +184,14 @@ "JSONStream", "lazy-property", "libcipm", + "libnpm", + "libnpmaccess", "libnpmhook", + "libnpmorg", + "libnpmsearch", + "libnpmteam", "libnpx", + "lock-verify", "lockfile", "lodash._baseindexof", "lodash._baseuniq", @@ -198,15 +206,16 @@ "lodash.without", "lru-cache", "meant", - "mkdirp", "mississippi", + "mkdirp", "move-concurrently", + "node-gyp", "nopt", "normalize-package-data", "npm-audit-report", "npm-cache-filename", - "npm-lifecycle", "npm-install-checks", + "npm-lifecycle", "npm-package-arg", "npm-packlist", "npm-pick-manifest", @@ -220,27 +229,30 @@ "pacote", "path-is-inside", "promise-inflight", - "query-string", "qrcode-terminal", + "query-string", "qw", - "read", "read-cmd-shim", "read-installed", "read-package-json", "read-package-tree", + "read", "readable-stream", "readdir-scoped-modules", "request", "retry", "rimraf", + "safe-buffer", "semver", "sha", "slide", "sorted-object", "sorted-union-stream", "ssri", + "stringify-package", "tar", "text-table", + "tiny-relative-date", "uid-number", "umask", "unique-filename", @@ -250,20 +262,8 @@ "validate-npm-package-license", "validate-npm-package-name", "which", - "write-file-atomic", - "safe-buffer", "worker-farm", - "tiny-relative-date", - "cli-columns", - "cli-table3", - "node-gyp", - "lock-verify", - "stringify-package", - "libnpmaccess", - "libnpmorg", - "libnpmteam", - "libnpmsearch", - "libnpm" + "write-file-atomic" ], "devDependencies": { "deep-equal": "~1.0.1", From 1a20b385d95603d68b294042d68d186485383f2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kat=20March=C3=A1n?= Date: Wed, 12 Dec 2018 13:19:51 -0800 Subject: [PATCH 52/97] deps: fix up gitignore issues with devDeps --- node_modules/.gitignore | 21 +- node_modules/@types/caseless/LICENSE | 21 - node_modules/@types/caseless/README.md | 16 - node_modules/@types/caseless/index.d.ts | 34 - node_modules/@types/caseless/package.json | 55 - node_modules/@types/form-data/LICENSE | 21 - node_modules/@types/form-data/README.md | 16 - node_modules/@types/form-data/index.d.ts | 43 - node_modules/@types/form-data/package.json | 61 - node_modules/@types/node/LICENSE | 21 - node_modules/@types/node/README.md | 16 - node_modules/@types/node/index.d.ts | 8101 ----------------- node_modules/@types/node/inspector.d.ts | 2488 ----- node_modules/@types/node/package.json | 156 - node_modules/@types/request/LICENSE | 21 - node_modules/@types/request/README.md | 16 - node_modules/@types/request/index.d.ts | 395 - node_modules/@types/request/package.json | 84 - node_modules/@types/tough-cookie/LICENSE | 21 - node_modules/@types/tough-cookie/README.md | 16 - node_modules/@types/tough-cookie/index.d.ts | 244 - node_modules/@types/tough-cookie/package.json | 59 - node_modules/get-stream/package.json | 21 +- package-lock.json | 575 +- package.json | 12 +- 25 files changed, 254 insertions(+), 12280 deletions(-) delete mode 100644 node_modules/@types/caseless/LICENSE delete mode 100644 node_modules/@types/caseless/README.md delete mode 100644 node_modules/@types/caseless/index.d.ts delete mode 100644 node_modules/@types/caseless/package.json delete mode 100644 node_modules/@types/form-data/LICENSE delete mode 100644 node_modules/@types/form-data/README.md delete mode 100644 node_modules/@types/form-data/index.d.ts delete mode 100644 node_modules/@types/form-data/package.json delete mode 100644 node_modules/@types/node/LICENSE delete mode 100644 node_modules/@types/node/README.md delete mode 100644 node_modules/@types/node/index.d.ts delete mode 100644 node_modules/@types/node/inspector.d.ts delete mode 100644 node_modules/@types/node/package.json delete mode 100644 node_modules/@types/request/LICENSE delete mode 100644 node_modules/@types/request/README.md delete mode 100644 node_modules/@types/request/index.d.ts delete mode 100644 node_modules/@types/request/package.json delete mode 100644 node_modules/@types/tough-cookie/LICENSE delete mode 100644 node_modules/@types/tough-cookie/README.md delete mode 100644 node_modules/@types/tough-cookie/index.d.ts delete mode 100644 node_modules/@types/tough-cookie/package.json diff --git a/node_modules/.gitignore b/node_modules/.gitignore index 196f8f1209ac2..ac8c182e8fdc7 100644 --- a/node_modules/.gitignore +++ b/node_modules/.gitignore @@ -11,11 +11,9 @@ /argparse /array-find-index /array-includes -/array-union -/array-uniq -/arrify /babel-code-frame /bind-obj-methods +/browser-process-hrtime /browser-request /caller /caller-path @@ -30,7 +28,6 @@ /color-support /connect /contains-path -/core-js /couchapp /coveralls /debug-log @@ -38,10 +35,10 @@ /deep-is /define-properties /deglob -/del /diff /docopt /doctrine +/domain-browser /ee-first /encodeurl /error-ex @@ -70,13 +67,11 @@ /events-to-array /external-editor /fast-levenshtein -/fbjs /figures /file-entry-cache /finalhandler /find-root /flat-cache -/foreach /foreground-child /fs-access /fs-exists-cached @@ -85,9 +80,10 @@ /functional-red-black-tree /get-stdin /globals -/globby +/growl /has /has-ansi +/has-symbols /hock /http-proxy /ignore @@ -95,13 +91,10 @@ /is-arrayish /is-callable /is-date-object -/is-path-cwd -/is-path-in-cwd /is-promise /is-regex /is-resolvable /is-symbol -/isomorphic-fetch /js-tokens /js-yaml /json @@ -112,6 +105,7 @@ /levn /licensee /load-json-file +/lodash /lodash.isempty /log-driver /loose-envify @@ -119,7 +113,6 @@ /marked-man /nano /natural-compare -/node-fetch /npm-registry-couchapp /npm-registry-mock /null-check @@ -144,7 +137,6 @@ /pluralize /prelude-ls /progress -/promise /prop-types /querystring /read-pkg @@ -157,7 +149,6 @@ /run-parallel /rx-lite /rx-lite-aggregates -/setimmediate /simple-concat /slice-ansi /source-map @@ -182,13 +173,11 @@ /trivial-deferred /tsame /type-check -/ua-parser-js /unicode-length /uniq /url /utils-merge /watch -/whatwg-fetch /wordwrap /write /yapool diff --git a/node_modules/@types/caseless/LICENSE b/node_modules/@types/caseless/LICENSE deleted file mode 100644 index 21071075c2459..0000000000000 --- a/node_modules/@types/caseless/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - MIT License - - Copyright (c) Microsoft Corporation. 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/node_modules/@types/caseless/README.md b/node_modules/@types/caseless/README.md deleted file mode 100644 index b0bddadf900c6..0000000000000 --- a/node_modules/@types/caseless/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Installation -> `npm install --save @types/caseless` - -# Summary -This package contains type definitions for caseless (https://github.com/mikeal/caseless). - -# Details -Files were exported from https://www.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/caseless - -Additional Details - * Last updated: Wed, 17 Jan 2018 21:35:26 GMT - * Dependencies: none - * Global values: none - -# Credits -These definitions were written by downace , Matt R. Wilson . diff --git a/node_modules/@types/caseless/index.d.ts b/node_modules/@types/caseless/index.d.ts deleted file mode 100644 index 9b19f8a150be6..0000000000000 --- a/node_modules/@types/caseless/index.d.ts +++ /dev/null @@ -1,34 +0,0 @@ -// Type definitions for caseless 0.12 -// Project: https://github.com/mikeal/caseless -// Definitions by: downace -// Matt R. Wilson -// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped -// TypeScript Version: 2.2 - -type KeyType = string; -type ValueType = any; -type RawDict = object; - -export interface Caseless { - set(name: KeyType, value: ValueType, clobber?: boolean): KeyType | false; - set(dict: RawDict): void; - has(name: KeyType): KeyType | false; - get(name: KeyType): ValueType | undefined; - swap(name: KeyType): void; - del(name: KeyType): boolean; -} - -export interface Httpified { - headers: RawDict; - setHeader(name: KeyType, value: ValueType, clobber?: boolean): KeyType | false; - setHeader(dict: RawDict): void; - hasHeader(name: KeyType): KeyType | false; - getHeader(name: KeyType): ValueType | undefined; - removeHeader(name: KeyType): boolean; -} - -export function httpify(resp: object, headers: RawDict): Caseless; - -declare function caseless(dict?: RawDict): Caseless; - -export default caseless; diff --git a/node_modules/@types/caseless/package.json b/node_modules/@types/caseless/package.json deleted file mode 100644 index b5645cd5604e8..0000000000000 --- a/node_modules/@types/caseless/package.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "_from": "@types/caseless@*", - "_id": "@types/caseless@0.12.1", - "_inBundle": false, - "_integrity": "sha512-FhlMa34NHp9K5MY1Uz8yb+ZvuX0pnvn3jScRSNAb75KHGB8d3rEU6hqMs3Z2vjuytcMfRg6c5CHMc3wtYyD2/A==", - "_location": "/@types/caseless", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "@types/caseless@*", - "name": "@types/caseless", - "escapedName": "@types%2fcaseless", - "scope": "@types", - "rawSpec": "*", - "saveSpec": null, - "fetchSpec": "*" - }, - "_requiredBy": [ - "/@types/request" - ], - "_resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.1.tgz", - "_shasum": "9794c69c8385d0192acc471a540d1f8e0d16218a", - "_spec": "@types/caseless@*", - "_where": "/Users/zkat/Documents/code/work/npm/node_modules/@types/request", - "bugs": { - "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/issues" - }, - "bundleDependencies": false, - "contributors": [ - { - "name": "downace", - "url": "https://github.com/downace" - }, - { - "name": "Matt R. Wilson", - "url": "https://github.com/mastermatt" - } - ], - "dependencies": {}, - "deprecated": false, - "description": "TypeScript definitions for caseless", - "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped#readme", - "license": "MIT", - "main": "", - "name": "@types/caseless", - "repository": { - "type": "git", - "url": "git+https://github.com/DefinitelyTyped/DefinitelyTyped.git" - }, - "scripts": {}, - "typeScriptVersion": "2.2", - "typesPublisherContentHash": "9867f2283cf33abfd1a8875bf1d88add8d1133c5972167fba16c4699ceecc74e", - "version": "0.12.1" -} diff --git a/node_modules/@types/form-data/LICENSE b/node_modules/@types/form-data/LICENSE deleted file mode 100644 index 4b1ad51b2f0ef..0000000000000 --- a/node_modules/@types/form-data/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - MIT License - - Copyright (c) Microsoft Corporation. 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/node_modules/@types/form-data/README.md b/node_modules/@types/form-data/README.md deleted file mode 100644 index 36383f5772b32..0000000000000 --- a/node_modules/@types/form-data/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Installation -> `npm install --save @types/form-data` - -# Summary -This package contains type definitions for form-data (https://github.com/form-data/form-data). - -# Details -Files were exported from https://www.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/form-data - -Additional Details - * Last updated: Wed, 08 Nov 2017 22:42:24 GMT - * Dependencies: stream, http, node - * Global values: none - -# Credits -These definitions were written by Carlos Ballesteros Velasco , Leon Yu , BendingBender . diff --git a/node_modules/@types/form-data/index.d.ts b/node_modules/@types/form-data/index.d.ts deleted file mode 100644 index 8c20812697fbb..0000000000000 --- a/node_modules/@types/form-data/index.d.ts +++ /dev/null @@ -1,43 +0,0 @@ -// Type definitions for form-data 2.2 -// Project: https://github.com/form-data/form-data -// Definitions by: Carlos Ballesteros Velasco -// Leon Yu -// BendingBender -// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped -// TypeScript Version: 2.3 - -// Imported from: https://github.com/soywiz/typescript-node-definitions/form-data.d.ts - -/// -import * as stream from 'stream'; -import * as http from 'http'; - -export = FormData; - -declare class FormData extends stream.Readable { - append(key: string, value: any, options?: FormData.AppendOptions | string): void; - getHeaders(): FormData.Headers; - submit(params: string | FormData.SubmitOptions, callback?: (error: Error | undefined, response: http.IncomingMessage) => void): http.ClientRequest; - getBoundary(): string; - getLength(callback: (err: Error | undefined, length: number) => void): void; - getLengthSync(): number; - hasKnownLength(): boolean; -} - -declare namespace FormData { - interface Headers { - [key: string]: any; - } - - interface AppendOptions { - header?: string | Headers; - knownLength?: number; - filename?: string; - filepath?: string; - contentType?: string; - } - - interface SubmitOptions extends http.RequestOptions { - protocol?: 'https:' | 'http:'; - } -} diff --git a/node_modules/@types/form-data/package.json b/node_modules/@types/form-data/package.json deleted file mode 100644 index 9d5dee5a802b0..0000000000000 --- a/node_modules/@types/form-data/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "_from": "@types/form-data@*", - "_id": "@types/form-data@2.2.1", - "_inBundle": false, - "_integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==", - "_location": "/@types/form-data", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "@types/form-data@*", - "name": "@types/form-data", - "escapedName": "@types%2fform-data", - "scope": "@types", - "rawSpec": "*", - "saveSpec": null, - "fetchSpec": "*" - }, - "_requiredBy": [ - "/@types/request" - ], - "_resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz", - "_shasum": "ee2b3b8eaa11c0938289953606b745b738c54b1e", - "_spec": "@types/form-data@*", - "_where": "/Users/zkat/Documents/code/work/npm/node_modules/@types/request", - "bugs": { - "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/issues" - }, - "bundleDependencies": false, - "contributors": [ - { - "name": "Carlos Ballesteros Velasco", - "url": "https://github.com/soywiz" - }, - { - "name": "Leon Yu", - "url": "https://github.com/leonyu" - }, - { - "name": "BendingBender", - "url": "https://github.com/BendingBender" - } - ], - "dependencies": { - "@types/node": "*" - }, - "deprecated": false, - "description": "TypeScript definitions for form-data", - "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped#readme", - "license": "MIT", - "main": "", - "name": "@types/form-data", - "repository": { - "type": "git", - "url": "git+https://github.com/DefinitelyTyped/DefinitelyTyped.git" - }, - "scripts": {}, - "typeScriptVersion": "2.3", - "typesPublisherContentHash": "6b123d0ea13d7814315d38f664835e20d88c9a72981615a76f3814b8d5ed6a5a", - "version": "2.2.1" -} diff --git a/node_modules/@types/node/LICENSE b/node_modules/@types/node/LICENSE deleted file mode 100644 index 21071075c2459..0000000000000 --- a/node_modules/@types/node/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - MIT License - - Copyright (c) Microsoft Corporation. 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/node_modules/@types/node/README.md b/node_modules/@types/node/README.md deleted file mode 100644 index 7fa2d094e0e8b..0000000000000 --- a/node_modules/@types/node/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Installation -> `npm install --save @types/node` - -# Summary -This package contains type definitions for Node.js (http://nodejs.org/). - -# Details -Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node - -Additional Details - * Last updated: Tue, 14 Aug 2018 00:52:13 GMT - * Dependencies: none - * Global values: Buffer, NodeJS, SlowBuffer, Symbol, __dirname, __filename, clearImmediate, clearInterval, clearTimeout, console, exports, global, module, process, require, setImmediate, setInterval, setTimeout - -# Credits -These definitions were written by Microsoft TypeScript , DefinitelyTyped , Parambir Singh , Christian Vaagland Tellnes , Wilco Bakker , Nicolas Voigt , Chigozirim C. , Flarna , Mariusz Wiktorczyk , wwwy3y3 , Deividas Bakanas , Kelvin Jin , Alvis HT Tang , Sebastian Silbermann , Hannes Magnusson , Alberto Schiabel , Klaus Meinhardt , Huw , Nicolas Even , Bruno Scheufler , Mohsen Azimi , Hoàng Văn Khải , Alexander T. , Lishude , Andrew Makarov , Zane Hannan AU , Eugene Y. Q. Shen . diff --git a/node_modules/@types/node/index.d.ts b/node_modules/@types/node/index.d.ts deleted file mode 100644 index 7745372a21ecb..0000000000000 --- a/node_modules/@types/node/index.d.ts +++ /dev/null @@ -1,8101 +0,0 @@ -// Type definitions for Node.js 10.7.x -// Project: http://nodejs.org/ -// Definitions by: Microsoft TypeScript -// DefinitelyTyped -// Parambir Singh -// Christian Vaagland Tellnes -// Wilco Bakker -// Nicolas Voigt -// Chigozirim C. -// Flarna -// Mariusz Wiktorczyk -// wwwy3y3 -// Deividas Bakanas -// Kelvin Jin -// Alvis HT Tang -// Sebastian Silbermann -// Hannes Magnusson -// Alberto Schiabel -// Klaus Meinhardt -// Huw -// Nicolas Even -// Bruno Scheufler -// Mohsen Azimi -// Hoàng Văn Khải -// Alexander T. -// Lishude -// Andrew Makarov -// Zane Hannan AU -// Eugene Y. Q. Shen -// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped - -/** inspector module types */ -/// - -// This needs to be global to avoid TS2403 in case lib.dom.d.ts is present in the same build -interface Console { - Console: NodeJS.ConsoleConstructor; - /** - * A simple assertion test that verifies whether `value` is truthy. - * If it is not, an `AssertionError` is thrown. - * If provided, the error `message` is formatted using `util.format()` and used as the error message. - */ - assert(value: any, message?: string, ...optionalParams: any[]): void; - /** - * When `stdout` is a TTY, calling `console.clear()` will attempt to clear the TTY. - * When `stdout` is not a TTY, this method does nothing. - */ - clear(): void; - /** - * Maintains an internal counter specific to `label` and outputs to `stdout` the number of times `console.count()` has been called with the given `label`. - */ - count(label?: string): void; - /** - * Resets the internal counter specific to `label`. - */ - countReset(label?: string): void; - /** - * The `console.debug()` function is an alias for {@link console.log()}. - */ - debug(message?: any, ...optionalParams: any[]): void; - /** - * Uses {@link util.inspect()} on `obj` and prints the resulting string to `stdout`. - * This function bypasses any custom `inspect()` function defined on `obj`. - */ - dir(obj: any, options?: NodeJS.InspectOptions): void; - /** - * This method calls {@link console.log()} passing it the arguments received. Please note that this method does not produce any XML formatting - */ - dirxml(...data: any[]): void; - /** - * Prints to `stderr` with newline. - */ - error(message?: any, ...optionalParams: any[]): void; - /** - * Increases indentation of subsequent lines by two spaces. - * If one or more `label`s are provided, those are printed first without the additional indentation. - */ - group(...label: any[]): void; - /** - * The `console.groupCollapsed()` function is an alias for {@link console.group()}. - */ - groupCollapsed(): void; - /** - * Decreases indentation of subsequent lines by two spaces. - */ - groupEnd(): void; - /** - * The {@link console.info()} function is an alias for {@link console.log()}. - */ - info(message?: any, ...optionalParams: any[]): void; - /** - * Prints to `stdout` with newline. - */ - log(message?: any, ...optionalParams: any[]): void; - /** - * This method does not display anything unless used in the inspector. - * Prints to `stdout` the array `array` formatted as a table. - */ - table(tabularData: any, properties?: string[]): void; - /** - * Starts a timer that can be used to compute the duration of an operation. Timers are identified by a unique `label`. - */ - time(label?: string): void; - /** - * Stops a timer that was previously started by calling {@link console.time()} and prints the result to `stdout`. - */ - timeEnd(label?: string): void; - /** - * Prints to `stderr` the string 'Trace :', followed by the {@link util.format()} formatted message and stack trace to the current position in the code. - */ - trace(message?: any, ...optionalParams: any[]): void; - /** - * The {@link console.warn()} function is an alias for {@link console.error()}. - */ - warn(message?: any, ...optionalParams: any[]): void; - - // --- Inspector mode only --- - /** - * This method does not display anything unless used in the inspector. - * Starts a JavaScript CPU profile with an optional label. - */ - profile(label?: string): void; - /** - * This method does not display anything unless used in the inspector. - * Stops the current JavaScript CPU profiling session if one has been started and prints the report to the Profiles panel of the inspector. - */ - profileEnd(): void; - /** - * This method does not display anything unless used in the inspector. - * Adds an event with the label `label` to the Timeline panel of the inspector. - */ - timeStamp(label?: string): void; -} - -interface Error { - stack?: string; -} - -// Declare "static" methods in Error -interface ErrorConstructor { - /** Create .stack property on a target object */ - captureStackTrace(targetObject: Object, constructorOpt?: Function): void; - - /** - * Optional override for formatting stack traces - * - * @see https://github.com/v8/v8/wiki/Stack%20Trace%20API#customizing-stack-traces - */ - prepareStackTrace?: (err: Error, stackTraces: NodeJS.CallSite[]) => any; - - stackTraceLimit: number; -} - -// compat for TypeScript 1.8 -// if you use with --target es3 or --target es5 and use below definitions, -// use the lib.es6.d.ts that is bundled with TypeScript 1.8. -interface MapConstructor { } -interface WeakMapConstructor { } -interface SetConstructor { } -interface WeakSetConstructor { } - -// Forward-declare needed types from lib.es2015.d.ts (in case users are using `--lib es5`) -interface Iterable { } -interface Iterator { - next(value?: any): IteratorResult; -} -interface IteratorResult { } -interface AsyncIterableIterator {} -interface SymbolConstructor { - readonly observable: symbol; - readonly iterator: symbol; - readonly asyncIterator: symbol; -} -declare var Symbol: SymbolConstructor; - -// Node.js ESNEXT support -interface String { - /** Removes whitespace from the left end of a string. */ - trimLeft(): string; - /** Removes whitespace from the right end of a string. */ - trimRight(): string; -} - -/************************************************ -* * -* GLOBAL * -* * -************************************************/ -declare var process: NodeJS.Process; -declare var global: NodeJS.Global; -declare var console: Console; - -declare var __filename: string; -declare var __dirname: string; - -declare function setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; -declare namespace setTimeout { - export function __promisify__(ms: number): Promise; - export function __promisify__(ms: number, value: T): Promise; -} -declare function clearTimeout(timeoutId: NodeJS.Timer): void; -declare function setInterval(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; -declare function clearInterval(intervalId: NodeJS.Timer): void; -declare function setImmediate(callback: (...args: any[]) => void, ...args: any[]): any; -declare namespace setImmediate { - export function __promisify__(): Promise; - export function __promisify__(value: T): Promise; -} -declare function clearImmediate(immediateId: any): void; - -// TODO: change to `type NodeRequireFunction = (id: string) => any;` in next mayor version. -interface NodeRequireFunction { - /* tslint:disable-next-line:callable-types */ - (id: string): any; -} - -interface NodeRequire extends NodeRequireFunction { - resolve: RequireResolve; - cache: any; - extensions: NodeExtensions; - main: NodeModule | undefined; -} - -interface RequireResolve { - (id: string, options?: { paths?: string[]; }): string; - paths(request: string): string[] | null; -} - -interface NodeExtensions { - '.js': (m: NodeModule, filename: string) => any; - '.json': (m: NodeModule, filename: string) => any; - '.node': (m: NodeModule, filename: string) => any; - [ext: string]: (m: NodeModule, filename: string) => any; -} - -declare var require: NodeRequire; - -interface NodeModule { - exports: any; - require: NodeRequireFunction; - id: string; - filename: string; - loaded: boolean; - parent: NodeModule | null; - children: NodeModule[]; - paths: string[]; -} - -declare var module: NodeModule; - -// Same as module.exports -declare var exports: any; -declare var SlowBuffer: { - new(str: string, encoding?: string): Buffer; - new(size: number): Buffer; - new(size: Uint8Array): Buffer; - new(array: any[]): Buffer; - prototype: Buffer; - isBuffer(obj: any): boolean; - byteLength(string: string, encoding?: string): number; - concat(list: Buffer[], totalLength?: number): Buffer; -}; - -// Buffer class -type BufferEncoding = "ascii" | "utf8" | "utf16le" | "ucs2" | "base64" | "latin1" | "binary" | "hex"; -interface Buffer extends Uint8Array { - write(string: string, offset?: number, length?: number, encoding?: string): number; - toString(encoding?: string, start?: number, end?: number): string; - toJSON(): { type: 'Buffer', data: any[] }; - equals(otherBuffer: Uint8Array): boolean; - compare(otherBuffer: Uint8Array, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number; - copy(targetBuffer: Uint8Array, targetStart?: number, sourceStart?: number, sourceEnd?: number): number; - slice(start?: number, end?: number): Buffer; - writeUIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; - writeUIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; - writeIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; - writeIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; - readUIntLE(offset: number, byteLength: number, noAssert?: boolean): number; - readUIntBE(offset: number, byteLength: number, noAssert?: boolean): number; - readIntLE(offset: number, byteLength: number, noAssert?: boolean): number; - readIntBE(offset: number, byteLength: number, noAssert?: boolean): number; - readUInt8(offset: number, noAssert?: boolean): number; - readUInt16LE(offset: number, noAssert?: boolean): number; - readUInt16BE(offset: number, noAssert?: boolean): number; - readUInt32LE(offset: number, noAssert?: boolean): number; - readUInt32BE(offset: number, noAssert?: boolean): number; - readInt8(offset: number, noAssert?: boolean): number; - readInt16LE(offset: number, noAssert?: boolean): number; - readInt16BE(offset: number, noAssert?: boolean): number; - readInt32LE(offset: number, noAssert?: boolean): number; - readInt32BE(offset: number, noAssert?: boolean): number; - readFloatLE(offset: number, noAssert?: boolean): number; - readFloatBE(offset: number, noAssert?: boolean): number; - readDoubleLE(offset: number, noAssert?: boolean): number; - readDoubleBE(offset: number, noAssert?: boolean): number; - swap16(): Buffer; - swap32(): Buffer; - swap64(): Buffer; - writeUInt8(value: number, offset: number, noAssert?: boolean): number; - writeUInt16LE(value: number, offset: number, noAssert?: boolean): number; - writeUInt16BE(value: number, offset: number, noAssert?: boolean): number; - writeUInt32LE(value: number, offset: number, noAssert?: boolean): number; - writeUInt32BE(value: number, offset: number, noAssert?: boolean): number; - writeInt8(value: number, offset: number, noAssert?: boolean): number; - writeInt16LE(value: number, offset: number, noAssert?: boolean): number; - writeInt16BE(value: number, offset: number, noAssert?: boolean): number; - writeInt32LE(value: number, offset: number, noAssert?: boolean): number; - writeInt32BE(value: number, offset: number, noAssert?: boolean): number; - writeFloatLE(value: number, offset: number, noAssert?: boolean): number; - writeFloatBE(value: number, offset: number, noAssert?: boolean): number; - writeDoubleLE(value: number, offset: number, noAssert?: boolean): number; - writeDoubleBE(value: number, offset: number, noAssert?: boolean): number; - fill(value: any, offset?: number, end?: number): this; - indexOf(value: string | number | Uint8Array, byteOffset?: number, encoding?: string): number; - lastIndexOf(value: string | number | Uint8Array, byteOffset?: number, encoding?: string): number; - entries(): IterableIterator<[number, number]>; - includes(value: string | number | Buffer, byteOffset?: number, encoding?: string): boolean; - keys(): IterableIterator; - values(): IterableIterator; -} - -/** - * Raw data is stored in instances of the Buffer class. - * A Buffer is similar to an array of integers but corresponds to a raw memory allocation outside the V8 heap. A Buffer cannot be resized. - * Valid string encodings: 'ascii'|'utf8'|'utf16le'|'ucs2'(alias of 'utf16le')|'base64'|'binary'(deprecated)|'hex' - */ -declare var Buffer: { - /** - * Allocates a new buffer containing the given {str}. - * - * @param str String to store in buffer. - * @param encoding encoding to use, optional. Default is 'utf8' - * @deprecated since v10.0.0 - Use `Buffer.from(string[, encoding])` instead. - */ - new(str: string, encoding?: string): Buffer; - /** - * Allocates a new buffer of {size} octets. - * - * @param size count of octets to allocate. - * @deprecated since v10.0.0 - Use `Buffer.alloc()` instead (also see `Buffer.allocUnsafe()`). - */ - new(size: number): Buffer; - /** - * Allocates a new buffer containing the given {array} of octets. - * - * @param array The octets to store. - * @deprecated since v10.0.0 - Use `Buffer.from(array)` instead. - */ - new(array: Uint8Array): Buffer; - /** - * Produces a Buffer backed by the same allocated memory as - * the given {ArrayBuffer}. - * - * - * @param arrayBuffer The ArrayBuffer with which to share memory. - * @deprecated since v10.0.0 - Use `Buffer.from(arrayBuffer[, byteOffset[, length]])` instead. - */ - new(arrayBuffer: ArrayBuffer): Buffer; - /** - * Allocates a new buffer containing the given {array} of octets. - * - * @param array The octets to store. - * @deprecated since v10.0.0 - Use `Buffer.from(array)` instead. - */ - new(array: any[]): Buffer; - /** - * Copies the passed {buffer} data onto a new {Buffer} instance. - * - * @param buffer The buffer to copy. - * @deprecated since v10.0.0 - Use `Buffer.from(buffer)` instead. - */ - new(buffer: Buffer): Buffer; - prototype: Buffer; - /** - * When passed a reference to the .buffer property of a TypedArray instance, - * the newly created Buffer will share the same allocated memory as the TypedArray. - * The optional {byteOffset} and {length} arguments specify a memory range - * within the {arrayBuffer} that will be shared by the Buffer. - * - * @param arrayBuffer The .buffer property of any TypedArray or a new ArrayBuffer() - */ - from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer; - // from(arrayBuffer: SharedArrayBuffer, byteOffset?: number, length?: number): Buffer; - /** - * Creates a new Buffer using the passed {data} - * @param data data to create a new Buffer - */ - from(data: any[]): Buffer; - from(data: Uint8Array): Buffer; - /** - * Creates a new Buffer containing the given JavaScript string {str}. - * If provided, the {encoding} parameter identifies the character encoding. - * If not provided, {encoding} defaults to 'utf8'. - */ - from(str: string, encoding?: string): Buffer; - /** - * Creates a new Buffer using the passed {data} - * @param values to create a new Buffer - */ - of(...items: number[]): Buffer; - /** - * Returns true if {obj} is a Buffer - * - * @param obj object to test. - */ - isBuffer(obj: any): obj is Buffer; - /** - * Returns true if {encoding} is a valid encoding argument. - * Valid string encodings in Node 0.12: 'ascii'|'utf8'|'utf16le'|'ucs2'(alias of 'utf16le')|'base64'|'binary'(deprecated)|'hex' - * - * @param encoding string to test. - */ - isEncoding(encoding: string): boolean | undefined; - /** - * Gives the actual byte length of a string. encoding defaults to 'utf8'. - * This is not the same as String.prototype.length since that returns the number of characters in a string. - * - * @param string string to test. - * @param encoding encoding used to evaluate (defaults to 'utf8') - */ - byteLength(string: string | NodeJS.TypedArray | DataView | ArrayBuffer /*| SharedArrayBuffer */, encoding?: string): number; - /** - * Returns a buffer which is the result of concatenating all the buffers in the list together. - * - * If the list has no items, or if the totalLength is 0, then it returns a zero-length buffer. - * If the list has exactly one item, then the first item of the list is returned. - * If the list has more than one item, then a new Buffer is created. - * - * @param list An array of Buffer objects to concatenate - * @param totalLength Total length of the buffers when concatenated. - * If totalLength is not provided, it is read from the buffers in the list. However, this adds an additional loop to the function, so it is faster to provide the length explicitly. - */ - concat(list: Uint8Array[], totalLength?: number): Buffer; - /** - * The same as buf1.compare(buf2). - */ - compare(buf1: Uint8Array, buf2: Uint8Array): number; - /** - * Allocates a new buffer of {size} octets. - * - * @param size count of octets to allocate. - * @param fill if specified, buffer will be initialized by calling buf.fill(fill). - * If parameter is omitted, buffer will be filled with zeros. - * @param encoding encoding used for call to buf.fill while initalizing - */ - alloc(size: number, fill?: string | Buffer | number, encoding?: string): Buffer; - /** - * Allocates a new buffer of {size} octets, leaving memory not initialized, so the contents - * of the newly created Buffer are unknown and may contain sensitive data. - * - * @param size count of octets to allocate - */ - allocUnsafe(size: number): Buffer; - /** - * Allocates a new non-pooled buffer of {size} octets, leaving memory not initialized, so the contents - * of the newly created Buffer are unknown and may contain sensitive data. - * - * @param size count of octets to allocate - */ - allocUnsafeSlow(size: number): Buffer; - /** - * This is the number of bytes used to determine the size of pre-allocated, internal Buffer instances used for pooling. This value may be modified. - */ - poolSize: number; -}; - -/************************************************ -* * -* GLOBAL INTERFACES * -* * -************************************************/ -declare namespace NodeJS { - export interface InspectOptions { - showHidden?: boolean; - depth?: number | null; - colors?: boolean; - customInspect?: boolean; - showProxy?: boolean; - maxArrayLength?: number | null; - breakLength?: number; - compact?: boolean; - } - - export interface ConsoleConstructor { - prototype: Console; - new(stdout: WritableStream, stderr?: WritableStream): Console; - } - - export interface CallSite { - /** - * Value of "this" - */ - getThis(): any; - - /** - * Type of "this" as a string. - * This is the name of the function stored in the constructor field of - * "this", if available. Otherwise the object's [[Class]] internal - * property. - */ - getTypeName(): string | null; - - /** - * Current function - */ - getFunction(): Function | undefined; - - /** - * Name of the current function, typically its name property. - * If a name property is not available an attempt will be made to try - * to infer a name from the function's context. - */ - getFunctionName(): string | null; - - /** - * Name of the property [of "this" or one of its prototypes] that holds - * the current function - */ - getMethodName(): string | null; - - /** - * Name of the script [if this function was defined in a script] - */ - getFileName(): string | null; - - /** - * Current line number [if this function was defined in a script] - */ - getLineNumber(): number | null; - - /** - * Current column number [if this function was defined in a script] - */ - getColumnNumber(): number | null; - - /** - * A call site object representing the location where eval was called - * [if this function was created using a call to eval] - */ - getEvalOrigin(): string | undefined; - - /** - * Is this a toplevel invocation, that is, is "this" the global object? - */ - isToplevel(): boolean; - - /** - * Does this call take place in code defined by a call to eval? - */ - isEval(): boolean; - - /** - * Is this call in native V8 code? - */ - isNative(): boolean; - - /** - * Is this a constructor call? - */ - isConstructor(): boolean; - } - - export interface ErrnoException extends Error { - errno?: number; - code?: string; - path?: string; - syscall?: string; - stack?: string; - } - - export class EventEmitter { - addListener(event: string | symbol, listener: (...args: any[]) => void): this; - on(event: string | symbol, listener: (...args: any[]) => void): this; - once(event: string | symbol, listener: (...args: any[]) => void): this; - removeListener(event: string | symbol, listener: (...args: any[]) => void): this; - off(event: string | symbol, listener: (...args: any[]) => void): this; - removeAllListeners(event?: string | symbol): this; - setMaxListeners(n: number): this; - getMaxListeners(): number; - listeners(event: string | symbol): Function[]; - rawListeners(event: string | symbol): Function[]; - emit(event: string | symbol, ...args: any[]): boolean; - listenerCount(type: string | symbol): number; - // Added in Node 6... - prependListener(event: string | symbol, listener: (...args: any[]) => void): this; - prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; - eventNames(): Array; - } - - export interface ReadableStream extends EventEmitter { - readable: boolean; - read(size?: number): string | Buffer; - setEncoding(encoding: string): this; - pause(): this; - resume(): this; - isPaused(): boolean; - pipe(destination: T, options?: { end?: boolean; }): T; - unpipe(destination?: T): this; - unshift(chunk: string): void; - unshift(chunk: Buffer): void; - wrap(oldStream: ReadableStream): this; - [Symbol.asyncIterator](): AsyncIterableIterator; - } - - export interface WritableStream extends EventEmitter { - writable: boolean; - write(buffer: Buffer | string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - end(cb?: Function): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - } - - export interface ReadWriteStream extends ReadableStream, WritableStream { } - - export interface Events extends EventEmitter { } - - export interface Domain extends Events { - run(fn: Function): void; - add(emitter: Events): void; - remove(emitter: Events): void; - bind(cb: (err: Error, data: any) => any): any; - intercept(cb: (data: any) => any): any; - - addListener(event: string, listener: (...args: any[]) => void): this; - on(event: string, listener: (...args: any[]) => void): this; - once(event: string, listener: (...args: any[]) => void): this; - removeListener(event: string, listener: (...args: any[]) => void): this; - removeAllListeners(event?: string): this; - } - - export interface MemoryUsage { - rss: number; - heapTotal: number; - heapUsed: number; - external: number; - } - - export interface CpuUsage { - user: number; - system: number; - } - - export interface ProcessVersions { - http_parser: string; - node: string; - v8: string; - ares: string; - uv: string; - zlib: string; - modules: string; - openssl: string; - } - - type Platform = 'aix' - | 'android' - | 'darwin' - | 'freebsd' - | 'linux' - | 'openbsd' - | 'sunos' - | 'win32' - | 'cygwin'; - - type Signals = - "SIGABRT" | "SIGALRM" | "SIGBUS" | "SIGCHLD" | "SIGCONT" | "SIGFPE" | "SIGHUP" | "SIGILL" | "SIGINT" | "SIGIO" | - "SIGIOT" | "SIGKILL" | "SIGPIPE" | "SIGPOLL" | "SIGPROF" | "SIGPWR" | "SIGQUIT" | "SIGSEGV" | "SIGSTKFLT" | - "SIGSTOP" | "SIGSYS" | "SIGTERM" | "SIGTRAP" | "SIGTSTP" | "SIGTTIN" | "SIGTTOU" | "SIGUNUSED" | "SIGURG" | - "SIGUSR1" | "SIGUSR2" | "SIGVTALRM" | "SIGWINCH" | "SIGXCPU" | "SIGXFSZ" | "SIGBREAK" | "SIGLOST" | "SIGINFO"; - - type BeforeExitListener = (code: number) => void; - type DisconnectListener = () => void; - type ExitListener = (code: number) => void; - type RejectionHandledListener = (promise: Promise) => void; - type UncaughtExceptionListener = (error: Error) => void; - type UnhandledRejectionListener = (reason: any, promise: Promise) => void; - type WarningListener = (warning: Error) => void; - type MessageListener = (message: any, sendHandle: any) => void; - type SignalsListener = (signal: Signals) => void; - type NewListenerListener = (type: string | symbol, listener: (...args: any[]) => void) => void; - type RemoveListenerListener = (type: string | symbol, listener: (...args: any[]) => void) => void; - - export interface Socket extends ReadWriteStream { - isTTY?: true; - } - - export interface ProcessEnv { - [key: string]: string | undefined; - } - - export interface WriteStream extends Socket { - readonly writableHighWaterMark: number; - readonly writableLength: number; - columns?: number; - rows?: number; - _write(chunk: any, encoding: string, callback: Function): void; - _destroy(err: Error | null, callback: Function): void; - _final(callback: Function): void; - setDefaultEncoding(encoding: string): this; - cork(): void; - uncork(): void; - destroy(error?: Error): void; - } - export interface ReadStream extends Socket { - readonly readableHighWaterMark: number; - readonly readableLength: number; - isRaw?: boolean; - setRawMode?(mode: boolean): void; - _read(size: number): void; - _destroy(err: Error | null, callback: Function): void; - push(chunk: any, encoding?: string): boolean; - destroy(error?: Error): void; - } - - export interface Process extends EventEmitter { - stdout: WriteStream; - stderr: WriteStream; - stdin: ReadStream; - openStdin(): Socket; - argv: string[]; - argv0: string; - execArgv: string[]; - execPath: string; - abort(): void; - chdir(directory: string): void; - cwd(): string; - debugPort: number; - emitWarning(warning: string | Error, name?: string, ctor?: Function): void; - env: ProcessEnv; - exit(code?: number): never; - exitCode: number; - getgid(): number; - setgid(id: number | string): void; - getuid(): number; - setuid(id: number | string): void; - geteuid(): number; - seteuid(id: number | string): void; - getegid(): number; - setegid(id: number | string): void; - getgroups(): number[]; - setgroups(groups: Array): void; - setUncaughtExceptionCaptureCallback(cb: ((err: Error) => void) | null): void; - hasUncaughtExceptionCaptureCallback(): boolean; - version: string; - versions: ProcessVersions; - config: { - target_defaults: { - cflags: any[]; - default_configuration: string; - defines: string[]; - include_dirs: string[]; - libraries: string[]; - }; - variables: { - clang: number; - host_arch: string; - node_install_npm: boolean; - node_install_waf: boolean; - node_prefix: string; - node_shared_openssl: boolean; - node_shared_v8: boolean; - node_shared_zlib: boolean; - node_use_dtrace: boolean; - node_use_etw: boolean; - node_use_openssl: boolean; - target_arch: string; - v8_no_strict_aliasing: number; - v8_use_snapshot: boolean; - visibility: string; - }; - }; - kill(pid: number, signal?: string | number): void; - pid: number; - ppid: number; - title: string; - arch: string; - platform: Platform; - mainModule?: NodeModule; - memoryUsage(): MemoryUsage; - cpuUsage(previousValue?: CpuUsage): CpuUsage; - nextTick(callback: Function, ...args: any[]): void; - umask(mask?: number): number; - uptime(): number; - hrtime(time?: [number, number]): [number, number]; - domain: Domain; - - // Worker - send?(message: any, sendHandle?: any): void; - disconnect(): void; - connected: boolean; - - /** - * EventEmitter - * 1. beforeExit - * 2. disconnect - * 3. exit - * 4. message - * 5. rejectionHandled - * 6. uncaughtException - * 7. unhandledRejection - * 8. warning - * 9. message - * 10. - * 11. newListener/removeListener inherited from EventEmitter - */ - addListener(event: "beforeExit", listener: BeforeExitListener): this; - addListener(event: "disconnect", listener: DisconnectListener): this; - addListener(event: "exit", listener: ExitListener): this; - addListener(event: "rejectionHandled", listener: RejectionHandledListener): this; - addListener(event: "uncaughtException", listener: UncaughtExceptionListener): this; - addListener(event: "unhandledRejection", listener: UnhandledRejectionListener): this; - addListener(event: "warning", listener: WarningListener): this; - addListener(event: "message", listener: MessageListener): this; - addListener(event: Signals, listener: SignalsListener): this; - addListener(event: "newListener", listener: NewListenerListener): this; - addListener(event: "removeListener", listener: RemoveListenerListener): this; - - emit(event: "beforeExit", code: number): boolean; - emit(event: "disconnect"): boolean; - emit(event: "exit", code: number): boolean; - emit(event: "rejectionHandled", promise: Promise): boolean; - emit(event: "uncaughtException", error: Error): boolean; - emit(event: "unhandledRejection", reason: any, promise: Promise): boolean; - emit(event: "warning", warning: Error): boolean; - emit(event: "message", message: any, sendHandle: any): this; - emit(event: Signals): boolean; - emit(event: "newListener", eventName: string | symbol, listener: (...args: any[]) => void): this; - emit(event: "removeListener", eventName: string, listener: (...args: any[]) => void): this; - - on(event: "beforeExit", listener: BeforeExitListener): this; - on(event: "disconnect", listener: DisconnectListener): this; - on(event: "exit", listener: ExitListener): this; - on(event: "rejectionHandled", listener: RejectionHandledListener): this; - on(event: "uncaughtException", listener: UncaughtExceptionListener): this; - on(event: "unhandledRejection", listener: UnhandledRejectionListener): this; - on(event: "warning", listener: WarningListener): this; - on(event: "message", listener: MessageListener): this; - on(event: Signals, listener: SignalsListener): this; - on(event: "newListener", listener: NewListenerListener): this; - on(event: "removeListener", listener: RemoveListenerListener): this; - - once(event: "beforeExit", listener: BeforeExitListener): this; - once(event: "disconnect", listener: DisconnectListener): this; - once(event: "exit", listener: ExitListener): this; - once(event: "rejectionHandled", listener: RejectionHandledListener): this; - once(event: "uncaughtException", listener: UncaughtExceptionListener): this; - once(event: "unhandledRejection", listener: UnhandledRejectionListener): this; - once(event: "warning", listener: WarningListener): this; - once(event: "message", listener: MessageListener): this; - once(event: Signals, listener: SignalsListener): this; - once(event: "newListener", listener: NewListenerListener): this; - once(event: "removeListener", listener: RemoveListenerListener): this; - - prependListener(event: "beforeExit", listener: BeforeExitListener): this; - prependListener(event: "disconnect", listener: DisconnectListener): this; - prependListener(event: "exit", listener: ExitListener): this; - prependListener(event: "rejectionHandled", listener: RejectionHandledListener): this; - prependListener(event: "uncaughtException", listener: UncaughtExceptionListener): this; - prependListener(event: "unhandledRejection", listener: UnhandledRejectionListener): this; - prependListener(event: "warning", listener: WarningListener): this; - prependListener(event: "message", listener: MessageListener): this; - prependListener(event: Signals, listener: SignalsListener): this; - prependListener(event: "newListener", listener: NewListenerListener): this; - prependListener(event: "removeListener", listener: RemoveListenerListener): this; - - prependOnceListener(event: "beforeExit", listener: BeforeExitListener): this; - prependOnceListener(event: "disconnect", listener: DisconnectListener): this; - prependOnceListener(event: "exit", listener: ExitListener): this; - prependOnceListener(event: "rejectionHandled", listener: RejectionHandledListener): this; - prependOnceListener(event: "uncaughtException", listener: UncaughtExceptionListener): this; - prependOnceListener(event: "unhandledRejection", listener: UnhandledRejectionListener): this; - prependOnceListener(event: "warning", listener: WarningListener): this; - prependOnceListener(event: "message", listener: MessageListener): this; - prependOnceListener(event: Signals, listener: SignalsListener): this; - prependOnceListener(event: "newListener", listener: NewListenerListener): this; - prependOnceListener(event: "removeListener", listener: RemoveListenerListener): this; - - listeners(event: "beforeExit"): BeforeExitListener[]; - listeners(event: "disconnect"): DisconnectListener[]; - listeners(event: "exit"): ExitListener[]; - listeners(event: "rejectionHandled"): RejectionHandledListener[]; - listeners(event: "uncaughtException"): UncaughtExceptionListener[]; - listeners(event: "unhandledRejection"): UnhandledRejectionListener[]; - listeners(event: "warning"): WarningListener[]; - listeners(event: "message"): MessageListener[]; - listeners(event: Signals): SignalsListener[]; - listeners(event: "newListener"): NewListenerListener[]; - listeners(event: "removeListener"): RemoveListenerListener[]; - } - - export interface Global { - Array: typeof Array; - ArrayBuffer: typeof ArrayBuffer; - Boolean: typeof Boolean; - Buffer: typeof Buffer; - DataView: typeof DataView; - Date: typeof Date; - Error: typeof Error; - EvalError: typeof EvalError; - Float32Array: typeof Float32Array; - Float64Array: typeof Float64Array; - Function: typeof Function; - GLOBAL: Global; - Infinity: typeof Infinity; - Int16Array: typeof Int16Array; - Int32Array: typeof Int32Array; - Int8Array: typeof Int8Array; - Intl: typeof Intl; - JSON: typeof JSON; - Map: MapConstructor; - Math: typeof Math; - NaN: typeof NaN; - Number: typeof Number; - Object: typeof Object; - Promise: Function; - RangeError: typeof RangeError; - ReferenceError: typeof ReferenceError; - RegExp: typeof RegExp; - Set: SetConstructor; - String: typeof String; - Symbol: Function; - SyntaxError: typeof SyntaxError; - TypeError: typeof TypeError; - URIError: typeof URIError; - Uint16Array: typeof Uint16Array; - Uint32Array: typeof Uint32Array; - Uint8Array: typeof Uint8Array; - Uint8ClampedArray: Function; - WeakMap: WeakMapConstructor; - WeakSet: WeakSetConstructor; - clearImmediate: (immediateId: any) => void; - clearInterval: (intervalId: NodeJS.Timer) => void; - clearTimeout: (timeoutId: NodeJS.Timer) => void; - console: typeof console; - decodeURI: typeof decodeURI; - decodeURIComponent: typeof decodeURIComponent; - encodeURI: typeof encodeURI; - encodeURIComponent: typeof encodeURIComponent; - escape: (str: string) => string; - eval: typeof eval; - global: Global; - isFinite: typeof isFinite; - isNaN: typeof isNaN; - parseFloat: typeof parseFloat; - parseInt: typeof parseInt; - process: Process; - root: Global; - setImmediate: (callback: (...args: any[]) => void, ...args: any[]) => any; - setInterval: (callback: (...args: any[]) => void, ms: number, ...args: any[]) => NodeJS.Timer; - setTimeout: (callback: (...args: any[]) => void, ms: number, ...args: any[]) => NodeJS.Timer; - undefined: typeof undefined; - unescape: (str: string) => string; - gc: () => void; - v8debug?: any; - } - - export interface Timer { - ref(): void; - unref(): void; - } - - class Module { - static runMain(): void; - static wrap(code: string): string; - static builtinModules: string[]; - - static Module: typeof Module; - - exports: any; - require: NodeRequireFunction; - id: string; - filename: string; - loaded: boolean; - parent: Module | null; - children: Module[]; - paths: string[]; - - constructor(id: string, parent?: Module); - } - - type TypedArray = Uint8Array | Uint8ClampedArray | Uint16Array | Uint32Array | Int8Array | Int16Array | Int32Array | Float32Array | Float64Array; -} - -interface IterableIterator { } - -/************************************************ -* * -* MODULES * -* * -************************************************/ -declare module "buffer" { - export var INSPECT_MAX_BYTES: number; - var BuffType: typeof Buffer; - var SlowBuffType: typeof SlowBuffer; - export { BuffType as Buffer, SlowBuffType as SlowBuffer }; -} - -declare module "querystring" { - export interface StringifyOptions { - encodeURIComponent?: Function; - } - - export interface ParseOptions { - maxKeys?: number; - decodeURIComponent?: Function; - } - - interface ParsedUrlQuery { [key: string]: string | string[] | undefined; } - - export function stringify(obj: T, sep?: string, eq?: string, options?: StringifyOptions): string; - export function parse(str: string, sep?: string, eq?: string, options?: ParseOptions): ParsedUrlQuery; - export function parse(str: string, sep?: string, eq?: string, options?: ParseOptions): T; - export function escape(str: string): string; - export function unescape(str: string): string; -} - -declare module "events" { - class internal extends NodeJS.EventEmitter { } - - namespace internal { - export class EventEmitter extends internal { - /** @deprecated since v4.0.0 */ - static listenerCount(emitter: EventEmitter, event: string | symbol): number; - static defaultMaxListeners: number; - - addListener(event: string | symbol, listener: (...args: any[]) => void): this; - on(event: string | symbol, listener: (...args: any[]) => void): this; - once(event: string | symbol, listener: (...args: any[]) => void): this; - prependListener(event: string | symbol, listener: (...args: any[]) => void): this; - prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; - removeListener(event: string | symbol, listener: (...args: any[]) => void): this; - off(event: string | symbol, listener: (...args: any[]) => void): this; - removeAllListeners(event?: string | symbol): this; - setMaxListeners(n: number): this; - getMaxListeners(): number; - listeners(event: string | symbol): Function[]; - rawListeners(event: string | symbol): Function[]; - emit(event: string | symbol, ...args: any[]): boolean; - eventNames(): Array; - listenerCount(type: string | symbol): number; - } - } - - export = internal; -} - -declare module "http" { - import * as events from "events"; - import * as net from "net"; - import * as stream from "stream"; - import { URL } from "url"; - - // incoming headers will never contain number - export interface IncomingHttpHeaders { - 'accept'?: string; - 'access-control-allow-origin'?: string; - 'access-control-allow-credentials'?: string; - 'access-control-expose-headers'?: string; - 'access-control-max-age'?: string; - 'access-control-allow-methods'?: string; - 'access-control-allow-headers'?: string; - 'accept-patch'?: string; - 'accept-ranges'?: string; - 'authorization'?: string; - 'age'?: string; - 'allow'?: string; - 'alt-svc'?: string; - 'cache-control'?: string; - 'connection'?: string; - 'content-disposition'?: string; - 'content-encoding'?: string; - 'content-language'?: string; - 'content-length'?: string; - 'content-location'?: string; - 'content-range'?: string; - 'content-type'?: string; - 'date'?: string; - 'expires'?: string; - 'host'?: string; - 'last-modified'?: string; - 'location'?: string; - 'pragma'?: string; - 'proxy-authenticate'?: string; - 'public-key-pins'?: string; - 'retry-after'?: string; - 'set-cookie'?: string[]; - 'strict-transport-security'?: string; - 'trailer'?: string; - 'transfer-encoding'?: string; - 'tk'?: string; - 'upgrade'?: string; - 'vary'?: string; - 'via'?: string; - 'warning'?: string; - 'www-authenticate'?: string; - [header: string]: string | string[] | undefined; - } - - // outgoing headers allows numbers (as they are converted internally to strings) - export interface OutgoingHttpHeaders { - [header: string]: number | string | string[] | undefined; - } - - export interface ClientRequestArgs { - protocol?: string; - host?: string; - hostname?: string; - family?: number; - port?: number | string; - defaultPort?: number | string; - localAddress?: string; - socketPath?: string; - method?: string; - path?: string; - headers?: OutgoingHttpHeaders; - auth?: string; - agent?: Agent | boolean; - _defaultAgent?: Agent; - timeout?: number; - // https://github.com/nodejs/node/blob/master/lib/_http_client.js#L278 - createConnection?: (options: ClientRequestArgs, oncreate: (err: Error, socket: net.Socket) => void) => net.Socket; - } - - export class Server extends net.Server { - constructor(requestListener?: (req: IncomingMessage, res: ServerResponse) => void); - - setTimeout(msecs?: number, callback?: () => void): this; - setTimeout(callback: () => void): this; - maxHeadersCount: number; - timeout: number; - keepAliveTimeout: number; - } - /** - * @deprecated Use IncomingMessage - */ - export class ServerRequest extends IncomingMessage { - connection: net.Socket; - } - - // https://github.com/nodejs/node/blob/master/lib/_http_outgoing.js - export class OutgoingMessage extends stream.Writable { - upgrading: boolean; - chunkedEncoding: boolean; - shouldKeepAlive: boolean; - useChunkedEncodingByDefault: boolean; - sendDate: boolean; - finished: boolean; - headersSent: boolean; - connection: net.Socket; - - constructor(); - - setTimeout(msecs: number, callback?: () => void): this; - setHeader(name: string, value: number | string | string[]): void; - getHeader(name: string): number | string | string[] | undefined; - getHeaders(): OutgoingHttpHeaders; - getHeaderNames(): string[]; - hasHeader(name: string): boolean; - removeHeader(name: string): void; - addTrailers(headers: OutgoingHttpHeaders | Array<[string, string]>): void; - flushHeaders(): void; - } - - // https://github.com/nodejs/node/blob/master/lib/_http_server.js#L108-L256 - export class ServerResponse extends OutgoingMessage { - statusCode: number; - statusMessage: string; - - constructor(req: IncomingMessage); - - assignSocket(socket: net.Socket): void; - detachSocket(socket: net.Socket): void; - // https://github.com/nodejs/node/blob/master/test/parallel/test-http-write-callbacks.js#L53 - // no args in writeContinue callback - writeContinue(callback?: () => void): void; - writeHead(statusCode: number, reasonPhrase?: string, headers?: OutgoingHttpHeaders): void; - writeHead(statusCode: number, headers?: OutgoingHttpHeaders): void; - } - - // https://github.com/nodejs/node/blob/master/lib/_http_client.js#L77 - export class ClientRequest extends OutgoingMessage { - connection: net.Socket; - socket: net.Socket; - aborted: number; - - constructor(url: string | URL | ClientRequestArgs, cb?: (res: IncomingMessage) => void); - - abort(): void; - onSocket(socket: net.Socket): void; - setTimeout(timeout: number, callback?: () => void): this; - setNoDelay(noDelay?: boolean): void; - setSocketKeepAlive(enable?: boolean, initialDelay?: number): void; - } - - export class IncomingMessage extends stream.Readable { - constructor(socket: net.Socket); - - httpVersion: string; - httpVersionMajor: number; - httpVersionMinor: number; - connection: net.Socket; - headers: IncomingHttpHeaders; - rawHeaders: string[]; - trailers: { [key: string]: string | undefined }; - rawTrailers: string[]; - setTimeout(msecs: number, callback: () => void): this; - /** - * Only valid for request obtained from http.Server. - */ - method?: string; - /** - * Only valid for request obtained from http.Server. - */ - url?: string; - /** - * Only valid for response obtained from http.ClientRequest. - */ - statusCode?: number; - /** - * Only valid for response obtained from http.ClientRequest. - */ - statusMessage?: string; - socket: net.Socket; - destroy(error?: Error): void; - } - - /** - * @deprecated Use IncomingMessage - */ - export class ClientResponse extends IncomingMessage { } - - export interface AgentOptions { - /** - * Keep sockets around in a pool to be used by other requests in the future. Default = false - */ - keepAlive?: boolean; - /** - * When using HTTP KeepAlive, how often to send TCP KeepAlive packets over sockets being kept alive. Default = 1000. - * Only relevant if keepAlive is set to true. - */ - keepAliveMsecs?: number; - /** - * Maximum number of sockets to allow per host. Default for Node 0.10 is 5, default for Node 0.12 is Infinity - */ - maxSockets?: number; - /** - * Maximum number of sockets to leave open in a free state. Only relevant if keepAlive is set to true. Default = 256. - */ - maxFreeSockets?: number; - /** - * Socket timeout in milliseconds. This will set the timeout after the socket is connected. - */ - timeout?: number; - } - - export class Agent { - maxFreeSockets: number; - maxSockets: number; - sockets: any; - requests: any; - - constructor(opts?: AgentOptions); - - /** - * Destroy any sockets that are currently in use by the agent. - * It is usually not necessary to do this. However, if you are using an agent with KeepAlive enabled, - * then it is best to explicitly shut down the agent when you know that it will no longer be used. Otherwise, - * sockets may hang open for quite a long time before the server terminates them. - */ - destroy(): void; - } - - export var METHODS: string[]; - - export var STATUS_CODES: { - [errorCode: number]: string | undefined; - [errorCode: string]: string | undefined; - }; - - export function createServer(requestListener?: (request: IncomingMessage, response: ServerResponse) => void): Server; - export function createClient(port?: number, host?: string): any; - - // although RequestOptions are passed as ClientRequestArgs to ClientRequest directly, - // create interface RequestOptions would make the naming more clear to developers - export interface RequestOptions extends ClientRequestArgs { } - export function request(options: RequestOptions | string | URL, callback?: (res: IncomingMessage) => void): ClientRequest; - export function get(options: RequestOptions | string | URL, callback?: (res: IncomingMessage) => void): ClientRequest; - export var globalAgent: Agent; -} - -declare module "cluster" { - import * as child from "child_process"; - import * as events from "events"; - import * as net from "net"; - - // interfaces - export interface ClusterSettings { - execArgv?: string[]; // default: process.execArgv - exec?: string; - args?: string[]; - silent?: boolean; - stdio?: any[]; - uid?: number; - gid?: number; - inspectPort?: number | (() => number); - } - - export interface Address { - address: string; - port: number; - addressType: number | "udp4" | "udp6"; // 4, 6, -1, "udp4", "udp6" - } - - export class Worker extends events.EventEmitter { - id: number; - process: child.ChildProcess; - suicide: boolean; - send(message: any, sendHandle?: any, callback?: (error: Error) => void): boolean; - kill(signal?: string): void; - destroy(signal?: string): void; - disconnect(): void; - isConnected(): boolean; - isDead(): boolean; - exitedAfterDisconnect: boolean; - - /** - * events.EventEmitter - * 1. disconnect - * 2. error - * 3. exit - * 4. listening - * 5. message - * 6. online - */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "disconnect", listener: () => void): this; - addListener(event: "error", listener: (error: Error) => void): this; - addListener(event: "exit", listener: (code: number, signal: string) => void): this; - addListener(event: "listening", listener: (address: Address) => void): this; - addListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - addListener(event: "online", listener: () => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "disconnect"): boolean; - emit(event: "error", error: Error): boolean; - emit(event: "exit", code: number, signal: string): boolean; - emit(event: "listening", address: Address): boolean; - emit(event: "message", message: any, handle: net.Socket | net.Server): boolean; - emit(event: "online"): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "disconnect", listener: () => void): this; - on(event: "error", listener: (error: Error) => void): this; - on(event: "exit", listener: (code: number, signal: string) => void): this; - on(event: "listening", listener: (address: Address) => void): this; - on(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - on(event: "online", listener: () => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "disconnect", listener: () => void): this; - once(event: "error", listener: (error: Error) => void): this; - once(event: "exit", listener: (code: number, signal: string) => void): this; - once(event: "listening", listener: (address: Address) => void): this; - once(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - once(event: "online", listener: () => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "disconnect", listener: () => void): this; - prependListener(event: "error", listener: (error: Error) => void): this; - prependListener(event: "exit", listener: (code: number, signal: string) => void): this; - prependListener(event: "listening", listener: (address: Address) => void): this; - prependListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - prependListener(event: "online", listener: () => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "disconnect", listener: () => void): this; - prependOnceListener(event: "error", listener: (error: Error) => void): this; - prependOnceListener(event: "exit", listener: (code: number, signal: string) => void): this; - prependOnceListener(event: "listening", listener: (address: Address) => void): this; - prependOnceListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - prependOnceListener(event: "online", listener: () => void): this; - } - - export interface Cluster extends events.EventEmitter { - Worker: Worker; - disconnect(callback?: Function): void; - fork(env?: any): Worker; - isMaster: boolean; - isWorker: boolean; - // TODO: cluster.schedulingPolicy - settings: ClusterSettings; - setupMaster(settings?: ClusterSettings): void; - worker?: Worker; - workers?: { - [index: string]: Worker | undefined - }; - - /** - * events.EventEmitter - * 1. disconnect - * 2. exit - * 3. fork - * 4. listening - * 5. message - * 6. online - * 7. setup - */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "disconnect", listener: (worker: Worker) => void): this; - addListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; - addListener(event: "fork", listener: (worker: Worker) => void): this; - addListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; - addListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - addListener(event: "online", listener: (worker: Worker) => void): this; - addListener(event: "setup", listener: (settings: any) => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "disconnect", worker: Worker): boolean; - emit(event: "exit", worker: Worker, code: number, signal: string): boolean; - emit(event: "fork", worker: Worker): boolean; - emit(event: "listening", worker: Worker, address: Address): boolean; - emit(event: "message", worker: Worker, message: any, handle: net.Socket | net.Server): boolean; - emit(event: "online", worker: Worker): boolean; - emit(event: "setup", settings: any): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "disconnect", listener: (worker: Worker) => void): this; - on(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; - on(event: "fork", listener: (worker: Worker) => void): this; - on(event: "listening", listener: (worker: Worker, address: Address) => void): this; - on(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - on(event: "online", listener: (worker: Worker) => void): this; - on(event: "setup", listener: (settings: any) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "disconnect", listener: (worker: Worker) => void): this; - once(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; - once(event: "fork", listener: (worker: Worker) => void): this; - once(event: "listening", listener: (worker: Worker, address: Address) => void): this; - once(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - once(event: "online", listener: (worker: Worker) => void): this; - once(event: "setup", listener: (settings: any) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "disconnect", listener: (worker: Worker) => void): this; - prependListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; - prependListener(event: "fork", listener: (worker: Worker) => void): this; - prependListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; - prependListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - prependListener(event: "online", listener: (worker: Worker) => void): this; - prependListener(event: "setup", listener: (settings: any) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "disconnect", listener: (worker: Worker) => void): this; - prependOnceListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; - prependOnceListener(event: "fork", listener: (worker: Worker) => void): this; - prependOnceListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; - prependOnceListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - prependOnceListener(event: "online", listener: (worker: Worker) => void): this; - prependOnceListener(event: "setup", listener: (settings: any) => void): this; - } - - export function disconnect(callback?: Function): void; - export function fork(env?: any): Worker; - export var isMaster: boolean; - export var isWorker: boolean; - // TODO: cluster.schedulingPolicy - export var settings: ClusterSettings; - export function setupMaster(settings?: ClusterSettings): void; - export var worker: Worker; - export var workers: { - [index: string]: Worker | undefined - }; - - /** - * events.EventEmitter - * 1. disconnect - * 2. exit - * 3. fork - * 4. listening - * 5. message - * 6. online - * 7. setup - */ - export function addListener(event: string, listener: (...args: any[]) => void): Cluster; - export function addListener(event: "disconnect", listener: (worker: Worker) => void): Cluster; - export function addListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; - export function addListener(event: "fork", listener: (worker: Worker) => void): Cluster; - export function addListener(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; - export function addListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. - export function addListener(event: "online", listener: (worker: Worker) => void): Cluster; - export function addListener(event: "setup", listener: (settings: any) => void): Cluster; - - export function emit(event: string | symbol, ...args: any[]): boolean; - export function emit(event: "disconnect", worker: Worker): boolean; - export function emit(event: "exit", worker: Worker, code: number, signal: string): boolean; - export function emit(event: "fork", worker: Worker): boolean; - export function emit(event: "listening", worker: Worker, address: Address): boolean; - export function emit(event: "message", worker: Worker, message: any, handle: net.Socket | net.Server): boolean; - export function emit(event: "online", worker: Worker): boolean; - export function emit(event: "setup", settings: any): boolean; - - export function on(event: string, listener: (...args: any[]) => void): Cluster; - export function on(event: "disconnect", listener: (worker: Worker) => void): Cluster; - export function on(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; - export function on(event: "fork", listener: (worker: Worker) => void): Cluster; - export function on(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; - export function on(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. - export function on(event: "online", listener: (worker: Worker) => void): Cluster; - export function on(event: "setup", listener: (settings: any) => void): Cluster; - - export function once(event: string, listener: (...args: any[]) => void): Cluster; - export function once(event: "disconnect", listener: (worker: Worker) => void): Cluster; - export function once(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; - export function once(event: "fork", listener: (worker: Worker) => void): Cluster; - export function once(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; - export function once(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. - export function once(event: "online", listener: (worker: Worker) => void): Cluster; - export function once(event: "setup", listener: (settings: any) => void): Cluster; - - export function removeListener(event: string, listener: (...args: any[]) => void): Cluster; - export function removeAllListeners(event?: string): Cluster; - export function setMaxListeners(n: number): Cluster; - export function getMaxListeners(): number; - export function listeners(event: string): Function[]; - export function listenerCount(type: string): number; - - export function prependListener(event: string, listener: (...args: any[]) => void): Cluster; - export function prependListener(event: "disconnect", listener: (worker: Worker) => void): Cluster; - export function prependListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; - export function prependListener(event: "fork", listener: (worker: Worker) => void): Cluster; - export function prependListener(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; - export function prependListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. - export function prependListener(event: "online", listener: (worker: Worker) => void): Cluster; - export function prependListener(event: "setup", listener: (settings: any) => void): Cluster; - - export function prependOnceListener(event: string, listener: (...args: any[]) => void): Cluster; - export function prependOnceListener(event: "disconnect", listener: (worker: Worker) => void): Cluster; - export function prependOnceListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; - export function prependOnceListener(event: "fork", listener: (worker: Worker) => void): Cluster; - export function prependOnceListener(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; - export function prependOnceListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. - export function prependOnceListener(event: "online", listener: (worker: Worker) => void): Cluster; - export function prependOnceListener(event: "setup", listener: (settings: any) => void): Cluster; - - export function eventNames(): string[]; -} - -declare module "zlib" { - import * as stream from "stream"; - - export interface ZlibOptions { - flush?: number; // default: zlib.constants.Z_NO_FLUSH - finishFlush?: number; // default: zlib.constants.Z_FINISH - chunkSize?: number; // default: 16*1024 - windowBits?: number; - level?: number; // compression only - memLevel?: number; // compression only - strategy?: number; // compression only - dictionary?: Buffer | NodeJS.TypedArray | DataView | ArrayBuffer; // deflate/inflate only, empty dictionary by default - } - - export interface Zlib { - readonly bytesRead: number; - close(callback?: () => void): void; - flush(kind?: number | (() => void), callback?: () => void): void; - } - - export interface ZlibParams { - params(level: number, strategy: number, callback: () => void): void; - } - - export interface ZlibReset { - reset(): void; - } - - export interface Gzip extends stream.Transform, Zlib { } - export interface Gunzip extends stream.Transform, Zlib { } - export interface Deflate extends stream.Transform, Zlib, ZlibReset, ZlibParams { } - export interface Inflate extends stream.Transform, Zlib, ZlibReset { } - export interface DeflateRaw extends stream.Transform, Zlib, ZlibReset, ZlibParams { } - export interface InflateRaw extends stream.Transform, Zlib, ZlibReset { } - export interface Unzip extends stream.Transform, Zlib { } - - export function createGzip(options?: ZlibOptions): Gzip; - export function createGunzip(options?: ZlibOptions): Gunzip; - export function createDeflate(options?: ZlibOptions): Deflate; - export function createInflate(options?: ZlibOptions): Inflate; - export function createDeflateRaw(options?: ZlibOptions): DeflateRaw; - export function createInflateRaw(options?: ZlibOptions): InflateRaw; - export function createUnzip(options?: ZlibOptions): Unzip; - - type InputType = string | Buffer | DataView | ArrayBuffer | NodeJS.TypedArray; - export function deflate(buf: InputType, callback: (error: Error | null, result: Buffer) => void): void; - export function deflate(buf: InputType, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; - export function deflateSync(buf: InputType, options?: ZlibOptions): Buffer; - export function deflateRaw(buf: InputType, callback: (error: Error | null, result: Buffer) => void): void; - export function deflateRaw(buf: InputType, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; - export function deflateRawSync(buf: InputType, options?: ZlibOptions): Buffer; - export function gzip(buf: InputType, callback: (error: Error | null, result: Buffer) => void): void; - export function gzip(buf: InputType, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; - export function gzipSync(buf: InputType, options?: ZlibOptions): Buffer; - export function gunzip(buf: InputType, callback: (error: Error | null, result: Buffer) => void): void; - export function gunzip(buf: InputType, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; - export function gunzipSync(buf: InputType, options?: ZlibOptions): Buffer; - export function inflate(buf: InputType, callback: (error: Error | null, result: Buffer) => void): void; - export function inflate(buf: InputType, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; - export function inflateSync(buf: InputType, options?: ZlibOptions): Buffer; - export function inflateRaw(buf: InputType, callback: (error: Error | null, result: Buffer) => void): void; - export function inflateRaw(buf: InputType, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; - export function inflateRawSync(buf: InputType, options?: ZlibOptions): Buffer; - export function unzip(buf: InputType, callback: (error: Error | null, result: Buffer) => void): void; - export function unzip(buf: InputType, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; - export function unzipSync(buf: InputType, options?: ZlibOptions): Buffer; - - export namespace constants { - // Allowed flush values. - - export const Z_NO_FLUSH: number; - export const Z_PARTIAL_FLUSH: number; - export const Z_SYNC_FLUSH: number; - export const Z_FULL_FLUSH: number; - export const Z_FINISH: number; - export const Z_BLOCK: number; - export const Z_TREES: number; - - // Return codes for the compression/decompression functions. Negative values are errors, positive values are used for special but normal events. - - export const Z_OK: number; - export const Z_STREAM_END: number; - export const Z_NEED_DICT: number; - export const Z_ERRNO: number; - export const Z_STREAM_ERROR: number; - export const Z_DATA_ERROR: number; - export const Z_MEM_ERROR: number; - export const Z_BUF_ERROR: number; - export const Z_VERSION_ERROR: number; - - // Compression levels. - - export const Z_NO_COMPRESSION: number; - export const Z_BEST_SPEED: number; - export const Z_BEST_COMPRESSION: number; - export const Z_DEFAULT_COMPRESSION: number; - - // Compression strategy. - - export const Z_FILTERED: number; - export const Z_HUFFMAN_ONLY: number; - export const Z_RLE: number; - export const Z_FIXED: number; - export const Z_DEFAULT_STRATEGY: number; - } - - // Constants - export var Z_NO_FLUSH: number; - export var Z_PARTIAL_FLUSH: number; - export var Z_SYNC_FLUSH: number; - export var Z_FULL_FLUSH: number; - export var Z_FINISH: number; - export var Z_BLOCK: number; - export var Z_TREES: number; - export var Z_OK: number; - export var Z_STREAM_END: number; - export var Z_NEED_DICT: number; - export var Z_ERRNO: number; - export var Z_STREAM_ERROR: number; - export var Z_DATA_ERROR: number; - export var Z_MEM_ERROR: number; - export var Z_BUF_ERROR: number; - export var Z_VERSION_ERROR: number; - export var Z_NO_COMPRESSION: number; - export var Z_BEST_SPEED: number; - export var Z_BEST_COMPRESSION: number; - export var Z_DEFAULT_COMPRESSION: number; - export var Z_FILTERED: number; - export var Z_HUFFMAN_ONLY: number; - export var Z_RLE: number; - export var Z_FIXED: number; - export var Z_DEFAULT_STRATEGY: number; - export var Z_BINARY: number; - export var Z_TEXT: number; - export var Z_ASCII: number; - export var Z_UNKNOWN: number; - export var Z_DEFLATED: number; -} - -declare module "os" { - export interface CpuInfo { - model: string; - speed: number; - times: { - user: number; - nice: number; - sys: number; - idle: number; - irq: number; - }; - } - - export interface NetworkInterfaceBase { - address: string; - netmask: string; - mac: string; - internal: boolean; - } - - export interface NetworkInterfaceInfoIPv4 extends NetworkInterfaceBase { - family: "IPv4"; - } - - export interface NetworkInterfaceInfoIPv6 extends NetworkInterfaceBase { - family: "IPv6"; - scopeid: number; - } - - export type NetworkInterfaceInfo = NetworkInterfaceInfoIPv4 | NetworkInterfaceInfoIPv6; - - export function hostname(): string; - export function loadavg(): number[]; - export function uptime(): number; - export function freemem(): number; - export function totalmem(): number; - export function cpus(): CpuInfo[]; - export function type(): string; - export function release(): string; - export function networkInterfaces(): { [index: string]: NetworkInterfaceInfo[] }; - export function homedir(): string; - export function userInfo(options?: { encoding: string }): { username: string, uid: number, gid: number, shell: any, homedir: string }; - export var constants: { - UV_UDP_REUSEADDR: number, - signals: { - SIGHUP: number; - SIGINT: number; - SIGQUIT: number; - SIGILL: number; - SIGTRAP: number; - SIGABRT: number; - SIGIOT: number; - SIGBUS: number; - SIGFPE: number; - SIGKILL: number; - SIGUSR1: number; - SIGSEGV: number; - SIGUSR2: number; - SIGPIPE: number; - SIGALRM: number; - SIGTERM: number; - SIGCHLD: number; - SIGSTKFLT: number; - SIGCONT: number; - SIGSTOP: number; - SIGTSTP: number; - SIGTTIN: number; - SIGTTOU: number; - SIGURG: number; - SIGXCPU: number; - SIGXFSZ: number; - SIGVTALRM: number; - SIGPROF: number; - SIGWINCH: number; - SIGIO: number; - SIGPOLL: number; - SIGPWR: number; - SIGSYS: number; - SIGUNUSED: number; - }, - errno: { - E2BIG: number; - EACCES: number; - EADDRINUSE: number; - EADDRNOTAVAIL: number; - EAFNOSUPPORT: number; - EAGAIN: number; - EALREADY: number; - EBADF: number; - EBADMSG: number; - EBUSY: number; - ECANCELED: number; - ECHILD: number; - ECONNABORTED: number; - ECONNREFUSED: number; - ECONNRESET: number; - EDEADLK: number; - EDESTADDRREQ: number; - EDOM: number; - EDQUOT: number; - EEXIST: number; - EFAULT: number; - EFBIG: number; - EHOSTUNREACH: number; - EIDRM: number; - EILSEQ: number; - EINPROGRESS: number; - EINTR: number; - EINVAL: number; - EIO: number; - EISCONN: number; - EISDIR: number; - ELOOP: number; - EMFILE: number; - EMLINK: number; - EMSGSIZE: number; - EMULTIHOP: number; - ENAMETOOLONG: number; - ENETDOWN: number; - ENETRESET: number; - ENETUNREACH: number; - ENFILE: number; - ENOBUFS: number; - ENODATA: number; - ENODEV: number; - ENOENT: number; - ENOEXEC: number; - ENOLCK: number; - ENOLINK: number; - ENOMEM: number; - ENOMSG: number; - ENOPROTOOPT: number; - ENOSPC: number; - ENOSR: number; - ENOSTR: number; - ENOSYS: number; - ENOTCONN: number; - ENOTDIR: number; - ENOTEMPTY: number; - ENOTSOCK: number; - ENOTSUP: number; - ENOTTY: number; - ENXIO: number; - EOPNOTSUPP: number; - EOVERFLOW: number; - EPERM: number; - EPIPE: number; - EPROTO: number; - EPROTONOSUPPORT: number; - EPROTOTYPE: number; - ERANGE: number; - EROFS: number; - ESPIPE: number; - ESRCH: number; - ESTALE: number; - ETIME: number; - ETIMEDOUT: number; - ETXTBSY: number; - EWOULDBLOCK: number; - EXDEV: number; - }, - }; - export function arch(): string; - export function platform(): NodeJS.Platform; - export function tmpdir(): string; - export const EOL: string; - export function endianness(): "BE" | "LE"; -} - -declare module "https" { - import * as tls from "tls"; - import * as events from "events"; - import * as http from "http"; - import { URL } from "url"; - - export type ServerOptions = tls.SecureContextOptions & tls.TlsOptions; - - export type RequestOptions = http.RequestOptions & tls.SecureContextOptions & { - rejectUnauthorized?: boolean; // Defaults to true - servername?: string; // SNI TLS Extension - }; - - export interface AgentOptions extends http.AgentOptions, tls.ConnectionOptions { - rejectUnauthorized?: boolean; - maxCachedSessions?: number; - } - - export class Agent extends http.Agent { - constructor(options?: AgentOptions); - options: AgentOptions; - } - - export class Server extends tls.Server { - setTimeout(callback: () => void): this; - setTimeout(msecs?: number, callback?: () => void): this; - timeout: number; - keepAliveTimeout: number; - } - - export function createServer(options: ServerOptions, requestListener?: (req: http.IncomingMessage, res: http.ServerResponse) => void): Server; - export function request(options: RequestOptions | string | URL, callback?: (res: http.IncomingMessage) => void): http.ClientRequest; - export function get(options: RequestOptions | string | URL, callback?: (res: http.IncomingMessage) => void): http.ClientRequest; - export var globalAgent: Agent; -} - -declare module "punycode" { - export function decode(string: string): string; - export function encode(string: string): string; - export function toUnicode(domain: string): string; - export function toASCII(domain: string): string; - export var ucs2: ucs2; - interface ucs2 { - decode(string: string): number[]; - encode(codePoints: number[]): string; - } - export var version: any; -} - -declare module "repl" { - import * as stream from "stream"; - import * as readline from "readline"; - - export interface ReplOptions { - prompt?: string; - input?: NodeJS.ReadableStream; - output?: NodeJS.WritableStream; - terminal?: boolean; - eval?: Function; - useColors?: boolean; - useGlobal?: boolean; - ignoreUndefined?: boolean; - writer?: Function; - completer?: Function; - replMode?: any; - breakEvalOnSigint?: any; - } - - export interface REPLServer extends readline.ReadLine { - context: any; - inputStream: NodeJS.ReadableStream; - outputStream: NodeJS.WritableStream; - - defineCommand(keyword: string, cmd: Function | { help: string, action: Function }): void; - displayPrompt(preserveCursor?: boolean): void; - - /** - * events.EventEmitter - * 1. exit - * 2. reset - */ - - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "exit", listener: () => void): this; - addListener(event: "reset", listener: (...args: any[]) => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "exit"): boolean; - emit(event: "reset", context: any): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "exit", listener: () => void): this; - on(event: "reset", listener: (...args: any[]) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "exit", listener: () => void): this; - once(event: "reset", listener: (...args: any[]) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "exit", listener: () => void): this; - prependListener(event: "reset", listener: (...args: any[]) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "exit", listener: () => void): this; - prependOnceListener(event: "reset", listener: (...args: any[]) => void): this; - } - - export function start(options?: string | ReplOptions): REPLServer; - - export class Recoverable extends SyntaxError { - err: Error; - - constructor(err: Error); - } -} - -declare module "readline" { - import * as events from "events"; - import * as stream from "stream"; - - export interface Key { - sequence?: string; - name?: string; - ctrl?: boolean; - meta?: boolean; - shift?: boolean; - } - - export interface ReadLine extends events.EventEmitter { - setPrompt(prompt: string): void; - prompt(preserveCursor?: boolean): void; - question(query: string, callback: (answer: string) => void): void; - pause(): ReadLine; - resume(): ReadLine; - close(): void; - write(data: string | Buffer, key?: Key): void; - - /** - * events.EventEmitter - * 1. close - * 2. line - * 3. pause - * 4. resume - * 5. SIGCONT - * 6. SIGINT - * 7. SIGTSTP - */ - - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "line", listener: (input: any) => void): this; - addListener(event: "pause", listener: () => void): this; - addListener(event: "resume", listener: () => void): this; - addListener(event: "SIGCONT", listener: () => void): this; - addListener(event: "SIGINT", listener: () => void): this; - addListener(event: "SIGTSTP", listener: () => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close"): boolean; - emit(event: "line", input: any): boolean; - emit(event: "pause"): boolean; - emit(event: "resume"): boolean; - emit(event: "SIGCONT"): boolean; - emit(event: "SIGINT"): boolean; - emit(event: "SIGTSTP"): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "close", listener: () => void): this; - on(event: "line", listener: (input: any) => void): this; - on(event: "pause", listener: () => void): this; - on(event: "resume", listener: () => void): this; - on(event: "SIGCONT", listener: () => void): this; - on(event: "SIGINT", listener: () => void): this; - on(event: "SIGTSTP", listener: () => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "close", listener: () => void): this; - once(event: "line", listener: (input: any) => void): this; - once(event: "pause", listener: () => void): this; - once(event: "resume", listener: () => void): this; - once(event: "SIGCONT", listener: () => void): this; - once(event: "SIGINT", listener: () => void): this; - once(event: "SIGTSTP", listener: () => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "line", listener: (input: any) => void): this; - prependListener(event: "pause", listener: () => void): this; - prependListener(event: "resume", listener: () => void): this; - prependListener(event: "SIGCONT", listener: () => void): this; - prependListener(event: "SIGINT", listener: () => void): this; - prependListener(event: "SIGTSTP", listener: () => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "line", listener: (input: any) => void): this; - prependOnceListener(event: "pause", listener: () => void): this; - prependOnceListener(event: "resume", listener: () => void): this; - prependOnceListener(event: "SIGCONT", listener: () => void): this; - prependOnceListener(event: "SIGINT", listener: () => void): this; - prependOnceListener(event: "SIGTSTP", listener: () => void): this; - } - - type Completer = (line: string) => CompleterResult; - type AsyncCompleter = (line: string, callback: (err: any, result: CompleterResult) => void) => any; - - export type CompleterResult = [string[], string]; - - export interface ReadLineOptions { - input: NodeJS.ReadableStream; - output?: NodeJS.WritableStream; - completer?: Completer | AsyncCompleter; - terminal?: boolean; - historySize?: number; - prompt?: string; - crlfDelay?: number; - removeHistoryDuplicates?: boolean; - } - - export function createInterface(input: NodeJS.ReadableStream, output?: NodeJS.WritableStream, completer?: Completer | AsyncCompleter, terminal?: boolean): ReadLine; - export function createInterface(options: ReadLineOptions): ReadLine; - - export function cursorTo(stream: NodeJS.WritableStream, x: number, y?: number): void; - export function emitKeypressEvents(stream: NodeJS.ReadableStream, interface?: ReadLine): void; - export function moveCursor(stream: NodeJS.WritableStream, dx: number | string, dy: number | string): void; - export function clearLine(stream: NodeJS.WritableStream, dir: number): void; - export function clearScreenDown(stream: NodeJS.WritableStream): void; -} - -declare module "vm" { - export interface Context { } - export interface ScriptOptions { - filename?: string; - lineOffset?: number; - columnOffset?: number; - displayErrors?: boolean; - timeout?: number; - cachedData?: Buffer; - produceCachedData?: boolean; - } - export interface RunningScriptOptions { - filename?: string; - lineOffset?: number; - columnOffset?: number; - displayErrors?: boolean; - timeout?: number; - } - export class Script { - constructor(code: string, options?: ScriptOptions); - runInContext(contextifiedSandbox: Context, options?: RunningScriptOptions): any; - runInNewContext(sandbox?: Context, options?: RunningScriptOptions): any; - runInThisContext(options?: RunningScriptOptions): any; - } - export function createContext(sandbox?: Context): Context; - export function isContext(sandbox: Context): boolean; - export function runInContext(code: string, contextifiedSandbox: Context, options?: RunningScriptOptions | string): any; - /** @deprecated */ - export function runInDebugContext(code: string): any; - export function runInNewContext(code: string, sandbox?: Context, options?: RunningScriptOptions | string): any; - export function runInThisContext(code: string, options?: RunningScriptOptions | string): any; -} - -declare module "child_process" { - import * as events from "events"; - import * as stream from "stream"; - import * as net from "net"; - - export interface ChildProcess extends events.EventEmitter { - stdin: stream.Writable; - stdout: stream.Readable; - stderr: stream.Readable; - stdio: [stream.Writable, stream.Readable, stream.Readable]; - killed: boolean; - pid: number; - kill(signal?: string): void; - send(message: any, callback?: (error: Error) => void): boolean; - send(message: any, sendHandle?: net.Socket | net.Server, callback?: (error: Error) => void): boolean; - send(message: any, sendHandle?: net.Socket | net.Server, options?: MessageOptions, callback?: (error: Error) => void): boolean; - connected: boolean; - disconnect(): void; - unref(): void; - ref(): void; - - /** - * events.EventEmitter - * 1. close - * 2. disconnect - * 3. error - * 4. exit - * 5. message - */ - - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "close", listener: (code: number, signal: string) => void): this; - addListener(event: "disconnect", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "exit", listener: (code: number, signal: string) => void): this; - addListener(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close", code: number, signal: string): boolean; - emit(event: "disconnect"): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "exit", code: number, signal: string): boolean; - emit(event: "message", message: any, sendHandle: net.Socket | net.Server): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "close", listener: (code: number, signal: string) => void): this; - on(event: "disconnect", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "exit", listener: (code: number, signal: string) => void): this; - on(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "close", listener: (code: number, signal: string) => void): this; - once(event: "disconnect", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "exit", listener: (code: number, signal: string) => void): this; - once(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "close", listener: (code: number, signal: string) => void): this; - prependListener(event: "disconnect", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "exit", listener: (code: number, signal: string) => void): this; - prependListener(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "close", listener: (code: number, signal: string) => void): this; - prependOnceListener(event: "disconnect", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "exit", listener: (code: number, signal: string) => void): this; - prependOnceListener(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; - } - - export interface MessageOptions { - keepOpen?: boolean; - } - - export type StdioOptions = "pipe" | "ignore" | "inherit" | Array<("pipe" | "ipc" | "ignore" | stream.Stream | number | null | undefined)>; - - export interface SpawnOptions { - cwd?: string; - env?: NodeJS.ProcessEnv; - argv0?: string; - stdio?: StdioOptions; - detached?: boolean; - uid?: number; - gid?: number; - shell?: boolean | string; - windowsVerbatimArguments?: boolean; - windowsHide?: boolean; - } - - export function spawn(command: string, args?: ReadonlyArray, options?: SpawnOptions): ChildProcess; - - export interface ExecOptions { - cwd?: string; - env?: NodeJS.ProcessEnv; - shell?: string; - timeout?: number; - maxBuffer?: number; - killSignal?: string; - uid?: number; - gid?: number; - windowsHide?: boolean; - } - - export interface ExecOptionsWithStringEncoding extends ExecOptions { - encoding: BufferEncoding; - } - - export interface ExecOptionsWithBufferEncoding extends ExecOptions { - encoding: string | null; // specify `null`. - } - - export interface ExecException extends Error { - cmd?: string; - killed?: boolean; - code?: number; - signal?: string; - } - - // no `options` definitely means stdout/stderr are `string`. - export function exec(command: string, callback?: (error: ExecException | null, stdout: string, stderr: string) => void): ChildProcess; - - // `options` with `"buffer"` or `null` for `encoding` means stdout/stderr are definitely `Buffer`. - export function exec(command: string, options: { encoding: "buffer" | null } & ExecOptions, callback?: (error: ExecException | null, stdout: Buffer, stderr: Buffer) => void): ChildProcess; - - // `options` with well known `encoding` means stdout/stderr are definitely `string`. - export function exec(command: string, options: { encoding: BufferEncoding } & ExecOptions, callback?: (error: ExecException | null, stdout: string, stderr: string) => void): ChildProcess; - - // `options` with an `encoding` whose type is `string` means stdout/stderr could either be `Buffer` or `string`. - // There is no guarantee the `encoding` is unknown as `string` is a superset of `BufferEncoding`. - export function exec(command: string, options: { encoding: string } & ExecOptions, callback?: (error: ExecException | null, stdout: string | Buffer, stderr: string | Buffer) => void): ChildProcess; - - // `options` without an `encoding` means stdout/stderr are definitely `string`. - export function exec(command: string, options: ExecOptions, callback?: (error: ExecException | null, stdout: string, stderr: string) => void): ChildProcess; - - // fallback if nothing else matches. Worst case is always `string | Buffer`. - export function exec(command: string, options: ({ encoding?: string | null } & ExecOptions) | undefined | null, callback?: (error: ExecException | null, stdout: string | Buffer, stderr: string | Buffer) => void): ChildProcess; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace exec { - export function __promisify__(command: string): Promise<{ stdout: string, stderr: string }>; - export function __promisify__(command: string, options: { encoding: "buffer" | null } & ExecOptions): Promise<{ stdout: Buffer, stderr: Buffer }>; - export function __promisify__(command: string, options: { encoding: BufferEncoding } & ExecOptions): Promise<{ stdout: string, stderr: string }>; - export function __promisify__(command: string, options: ExecOptions): Promise<{ stdout: string, stderr: string }>; - export function __promisify__(command: string, options?: ({ encoding?: string | null } & ExecOptions) | null): Promise<{ stdout: string | Buffer, stderr: string | Buffer }>; - } - - export interface ExecFileOptions { - cwd?: string; - env?: NodeJS.ProcessEnv; - timeout?: number; - maxBuffer?: number; - killSignal?: string; - uid?: number; - gid?: number; - windowsHide?: boolean; - windowsVerbatimArguments?: boolean; - } - export interface ExecFileOptionsWithStringEncoding extends ExecFileOptions { - encoding: BufferEncoding; - } - export interface ExecFileOptionsWithBufferEncoding extends ExecFileOptions { - encoding: 'buffer' | null; - } - export interface ExecFileOptionsWithOtherEncoding extends ExecFileOptions { - encoding: string; - } - - export function execFile(file: string): ChildProcess; - export function execFile(file: string, options: ({ encoding?: string | null } & ExecFileOptions) | undefined | null): ChildProcess; - export function execFile(file: string, args?: ReadonlyArray | null): ChildProcess; - export function execFile(file: string, args: ReadonlyArray | undefined | null, options: ({ encoding?: string | null } & ExecFileOptions) | undefined | null): ChildProcess; - - // no `options` definitely means stdout/stderr are `string`. - export function execFile(file: string, callback: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; - export function execFile(file: string, args: ReadonlyArray | undefined | null, callback: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; - - // `options` with `"buffer"` or `null` for `encoding` means stdout/stderr are definitely `Buffer`. - export function execFile(file: string, options: ExecFileOptionsWithBufferEncoding, callback: (error: Error | null, stdout: Buffer, stderr: Buffer) => void): ChildProcess; - export function execFile(file: string, args: ReadonlyArray | undefined | null, options: ExecFileOptionsWithBufferEncoding, callback: (error: Error | null, stdout: Buffer, stderr: Buffer) => void): ChildProcess; - - // `options` with well known `encoding` means stdout/stderr are definitely `string`. - export function execFile(file: string, options: ExecFileOptionsWithStringEncoding, callback: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; - export function execFile(file: string, args: ReadonlyArray | undefined | null, options: ExecFileOptionsWithStringEncoding, callback: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; - - // `options` with an `encoding` whose type is `string` means stdout/stderr could either be `Buffer` or `string`. - // There is no guarantee the `encoding` is unknown as `string` is a superset of `BufferEncoding`. - export function execFile(file: string, options: ExecFileOptionsWithOtherEncoding, callback: (error: Error | null, stdout: string | Buffer, stderr: string | Buffer) => void): ChildProcess; - export function execFile(file: string, args: ReadonlyArray | undefined | null, options: ExecFileOptionsWithOtherEncoding, callback: (error: Error | null, stdout: string | Buffer, stderr: string | Buffer) => void): ChildProcess; - - // `options` without an `encoding` means stdout/stderr are definitely `string`. - export function execFile(file: string, options: ExecFileOptions, callback: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; - export function execFile(file: string, args: ReadonlyArray | undefined | null, options: ExecFileOptions, callback: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; - - // fallback if nothing else matches. Worst case is always `string | Buffer`. - export function execFile(file: string, options: ({ encoding?: string | null } & ExecFileOptions) | undefined | null, callback: ((error: Error | null, stdout: string | Buffer, stderr: string | Buffer) => void) | undefined | null): ChildProcess; - export function execFile(file: string, args: ReadonlyArray | undefined | null, options: ({ encoding?: string | null } & ExecFileOptions) | undefined | null, callback: ((error: Error | null, stdout: string | Buffer, stderr: string | Buffer) => void) | undefined | null): ChildProcess; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace execFile { - export function __promisify__(file: string): Promise<{ stdout: string, stderr: string }>; - export function __promisify__(file: string, args: string[] | undefined | null): Promise<{ stdout: string, stderr: string }>; - export function __promisify__(file: string, options: ExecFileOptionsWithBufferEncoding): Promise<{ stdout: Buffer, stderr: Buffer }>; - export function __promisify__(file: string, args: string[] | undefined | null, options: ExecFileOptionsWithBufferEncoding): Promise<{ stdout: Buffer, stderr: Buffer }>; - export function __promisify__(file: string, options: ExecFileOptionsWithStringEncoding): Promise<{ stdout: string, stderr: string }>; - export function __promisify__(file: string, args: string[] | undefined | null, options: ExecFileOptionsWithStringEncoding): Promise<{ stdout: string, stderr: string }>; - export function __promisify__(file: string, options: ExecFileOptionsWithOtherEncoding): Promise<{ stdout: string | Buffer, stderr: string | Buffer }>; - export function __promisify__(file: string, args: string[] | undefined | null, options: ExecFileOptionsWithOtherEncoding): Promise<{ stdout: string | Buffer, stderr: string | Buffer }>; - export function __promisify__(file: string, options: ExecFileOptions): Promise<{ stdout: string, stderr: string }>; - export function __promisify__(file: string, args: string[] | undefined | null, options: ExecFileOptions): Promise<{ stdout: string, stderr: string }>; - export function __promisify__(file: string, options: ({ encoding?: string | null } & ExecFileOptions) | undefined | null): Promise<{ stdout: string | Buffer, stderr: string | Buffer }>; - export function __promisify__(file: string, args: string[] | undefined | null, options: ({ encoding?: string | null } & ExecFileOptions) | undefined | null): Promise<{ stdout: string | Buffer, stderr: string | Buffer }>; - } - - export interface ForkOptions { - cwd?: string; - env?: NodeJS.ProcessEnv; - execPath?: string; - execArgv?: string[]; - silent?: boolean; - stdio?: StdioOptions; - windowsVerbatimArguments?: boolean; - uid?: number; - gid?: number; - } - export function fork(modulePath: string, args?: ReadonlyArray, options?: ForkOptions): ChildProcess; - - export interface SpawnSyncOptions { - argv0?: string; // Not specified in the docs - cwd?: string; - input?: string | Buffer | Uint8Array; - stdio?: StdioOptions; - env?: NodeJS.ProcessEnv; - uid?: number; - gid?: number; - timeout?: number; - killSignal?: string | number; - maxBuffer?: number; - encoding?: string; - shell?: boolean | string; - windowsVerbatimArguments?: boolean; - windowsHide?: boolean; - } - export interface SpawnSyncOptionsWithStringEncoding extends SpawnSyncOptions { - encoding: BufferEncoding; - } - export interface SpawnSyncOptionsWithBufferEncoding extends SpawnSyncOptions { - encoding: string; // specify `null`. - } - export interface SpawnSyncReturns { - pid: number; - output: string[]; - stdout: T; - stderr: T; - status: number; - signal: string; - error: Error; - } - export function spawnSync(command: string): SpawnSyncReturns; - export function spawnSync(command: string, options?: SpawnSyncOptionsWithStringEncoding): SpawnSyncReturns; - export function spawnSync(command: string, options?: SpawnSyncOptionsWithBufferEncoding): SpawnSyncReturns; - export function spawnSync(command: string, options?: SpawnSyncOptions): SpawnSyncReturns; - export function spawnSync(command: string, args?: ReadonlyArray, options?: SpawnSyncOptionsWithStringEncoding): SpawnSyncReturns; - export function spawnSync(command: string, args?: ReadonlyArray, options?: SpawnSyncOptionsWithBufferEncoding): SpawnSyncReturns; - export function spawnSync(command: string, args?: ReadonlyArray, options?: SpawnSyncOptions): SpawnSyncReturns; - - export interface ExecSyncOptions { - cwd?: string; - input?: string | Buffer | Uint8Array; - stdio?: StdioOptions; - env?: NodeJS.ProcessEnv; - shell?: string; - uid?: number; - gid?: number; - timeout?: number; - killSignal?: string | number; - maxBuffer?: number; - encoding?: string; - windowsHide?: boolean; - } - export interface ExecSyncOptionsWithStringEncoding extends ExecSyncOptions { - encoding: BufferEncoding; - } - export interface ExecSyncOptionsWithBufferEncoding extends ExecSyncOptions { - encoding: string; // specify `null`. - } - export function execSync(command: string): Buffer; - export function execSync(command: string, options?: ExecSyncOptionsWithStringEncoding): string; - export function execSync(command: string, options?: ExecSyncOptionsWithBufferEncoding): Buffer; - export function execSync(command: string, options?: ExecSyncOptions): Buffer; - - export interface ExecFileSyncOptions { - cwd?: string; - input?: string | Buffer | Uint8Array; - stdio?: StdioOptions; - env?: NodeJS.ProcessEnv; - uid?: number; - gid?: number; - timeout?: number; - killSignal?: string | number; - maxBuffer?: number; - encoding?: string; - windowsHide?: boolean; - shell?: boolean | string; - } - export interface ExecFileSyncOptionsWithStringEncoding extends ExecFileSyncOptions { - encoding: BufferEncoding; - } - export interface ExecFileSyncOptionsWithBufferEncoding extends ExecFileSyncOptions { - encoding: string; // specify `null`. - } - export function execFileSync(command: string): Buffer; - export function execFileSync(command: string, options?: ExecFileSyncOptionsWithStringEncoding): string; - export function execFileSync(command: string, options?: ExecFileSyncOptionsWithBufferEncoding): Buffer; - export function execFileSync(command: string, options?: ExecFileSyncOptions): Buffer; - export function execFileSync(command: string, args?: ReadonlyArray, options?: ExecFileSyncOptionsWithStringEncoding): string; - export function execFileSync(command: string, args?: ReadonlyArray, options?: ExecFileSyncOptionsWithBufferEncoding): Buffer; - export function execFileSync(command: string, args?: ReadonlyArray, options?: ExecFileSyncOptions): Buffer; -} - -declare module "url" { - import { ParsedUrlQuery } from 'querystring'; - - export interface UrlObjectCommon { - auth?: string; - hash?: string; - host?: string; - hostname?: string; - href?: string; - path?: string; - pathname?: string; - protocol?: string; - search?: string; - slashes?: boolean; - } - - // Input to `url.format` - export interface UrlObject extends UrlObjectCommon { - port?: string | number; - query?: string | null | { [key: string]: any }; - } - - // Output of `url.parse` - export interface Url extends UrlObjectCommon { - port?: string; - query?: string | null | ParsedUrlQuery; - } - - export interface UrlWithParsedQuery extends Url { - query: ParsedUrlQuery; - } - - export interface UrlWithStringQuery extends Url { - query: string | null; - } - - export function parse(urlStr: string): UrlWithStringQuery; - export function parse(urlStr: string, parseQueryString: false | undefined, slashesDenoteHost?: boolean): UrlWithStringQuery; - export function parse(urlStr: string, parseQueryString: true, slashesDenoteHost?: boolean): UrlWithParsedQuery; - export function parse(urlStr: string, parseQueryString: boolean, slashesDenoteHost?: boolean): Url; - - export function format(URL: URL, options?: URLFormatOptions): string; - export function format(urlObject: UrlObject | string): string; - export function resolve(from: string, to: string): string; - - export function domainToASCII(domain: string): string; - export function domainToUnicode(domain: string): string; - - export interface URLFormatOptions { - auth?: boolean; - fragment?: boolean; - search?: boolean; - unicode?: boolean; - } - - export class URL { - constructor(input: string, base?: string | URL); - hash: string; - host: string; - hostname: string; - href: string; - readonly origin: string; - password: string; - pathname: string; - port: string; - protocol: string; - search: string; - readonly searchParams: URLSearchParams; - username: string; - toString(): string; - toJSON(): string; - } - - export class URLSearchParams implements Iterable<[string, string]> { - constructor(init?: URLSearchParams | string | { [key: string]: string | string[] | undefined } | Iterable<[string, string]> | Array<[string, string]>); - append(name: string, value: string): void; - delete(name: string): void; - entries(): IterableIterator<[string, string]>; - forEach(callback: (value: string, name: string, searchParams: this) => void): void; - get(name: string): string | null; - getAll(name: string): string[]; - has(name: string): boolean; - keys(): IterableIterator; - set(name: string, value: string): void; - sort(): void; - toString(): string; - values(): IterableIterator; - [Symbol.iterator](): IterableIterator<[string, string]>; - } -} - -declare module "dns" { - // Supported getaddrinfo flags. - export const ADDRCONFIG: number; - export const V4MAPPED: number; - - export interface LookupOptions { - family?: number; - hints?: number; - all?: boolean; - } - - export interface LookupOneOptions extends LookupOptions { - all?: false; - } - - export interface LookupAllOptions extends LookupOptions { - all: true; - } - - export interface LookupAddress { - address: string; - family: number; - } - - export function lookup(hostname: string, family: number, callback: (err: NodeJS.ErrnoException, address: string, family: number) => void): void; - export function lookup(hostname: string, options: LookupOneOptions, callback: (err: NodeJS.ErrnoException, address: string, family: number) => void): void; - export function lookup(hostname: string, options: LookupAllOptions, callback: (err: NodeJS.ErrnoException, addresses: LookupAddress[]) => void): void; - export function lookup(hostname: string, options: LookupOptions, callback: (err: NodeJS.ErrnoException, address: string | LookupAddress[], family: number) => void): void; - export function lookup(hostname: string, callback: (err: NodeJS.ErrnoException, address: string, family: number) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace lookup { - export function __promisify__(hostname: string, options: LookupAllOptions): Promise<{ address: LookupAddress[] }>; - export function __promisify__(hostname: string, options?: LookupOneOptions | number): Promise<{ address: string, family: number }>; - export function __promisify__(hostname: string, options?: LookupOptions | number): Promise<{ address: string | LookupAddress[], family?: number }>; - } - - export function lookupService(address: string, port: number, callback: (err: NodeJS.ErrnoException, hostname: string, service: string) => void): void; - - export namespace lookupService { - export function __promisify__(address: string, port: number): Promise<{ hostname: string, service: string }>; - } - - export interface ResolveOptions { - ttl: boolean; - } - - export interface ResolveWithTtlOptions extends ResolveOptions { - ttl: true; - } - - export interface RecordWithTtl { - address: string; - ttl: number; - } - - /** @deprecated Use AnyARecord or AnyAaaaRecord instead. */ - export type AnyRecordWithTtl = AnyARecord | AnyAaaaRecord; - - export interface AnyARecord extends RecordWithTtl { - type: "A"; - } - - export interface AnyAaaaRecord extends RecordWithTtl { - type: "AAAA"; - } - - export interface MxRecord { - priority: number; - exchange: string; - } - - export interface AnyMxRecord extends MxRecord { - type: "MX"; - } - - export interface NaptrRecord { - flags: string; - service: string; - regexp: string; - replacement: string; - order: number; - preference: number; - } - - export interface AnyNaptrRecord extends NaptrRecord { - type: "NAPTR"; - } - - export interface SoaRecord { - nsname: string; - hostmaster: string; - serial: number; - refresh: number; - retry: number; - expire: number; - minttl: number; - } - - export interface AnySoaRecord extends SoaRecord { - type: "SOA"; - } - - export interface SrvRecord { - priority: number; - weight: number; - port: number; - name: string; - } - - export interface AnySrvRecord extends SrvRecord { - type: "SRV"; - } - - export interface AnyTxtRecord { - type: "TXT"; - entries: string[]; - } - - export interface AnyNsRecord { - type: "NS"; - value: string; - } - - export interface AnyPtrRecord { - type: "PTR"; - value: string; - } - - export interface AnyCnameRecord { - type: "CNAME"; - value: string; - } - - export type AnyRecord = AnyARecord | - AnyAaaaRecord | - AnyCnameRecord | - AnyMxRecord | - AnyNaptrRecord | - AnyNsRecord | - AnyPtrRecord | - AnySoaRecord | - AnySrvRecord | - AnyTxtRecord; - - export function resolve(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve(hostname: string, rrtype: "A", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve(hostname: string, rrtype: "AAAA", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve(hostname: string, rrtype: "ANY", callback: (err: NodeJS.ErrnoException, addresses: AnyRecord[]) => void): void; - export function resolve(hostname: string, rrtype: "CNAME", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve(hostname: string, rrtype: "MX", callback: (err: NodeJS.ErrnoException, addresses: MxRecord[]) => void): void; - export function resolve(hostname: string, rrtype: "NAPTR", callback: (err: NodeJS.ErrnoException, addresses: NaptrRecord[]) => void): void; - export function resolve(hostname: string, rrtype: "NS", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve(hostname: string, rrtype: "PTR", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve(hostname: string, rrtype: "SOA", callback: (err: NodeJS.ErrnoException, addresses: SoaRecord) => void): void; - export function resolve(hostname: string, rrtype: "SRV", callback: (err: NodeJS.ErrnoException, addresses: SrvRecord[]) => void): void; - export function resolve(hostname: string, rrtype: "TXT", callback: (err: NodeJS.ErrnoException, addresses: string[][]) => void): void; - export function resolve(hostname: string, rrtype: string, callback: (err: NodeJS.ErrnoException, addresses: string[] | MxRecord[] | NaptrRecord[] | SoaRecord | SrvRecord[] | string[][] | AnyRecord[]) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace resolve { - export function __promisify__(hostname: string, rrtype?: "A" | "AAAA" | "CNAME" | "NS" | "PTR"): Promise; - export function __promisify__(hostname: string, rrtype: "ANY"): Promise; - export function __promisify__(hostname: string, rrtype: "MX"): Promise; - export function __promisify__(hostname: string, rrtype: "NAPTR"): Promise; - export function __promisify__(hostname: string, rrtype: "SOA"): Promise; - export function __promisify__(hostname: string, rrtype: "SRV"): Promise; - export function __promisify__(hostname: string, rrtype: "TXT"): Promise; - export function __promisify__(hostname: string, rrtype: string): Promise; - } - - export function resolve4(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve4(hostname: string, options: ResolveWithTtlOptions, callback: (err: NodeJS.ErrnoException, addresses: RecordWithTtl[]) => void): void; - export function resolve4(hostname: string, options: ResolveOptions, callback: (err: NodeJS.ErrnoException, addresses: string[] | RecordWithTtl[]) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace resolve4 { - export function __promisify__(hostname: string): Promise; - export function __promisify__(hostname: string, options: ResolveWithTtlOptions): Promise; - export function __promisify__(hostname: string, options?: ResolveOptions): Promise; - } - - export function resolve6(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve6(hostname: string, options: ResolveWithTtlOptions, callback: (err: NodeJS.ErrnoException, addresses: RecordWithTtl[]) => void): void; - export function resolve6(hostname: string, options: ResolveOptions, callback: (err: NodeJS.ErrnoException, addresses: string[] | RecordWithTtl[]) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace resolve6 { - export function __promisify__(hostname: string): Promise; - export function __promisify__(hostname: string, options: ResolveWithTtlOptions): Promise; - export function __promisify__(hostname: string, options?: ResolveOptions): Promise; - } - - export function resolveCname(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export namespace resolveCname { - export function __promisify__(hostname: string): Promise; - } - - export function resolveMx(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: MxRecord[]) => void): void; - export namespace resolveMx { - export function __promisify__(hostname: string): Promise; - } - - export function resolveNaptr(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: NaptrRecord[]) => void): void; - export namespace resolveNaptr { - export function __promisify__(hostname: string): Promise; - } - - export function resolveNs(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export namespace resolveNs { - export function __promisify__(hostname: string): Promise; - } - - export function resolvePtr(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export namespace resolvePtr { - export function __promisify__(hostname: string): Promise; - } - - export function resolveSoa(hostname: string, callback: (err: NodeJS.ErrnoException, address: SoaRecord) => void): void; - export namespace resolveSoa { - export function __promisify__(hostname: string): Promise; - } - - export function resolveSrv(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: SrvRecord[]) => void): void; - export namespace resolveSrv { - export function __promisify__(hostname: string): Promise; - } - - export function resolveTxt(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[][]) => void): void; - export namespace resolveTxt { - export function __promisify__(hostname: string): Promise; - } - - export function resolveAny(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: AnyRecord[]) => void): void; - export namespace resolveAny { - export function __promisify__(hostname: string): Promise; - } - - export function reverse(ip: string, callback: (err: NodeJS.ErrnoException, hostnames: string[]) => void): void; - export function setServers(servers: string[]): void; - - // Error codes - export var NODATA: string; - export var FORMERR: string; - export var SERVFAIL: string; - export var NOTFOUND: string; - export var NOTIMP: string; - export var REFUSED: string; - export var BADQUERY: string; - export var BADNAME: string; - export var BADFAMILY: string; - export var BADRESP: string; - export var CONNREFUSED: string; - export var TIMEOUT: string; - export var EOF: string; - export var FILE: string; - export var NOMEM: string; - export var DESTRUCTION: string; - export var BADSTR: string; - export var BADFLAGS: string; - export var NONAME: string; - export var BADHINTS: string; - export var NOTINITIALIZED: string; - export var LOADIPHLPAPI: string; - export var ADDRGETNETWORKPARAMS: string; - export var CANCELLED: string; -} - -declare module "net" { - import * as stream from "stream"; - import * as events from "events"; - import * as dns from "dns"; - - type LookupFunction = (hostname: string, options: dns.LookupOneOptions, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void) => void; - - export interface AddressInfo { - address: string; - family: string; - port: number; - } - - export interface SocketConstructorOpts { - fd?: number; - allowHalfOpen?: boolean; - readable?: boolean; - writable?: boolean; - } - - export interface TcpSocketConnectOpts { - port: number; - host?: string; - localAddress?: string; - localPort?: number; - hints?: number; - family?: number; - lookup?: LookupFunction; - } - - export interface IpcSocketConnectOpts { - path: string; - } - - export type SocketConnectOpts = TcpSocketConnectOpts | IpcSocketConnectOpts; - - export class Socket extends stream.Duplex { - constructor(options?: SocketConstructorOpts); - - // Extended base methods - write(buffer: Buffer): boolean; - write(buffer: Buffer, cb?: Function): boolean; - write(str: string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - write(str: string, encoding?: string, fd?: string): boolean; - write(data: any, encoding?: string, callback?: Function): void; - - connect(options: SocketConnectOpts, connectionListener?: Function): this; - connect(port: number, host: string, connectionListener?: Function): this; - connect(port: number, connectionListener?: Function): this; - connect(path: string, connectionListener?: Function): this; - - bufferSize: number; - setEncoding(encoding?: string): this; - pause(): this; - resume(): this; - setTimeout(timeout: number, callback?: Function): this; - setNoDelay(noDelay?: boolean): this; - setKeepAlive(enable?: boolean, initialDelay?: number): this; - address(): AddressInfo | string; - unref(): void; - ref(): void; - - remoteAddress?: string; - remoteFamily?: string; - remotePort?: number; - localAddress: string; - localPort: number; - bytesRead: number; - bytesWritten: number; - connecting: boolean; - destroyed: boolean; - - // Extended base methods - end(): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - end(data?: any, encoding?: string): void; - - /** - * events.EventEmitter - * 1. close - * 2. connect - * 3. data - * 4. drain - * 5. end - * 6. error - * 7. lookup - * 8. timeout - */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "close", listener: (had_error: boolean) => void): this; - addListener(event: "connect", listener: () => void): this; - addListener(event: "data", listener: (data: Buffer) => void): this; - addListener(event: "drain", listener: () => void): this; - addListener(event: "end", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; - addListener(event: "timeout", listener: () => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close", had_error: boolean): boolean; - emit(event: "connect"): boolean; - emit(event: "data", data: Buffer): boolean; - emit(event: "drain"): boolean; - emit(event: "end"): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "lookup", err: Error, address: string, family: string | number, host: string): boolean; - emit(event: "timeout"): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "close", listener: (had_error: boolean) => void): this; - on(event: "connect", listener: () => void): this; - on(event: "data", listener: (data: Buffer) => void): this; - on(event: "drain", listener: () => void): this; - on(event: "end", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; - on(event: "timeout", listener: () => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "close", listener: (had_error: boolean) => void): this; - once(event: "connect", listener: () => void): this; - once(event: "data", listener: (data: Buffer) => void): this; - once(event: "drain", listener: () => void): this; - once(event: "end", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; - once(event: "timeout", listener: () => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "close", listener: (had_error: boolean) => void): this; - prependListener(event: "connect", listener: () => void): this; - prependListener(event: "data", listener: (data: Buffer) => void): this; - prependListener(event: "drain", listener: () => void): this; - prependListener(event: "end", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; - prependListener(event: "timeout", listener: () => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "close", listener: (had_error: boolean) => void): this; - prependOnceListener(event: "connect", listener: () => void): this; - prependOnceListener(event: "data", listener: (data: Buffer) => void): this; - prependOnceListener(event: "drain", listener: () => void): this; - prependOnceListener(event: "end", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; - prependOnceListener(event: "timeout", listener: () => void): this; - } - - export interface ListenOptions { - port?: number; - host?: string; - backlog?: number; - path?: string; - exclusive?: boolean; - readableAll?: boolean; - writableAll?: boolean; - } - - // https://github.com/nodejs/node/blob/master/lib/net.js - export class Server extends events.EventEmitter { - constructor(connectionListener?: (socket: Socket) => void); - constructor(options?: { allowHalfOpen?: boolean, pauseOnConnect?: boolean }, connectionListener?: (socket: Socket) => void); - - listen(port?: number, hostname?: string, backlog?: number, listeningListener?: Function): this; - listen(port?: number, hostname?: string, listeningListener?: Function): this; - listen(port?: number, backlog?: number, listeningListener?: Function): this; - listen(port?: number, listeningListener?: Function): this; - listen(path: string, backlog?: number, listeningListener?: Function): this; - listen(path: string, listeningListener?: Function): this; - listen(options: ListenOptions, listeningListener?: Function): this; - listen(handle: any, backlog?: number, listeningListener?: Function): this; - listen(handle: any, listeningListener?: Function): this; - close(callback?: Function): this; - address(): AddressInfo | string; - getConnections(cb: (error: Error | null, count: number) => void): void; - ref(): this; - unref(): this; - maxConnections: number; - connections: number; - listening: boolean; - - /** - * events.EventEmitter - * 1. close - * 2. connection - * 3. error - * 4. listening - */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "connection", listener: (socket: Socket) => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "listening", listener: () => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close"): boolean; - emit(event: "connection", socket: Socket): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "listening"): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "close", listener: () => void): this; - on(event: "connection", listener: (socket: Socket) => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "listening", listener: () => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "close", listener: () => void): this; - once(event: "connection", listener: (socket: Socket) => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "listening", listener: () => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "connection", listener: (socket: Socket) => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "listening", listener: () => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "connection", listener: (socket: Socket) => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "listening", listener: () => void): this; - } - - export interface TcpNetConnectOpts extends TcpSocketConnectOpts, SocketConstructorOpts { - timeout?: number; - } - - export interface IpcNetConnectOpts extends IpcSocketConnectOpts, SocketConstructorOpts { - timeout?: number; - } - - export type NetConnectOpts = TcpNetConnectOpts | IpcNetConnectOpts; - - export function createServer(connectionListener?: (socket: Socket) => void): Server; - export function createServer(options?: { allowHalfOpen?: boolean, pauseOnConnect?: boolean }, connectionListener?: (socket: Socket) => void): Server; - export function connect(options: NetConnectOpts, connectionListener?: Function): Socket; - export function connect(port: number, host?: string, connectionListener?: Function): Socket; - export function connect(path: string, connectionListener?: Function): Socket; - export function createConnection(options: NetConnectOpts, connectionListener?: Function): Socket; - export function createConnection(port: number, host?: string, connectionListener?: Function): Socket; - export function createConnection(path: string, connectionListener?: Function): Socket; - export function isIP(input: string): number; - export function isIPv4(input: string): boolean; - export function isIPv6(input: string): boolean; -} - -declare module "dgram" { - import { AddressInfo } from "net"; - import * as dns from "dns"; - import * as events from "events"; - - export interface RemoteInfo { - address: string; - family: string; - port: number; - } - - export interface BindOptions { - port: number; - address?: string; - exclusive?: boolean; - } - - type SocketType = "udp4" | "udp6"; - - export interface SocketOptions { - type: SocketType; - reuseAddr?: boolean; - recvBufferSize?: number; - sendBufferSize?: number; - lookup?: (hostname: string, options: dns.LookupOneOptions, callback: (err: NodeJS.ErrnoException, address: string, family: number) => void) => void; - } - - export function createSocket(type: SocketType, callback?: (msg: Buffer, rinfo: RemoteInfo) => void): Socket; - export function createSocket(options: SocketOptions, callback?: (msg: Buffer, rinfo: RemoteInfo) => void): Socket; - - export class Socket extends events.EventEmitter { - send(msg: Buffer | string | Uint8Array | any[], port: number, address?: string, callback?: (error: Error | null, bytes: number) => void): void; - send(msg: Buffer | string | Uint8Array, offset: number, length: number, port: number, address?: string, callback?: (error: Error | null, bytes: number) => void): void; - bind(port?: number, address?: string, callback?: () => void): void; - bind(port?: number, callback?: () => void): void; - bind(callback?: () => void): void; - bind(options: BindOptions, callback?: Function): void; - close(callback?: () => void): void; - address(): AddressInfo | string; - setBroadcast(flag: boolean): void; - setTTL(ttl: number): void; - setMulticastTTL(ttl: number): void; - setMulticastInterface(multicastInterface: string): void; - setMulticastLoopback(flag: boolean): void; - addMembership(multicastAddress: string, multicastInterface?: string): void; - dropMembership(multicastAddress: string, multicastInterface?: string): void; - ref(): this; - unref(): this; - setRecvBufferSize(size: number): void; - setSendBufferSize(size: number): void; - getRecvBufferSize(): number; - getSendBufferSize(): number; - - /** - * events.EventEmitter - * 1. close - * 2. error - * 3. listening - * 4. message - */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "listening", listener: () => void): this; - addListener(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close"): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "listening"): boolean; - emit(event: "message", msg: Buffer, rinfo: AddressInfo): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "close", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "listening", listener: () => void): this; - on(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "close", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "listening", listener: () => void): this; - once(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "listening", listener: () => void): this; - prependListener(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "listening", listener: () => void): this; - prependOnceListener(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; - } -} - -declare module "fs" { - import * as stream from "stream"; - import * as events from "events"; - import { URL } from "url"; - - /** - * Valid types for path values in "fs". - */ - export type PathLike = string | Buffer | URL; - - export class Stats { - isFile(): boolean; - isDirectory(): boolean; - isBlockDevice(): boolean; - isCharacterDevice(): boolean; - isSymbolicLink(): boolean; - isFIFO(): boolean; - isSocket(): boolean; - dev: number; - ino: number; - mode: number; - nlink: number; - uid: number; - gid: number; - rdev: number; - size: number; - blksize: number; - blocks: number; - atimeMs: number; - mtimeMs: number; - ctimeMs: number; - birthtimeMs: number; - atime: Date; - mtime: Date; - ctime: Date; - birthtime: Date; - } - - export interface FSWatcher extends events.EventEmitter { - close(): void; - - /** - * events.EventEmitter - * 1. change - * 2. error - */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; - addListener(event: "error", listener: (error: Error) => void): this; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; - on(event: "error", listener: (error: Error) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; - once(event: "error", listener: (error: Error) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; - prependListener(event: "error", listener: (error: Error) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; - prependOnceListener(event: "error", listener: (error: Error) => void): this; - } - - export class ReadStream extends stream.Readable { - close(): void; - bytesRead: number; - path: string | Buffer; - - /** - * events.EventEmitter - * 1. open - * 2. close - */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "open", listener: (fd: number) => void): this; - addListener(event: "close", listener: () => void): this; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "open", listener: (fd: number) => void): this; - on(event: "close", listener: () => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "open", listener: (fd: number) => void): this; - once(event: "close", listener: () => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "open", listener: (fd: number) => void): this; - prependListener(event: "close", listener: () => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "open", listener: (fd: number) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - } - - export class WriteStream extends stream.Writable { - close(): void; - bytesWritten: number; - path: string | Buffer; - - /** - * events.EventEmitter - * 1. open - * 2. close - */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "open", listener: (fd: number) => void): this; - addListener(event: "close", listener: () => void): this; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "open", listener: (fd: number) => void): this; - on(event: "close", listener: () => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "open", listener: (fd: number) => void): this; - once(event: "close", listener: () => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "open", listener: (fd: number) => void): this; - prependListener(event: "close", listener: () => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "open", listener: (fd: number) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - } - - /** - * Asynchronous rename(2) - Change the name or location of a file or directory. - * @param oldPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function rename(oldPath: PathLike, newPath: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace rename { - /** - * Asynchronous rename(2) - Change the name or location of a file or directory. - * @param oldPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function __promisify__(oldPath: PathLike, newPath: PathLike): Promise; - } - - /** - * Synchronous rename(2) - Change the name or location of a file or directory. - * @param oldPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function renameSync(oldPath: PathLike, newPath: PathLike): void; - - /** - * Asynchronous truncate(2) - Truncate a file to a specified length. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param len If not specified, defaults to `0`. - */ - export function truncate(path: PathLike, len: number | undefined | null, callback: (err: NodeJS.ErrnoException) => void): void; - - /** - * Asynchronous truncate(2) - Truncate a file to a specified length. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function truncate(path: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace truncate { - /** - * Asynchronous truncate(2) - Truncate a file to a specified length. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param len If not specified, defaults to `0`. - */ - export function __promisify__(path: PathLike, len?: number | null): Promise; - } - - /** - * Synchronous truncate(2) - Truncate a file to a specified length. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param len If not specified, defaults to `0`. - */ - export function truncateSync(path: PathLike, len?: number | null): void; - - /** - * Asynchronous ftruncate(2) - Truncate a file to a specified length. - * @param fd A file descriptor. - * @param len If not specified, defaults to `0`. - */ - export function ftruncate(fd: number, len: number | undefined | null, callback: (err: NodeJS.ErrnoException) => void): void; - - /** - * Asynchronous ftruncate(2) - Truncate a file to a specified length. - * @param fd A file descriptor. - */ - export function ftruncate(fd: number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace ftruncate { - /** - * Asynchronous ftruncate(2) - Truncate a file to a specified length. - * @param fd A file descriptor. - * @param len If not specified, defaults to `0`. - */ - export function __promisify__(fd: number, len?: number | null): Promise; - } - - /** - * Synchronous ftruncate(2) - Truncate a file to a specified length. - * @param fd A file descriptor. - * @param len If not specified, defaults to `0`. - */ - export function ftruncateSync(fd: number, len?: number | null): void; - - /** - * Asynchronous chown(2) - Change ownership of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function chown(path: PathLike, uid: number, gid: number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace chown { - /** - * Asynchronous chown(2) - Change ownership of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function __promisify__(path: PathLike, uid: number, gid: number): Promise; - } - - /** - * Synchronous chown(2) - Change ownership of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function chownSync(path: PathLike, uid: number, gid: number): void; - - /** - * Asynchronous fchown(2) - Change ownership of a file. - * @param fd A file descriptor. - */ - export function fchown(fd: number, uid: number, gid: number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace fchown { - /** - * Asynchronous fchown(2) - Change ownership of a file. - * @param fd A file descriptor. - */ - export function __promisify__(fd: number, uid: number, gid: number): Promise; - } - - /** - * Synchronous fchown(2) - Change ownership of a file. - * @param fd A file descriptor. - */ - export function fchownSync(fd: number, uid: number, gid: number): void; - - /** - * Asynchronous lchown(2) - Change ownership of a file. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function lchown(path: PathLike, uid: number, gid: number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace lchown { - /** - * Asynchronous lchown(2) - Change ownership of a file. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function __promisify__(path: PathLike, uid: number, gid: number): Promise; - } - - /** - * Synchronous lchown(2) - Change ownership of a file. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function lchownSync(path: PathLike, uid: number, gid: number): void; - - /** - * Asynchronous chmod(2) - Change permissions of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - export function chmod(path: PathLike, mode: string | number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace chmod { - /** - * Asynchronous chmod(2) - Change permissions of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - export function __promisify__(path: PathLike, mode: string | number): Promise; - } - - /** - * Synchronous chmod(2) - Change permissions of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - export function chmodSync(path: PathLike, mode: string | number): void; - - /** - * Asynchronous fchmod(2) - Change permissions of a file. - * @param fd A file descriptor. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - export function fchmod(fd: number, mode: string | number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace fchmod { - /** - * Asynchronous fchmod(2) - Change permissions of a file. - * @param fd A file descriptor. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - export function __promisify__(fd: number, mode: string | number): Promise; - } - - /** - * Synchronous fchmod(2) - Change permissions of a file. - * @param fd A file descriptor. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - export function fchmodSync(fd: number, mode: string | number): void; - - /** - * Asynchronous lchmod(2) - Change permissions of a file. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - export function lchmod(path: PathLike, mode: string | number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace lchmod { - /** - * Asynchronous lchmod(2) - Change permissions of a file. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - export function __promisify__(path: PathLike, mode: string | number): Promise; - } - - /** - * Synchronous lchmod(2) - Change permissions of a file. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - export function lchmodSync(path: PathLike, mode: string | number): void; - - /** - * Asynchronous stat(2) - Get file status. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function stat(path: PathLike, callback: (err: NodeJS.ErrnoException, stats: Stats) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace stat { - /** - * Asynchronous stat(2) - Get file status. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function __promisify__(path: PathLike): Promise; - } - - /** - * Synchronous stat(2) - Get file status. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function statSync(path: PathLike): Stats; - - /** - * Asynchronous fstat(2) - Get file status. - * @param fd A file descriptor. - */ - export function fstat(fd: number, callback: (err: NodeJS.ErrnoException, stats: Stats) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace fstat { - /** - * Asynchronous fstat(2) - Get file status. - * @param fd A file descriptor. - */ - export function __promisify__(fd: number): Promise; - } - - /** - * Synchronous fstat(2) - Get file status. - * @param fd A file descriptor. - */ - export function fstatSync(fd: number): Stats; - - /** - * Asynchronous lstat(2) - Get file status. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function lstat(path: PathLike, callback: (err: NodeJS.ErrnoException, stats: Stats) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace lstat { - /** - * Asynchronous lstat(2) - Get file status. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function __promisify__(path: PathLike): Promise; - } - - /** - * Synchronous lstat(2) - Get file status. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function lstatSync(path: PathLike): Stats; - - /** - * Asynchronous link(2) - Create a new link (also known as a hard link) to an existing file. - * @param existingPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function link(existingPath: PathLike, newPath: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace link { - /** - * Asynchronous link(2) - Create a new link (also known as a hard link) to an existing file. - * @param existingPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function link(existingPath: PathLike, newPath: PathLike): Promise; - } - - /** - * Synchronous link(2) - Create a new link (also known as a hard link) to an existing file. - * @param existingPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function linkSync(existingPath: PathLike, newPath: PathLike): void; - - /** - * Asynchronous symlink(2) - Create a new symbolic link to an existing file. - * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. - * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. - * @param type May be set to `'dir'`, `'file'`, or `'junction'` (default is `'file'`) and is only available on Windows (ignored on other platforms). - * When using `'junction'`, the `target` argument will automatically be normalized to an absolute path. - */ - export function symlink(target: PathLike, path: PathLike, type: symlink.Type | undefined | null, callback: (err: NodeJS.ErrnoException) => void): void; - - /** - * Asynchronous symlink(2) - Create a new symbolic link to an existing file. - * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. - * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. - */ - export function symlink(target: PathLike, path: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace symlink { - /** - * Asynchronous symlink(2) - Create a new symbolic link to an existing file. - * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. - * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. - * @param type May be set to `'dir'`, `'file'`, or `'junction'` (default is `'file'`) and is only available on Windows (ignored on other platforms). - * When using `'junction'`, the `target` argument will automatically be normalized to an absolute path. - */ - export function __promisify__(target: PathLike, path: PathLike, type?: string | null): Promise; - - export type Type = "dir" | "file" | "junction"; - } - - /** - * Synchronous symlink(2) - Create a new symbolic link to an existing file. - * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. - * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. - * @param type May be set to `'dir'`, `'file'`, or `'junction'` (default is `'file'`) and is only available on Windows (ignored on other platforms). - * When using `'junction'`, the `target` argument will automatically be normalized to an absolute path. - */ - export function symlinkSync(target: PathLike, path: PathLike, type?: symlink.Type | null): void; - - /** - * Asynchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readlink(path: PathLike, options: { encoding?: BufferEncoding | null } | BufferEncoding | undefined | null, callback: (err: NodeJS.ErrnoException, linkString: string) => void): void; - - /** - * Asynchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readlink(path: PathLike, options: { encoding: "buffer" } | "buffer", callback: (err: NodeJS.ErrnoException, linkString: Buffer) => void): void; - - /** - * Asynchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readlink(path: PathLike, options: { encoding?: string | null } | string | undefined | null, callback: (err: NodeJS.ErrnoException, linkString: string | Buffer) => void): void; - - /** - * Asynchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function readlink(path: PathLike, callback: (err: NodeJS.ErrnoException, linkString: string) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace readlink { - /** - * Asynchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(path: PathLike, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): Promise; - - /** - * Asynchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(path: PathLike, options: { encoding: "buffer" } | "buffer"): Promise; - - /** - * Asynchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(path: PathLike, options?: { encoding?: string | null } | string | null): Promise; - } - - /** - * Synchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readlinkSync(path: PathLike, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): string; - - /** - * Synchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readlinkSync(path: PathLike, options: { encoding: "buffer" } | "buffer"): Buffer; - - /** - * Synchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readlinkSync(path: PathLike, options?: { encoding?: string | null } | string | null): string | Buffer; - - /** - * Asynchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function realpath(path: PathLike, options: { encoding?: BufferEncoding | null } | BufferEncoding | undefined | null, callback: (err: NodeJS.ErrnoException, resolvedPath: string) => void): void; - - /** - * Asynchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function realpath(path: PathLike, options: { encoding: "buffer" } | "buffer", callback: (err: NodeJS.ErrnoException, resolvedPath: Buffer) => void): void; - - /** - * Asynchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function realpath(path: PathLike, options: { encoding?: string | null } | string | undefined | null, callback: (err: NodeJS.ErrnoException, resolvedPath: string | Buffer) => void): void; - - /** - * Asynchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function realpath(path: PathLike, callback: (err: NodeJS.ErrnoException, resolvedPath: string) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace realpath { - /** - * Asynchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(path: PathLike, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): Promise; - - /** - * Asynchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(path: PathLike, options: { encoding: "buffer" } | "buffer"): Promise; - - /** - * Asynchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(path: PathLike, options?: { encoding?: string | null } | string | null): Promise; - - export function native(path: PathLike, options: { encoding?: BufferEncoding | null } | BufferEncoding | undefined | null, callback: (err: NodeJS.ErrnoException, resolvedPath: string) => void): void; - export function native(path: PathLike, options: { encoding: "buffer" } | "buffer", callback: (err: NodeJS.ErrnoException, resolvedPath: Buffer) => void): void; - export function native(path: PathLike, options: { encoding?: string | null } | string | undefined | null, callback: (err: NodeJS.ErrnoException, resolvedPath: string | Buffer) => void): void; - export function native(path: PathLike, callback: (err: NodeJS.ErrnoException, resolvedPath: string) => void): void; - } - - /** - * Synchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function realpathSync(path: PathLike, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): string; - - /** - * Synchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function realpathSync(path: PathLike, options: { encoding: "buffer" } | "buffer"): Buffer; - - /** - * Synchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function realpathSync(path: PathLike, options?: { encoding?: string | null } | string | null): string | Buffer; - - export namespace realpathSync { - export function native(path: PathLike, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): string; - export function native(path: PathLike, options: { encoding: "buffer" } | "buffer"): Buffer; - export function native(path: PathLike, options?: { encoding?: string | null } | string | null): string | Buffer; - } - - /** - * Asynchronous unlink(2) - delete a name and possibly the file it refers to. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function unlink(path: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace unlink { - /** - * Asynchronous unlink(2) - delete a name and possibly the file it refers to. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function __promisify__(path: PathLike): Promise; - } - - /** - * Synchronous unlink(2) - delete a name and possibly the file it refers to. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function unlinkSync(path: PathLike): void; - - /** - * Asynchronous rmdir(2) - delete a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function rmdir(path: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace rmdir { - /** - * Asynchronous rmdir(2) - delete a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function __promisify__(path: PathLike): Promise; - } - - /** - * Synchronous rmdir(2) - delete a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function rmdirSync(path: PathLike): void; - - /** - * Asynchronous mkdir(2) - create a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. - */ - export function mkdir(path: PathLike, mode: number | string | undefined | null, callback: (err: NodeJS.ErrnoException) => void): void; - - /** - * Asynchronous mkdir(2) - create a directory with a mode of `0o777`. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function mkdir(path: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace mkdir { - /** - * Asynchronous mkdir(2) - create a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. - */ - export function __promisify__(path: PathLike, mode?: number | string | null): Promise; - } - - /** - * Synchronous mkdir(2) - create a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. - */ - export function mkdirSync(path: PathLike, mode?: number | string | null): void; - - /** - * Asynchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function mkdtemp(prefix: string, options: { encoding?: BufferEncoding | null } | BufferEncoding | undefined | null, callback: (err: NodeJS.ErrnoException, folder: string) => void): void; - - /** - * Asynchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function mkdtemp(prefix: string, options: "buffer" | { encoding: "buffer" }, callback: (err: NodeJS.ErrnoException, folder: Buffer) => void): void; - - /** - * Asynchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function mkdtemp(prefix: string, options: { encoding?: string | null } | string | undefined | null, callback: (err: NodeJS.ErrnoException, folder: string | Buffer) => void): void; - - /** - * Asynchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - */ - export function mkdtemp(prefix: string, callback: (err: NodeJS.ErrnoException, folder: string) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace mkdtemp { - /** - * Asynchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(prefix: string, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): Promise; - - /** - * Asynchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(prefix: string, options: { encoding: "buffer" } | "buffer"): Promise; - - /** - * Asynchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(prefix: string, options?: { encoding?: string | null } | string | null): Promise; - } - - /** - * Synchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function mkdtempSync(prefix: string, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): string; - - /** - * Synchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function mkdtempSync(prefix: string, options: { encoding: "buffer" } | "buffer"): Buffer; - - /** - * Synchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function mkdtempSync(prefix: string, options?: { encoding?: string | null } | string | null): string | Buffer; - - /** - * Asynchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readdir(path: PathLike, options: { encoding: BufferEncoding | null } | BufferEncoding | undefined | null, callback: (err: NodeJS.ErrnoException, files: string[]) => void): void; - - /** - * Asynchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readdir(path: PathLike, options: { encoding: "buffer" } | "buffer", callback: (err: NodeJS.ErrnoException, files: Buffer[]) => void): void; - - /** - * Asynchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readdir(path: PathLike, options: { encoding?: string | null } | string | undefined | null, callback: (err: NodeJS.ErrnoException, files: string[] | Buffer[]) => void): void; - - /** - * Asynchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function readdir(path: PathLike, callback: (err: NodeJS.ErrnoException, files: string[]) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace readdir { - /** - * Asynchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(path: PathLike, options?: { encoding: BufferEncoding | null } | BufferEncoding | null): Promise; - - /** - * Asynchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(path: PathLike, options: "buffer" | { encoding: "buffer" }): Promise; - - /** - * Asynchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(path: PathLike, options?: { encoding?: string | null } | string | null): Promise; - } - - /** - * Synchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readdirSync(path: PathLike, options?: { encoding: BufferEncoding | null } | BufferEncoding | null): string[]; - - /** - * Synchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readdirSync(path: PathLike, options: { encoding: "buffer" } | "buffer"): Buffer[]; - - /** - * Synchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readdirSync(path: PathLike, options?: { encoding?: string | null } | string | null): string[] | Buffer[]; - - /** - * Asynchronous close(2) - close a file descriptor. - * @param fd A file descriptor. - */ - export function close(fd: number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace close { - /** - * Asynchronous close(2) - close a file descriptor. - * @param fd A file descriptor. - */ - export function __promisify__(fd: number): Promise; - } - - /** - * Synchronous close(2) - close a file descriptor. - * @param fd A file descriptor. - */ - export function closeSync(fd: number): void; - - /** - * Asynchronous open(2) - open and possibly create a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not supplied, defaults to `0o666`. - */ - export function open(path: PathLike, flags: string | number, mode: string | number | undefined | null, callback: (err: NodeJS.ErrnoException, fd: number) => void): void; - - /** - * Asynchronous open(2) - open and possibly create a file. If the file is created, its mode will be `0o666`. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function open(path: PathLike, flags: string | number, callback: (err: NodeJS.ErrnoException, fd: number) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace open { - /** - * Asynchronous open(2) - open and possibly create a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not supplied, defaults to `0o666`. - */ - export function __promisify__(path: PathLike, flags: string | number, mode?: string | number | null): Promise; - } - - /** - * Synchronous open(2) - open and possibly create a file, returning a file descriptor.. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not supplied, defaults to `0o666`. - */ - export function openSync(path: PathLike, flags: string | number, mode?: string | number | null): number; - - /** - * Asynchronously change file timestamps of the file referenced by the supplied path. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param atime The last access time. If a string is provided, it will be coerced to number. - * @param mtime The last modified time. If a string is provided, it will be coerced to number. - */ - export function utimes(path: PathLike, atime: string | number | Date, mtime: string | number | Date, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace utimes { - /** - * Asynchronously change file timestamps of the file referenced by the supplied path. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param atime The last access time. If a string is provided, it will be coerced to number. - * @param mtime The last modified time. If a string is provided, it will be coerced to number. - */ - export function __promisify__(path: PathLike, atime: string | number | Date, mtime: string | number | Date): Promise; - } - - /** - * Synchronously change file timestamps of the file referenced by the supplied path. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param atime The last access time. If a string is provided, it will be coerced to number. - * @param mtime The last modified time. If a string is provided, it will be coerced to number. - */ - export function utimesSync(path: PathLike, atime: string | number | Date, mtime: string | number | Date): void; - - /** - * Asynchronously change file timestamps of the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param atime The last access time. If a string is provided, it will be coerced to number. - * @param mtime The last modified time. If a string is provided, it will be coerced to number. - */ - export function futimes(fd: number, atime: string | number | Date, mtime: string | number | Date, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace futimes { - /** - * Asynchronously change file timestamps of the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param atime The last access time. If a string is provided, it will be coerced to number. - * @param mtime The last modified time. If a string is provided, it will be coerced to number. - */ - export function __promisify__(fd: number, atime: string | number | Date, mtime: string | number | Date): Promise; - } - - /** - * Synchronously change file timestamps of the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param atime The last access time. If a string is provided, it will be coerced to number. - * @param mtime The last modified time. If a string is provided, it will be coerced to number. - */ - export function futimesSync(fd: number, atime: string | number | Date, mtime: string | number | Date): void; - - /** - * Asynchronous fsync(2) - synchronize a file's in-core state with the underlying storage device. - * @param fd A file descriptor. - */ - export function fsync(fd: number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace fsync { - /** - * Asynchronous fsync(2) - synchronize a file's in-core state with the underlying storage device. - * @param fd A file descriptor. - */ - export function __promisify__(fd: number): Promise; - } - - /** - * Synchronous fsync(2) - synchronize a file's in-core state with the underlying storage device. - * @param fd A file descriptor. - */ - export function fsyncSync(fd: number): void; - - /** - * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. - * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. - * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. - */ - export function write(fd: number, buffer: TBuffer, offset: number | undefined | null, length: number | undefined | null, position: number | undefined | null, callback: (err: NodeJS.ErrnoException, written: number, buffer: TBuffer) => void): void; - - /** - * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. - * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. - */ - export function write(fd: number, buffer: TBuffer, offset: number | undefined | null, length: number | undefined | null, callback: (err: NodeJS.ErrnoException, written: number, buffer: TBuffer) => void): void; - - /** - * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. - */ - export function write(fd: number, buffer: TBuffer, offset: number | undefined | null, callback: (err: NodeJS.ErrnoException, written: number, buffer: TBuffer) => void): void; - - /** - * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - */ - export function write(fd: number, buffer: TBuffer, callback: (err: NodeJS.ErrnoException, written: number, buffer: TBuffer) => void): void; - - /** - * Asynchronously writes `string` to the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param string A string to write. If something other than a string is supplied it will be coerced to a string. - * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. - * @param encoding The expected string encoding. - */ - export function write(fd: number, string: any, position: number | undefined | null, encoding: string | undefined | null, callback: (err: NodeJS.ErrnoException, written: number, str: string) => void): void; - - /** - * Asynchronously writes `string` to the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param string A string to write. If something other than a string is supplied it will be coerced to a string. - * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. - */ - export function write(fd: number, string: any, position: number | undefined | null, callback: (err: NodeJS.ErrnoException, written: number, str: string) => void): void; - - /** - * Asynchronously writes `string` to the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param string A string to write. If something other than a string is supplied it will be coerced to a string. - */ - export function write(fd: number, string: any, callback: (err: NodeJS.ErrnoException, written: number, str: string) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace write { - /** - * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. - * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. - * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. - */ - export function __promisify__(fd: number, buffer?: TBuffer, offset?: number, length?: number, position?: number | null): Promise<{ bytesWritten: number, buffer: TBuffer }>; - - /** - * Asynchronously writes `string` to the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param string A string to write. If something other than a string is supplied it will be coerced to a string. - * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. - * @param encoding The expected string encoding. - */ - export function __promisify__(fd: number, string: any, position?: number | null, encoding?: string | null): Promise<{ bytesWritten: number, buffer: string }>; - } - - /** - * Synchronously writes `buffer` to the file referenced by the supplied file descriptor, returning the number of bytes written. - * @param fd A file descriptor. - * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. - * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. - * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. - */ - export function writeSync(fd: number, buffer: Buffer | Uint8Array, offset?: number | null, length?: number | null, position?: number | null): number; - - /** - * Synchronously writes `string` to the file referenced by the supplied file descriptor, returning the number of bytes written. - * @param fd A file descriptor. - * @param string A string to write. If something other than a string is supplied it will be coerced to a string. - * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. - * @param encoding The expected string encoding. - */ - export function writeSync(fd: number, string: any, position?: number | null, encoding?: string | null): number; - - /** - * Asynchronously reads data from the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param buffer The buffer that the data will be written to. - * @param offset The offset in the buffer at which to start writing. - * @param length The number of bytes to read. - * @param position The offset from the beginning of the file from which data should be read. If `null`, data will be read from the current position. - */ - export function read(fd: number, buffer: TBuffer, offset: number, length: number, position: number | null, callback?: (err: NodeJS.ErrnoException, bytesRead: number, buffer: TBuffer) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace read { - /** - * @param fd A file descriptor. - * @param buffer The buffer that the data will be written to. - * @param offset The offset in the buffer at which to start writing. - * @param length The number of bytes to read. - * @param position The offset from the beginning of the file from which data should be read. If `null`, data will be read from the current position. - */ - export function __promisify__(fd: number, buffer: TBuffer, offset: number, length: number, position: number | null): Promise<{ bytesRead: number, buffer: TBuffer }>; - } - - /** - * Synchronously reads data from the file referenced by the supplied file descriptor, returning the number of bytes read. - * @param fd A file descriptor. - * @param buffer The buffer that the data will be written to. - * @param offset The offset in the buffer at which to start writing. - * @param length The number of bytes to read. - * @param position The offset from the beginning of the file from which data should be read. If `null`, data will be read from the current position. - */ - export function readSync(fd: number, buffer: Buffer | Uint8Array, offset: number, length: number, position: number | null): number; - - /** - * Asynchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param options An object that may contain an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - export function readFile(path: PathLike | number, options: { encoding?: null; flag?: string; } | undefined | null, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; - - /** - * Asynchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - export function readFile(path: PathLike | number, options: { encoding: string; flag?: string; } | string, callback: (err: NodeJS.ErrnoException, data: string) => void): void; - - /** - * Asynchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - export function readFile(path: PathLike | number, options: { encoding?: string | null; flag?: string; } | string | undefined | null, callback: (err: NodeJS.ErrnoException, data: string | Buffer) => void): void; - - /** - * Asynchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - */ - export function readFile(path: PathLike | number, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace readFile { - /** - * Asynchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param options An object that may contain an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - export function __promisify__(path: PathLike | number, options?: { encoding?: null; flag?: string; } | null): Promise; - - /** - * Asynchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - export function __promisify__(path: PathLike | number, options: { encoding: string; flag?: string; } | string): Promise; - - /** - * Asynchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - export function __promisify__(path: PathLike | number, options?: { encoding?: string | null; flag?: string; } | string | null): Promise; - } - - /** - * Synchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param options An object that may contain an optional flag. If a flag is not provided, it defaults to `'r'`. - */ - export function readFileSync(path: PathLike | number, options?: { encoding?: null; flag?: string; } | null): Buffer; - - /** - * Synchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - export function readFileSync(path: PathLike | number, options: { encoding: string; flag?: string; } | string): string; - - /** - * Synchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - export function readFileSync(path: PathLike | number, options?: { encoding?: string | null; flag?: string; } | string | null): string | Buffer; - - /** - * Asynchronously writes data to a file, replacing the file if it already exists. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. - * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `mode` is not supplied, the default of `0o666` is used. - * If `mode` is a string, it is parsed as an octal integer. - * If `flag` is not supplied, the default of `'w'` is used. - */ - export function writeFile(path: PathLike | number, data: any, options: { encoding?: string | null; mode?: number | string; flag?: string; } | string | undefined | null, callback: (err: NodeJS.ErrnoException) => void): void; - - /** - * Asynchronously writes data to a file, replacing the file if it already exists. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. - */ - export function writeFile(path: PathLike | number, data: any, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace writeFile { - /** - * Asynchronously writes data to a file, replacing the file if it already exists. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. - * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `mode` is not supplied, the default of `0o666` is used. - * If `mode` is a string, it is parsed as an octal integer. - * If `flag` is not supplied, the default of `'w'` is used. - */ - export function __promisify__(path: PathLike | number, data: any, options?: { encoding?: string | null; mode?: number | string; flag?: string; } | string | null): Promise; - } - - /** - * Synchronously writes data to a file, replacing the file if it already exists. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. - * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `mode` is not supplied, the default of `0o666` is used. - * If `mode` is a string, it is parsed as an octal integer. - * If `flag` is not supplied, the default of `'w'` is used. - */ - export function writeFileSync(path: PathLike | number, data: any, options?: { encoding?: string | null; mode?: number | string; flag?: string; } | string | null): void; - - /** - * Asynchronously append data to a file, creating the file if it does not exist. - * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. - * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `mode` is not supplied, the default of `0o666` is used. - * If `mode` is a string, it is parsed as an octal integer. - * If `flag` is not supplied, the default of `'a'` is used. - */ - export function appendFile(file: PathLike | number, data: any, options: { encoding?: string | null, mode?: string | number, flag?: string } | string | undefined | null, callback: (err: NodeJS.ErrnoException) => void): void; - - /** - * Asynchronously append data to a file, creating the file if it does not exist. - * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. - */ - export function appendFile(file: PathLike | number, data: any, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace appendFile { - /** - * Asynchronously append data to a file, creating the file if it does not exist. - * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. - * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `mode` is not supplied, the default of `0o666` is used. - * If `mode` is a string, it is parsed as an octal integer. - * If `flag` is not supplied, the default of `'a'` is used. - */ - export function __promisify__(file: PathLike | number, data: any, options?: { encoding?: string | null, mode?: string | number, flag?: string } | string | null): Promise; - } - - /** - * Synchronously append data to a file, creating the file if it does not exist. - * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. - * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `mode` is not supplied, the default of `0o666` is used. - * If `mode` is a string, it is parsed as an octal integer. - * If `flag` is not supplied, the default of `'a'` is used. - */ - export function appendFileSync(file: PathLike | number, data: any, options?: { encoding?: string | null; mode?: number | string; flag?: string; } | string | null): void; - - /** - * Watch for changes on `filename`. The callback `listener` will be called each time the file is accessed. - */ - export function watchFile(filename: PathLike, options: { persistent?: boolean; interval?: number; } | undefined, listener: (curr: Stats, prev: Stats) => void): void; - - /** - * Watch for changes on `filename`. The callback `listener` will be called each time the file is accessed. - * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function watchFile(filename: PathLike, listener: (curr: Stats, prev: Stats) => void): void; - - /** - * Stop watching for changes on `filename`. - * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function unwatchFile(filename: PathLike, listener?: (curr: Stats, prev: Stats) => void): void; - - /** - * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. - * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `persistent` is not supplied, the default of `true` is used. - * If `recursive` is not supplied, the default of `false` is used. - */ - export function watch(filename: PathLike, options: { encoding?: BufferEncoding | null, persistent?: boolean, recursive?: boolean } | BufferEncoding | undefined | null, listener?: (event: string, filename: string) => void): FSWatcher; - - /** - * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. - * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `persistent` is not supplied, the default of `true` is used. - * If `recursive` is not supplied, the default of `false` is used. - */ - export function watch(filename: PathLike, options: { encoding: "buffer", persistent?: boolean, recursive?: boolean } | "buffer", listener?: (event: string, filename: Buffer) => void): FSWatcher; - - /** - * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. - * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `persistent` is not supplied, the default of `true` is used. - * If `recursive` is not supplied, the default of `false` is used. - */ - export function watch(filename: PathLike, options: { encoding?: string | null, persistent?: boolean, recursive?: boolean } | string | null, listener?: (event: string, filename: string | Buffer) => void): FSWatcher; - - /** - * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. - * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function watch(filename: PathLike, listener?: (event: string, filename: string) => any): FSWatcher; - - /** - * Asynchronously tests whether or not the given path exists by checking with the file system. - * @deprecated - * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function exists(path: PathLike, callback: (exists: boolean) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace exists { - /** - * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - function __promisify__(path: PathLike): Promise; - } - - /** - * Synchronously tests whether or not the given path exists by checking with the file system. - * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function existsSync(path: PathLike): boolean; - - export namespace constants { - // File Access Constants - - /** Constant for fs.access(). File is visible to the calling process. */ - export const F_OK: number; - - /** Constant for fs.access(). File can be read by the calling process. */ - export const R_OK: number; - - /** Constant for fs.access(). File can be written by the calling process. */ - export const W_OK: number; - - /** Constant for fs.access(). File can be executed by the calling process. */ - export const X_OK: number; - - // File Copy Constants - - /** Constant for fs.copyFile. Flag indicating the destination file should not be overwritten if it already exists. */ - export const COPYFILE_EXCL: number; - - /** Constant for fs.copyFile. copy operation will attempt to create a copy-on-write reflink. If the underlying platform does not support copy-on-write, then a fallback copy mechanism is used. */ - export const COPYFILE_FICLONE: number; - - /** Constant for fs.copyFile. Copy operation will attempt to create a copy-on-write reflink. If the underlying platform does not support copy-on-write, then the operation will fail with an error. */ - export const COPYFILE_FICLONE_FORCE: number; - - // File Open Constants - - /** Constant for fs.open(). Flag indicating to open a file for read-only access. */ - export const O_RDONLY: number; - - /** Constant for fs.open(). Flag indicating to open a file for write-only access. */ - export const O_WRONLY: number; - - /** Constant for fs.open(). Flag indicating to open a file for read-write access. */ - export const O_RDWR: number; - - /** Constant for fs.open(). Flag indicating to create the file if it does not already exist. */ - export const O_CREAT: number; - - /** Constant for fs.open(). Flag indicating that opening a file should fail if the O_CREAT flag is set and the file already exists. */ - export const O_EXCL: number; - - /** Constant for fs.open(). Flag indicating that if path identifies a terminal device, opening the path shall not cause that terminal to become the controlling terminal for the process (if the process does not already have one). */ - export const O_NOCTTY: number; - - /** Constant for fs.open(). Flag indicating that if the file exists and is a regular file, and the file is opened successfully for write access, its length shall be truncated to zero. */ - export const O_TRUNC: number; - - /** Constant for fs.open(). Flag indicating that data will be appended to the end of the file. */ - export const O_APPEND: number; - - /** Constant for fs.open(). Flag indicating that the open should fail if the path is not a directory. */ - export const O_DIRECTORY: number; - - /** Constant for fs.open(). Flag indicating reading accesses to the file system will no longer result in an update to the atime information associated with the file. This flag is available on Linux operating systems only. */ - export const O_NOATIME: number; - - /** Constant for fs.open(). Flag indicating that the open should fail if the path is a symbolic link. */ - export const O_NOFOLLOW: number; - - /** Constant for fs.open(). Flag indicating that the file is opened for synchronous I/O. */ - export const O_SYNC: number; - - /** Constant for fs.open(). Flag indicating that the file is opened for synchronous I/O with write operations waiting for data integrity. */ - export const O_DSYNC: number; - - /** Constant for fs.open(). Flag indicating to open the symbolic link itself rather than the resource it is pointing to. */ - export const O_SYMLINK: number; - - /** Constant for fs.open(). When set, an attempt will be made to minimize caching effects of file I/O. */ - export const O_DIRECT: number; - - /** Constant for fs.open(). Flag indicating to open the file in nonblocking mode when possible. */ - export const O_NONBLOCK: number; - - // File Type Constants - - /** Constant for fs.Stats mode property for determining a file's type. Bit mask used to extract the file type code. */ - export const S_IFMT: number; - - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a regular file. */ - export const S_IFREG: number; - - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a directory. */ - export const S_IFDIR: number; - - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a character-oriented device file. */ - export const S_IFCHR: number; - - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a block-oriented device file. */ - export const S_IFBLK: number; - - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a FIFO/pipe. */ - export const S_IFIFO: number; - - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a symbolic link. */ - export const S_IFLNK: number; - - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a socket. */ - export const S_IFSOCK: number; - - // File Mode Constants - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by owner. */ - export const S_IRWXU: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by owner. */ - export const S_IRUSR: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by owner. */ - export const S_IWUSR: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by owner. */ - export const S_IXUSR: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by group. */ - export const S_IRWXG: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by group. */ - export const S_IRGRP: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by group. */ - export const S_IWGRP: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by group. */ - export const S_IXGRP: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by others. */ - export const S_IRWXO: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by others. */ - export const S_IROTH: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by others. */ - export const S_IWOTH: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by others. */ - export const S_IXOTH: number; - } - - /** - * Asynchronously tests a user's permissions for the file specified by path. - * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function access(path: PathLike, mode: number | undefined, callback: (err: NodeJS.ErrnoException) => void): void; - - /** - * Asynchronously tests a user's permissions for the file specified by path. - * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function access(path: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace access { - /** - * Asynchronously tests a user's permissions for the file specified by path. - * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function __promisify__(path: PathLike, mode?: number): Promise; - } - - /** - * Synchronously tests a user's permissions for the file specified by path. - * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function accessSync(path: PathLike, mode?: number): void; - - /** - * Returns a new `ReadStream` object. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function createReadStream(path: PathLike, options?: string | { - flags?: string; - encoding?: string; - fd?: number; - mode?: number; - autoClose?: boolean; - start?: number; - end?: number; - highWaterMark?: number; - }): ReadStream; - - /** - * Returns a new `WriteStream` object. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function createWriteStream(path: PathLike, options?: string | { - flags?: string; - encoding?: string; - fd?: number; - mode?: number; - autoClose?: boolean; - start?: number; - }): WriteStream; - - /** - * Asynchronous fdatasync(2) - synchronize a file's in-core state with storage device. - * @param fd A file descriptor. - */ - export function fdatasync(fd: number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace fdatasync { - /** - * Asynchronous fdatasync(2) - synchronize a file's in-core state with storage device. - * @param fd A file descriptor. - */ - export function __promisify__(fd: number): Promise; - } - - /** - * Synchronous fdatasync(2) - synchronize a file's in-core state with storage device. - * @param fd A file descriptor. - */ - export function fdatasyncSync(fd: number): void; - - /** - * Asynchronously copies src to dest. By default, dest is overwritten if it already exists. - * No arguments other than a possible exception are given to the callback function. - * Node.js makes no guarantees about the atomicity of the copy operation. - * If an error occurs after the destination file has been opened for writing, Node.js will attempt - * to remove the destination. - * @param src A path to the source file. - * @param dest A path to the destination file. - */ - export function copyFile(src: PathLike, dest: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - /** - * Asynchronously copies src to dest. By default, dest is overwritten if it already exists. - * No arguments other than a possible exception are given to the callback function. - * Node.js makes no guarantees about the atomicity of the copy operation. - * If an error occurs after the destination file has been opened for writing, Node.js will attempt - * to remove the destination. - * @param src A path to the source file. - * @param dest A path to the destination file. - * @param flags An integer that specifies the behavior of the copy operation. The only supported flag is fs.constants.COPYFILE_EXCL, which causes the copy operation to fail if dest already exists. - */ - export function copyFile(src: PathLike, dest: PathLike, flags: number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace copyFile { - /** - * Asynchronously copies src to dest. By default, dest is overwritten if it already exists. - * No arguments other than a possible exception are given to the callback function. - * Node.js makes no guarantees about the atomicity of the copy operation. - * If an error occurs after the destination file has been opened for writing, Node.js will attempt - * to remove the destination. - * @param src A path to the source file. - * @param dest A path to the destination file. - * @param flags An optional integer that specifies the behavior of the copy operation. The only supported flag is fs.constants.COPYFILE_EXCL, which causes the copy operation to fail if dest already exists. - */ - export function __promisify__(src: PathLike, dst: PathLike, flags?: number): Promise; - } - - /** - * Synchronously copies src to dest. By default, dest is overwritten if it already exists. - * Node.js makes no guarantees about the atomicity of the copy operation. - * If an error occurs after the destination file has been opened for writing, Node.js will attempt - * to remove the destination. - * @param src A path to the source file. - * @param dest A path to the destination file. - * @param flags An optional integer that specifies the behavior of the copy operation. The only supported flag is fs.constants.COPYFILE_EXCL, which causes the copy operation to fail if dest already exists. - */ - export function copyFileSync(src: PathLike, dest: PathLike, flags?: number): void; - - export namespace promises { - interface FileHandle { - /** - * Gets the file descriptor for this file handle. - */ - readonly fd: number; - - /** - * Asynchronously append data to a file, creating the file if it does not exist. The underlying file will _not_ be closed automatically. - * The `FileHandle` must have been opened for appending. - * @param data The data to write. If something other than a `Buffer` or `Uint8Array` is provided, the value is coerced to a string. - * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `mode` is not supplied, the default of `0o666` is used. - * If `mode` is a string, it is parsed as an octal integer. - * If `flag` is not supplied, the default of `'a'` is used. - */ - appendFile(data: any, options?: { encoding?: string | null, mode?: string | number, flag?: string | number } | string | null): Promise; - - /** - * Asynchronous fchown(2) - Change ownership of a file. - */ - chown(uid: number, gid: number): Promise; - - /** - * Asynchronous fchmod(2) - Change permissions of a file. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - chmod(mode: string | number): Promise; - - /** - * Asynchronous fdatasync(2) - synchronize a file's in-core state with storage device. - */ - datasync(): Promise; - - /** - * Asynchronous fsync(2) - synchronize a file's in-core state with the underlying storage device. - */ - sync(): Promise; - - /** - * Asynchronously reads data from the file. - * The `FileHandle` must have been opened for reading. - * @param buffer The buffer that the data will be written to. - * @param offset The offset in the buffer at which to start writing. - * @param length The number of bytes to read. - * @param position The offset from the beginning of the file from which data should be read. If `null`, data will be read from the current position. - */ - read(buffer: TBuffer, offset?: number | null, length?: number | null, position?: number | null): Promise<{ bytesRead: number, buffer: TBuffer }>; - - /** - * Asynchronously reads the entire contents of a file. The underlying file will _not_ be closed automatically. - * The `FileHandle` must have been opened for reading. - * @param options An object that may contain an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - readFile(options?: { encoding?: null, flag?: string | number } | null): Promise; - - /** - * Asynchronously reads the entire contents of a file. The underlying file will _not_ be closed automatically. - * The `FileHandle` must have been opened for reading. - * @param options An object that may contain an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - readFile(options: { encoding: BufferEncoding, flag?: string | number } | BufferEncoding): Promise; - - /** - * Asynchronously reads the entire contents of a file. The underlying file will _not_ be closed automatically. - * The `FileHandle` must have been opened for reading. - * @param options An object that may contain an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - readFile(options?: { encoding?: string | null, flag?: string | number } | string | null): Promise; - - /** - * Asynchronous fstat(2) - Get file status. - */ - stat(): Promise; - - /** - * Asynchronous ftruncate(2) - Truncate a file to a specified length. - * @param len If not specified, defaults to `0`. - */ - truncate(len?: number): Promise; - - /** - * Asynchronously change file timestamps of the file. - * @param atime The last access time. If a string is provided, it will be coerced to number. - * @param mtime The last modified time. If a string is provided, it will be coerced to number. - */ - utimes(atime: string | number | Date, mtime: string | number | Date): Promise; - - /** - * Asynchronously writes `buffer` to the file. - * The `FileHandle` must have been opened for writing. - * @param buffer The buffer that the data will be written to. - * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. - * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. - * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. - */ - write(buffer: TBuffer, offset?: number | null, length?: number | null, position?: number | null): Promise<{ bytesWritten: number, buffer: TBuffer }>; - - /** - * Asynchronously writes `string` to the file. - * The `FileHandle` must have been opened for writing. - * It is unsafe to call `write()` multiple times on the same file without waiting for the `Promise` to be resolved (or rejected). For this scenario, `fs.createWriteStream` is strongly recommended. - * @param string A string to write. If something other than a string is supplied it will be coerced to a string. - * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. - * @param encoding The expected string encoding. - */ - write(data: any, position?: number | null, encoding?: string | null): Promise<{ bytesWritten: number, buffer: string }>; - - /** - * Asynchronously writes data to a file, replacing the file if it already exists. The underlying file will _not_ be closed automatically. - * The `FileHandle` must have been opened for writing. - * It is unsafe to call `writeFile()` multiple times on the same file without waiting for the `Promise` to be resolved (or rejected). - * @param data The data to write. If something other than a `Buffer` or `Uint8Array` is provided, the value is coerced to a string. - * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `mode` is not supplied, the default of `0o666` is used. - * If `mode` is a string, it is parsed as an octal integer. - * If `flag` is not supplied, the default of `'w'` is used. - */ - writeFile(data: any, options?: { encoding?: string | null, mode?: string | number, flag?: string | number } | string | null): Promise; - - /** - * Asynchronous close(2) - close a `FileHandle`. - */ - close(): Promise; - } - - /** - * Asynchronously tests a user's permissions for the file specified by path. - * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - function access(path: PathLike, mode?: number): Promise; - - /** - * Asynchronously copies `src` to `dest`. By default, `dest` is overwritten if it already exists. - * Node.js makes no guarantees about the atomicity of the copy operation. - * If an error occurs after the destination file has been opened for writing, Node.js will attempt - * to remove the destination. - * @param src A path to the source file. - * @param dest A path to the destination file. - * @param flags An optional integer that specifies the behavior of the copy operation. The only - * supported flag is `fs.constants.COPYFILE_EXCL`, which causes the copy operation to fail if - * `dest` already exists. - */ - function copyFile(src: PathLike, dest: PathLike, flags?: number): Promise; - - /** - * Asynchronous open(2) - open and possibly create a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not - * supplied, defaults to `0o666`. - */ - function open(path: PathLike, flags: string | number, mode?: string | number): Promise; - - /** - * Asynchronously reads data from the file referenced by the supplied `FileHandle`. - * @param handle A `FileHandle`. - * @param buffer The buffer that the data will be written to. - * @param offset The offset in the buffer at which to start writing. - * @param length The number of bytes to read. - * @param position The offset from the beginning of the file from which data should be read. If - * `null`, data will be read from the current position. - */ - function read(handle: FileHandle, buffer: TBuffer, offset?: number | null, length?: number | null, position?: number | null): Promise<{ bytesRead: number, buffer: TBuffer }>; - - /** - * Asynchronously writes `buffer` to the file referenced by the supplied `FileHandle`. - * It is unsafe to call `fsPromises.write()` multiple times on the same file without waiting for the `Promise` to be resolved (or rejected). For this scenario, `fs.createWriteStream` is strongly recommended. - * @param handle A `FileHandle`. - * @param buffer The buffer that the data will be written to. - * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. - * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. - * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. - */ - function write(handle: FileHandle, buffer: TBuffer, offset?: number | null, length?: number | null, position?: number | null): Promise<{ bytesWritten: number, buffer: TBuffer }>; - - /** - * Asynchronously writes `string` to the file referenced by the supplied `FileHandle`. - * It is unsafe to call `fsPromises.write()` multiple times on the same file without waiting for the `Promise` to be resolved (or rejected). For this scenario, `fs.createWriteStream` is strongly recommended. - * @param handle A `FileHandle`. - * @param string A string to write. If something other than a string is supplied it will be coerced to a string. - * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. - * @param encoding The expected string encoding. - */ - function write(handle: FileHandle, string: any, position?: number | null, encoding?: string | null): Promise<{ bytesWritten: number, buffer: string }>; - - /** - * Asynchronous rename(2) - Change the name or location of a file or directory. - * @param oldPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - function rename(oldPath: PathLike, newPath: PathLike): Promise; - - /** - * Asynchronous truncate(2) - Truncate a file to a specified length. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param len If not specified, defaults to `0`. - */ - function truncate(path: PathLike, len?: number): Promise; - - /** - * Asynchronous ftruncate(2) - Truncate a file to a specified length. - * @param handle A `FileHandle`. - * @param len If not specified, defaults to `0`. - */ - function ftruncate(handle: FileHandle, len?: number): Promise; - - /** - * Asynchronous rmdir(2) - delete a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - function rmdir(path: PathLike): Promise; - - /** - * Asynchronous fdatasync(2) - synchronize a file's in-core state with storage device. - * @param handle A `FileHandle`. - */ - function fdatasync(handle: FileHandle): Promise; - - /** - * Asynchronous fsync(2) - synchronize a file's in-core state with the underlying storage device. - * @param handle A `FileHandle`. - */ - function fsync(handle: FileHandle): Promise; - - /** - * Asynchronous mkdir(2) - create a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. - */ - function mkdir(path: PathLike, mode?: string | number): Promise; - - /** - * Asynchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - function readdir(path: PathLike, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): Promise; - - /** - * Asynchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - function readdir(path: PathLike, options: { encoding: "buffer" } | "buffer"): Promise; - - /** - * Asynchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - function readdir(path: PathLike, options?: { encoding?: string | null } | string | null): Promise; - - /** - * Asynchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - function readlink(path: PathLike, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): Promise; - - /** - * Asynchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - function readlink(path: PathLike, options: { encoding: "buffer" } | "buffer"): Promise; - - /** - * Asynchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - function readlink(path: PathLike, options?: { encoding?: string | null } | string | null): Promise; - - /** - * Asynchronous symlink(2) - Create a new symbolic link to an existing file. - * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. - * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. - * @param type May be set to `'dir'`, `'file'`, or `'junction'` (default is `'file'`) and is only available on Windows (ignored on other platforms). - * When using `'junction'`, the `target` argument will automatically be normalized to an absolute path. - */ - function symlink(target: PathLike, path: PathLike, type?: string | null): Promise; - - /** - * Asynchronous fstat(2) - Get file status. - * @param handle A `FileHandle`. - */ - function fstat(handle: FileHandle): Promise; - - /** - * Asynchronous lstat(2) - Get file status. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - function lstat(path: PathLike): Promise; - - /** - * Asynchronous stat(2) - Get file status. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - function stat(path: PathLike): Promise; - - /** - * Asynchronous link(2) - Create a new link (also known as a hard link) to an existing file. - * @param existingPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - function link(existingPath: PathLike, newPath: PathLike): Promise; - - /** - * Asynchronous unlink(2) - delete a name and possibly the file it refers to. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - function unlink(path: PathLike): Promise; - - /** - * Asynchronous fchmod(2) - Change permissions of a file. - * @param handle A `FileHandle`. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - function fchmod(handle: FileHandle, mode: string | number): Promise; - - /** - * Asynchronous chmod(2) - Change permissions of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - function chmod(path: PathLike, mode: string | number): Promise; - - /** - * Asynchronous lchmod(2) - Change permissions of a file. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - function lchmod(path: PathLike, mode: string | number): Promise; - - /** - * Asynchronous lchown(2) - Change ownership of a file. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - function lchown(path: PathLike, uid: number, gid: number): Promise; - - /** - * Asynchronous fchown(2) - Change ownership of a file. - * @param handle A `FileHandle`. - */ - function fchown(handle: FileHandle, uid: number, gid: number): Promise; - - /** - * Asynchronous chown(2) - Change ownership of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - function chown(path: PathLike, uid: number, gid: number): Promise; - - /** - * Asynchronously change file timestamps of the file referenced by the supplied path. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param atime The last access time. If a string is provided, it will be coerced to number. - * @param mtime The last modified time. If a string is provided, it will be coerced to number. - */ - function utimes(path: PathLike, atime: string | number | Date, mtime: string | number | Date): Promise; - - /** - * Asynchronously change file timestamps of the file referenced by the supplied `FileHandle`. - * @param handle A `FileHandle`. - * @param atime The last access time. If a string is provided, it will be coerced to number. - * @param mtime The last modified time. If a string is provided, it will be coerced to number. - */ - function futimes(handle: FileHandle, atime: string | number | Date, mtime: string | number | Date): Promise; - - /** - * Asynchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - function realpath(path: PathLike, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): Promise; - - /** - * Asynchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - function realpath(path: PathLike, options: { encoding: "buffer" } | "buffer"): Promise; - - /** - * Asynchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - function realpath(path: PathLike, options?: { encoding?: string | null } | string | null): Promise; - - /** - * Asynchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required `prefix` to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - function mkdtemp(prefix: string, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): Promise; - - /** - * Asynchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required `prefix` to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - function mkdtemp(prefix: string, options: { encoding: "buffer" } | "buffer"): Promise; - - /** - * Asynchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required `prefix` to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - function mkdtemp(prefix: string, options?: { encoding?: string | null } | string | null): Promise; - - /** - * Asynchronously writes data to a file, replacing the file if it already exists. - * It is unsafe to call `fsPromises.writeFile()` multiple times on the same file without waiting for the `Promise` to be resolved (or rejected). - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a `FileHandle` is provided, the underlying file will _not_ be closed automatically. - * @param data The data to write. If something other than a `Buffer` or `Uint8Array` is provided, the value is coerced to a string. - * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `mode` is not supplied, the default of `0o666` is used. - * If `mode` is a string, it is parsed as an octal integer. - * If `flag` is not supplied, the default of `'w'` is used. - */ - function writeFile(path: PathLike | FileHandle, data: any, options?: { encoding?: string | null, mode?: string | number, flag?: string | number } | string | null): Promise; - - /** - * Asynchronously append data to a file, creating the file if it does not exist. - * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a `FileHandle` is provided, the underlying file will _not_ be closed automatically. - * @param data The data to write. If something other than a `Buffer` or `Uint8Array` is provided, the value is coerced to a string. - * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `mode` is not supplied, the default of `0o666` is used. - * If `mode` is a string, it is parsed as an octal integer. - * If `flag` is not supplied, the default of `'a'` is used. - */ - function appendFile(path: PathLike | FileHandle, data: any, options?: { encoding?: string | null, mode?: string | number, flag?: string | number } | string | null): Promise; - - /** - * Asynchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * If a `FileHandle` is provided, the underlying file will _not_ be closed automatically. - * @param options An object that may contain an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - function readFile(path: PathLike | FileHandle, options?: { encoding?: null, flag?: string | number } | null): Promise; - - /** - * Asynchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * If a `FileHandle` is provided, the underlying file will _not_ be closed automatically. - * @param options An object that may contain an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - function readFile(path: PathLike | FileHandle, options: { encoding: BufferEncoding, flag?: string | number } | BufferEncoding): Promise; - - /** - * Asynchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * If a `FileHandle` is provided, the underlying file will _not_ be closed automatically. - * @param options An object that may contain an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - function readFile(path: PathLike | FileHandle, options?: { encoding?: string | null, flag?: string | number } | string | null): Promise; - } -} - -declare module "path" { - /** - * A parsed path object generated by path.parse() or consumed by path.format(). - */ - export interface ParsedPath { - /** - * The root of the path such as '/' or 'c:\' - */ - root: string; - /** - * The full directory path such as '/home/user/dir' or 'c:\path\dir' - */ - dir: string; - /** - * The file name including extension (if any) such as 'index.html' - */ - base: string; - /** - * The file extension (if any) such as '.html' - */ - ext: string; - /** - * The file name without extension (if any) such as 'index' - */ - name: string; - } - export interface FormatInputPathObject { - /** - * The root of the path such as '/' or 'c:\' - */ - root?: string; - /** - * The full directory path such as '/home/user/dir' or 'c:\path\dir' - */ - dir?: string; - /** - * The file name including extension (if any) such as 'index.html' - */ - base?: string; - /** - * The file extension (if any) such as '.html' - */ - ext?: string; - /** - * The file name without extension (if any) such as 'index' - */ - name?: string; - } - - /** - * Normalize a string path, reducing '..' and '.' parts. - * When multiple slashes are found, they're replaced by a single one; when the path contains a trailing slash, it is preserved. On Windows backslashes are used. - * - * @param p string path to normalize. - */ - export function normalize(p: string): string; - /** - * Join all arguments together and normalize the resulting path. - * Arguments must be strings. In v0.8, non-string arguments were silently ignored. In v0.10 and up, an exception is thrown. - * - * @param paths paths to join. - */ - export function join(...paths: string[]): string; - /** - * The right-most parameter is considered {to}. Other parameters are considered an array of {from}. - * - * Starting from leftmost {from} paramter, resolves {to} to an absolute path. - * - * If {to} isn't already absolute, {from} arguments are prepended in right to left order, until an absolute path is found. If after using all {from} paths still no absolute path is found, the current working directory is used as well. The resulting path is normalized, and trailing slashes are removed unless the path gets resolved to the root directory. - * - * @param pathSegments string paths to join. Non-string arguments are ignored. - */ - export function resolve(...pathSegments: string[]): string; - /** - * Determines whether {path} is an absolute path. An absolute path will always resolve to the same location, regardless of the working directory. - * - * @param path path to test. - */ - export function isAbsolute(path: string): boolean; - /** - * Solve the relative path from {from} to {to}. - * At times we have two absolute paths, and we need to derive the relative path from one to the other. This is actually the reverse transform of path.resolve. - */ - export function relative(from: string, to: string): string; - /** - * Return the directory name of a path. Similar to the Unix dirname command. - * - * @param p the path to evaluate. - */ - export function dirname(p: string): string; - /** - * Return the last portion of a path. Similar to the Unix basename command. - * Often used to extract the file name from a fully qualified path. - * - * @param p the path to evaluate. - * @param ext optionally, an extension to remove from the result. - */ - export function basename(p: string, ext?: string): string; - /** - * Return the extension of the path, from the last '.' to end of string in the last portion of the path. - * If there is no '.' in the last portion of the path or the first character of it is '.', then it returns an empty string - * - * @param p the path to evaluate. - */ - export function extname(p: string): string; - /** - * The platform-specific file separator. '\\' or '/'. - */ - export var sep: '\\' | '/'; - /** - * The platform-specific file delimiter. ';' or ':'. - */ - export var delimiter: ';' | ':'; - /** - * Returns an object from a path string - the opposite of format(). - * - * @param pathString path to evaluate. - */ - export function parse(pathString: string): ParsedPath; - /** - * Returns a path string from an object - the opposite of parse(). - * - * @param pathString path to evaluate. - */ - export function format(pathObject: FormatInputPathObject): string; - - export module posix { - export function normalize(p: string): string; - export function join(...paths: any[]): string; - export function resolve(...pathSegments: any[]): string; - export function isAbsolute(p: string): boolean; - export function relative(from: string, to: string): string; - export function dirname(p: string): string; - export function basename(p: string, ext?: string): string; - export function extname(p: string): string; - export var sep: string; - export var delimiter: string; - export function parse(p: string): ParsedPath; - export function format(pP: FormatInputPathObject): string; - } - - export module win32 { - export function normalize(p: string): string; - export function join(...paths: any[]): string; - export function resolve(...pathSegments: any[]): string; - export function isAbsolute(p: string): boolean; - export function relative(from: string, to: string): string; - export function dirname(p: string): string; - export function basename(p: string, ext?: string): string; - export function extname(p: string): string; - export var sep: string; - export var delimiter: string; - export function parse(p: string): ParsedPath; - export function format(pP: FormatInputPathObject): string; - } -} - -declare module "string_decoder" { - export interface NodeStringDecoder { - write(buffer: Buffer): string; - end(buffer?: Buffer): string; - } - export var StringDecoder: { - new(encoding?: string): NodeStringDecoder; - }; -} - -declare module "tls" { - import * as crypto from "crypto"; - import * as dns from "dns"; - import * as net from "net"; - import * as stream from "stream"; - - var CLIENT_RENEG_LIMIT: number; - var CLIENT_RENEG_WINDOW: number; - - export interface Certificate { - /** - * Country code. - */ - C: string; - /** - * Street. - */ - ST: string; - /** - * Locality. - */ - L: string; - /** - * Organization. - */ - O: string; - /** - * Organizational unit. - */ - OU: string; - /** - * Common name. - */ - CN: string; - } - - export interface PeerCertificate { - subject: Certificate; - issuer: Certificate; - subjectaltname: string; - infoAccess: { [index: string]: string[] | undefined }; - modulus: string; - exponent: string; - valid_from: string; - valid_to: string; - fingerprint: string; - ext_key_usage: string[]; - serialNumber: string; - raw: Buffer; - } - - export interface DetailedPeerCertificate extends PeerCertificate { - issuerCertificate: DetailedPeerCertificate; - } - - export interface CipherNameAndProtocol { - /** - * The cipher name. - */ - name: string; - /** - * SSL/TLS protocol version. - */ - version: string; - } - - export class TLSSocket extends net.Socket { - /** - * Construct a new tls.TLSSocket object from an existing TCP socket. - */ - constructor(socket: net.Socket, options?: { - /** - * An optional TLS context object from tls.createSecureContext() - */ - secureContext?: SecureContext, - /** - * If true the TLS socket will be instantiated in server-mode. - * Defaults to false. - */ - isServer?: boolean, - /** - * An optional net.Server instance. - */ - server?: net.Server, - /** - * If true the server will request a certificate from clients that - * connect and attempt to verify that certificate. Defaults to - * false. - */ - requestCert?: boolean, - /** - * If true the server will reject any connection which is not - * authorized with the list of supplied CAs. This option only has an - * effect if requestCert is true. Defaults to false. - */ - rejectUnauthorized?: boolean, - /** - * An array of strings or a Buffer naming possible NPN protocols. - * (Protocols should be ordered by their priority.) - */ - NPNProtocols?: string[] | Buffer[] | Uint8Array[] | Buffer | Uint8Array, - /** - * An array of strings or a Buffer naming possible ALPN protocols. - * (Protocols should be ordered by their priority.) When the server - * receives both NPN and ALPN extensions from the client, ALPN takes - * precedence over NPN and the server does not send an NPN extension - * to the client. - */ - ALPNProtocols?: string[] | Buffer[] | Uint8Array[] | Buffer | Uint8Array, - /** - * SNICallback(servername, cb) A function that will be - * called if the client supports SNI TLS extension. Two arguments - * will be passed when called: servername and cb. SNICallback should - * invoke cb(null, ctx), where ctx is a SecureContext instance. - * (tls.createSecureContext(...) can be used to get a proper - * SecureContext.) If SNICallback wasn't provided the default callback - * with high-level API will be used (see below). - */ - SNICallback?: (servername: string, cb: (err: Error | null, ctx: SecureContext) => void) => void, - /** - * An optional Buffer instance containing a TLS session. - */ - session?: Buffer, - /** - * If true, specifies that the OCSP status request extension will be - * added to the client hello and an 'OCSPResponse' event will be - * emitted on the socket before establishing a secure communication - */ - requestOCSP?: boolean - }); - - /** - * A boolean that is true if the peer certificate was signed by one of the specified CAs, otherwise false. - */ - authorized: boolean; - /** - * The reason why the peer's certificate has not been verified. - * This property becomes available only when tlsSocket.authorized === false. - */ - authorizationError: Error; - /** - * Static boolean value, always true. - * May be used to distinguish TLS sockets from regular ones. - */ - encrypted: boolean; - /** - * Returns an object representing the cipher name and the SSL/TLS protocol version of the current connection. - * @returns Returns an object representing the cipher name - * and the SSL/TLS protocol version of the current connection. - */ - getCipher(): CipherNameAndProtocol; - /** - * Returns an object representing the peer's certificate. - * The returned object has some properties corresponding to the field of the certificate. - * If detailed argument is true the full chain with issuer property will be returned, - * if false only the top certificate without issuer property. - * If the peer does not provide a certificate, it returns null or an empty object. - * @param detailed - If true; the full chain with issuer property will be returned. - * @returns An object representing the peer's certificate. - */ - getPeerCertificate(detailed: true): DetailedPeerCertificate; - getPeerCertificate(detailed?: false): PeerCertificate; - getPeerCertificate(detailed?: boolean): PeerCertificate | DetailedPeerCertificate; - /** - * Returns a string containing the negotiated SSL/TLS protocol version of the current connection. - * The value `'unknown'` will be returned for connected sockets that have not completed the handshaking process. - * The value `null` will be returned for server sockets or disconnected client sockets. - * See https://www.openssl.org/docs/man1.0.2/ssl/SSL_get_version.html for more information. - * @returns negotiated SSL/TLS protocol version of the current connection - */ - getProtocol(): string | null; - /** - * Could be used to speed up handshake establishment when reconnecting to the server. - * @returns ASN.1 encoded TLS session or undefined if none was negotiated. - */ - getSession(): any; - /** - * NOTE: Works only with client TLS sockets. - * Useful only for debugging, for session reuse provide session option to tls.connect(). - * @returns TLS session ticket or undefined if none was negotiated. - */ - getTLSTicket(): any; - /** - * Initiate TLS renegotiation process. - * - * NOTE: Can be used to request peer's certificate after the secure connection has been established. - * ANOTHER NOTE: When running as the server, socket will be destroyed with an error after handshakeTimeout timeout. - * @param options - The options may contain the following fields: rejectUnauthorized, - * requestCert (See tls.createServer() for details). - * @param callback - callback(err) will be executed with null as err, once the renegotiation - * is successfully completed. - */ - renegotiate(options: { rejectUnauthorized?: boolean, requestCert?: boolean }, callback: (err: Error | null) => void): any; - /** - * Set maximum TLS fragment size (default and maximum value is: 16384, minimum is: 512). - * Smaller fragment size decreases buffering latency on the client: large fragments are buffered by - * the TLS layer until the entire fragment is received and its integrity is verified; - * large fragments can span multiple roundtrips, and their processing can be delayed due to packet - * loss or reordering. However, smaller fragments add extra TLS framing bytes and CPU overhead, - * which may decrease overall server throughput. - * @param size - TLS fragment size (default and maximum value is: 16384, minimum is: 512). - * @returns Returns true on success, false otherwise. - */ - setMaxSendFragment(size: number): boolean; - - /** - * events.EventEmitter - * 1. OCSPResponse - * 2. secureConnect - */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; - addListener(event: "secureConnect", listener: () => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "OCSPResponse", response: Buffer): boolean; - emit(event: "secureConnect"): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "OCSPResponse", listener: (response: Buffer) => void): this; - on(event: "secureConnect", listener: () => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "OCSPResponse", listener: (response: Buffer) => void): this; - once(event: "secureConnect", listener: () => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; - prependListener(event: "secureConnect", listener: () => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; - prependOnceListener(event: "secureConnect", listener: () => void): this; - } - - export interface TlsOptions extends SecureContextOptions { - handshakeTimeout?: number; - requestCert?: boolean; - rejectUnauthorized?: boolean; - NPNProtocols?: string[] | Buffer[] | Uint8Array[] | Buffer | Uint8Array; - ALPNProtocols?: string[] | Buffer[] | Uint8Array[] | Buffer | Uint8Array; - SNICallback?: (servername: string, cb: (err: Error | null, ctx: SecureContext) => void) => void; - sessionTimeout?: number; - ticketKeys?: Buffer; - } - - export interface ConnectionOptions extends SecureContextOptions { - host?: string; - port?: number; - path?: string; // Creates unix socket connection to path. If this option is specified, `host` and `port` are ignored. - socket?: net.Socket; // Establish secure connection on a given socket rather than creating a new socket - rejectUnauthorized?: boolean; // Defaults to true - NPNProtocols?: string[] | Buffer[] | Uint8Array[] | Buffer | Uint8Array; - ALPNProtocols?: string[] | Buffer[] | Uint8Array[] | Buffer | Uint8Array; - checkServerIdentity?: typeof checkServerIdentity; - servername?: string; // SNI TLS Extension - session?: Buffer; - minDHSize?: number; - secureContext?: SecureContext; // If not provided, the entire ConnectionOptions object will be passed to tls.createSecureContext() - lookup?: net.LookupFunction; - } - - export class Server extends net.Server { - addContext(hostName: string, credentials: { - key: string; - cert: string; - ca: string; - }): void; - - /** - * events.EventEmitter - * 1. tlsClientError - * 2. newSession - * 3. OCSPRequest - * 4. resumeSession - * 5. secureConnection - */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; - addListener(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; - addListener(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; - addListener(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; - addListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "tlsClientError", err: Error, tlsSocket: TLSSocket): boolean; - emit(event: "newSession", sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void): boolean; - emit(event: "OCSPRequest", certificate: Buffer, issuer: Buffer, callback: Function): boolean; - emit(event: "resumeSession", sessionId: any, callback: (err: Error, sessionData: any) => void): boolean; - emit(event: "secureConnection", tlsSocket: TLSSocket): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; - on(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; - on(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; - on(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; - on(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; - once(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; - once(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; - once(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; - once(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; - prependListener(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; - prependListener(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; - prependListener(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; - prependListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; - prependOnceListener(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; - prependOnceListener(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; - prependOnceListener(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; - prependOnceListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; - } - - export interface SecurePair { - encrypted: any; - cleartext: any; - } - - export interface SecureContextOptions { - pfx?: string | Buffer | Array; - key?: string | Buffer | Array; - passphrase?: string; - cert?: string | Buffer | Array; - ca?: string | Buffer | Array; - ciphers?: string; - honorCipherOrder?: boolean; - ecdhCurve?: string; - clientCertEngine?: string; - crl?: string | Buffer | Array; - dhparam?: string | Buffer; - secureOptions?: number; // Value is a numeric bitmask of the `SSL_OP_*` options - secureProtocol?: string; // SSL Method, e.g. SSLv23_method - sessionIdContext?: string; - } - - export interface SecureContext { - context: any; - } - - /* - * Verifies the certificate `cert` is issued to host `host`. - * @host The hostname to verify the certificate against - * @cert PeerCertificate representing the peer's certificate - * - * Returns Error object, populating it with the reason, host and cert on failure. On success, returns undefined. - */ - export function checkServerIdentity(host: string, cert: PeerCertificate): Error | undefined; - export function createServer(options: TlsOptions, secureConnectionListener?: (socket: TLSSocket) => void): Server; - export function connect(options: ConnectionOptions, secureConnectionListener?: () => void): TLSSocket; - export function connect(port: number, host?: string, options?: ConnectionOptions, secureConnectListener?: () => void): TLSSocket; - export function connect(port: number, options?: ConnectionOptions, secureConnectListener?: () => void): TLSSocket; - export function createSecurePair(credentials?: crypto.Credentials, isServer?: boolean, requestCert?: boolean, rejectUnauthorized?: boolean): SecurePair; - export function createSecureContext(details: SecureContextOptions): SecureContext; - export function getCiphers(): string[]; - - export var DEFAULT_ECDH_CURVE: string; -} - -declare module "crypto" { - import * as stream from "stream"; - - export interface Certificate { - exportChallenge(spkac: string | Buffer | NodeJS.TypedArray | DataView): Buffer; - exportPublicKey(spkac: string | Buffer | NodeJS.TypedArray | DataView): Buffer; - verifySpkac(spkac: Buffer | NodeJS.TypedArray | DataView): boolean; - } - export var Certificate: { - new(): Certificate; - (): Certificate; - }; - - /** @deprecated since v10.0.0 */ - export var fips: boolean; - - export interface CredentialDetails { - pfx: string; - key: string; - passphrase: string; - cert: string; - ca: string | string[]; - crl: string | string[]; - ciphers: string; - } - export interface Credentials { context?: any; } - export function createCredentials(details: CredentialDetails): Credentials; - export function createHash(algorithm: string, options?: stream.TransformOptions): Hash; - export function createHmac(algorithm: string, key: string | Buffer | NodeJS.TypedArray | DataView, options?: stream.TransformOptions): Hmac; - - type Utf8AsciiLatin1Encoding = "utf8" | "ascii" | "latin1"; - type HexBase64Latin1Encoding = "latin1" | "hex" | "base64"; - type Utf8AsciiBinaryEncoding = "utf8" | "ascii" | "binary"; - type HexBase64BinaryEncoding = "binary" | "base64" | "hex"; - type ECDHKeyFormat = "compressed" | "uncompressed" | "hybrid"; - - export interface Hash extends NodeJS.ReadWriteStream { - update(data: string | Buffer | NodeJS.TypedArray | DataView): Hash; - update(data: string, input_encoding: Utf8AsciiLatin1Encoding): Hash; - digest(): Buffer; - digest(encoding: HexBase64Latin1Encoding): string; - } - export interface Hmac extends NodeJS.ReadWriteStream { - update(data: string | Buffer | NodeJS.TypedArray | DataView): Hmac; - update(data: string, input_encoding: Utf8AsciiLatin1Encoding): Hmac; - digest(): Buffer; - digest(encoding: HexBase64Latin1Encoding): string; - } - export type CipherCCMTypes = 'aes-128-ccm' | 'aes-192-ccm' | 'aes-256-ccm'; - export type CipherGCMTypes = 'aes-128-gcm' | 'aes-192-gcm' | 'aes-256-gcm'; - export interface CipherCCMOptions extends stream.TransformOptions { - authTagLength: number; - } - export interface CipherGCMOptions extends stream.TransformOptions { - authTagLength?: number; - } - /** @deprecated since v10.0.0 use createCipheriv() */ - export function createCipher(algorithm: string, password: string | Buffer | NodeJS.TypedArray | DataView, options?: stream.TransformOptions): Cipher; - export function createCipher(algorithm: CipherCCMTypes, password: string | Buffer | NodeJS.TypedArray | DataView, options: CipherCCMOptions): CipherCCM; - export function createCipher(algorithm: CipherGCMTypes, password: string | Buffer | NodeJS.TypedArray | DataView, options: CipherGCMOptions): CipherGCM; - - export function createCipheriv(algorithm: string, key: string | Buffer | NodeJS.TypedArray | DataView, iv: string | Buffer | NodeJS.TypedArray | DataView, options?: stream.TransformOptions): Cipher; - export function createCipheriv(algorithm: CipherGCMTypes, key: string | Buffer | NodeJS.TypedArray | DataView, iv: string | Buffer | NodeJS.TypedArray | DataView, options: CipherCCMOptions): CipherCCM; - export function createCipheriv(algorithm: CipherGCMTypes, key: string | Buffer | NodeJS.TypedArray | DataView, iv: string | Buffer | NodeJS.TypedArray | DataView, options: CipherGCMOptions): CipherGCM; - - export interface Cipher extends NodeJS.ReadWriteStream { - update(data: string | Buffer | NodeJS.TypedArray | DataView): Buffer; - update(data: string, input_encoding: Utf8AsciiBinaryEncoding): Buffer; - update(data: Buffer | NodeJS.TypedArray | DataView, output_encoding: HexBase64BinaryEncoding): string; - update(data: Buffer | NodeJS.TypedArray | DataView, input_encoding: any, output_encoding: HexBase64BinaryEncoding): string; - // second arg ignored - update(data: string, input_encoding: Utf8AsciiBinaryEncoding, output_encoding: HexBase64BinaryEncoding): string; - final(): Buffer; - final(output_encoding: string): string; - setAutoPadding(auto_padding?: boolean): this; - // getAuthTag(): Buffer; - // setAAD(buffer: Buffer): this; // docs only say buffer - } - export interface CipherCCM extends Cipher { - setAAD(buffer: Buffer, options: { plainTextLength: number }): this; - getAuthTag(): Buffer; - } - export interface CipherGCM extends Cipher { - setAAD(buffer: Buffer, options?: { plainTextLength: number }): this; - getAuthTag(): Buffer; - } - /** @deprecated since v10.0.0 use createCipheriv() */ - export function createDecipher(algorithm: string, password: string | Buffer | NodeJS.TypedArray | DataView, options?: stream.TransformOptions): Decipher; - export function createDecipher(algorithm: CipherCCMTypes, password: string | Buffer | NodeJS.TypedArray | DataView, options: CipherCCMOptions): DecipherCCM; - export function createDecipher(algorithm: CipherGCMTypes, password: string | Buffer | NodeJS.TypedArray | DataView, options: CipherGCMOptions): DecipherGCM; - - export function createDecipheriv(algorithm: string, key: string | Buffer | NodeJS.TypedArray | DataView, iv: string | Buffer | NodeJS.TypedArray | DataView, options?: stream.TransformOptions): Decipher; - export function createDecipheriv(algorithm: CipherCCMTypes, key: string | Buffer | NodeJS.TypedArray | DataView, iv: string | Buffer | NodeJS.TypedArray | DataView, options: CipherCCMOptions): DecipherCCM; - export function createDecipheriv(algorithm: CipherGCMTypes, key: string | Buffer | NodeJS.TypedArray | DataView, iv: string | Buffer | NodeJS.TypedArray | DataView, options: CipherGCMOptions): DecipherGCM; - - export interface Decipher extends NodeJS.ReadWriteStream { - update(data: Buffer | NodeJS.TypedArray | DataView): Buffer; - update(data: string, input_encoding: HexBase64BinaryEncoding): Buffer; - update(data: Buffer | NodeJS.TypedArray | DataView, input_encoding: any, output_encoding: Utf8AsciiBinaryEncoding): string; - // second arg is ignored - update(data: string, input_encoding: HexBase64BinaryEncoding, output_encoding: Utf8AsciiBinaryEncoding): string; - final(): Buffer; - final(output_encoding: string): string; - setAutoPadding(auto_padding?: boolean): this; - // setAuthTag(tag: Buffer | NodeJS.TypedArray | DataView): this; - // setAAD(buffer: Buffer | NodeJS.TypedArray | DataView): this; - } - export interface DecipherCCM extends Decipher { - setAuthTag(buffer: Buffer | NodeJS.TypedArray | DataView, options: { plainTextLength: number }): this; - setAAD(buffer: Buffer | NodeJS.TypedArray | DataView): this; - } - export interface DecipherGCM extends Decipher { - setAuthTag(buffer: Buffer | NodeJS.TypedArray | DataView, options?: { plainTextLength: number }): this; - setAAD(buffer: Buffer | NodeJS.TypedArray | DataView): this; - } - - export function createSign(algorithm: string, options?: stream.WritableOptions): Signer; - export interface Signer extends NodeJS.WritableStream { - update(data: string | Buffer | NodeJS.TypedArray | DataView): Signer; - update(data: string, input_encoding: Utf8AsciiLatin1Encoding): Signer; - sign(private_key: string | { key: string; passphrase: string, padding?: number, saltLength?: number }): Buffer; - sign(private_key: string | { key: string; passphrase: string, padding?: number, saltLength?: number }, output_format: HexBase64Latin1Encoding): string; - } - export function createVerify(algorith: string, options?: stream.WritableOptions): Verify; - export interface Verify extends NodeJS.WritableStream { - update(data: string | Buffer | NodeJS.TypedArray | DataView): Verify; - update(data: string, input_encoding: Utf8AsciiLatin1Encoding): Verify; - verify(object: string | Object, signature: Buffer | NodeJS.TypedArray | DataView): boolean; - verify(object: string | Object, signature: string, signature_format: HexBase64Latin1Encoding): boolean; - // https://nodejs.org/api/crypto.html#crypto_verifier_verify_object_signature_signature_format - // The signature field accepts a TypedArray type, but it is only available starting ES2017 - } - export function createDiffieHellman(prime_length: number, generator?: number | Buffer | NodeJS.TypedArray | DataView): DiffieHellman; - export function createDiffieHellman(prime: Buffer | NodeJS.TypedArray | DataView): DiffieHellman; - export function createDiffieHellman(prime: string, prime_encoding: HexBase64Latin1Encoding): DiffieHellman; - export function createDiffieHellman(prime: string, prime_encoding: HexBase64Latin1Encoding, generator: number | Buffer | NodeJS.TypedArray | DataView): DiffieHellman; - export function createDiffieHellman(prime: string, prime_encoding: HexBase64Latin1Encoding, generator: string, generator_encoding: HexBase64Latin1Encoding): DiffieHellman; - export interface DiffieHellman { - generateKeys(): Buffer; - generateKeys(encoding: HexBase64Latin1Encoding): string; - computeSecret(other_public_key: Buffer | NodeJS.TypedArray | DataView): Buffer; - computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding): Buffer; - computeSecret(other_public_key: Buffer | NodeJS.TypedArray | DataView, output_encoding: HexBase64Latin1Encoding): string; - computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding, output_encoding: HexBase64Latin1Encoding): string; - getPrime(): Buffer; - getPrime(encoding: HexBase64Latin1Encoding): string; - getGenerator(): Buffer; - getGenerator(encoding: HexBase64Latin1Encoding): string; - getPublicKey(): Buffer; - getPublicKey(encoding: HexBase64Latin1Encoding): string; - getPrivateKey(): Buffer; - getPrivateKey(encoding: HexBase64Latin1Encoding): string; - setPublicKey(public_key: Buffer | NodeJS.TypedArray | DataView): void; - setPublicKey(public_key: string, encoding: string): void; - setPrivateKey(private_key: Buffer | NodeJS.TypedArray | DataView): void; - setPrivateKey(private_key: string, encoding: string): void; - verifyError: number; - } - export function getDiffieHellman(group_name: string): DiffieHellman; - export function pbkdf2(password: string | Buffer | NodeJS.TypedArray | DataView, salt: string | Buffer | NodeJS.TypedArray | DataView, iterations: number, keylen: number, digest: string, callback: (err: Error | null, derivedKey: Buffer) => any): void; - export function pbkdf2Sync(password: string | Buffer | NodeJS.TypedArray | DataView, salt: string | Buffer | NodeJS.TypedArray | DataView, iterations: number, keylen: number, digest: string): Buffer; - - export function randomBytes(size: number): Buffer; - export function randomBytes(size: number, callback: (err: Error | null, buf: Buffer) => void): void; - export function pseudoRandomBytes(size: number): Buffer; - export function pseudoRandomBytes(size: number, callback: (err: Error | null, buf: Buffer) => void): void; - - export function randomFillSync(buffer: T, offset?: number, size?: number): T; - export function randomFill(buffer: T, callback: (err: Error | null, buf: T) => void): void; - export function randomFill(buffer: T, offset: number, callback: (err: Error | null, buf: T) => void): void; - export function randomFill(buffer: T, offset: number, size: number, callback: (err: Error | null, buf: T) => void): void; - - export interface ScryptOptions { - N?: number; - r?: number; - p?: number; - maxmem?: number; - } - export function scrypt(password: string | Buffer | NodeJS.TypedArray | DataView, salt: string | Buffer | NodeJS.TypedArray | DataView, keylen: number, callback: (err: Error | null, derivedKey: Buffer) => void): void; - export function scrypt(password: string | Buffer | NodeJS.TypedArray | DataView, salt: string | Buffer | NodeJS.TypedArray | DataView, keylen: number, options: ScryptOptions, callback: (err: Error | null, derivedKey: Buffer) => void): void; - export function scryptSync(password: string | Buffer | NodeJS.TypedArray | DataView, salt: string | Buffer | NodeJS.TypedArray | DataView, keylen: number, options?: ScryptOptions): Buffer; - - export interface RsaPublicKey { - key: string; - padding?: number; - } - export interface RsaPrivateKey { - key: string; - passphrase?: string; - padding?: number; - } - export function publicEncrypt(public_key: string | RsaPublicKey, buffer: Buffer | NodeJS.TypedArray | DataView): Buffer; - export function privateDecrypt(private_key: string | RsaPrivateKey, buffer: Buffer | NodeJS.TypedArray | DataView): Buffer; - export function privateEncrypt(private_key: string | RsaPrivateKey, buffer: Buffer | NodeJS.TypedArray | DataView): Buffer; - export function publicDecrypt(public_key: string | RsaPublicKey, buffer: Buffer | NodeJS.TypedArray | DataView): Buffer; - export function getCiphers(): string[]; - export function getCurves(): string[]; - export function getHashes(): string[]; - export class ECDH { - static convertKey(key: string | Buffer | NodeJS.TypedArray | DataView, curve: string, inputEncoding?: HexBase64Latin1Encoding, outputEncoding?: "latin1" | "hex" | "base64", format?: "uncompressed" | "compressed" | "hybrid"): Buffer | string; - generateKeys(): Buffer; - generateKeys(encoding: HexBase64Latin1Encoding, format?: ECDHKeyFormat): string; - computeSecret(other_public_key: Buffer | NodeJS.TypedArray | DataView): Buffer; - computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding): Buffer; - computeSecret(other_public_key: Buffer | NodeJS.TypedArray | DataView, output_encoding: HexBase64Latin1Encoding): string; - computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding, output_encoding: HexBase64Latin1Encoding): string; - getPrivateKey(): Buffer; - getPrivateKey(encoding: HexBase64Latin1Encoding): string; - getPublicKey(): Buffer; - getPublicKey(encoding: HexBase64Latin1Encoding, format?: ECDHKeyFormat): string; - setPrivateKey(private_key: Buffer | NodeJS.TypedArray | DataView): void; - setPrivateKey(private_key: string, encoding: HexBase64Latin1Encoding): void; - } - export function createECDH(curve_name: string): ECDH; - export function timingSafeEqual(a: Buffer | NodeJS.TypedArray | DataView, b: Buffer | NodeJS.TypedArray | DataView): boolean; - /** @deprecated since v10.0.0 */ - export var DEFAULT_ENCODING: string; -} - -declare module "stream" { - import * as events from "events"; - - class internal extends events.EventEmitter { - pipe(destination: T, options?: { end?: boolean; }): T; - } - - namespace internal { - export class Stream extends internal { } - - export interface ReadableOptions { - highWaterMark?: number; - encoding?: string; - objectMode?: boolean; - read?(this: Readable, size: number): void; - destroy?(this: Readable, error: Error | null, callback: (error: Error | null) => void): void; - } - - export class Readable extends Stream implements NodeJS.ReadableStream { - readable: boolean; - readonly readableHighWaterMark: number; - readonly readableLength: number; - constructor(opts?: ReadableOptions); - _read(size: number): void; - read(size?: number): any; - setEncoding(encoding: string): this; - pause(): this; - resume(): this; - isPaused(): boolean; - unpipe(destination?: T): this; - unshift(chunk: any): void; - wrap(oldStream: NodeJS.ReadableStream): this; - push(chunk: any, encoding?: string): boolean; - _destroy(error: Error | null, callback: (error: Error | null) => void): void; - destroy(error?: Error): void; - - /** - * Event emitter - * The defined events on documents including: - * 1. close - * 2. data - * 3. end - * 4. readable - * 5. error - */ - addListener(event: "close", listener: () => void): this; - addListener(event: "data", listener: (chunk: any) => void): this; - addListener(event: "end", listener: () => void): this; - addListener(event: "readable", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: string | symbol, listener: (...args: any[]) => void): this; - - emit(event: "close"): boolean; - emit(event: "data", chunk: any): boolean; - emit(event: "end"): boolean; - emit(event: "readable"): boolean; - emit(event: "error", err: Error): boolean; - emit(event: string | symbol, ...args: any[]): boolean; - - on(event: "close", listener: () => void): this; - on(event: "data", listener: (chunk: any) => void): this; - on(event: "end", listener: () => void): this; - on(event: "readable", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: string | symbol, listener: (...args: any[]) => void): this; - - once(event: "close", listener: () => void): this; - once(event: "data", listener: (chunk: any) => void): this; - once(event: "end", listener: () => void): this; - once(event: "readable", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: string | symbol, listener: (...args: any[]) => void): this; - - prependListener(event: "close", listener: () => void): this; - prependListener(event: "data", listener: (chunk: any) => void): this; - prependListener(event: "end", listener: () => void): this; - prependListener(event: "readable", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: string | symbol, listener: (...args: any[]) => void): this; - - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "data", listener: (chunk: any) => void): this; - prependOnceListener(event: "end", listener: () => void): this; - prependOnceListener(event: "readable", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; - - removeListener(event: "close", listener: () => void): this; - removeListener(event: "data", listener: (chunk: any) => void): this; - removeListener(event: "end", listener: () => void): this; - removeListener(event: "readable", listener: () => void): this; - removeListener(event: "error", listener: (err: Error) => void): this; - removeListener(event: string | symbol, listener: (...args: any[]) => void): this; - - [Symbol.asyncIterator](): AsyncIterableIterator; - } - - export interface WritableOptions { - highWaterMark?: number; - decodeStrings?: boolean; - objectMode?: boolean; - write?(this: Writable, chunk: any, encoding: string, callback: (error?: Error | null) => void): void; - writev?(this: Writable, chunks: Array<{ chunk: any, encoding: string }>, callback: (error?: Error | null) => void): void; - destroy?(this: Writable, error: Error | null, callback: (error: Error | null) => void): void; - final?(this: Writable, callback: (error?: Error | null) => void): void; - } - - export class Writable extends Stream implements NodeJS.WritableStream { - writable: boolean; - readonly writableHighWaterMark: number; - readonly writableLength: number; - constructor(opts?: WritableOptions); - _write(chunk: any, encoding: string, callback: (error?: Error | null) => void): void; - _writev?(chunks: Array<{ chunk: any, encoding: string }>, callback: (error?: Error | null) => void): void; - _destroy(error: Error | null, callback: (error: Error | null) => void): void; - _final(callback: (error?: Error | null) => void): void; - write(chunk: any, cb?: (error: Error | null | undefined) => void): boolean; - write(chunk: any, encoding?: string, cb?: (error: Error | null | undefined) => void): boolean; - setDefaultEncoding(encoding: string): this; - end(cb?: () => void): void; - end(chunk: any, cb?: () => void): void; - end(chunk: any, encoding?: string, cb?: () => void): void; - cork(): void; - uncork(): void; - destroy(error?: Error): void; - - /** - * Event emitter - * The defined events on documents including: - * 1. close - * 2. drain - * 3. error - * 4. finish - * 5. pipe - * 6. unpipe - */ - addListener(event: "close", listener: () => void): this; - addListener(event: "drain", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "finish", listener: () => void): this; - addListener(event: "pipe", listener: (src: Readable) => void): this; - addListener(event: "unpipe", listener: (src: Readable) => void): this; - addListener(event: string | symbol, listener: (...args: any[]) => void): this; - - emit(event: "close"): boolean; - emit(event: "drain"): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "finish"): boolean; - emit(event: "pipe", src: Readable): boolean; - emit(event: "unpipe", src: Readable): boolean; - emit(event: string | symbol, ...args: any[]): boolean; - - on(event: "close", listener: () => void): this; - on(event: "drain", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "finish", listener: () => void): this; - on(event: "pipe", listener: (src: Readable) => void): this; - on(event: "unpipe", listener: (src: Readable) => void): this; - on(event: string | symbol, listener: (...args: any[]) => void): this; - - once(event: "close", listener: () => void): this; - once(event: "drain", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "finish", listener: () => void): this; - once(event: "pipe", listener: (src: Readable) => void): this; - once(event: "unpipe", listener: (src: Readable) => void): this; - once(event: string | symbol, listener: (...args: any[]) => void): this; - - prependListener(event: "close", listener: () => void): this; - prependListener(event: "drain", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "finish", listener: () => void): this; - prependListener(event: "pipe", listener: (src: Readable) => void): this; - prependListener(event: "unpipe", listener: (src: Readable) => void): this; - prependListener(event: string | symbol, listener: (...args: any[]) => void): this; - - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "drain", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "finish", listener: () => void): this; - prependOnceListener(event: "pipe", listener: (src: Readable) => void): this; - prependOnceListener(event: "unpipe", listener: (src: Readable) => void): this; - prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; - - removeListener(event: "close", listener: () => void): this; - removeListener(event: "drain", listener: () => void): this; - removeListener(event: "error", listener: (err: Error) => void): this; - removeListener(event: "finish", listener: () => void): this; - removeListener(event: "pipe", listener: (src: Readable) => void): this; - removeListener(event: "unpipe", listener: (src: Readable) => void): this; - removeListener(event: string | symbol, listener: (...args: any[]) => void): this; - } - - export interface DuplexOptions extends ReadableOptions, WritableOptions { - allowHalfOpen?: boolean; - readableObjectMode?: boolean; - writableObjectMode?: boolean; - read?(this: Duplex, size: number): void; - write?(this: Duplex, chunk: any, encoding: string, callback: (error?: Error | null) => void): void; - writev?(this: Duplex, chunks: Array<{ chunk: any, encoding: string }>, callback: (error?: Error | null) => void): void; - final?(this: Duplex, callback: (error?: Error | null) => void): void; - destroy?(this: Duplex, error: Error | null, callback: (error: Error | null) => void): void; - } - - // Note: Duplex extends both Readable and Writable. - export class Duplex extends Readable implements Writable { - writable: boolean; - readonly writableHighWaterMark: number; - readonly writableLength: number; - constructor(opts?: DuplexOptions); - _write(chunk: any, encoding: string, callback: (error?: Error | null) => void): void; - _writev?(chunks: Array<{ chunk: any, encoding: string }>, callback: (error?: Error | null) => void): void; - _destroy(error: Error | null, callback: (error: Error | null) => void): void; - _final(callback: (error?: Error | null) => void): void; - write(chunk: any, cb?: (error: Error | null | undefined) => void): boolean; - write(chunk: any, encoding?: string, cb?: (error: Error | null | undefined) => void): boolean; - setDefaultEncoding(encoding: string): this; - end(cb?: () => void): void; - end(chunk: any, cb?: () => void): void; - end(chunk: any, encoding?: string, cb?: () => void): void; - cork(): void; - uncork(): void; - } - - type TransformCallback = (error?: Error, data?: any) => void; - - export interface TransformOptions extends DuplexOptions { - read?(this: Transform, size: number): void; - write?(this: Transform, chunk: any, encoding: string, callback: (error?: Error | null) => void): void; - writev?(this: Transform, chunks: Array<{ chunk: any, encoding: string }>, callback: (error?: Error | null) => void): void; - final?(this: Transform, callback: (error?: Error | null) => void): void; - destroy?(this: Transform, error: Error | null, callback: (error: Error | null) => void): void; - transform?(this: Transform, chunk: any, encoding: string, callback: TransformCallback): void; - flush?(this: Transform, callback: TransformCallback): void; - } - - export class Transform extends Duplex { - constructor(opts?: TransformOptions); - _transform(chunk: any, encoding: string, callback: TransformCallback): void; - _flush(callback: TransformCallback): void; - } - - export class PassThrough extends Transform { } - - export function pipeline(stream1: NodeJS.ReadableStream, stream2: T, callback?: (err: NodeJS.ErrnoException) => void): T; - export function pipeline(stream1: NodeJS.ReadableStream, stream2: NodeJS.ReadWriteStream, stream3: T, callback?: (err: NodeJS.ErrnoException) => void): T; - export function pipeline(stream1: NodeJS.ReadableStream, stream2: NodeJS.ReadWriteStream, stream3: NodeJS.ReadWriteStream, stream4: T, callback?: (err: NodeJS.ErrnoException) => void): T; - export function pipeline(stream1: NodeJS.ReadableStream, stream2: NodeJS.ReadWriteStream, stream3: NodeJS.ReadWriteStream, stream4: NodeJS.ReadWriteStream, stream5: T, callback?: (err: NodeJS.ErrnoException) => void): T; - export function pipeline(streams: Array, callback?: (err: NodeJS.ErrnoException) => void): NodeJS.WritableStream; - export function pipeline(stream1: NodeJS.ReadableStream, stream2: NodeJS.ReadWriteStream | NodeJS.WritableStream, ...streams: Array void)>): NodeJS.WritableStream; - export namespace pipeline { - export function __promisify__(stream1: NodeJS.ReadableStream, stream2: T): Promise; - export function __promisify__(stream1: NodeJS.ReadableStream, stream2: NodeJS.ReadWriteStream, stream3: T): Promise; - export function __promisify__(stream1: NodeJS.ReadableStream, stream2: NodeJS.ReadWriteStream, stream3: NodeJS.ReadWriteStream, stream4: T): Promise; - export function __promisify__(stream1: NodeJS.ReadableStream, stream2: NodeJS.ReadWriteStream, stream3: NodeJS.ReadWriteStream, stream4: NodeJS.ReadWriteStream, stream5: T): Promise; - export function __promisify__(streams: Array): Promise; - export function __promisify__(stream1: NodeJS.ReadableStream, stream2: NodeJS.ReadWriteStream | NodeJS.WritableStream, ...streams: Array): Promise; - } - } - - export = internal; -} - -declare module "util" { - export interface InspectOptions extends NodeJS.InspectOptions { } - export function format(format: any, ...param: any[]): string; - /** @deprecated since v0.11.3 - use `console.error()` instead. */ - export function debug(string: string): void; - /** @deprecated since v0.11.3 - use `console.error()` instead. */ - export function error(...param: any[]): void; - /** @deprecated since v0.11.3 - use `console.log()` instead. */ - export function puts(...param: any[]): void; - /** @deprecated since v0.11.3 - use `console.log()` instead. */ - export function print(...param: any[]): void; - /** @deprecated since v0.11.3 - use a third party module instead. */ - export function log(string: string): void; - export var inspect: { - (object: any, showHidden?: boolean, depth?: number | null, color?: boolean): string; - (object: any, options: InspectOptions): string; - colors: { - [color: string]: [number, number] | undefined - } - styles: { - [style: string]: string | undefined - } - defaultOptions: InspectOptions; - custom: symbol; - }; - /** @deprecated since v4.0.0 - use `Array.isArray()` instead. */ - export function isArray(object: any): object is any[]; - /** @deprecated since v4.0.0 - use `util.types.isRegExp()` instead. */ - export function isRegExp(object: any): object is RegExp; - /** @deprecated since v4.0.0 - use `util.types.isDate()` instead. */ - export function isDate(object: any): object is Date; - /** @deprecated since v4.0.0 - use `util.types.isNativeError()` instead. */ - export function isError(object: any): object is Error; - export function inherits(constructor: any, superConstructor: any): void; - export function debuglog(key: string): (msg: string, ...param: any[]) => void; - /** @deprecated since v4.0.0 - use `typeof value === 'boolean'` instead. */ - export function isBoolean(object: any): object is boolean; - /** @deprecated since v4.0.0 - use `Buffer.isBuffer()` instead. */ - export function isBuffer(object: any): object is Buffer; - /** @deprecated since v4.0.0 - use `typeof value === 'function'` instead. */ - export function isFunction(object: any): boolean; - /** @deprecated since v4.0.0 - use `value === null` instead. */ - export function isNull(object: any): object is null; - /** @deprecated since v4.0.0 - use `value === null || value === undefined` instead. */ - export function isNullOrUndefined(object: any): object is null | undefined; - /** @deprecated since v4.0.0 - use `typeof value === 'number'` instead. */ - export function isNumber(object: any): object is number; - /** @deprecated since v4.0.0 - use `value !== null && typeof value === 'object'` instead. */ - export function isObject(object: any): boolean; - /** @deprecated since v4.0.0 - use `(typeof value !== 'object' && typeof value !== 'function') || value === null` instead. */ - export function isPrimitive(object: any): boolean; - /** @deprecated since v4.0.0 - use `typeof value === 'string'` instead. */ - export function isString(object: any): object is string; - /** @deprecated since v4.0.0 - use `typeof value === 'symbol'` instead. */ - export function isSymbol(object: any): object is symbol; - /** @deprecated since v4.0.0 - use `value === undefined` instead. */ - export function isUndefined(object: any): object is undefined; - export function deprecate(fn: T, message: string): T; - export function isDeepStrictEqual(val1: any, val2: any): boolean; - - export interface CustomPromisify extends Function { - __promisify__: TCustom; - } - - export function callbackify(fn: () => Promise): (callback: (err: NodeJS.ErrnoException) => void) => void; - export function callbackify(fn: () => Promise): (callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; - export function callbackify(fn: (arg1: T1) => Promise): (arg1: T1, callback: (err: NodeJS.ErrnoException) => void) => void; - export function callbackify(fn: (arg1: T1) => Promise): (arg1: T1, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; - export function callbackify(fn: (arg1: T1, arg2: T2) => Promise): (arg1: T1, arg2: T2, callback: (err: NodeJS.ErrnoException) => void) => void; - export function callbackify(fn: (arg1: T1, arg2: T2) => Promise): (arg1: T1, arg2: T2, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; - export function callbackify(fn: (arg1: T1, arg2: T2, arg3: T3) => Promise): (arg1: T1, arg2: T2, arg3: T3, callback: (err: NodeJS.ErrnoException) => void) => void; - export function callbackify(fn: (arg1: T1, arg2: T2, arg3: T3) => Promise): (arg1: T1, arg2: T2, arg3: T3, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; - export function callbackify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: NodeJS.ErrnoException) => void) => void; - export function callbackify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; - export function callbackify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: NodeJS.ErrnoException) => void) => void; - export function callbackify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; - export function callbackify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Promise): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (err: NodeJS.ErrnoException) => void) => void; - export function callbackify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Promise): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; - - export function promisify(fn: CustomPromisify): TCustom; - export function promisify(fn: (callback: (err: Error | null, result: TResult) => void) => void): () => Promise; - export function promisify(fn: (callback: (err: Error | null) => void) => void): () => Promise; - export function promisify(fn: (arg1: T1, callback: (err: Error | null, result: TResult) => void) => void): (arg1: T1) => Promise; - export function promisify(fn: (arg1: T1, callback: (err: Error | null) => void) => void): (arg1: T1) => Promise; - export function promisify(fn: (arg1: T1, arg2: T2, callback: (err: Error | null, result: TResult) => void) => void): (arg1: T1, arg2: T2) => Promise; - export function promisify(fn: (arg1: T1, arg2: T2, callback: (err: Error | null) => void) => void): (arg1: T1, arg2: T2) => Promise; - export function promisify(fn: (arg1: T1, arg2: T2, arg3: T3, callback: (err: Error | null, result: TResult) => void) => void): (arg1: T1, arg2: T2, arg3: T3) => Promise; - export function promisify(fn: (arg1: T1, arg2: T2, arg3: T3, callback: (err: Error | null) => void) => void): (arg1: T1, arg2: T2, arg3: T3) => Promise; - export function promisify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: Error | null, result: TResult) => void) => void): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise; - export function promisify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: Error | null) => void) => void): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise; - export function promisify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: Error | null, result: TResult) => void) => void): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise; - export function promisify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: Error | null) => void) => void): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise; - export function promisify(fn: Function): Function; - export namespace promisify { - const custom: symbol; - } - - export namespace types { - export function isAnyArrayBuffer(object: any): boolean; - export function isArgumentsObject(object: any): object is IArguments; - export function isArrayBuffer(object: any): object is ArrayBuffer; - export function isAsyncFunction(object: any): boolean; - export function isBooleanObject(object: any): object is Boolean; - export function isDataView(object: any): object is DataView; - export function isDate(object: any): object is Date; - export function isExternal(object: any): boolean; - export function isFloat32Array(object: any): object is Float32Array; - export function isFloat64Array(object: any): object is Float64Array; - export function isGeneratorFunction(object: any): boolean; - export function isGeneratorObject(object: any): boolean; - export function isInt8Array(object: any): object is Int8Array; - export function isInt16Array(object: any): object is Int16Array; - export function isInt32Array(object: any): object is Int32Array; - export function isMap(object: any): boolean; - export function isMapIterator(object: any): boolean; - export function isNativeError(object: any): object is Error; - export function isNumberObject(object: any): object is Number; - export function isPromise(object: any): boolean; - export function isProxy(object: any): boolean; - export function isRegExp(object: any): object is RegExp; - export function isSet(object: any): boolean; - export function isSetIterator(object: any): boolean; - export function isSharedArrayBuffer(object: any): boolean; - export function isStringObject(object: any): boolean; - export function isSymbolObject(object: any): boolean; - export function isTypedArray(object: any): object is NodeJS.TypedArray; - export function isUint8Array(object: any): object is Uint8Array; - export function isUint8ClampedArray(object: any): object is Uint8ClampedArray; - export function isUint16Array(object: any): object is Uint16Array; - export function isUint32Array(object: any): object is Uint32Array; - export function isWeakMap(object: any): boolean; - export function isWeakSet(object: any): boolean; - export function isWebAssemblyCompiledModule(object: any): boolean; - } - - export class TextDecoder { - readonly encoding: string; - readonly fatal: boolean; - readonly ignoreBOM: boolean; - constructor( - encoding?: string, - options?: { fatal?: boolean; ignoreBOM?: boolean } - ); - decode( - input?: NodeJS.TypedArray | DataView | ArrayBuffer | null, - options?: { stream?: boolean } - ): string; - } - - export class TextEncoder { - readonly encoding: string; - constructor(); - encode(input?: string): Uint8Array; - } -} - -declare module "assert" { - function internal(value: any, message?: string | Error): void; - namespace internal { - export class AssertionError implements Error { - name: string; - message: string; - actual: any; - expected: any; - operator: string; - generatedMessage: boolean; - code: 'ERR_ASSERTION'; - - constructor(options?: { - message?: string; actual?: any; expected?: any; - operator?: string; stackStartFn?: Function - }); - } - - export function fail(message?: string | Error): never; - /** @deprecated since v10.0.0 - use fail([message]) or other assert functions instead. */ - export function fail(actual: any, expected: any, message?: string | Error, operator?: string, stackStartFn?: Function): never; - export function ok(value: any, message?: string | Error): void; - /** @deprecated since v9.9.0 - use strictEqual() instead. */ - export function equal(actual: any, expected: any, message?: string | Error): void; - /** @deprecated since v9.9.0 - use notStrictEqual() instead. */ - export function notEqual(actual: any, expected: any, message?: string | Error): void; - /** @deprecated since v9.9.0 - use deepStrictEqual() instead. */ - export function deepEqual(actual: any, expected: any, message?: string | Error): void; - /** @deprecated since v9.9.0 - use notDeepStrictEqual() instead. */ - export function notDeepEqual(actual: any, expected: any, message?: string | Error): void; - export function strictEqual(actual: any, expected: any, message?: string | Error): void; - export function notStrictEqual(actual: any, expected: any, message?: string | Error): void; - export function deepStrictEqual(actual: any, expected: any, message?: string | Error): void; - export function notDeepStrictEqual(actual: any, expected: any, message?: string | Error): void; - - export function throws(block: Function, message?: string | Error): void; - export function throws(block: Function, error: RegExp | Function | Object | Error, message?: string | Error): void; - export function doesNotThrow(block: Function, message?: string | Error): void; - export function doesNotThrow(block: Function, error: RegExp | Function, message?: string | Error): void; - - export function ifError(value: any): void; - - export function rejects(block: Function | Promise, message?: string | Error): Promise; - export function rejects(block: Function | Promise, error: RegExp | Function | Object | Error, message?: string | Error): Promise; - export function doesNotReject(block: Function | Promise, message?: string | Error): Promise; - export function doesNotReject(block: Function | Promise, error: RegExp | Function, message?: string | Error): Promise; - - export var strict: typeof internal; - } - - export = internal; -} - -declare module "tty" { - import * as net from "net"; - - export function isatty(fd: number): boolean; - export class ReadStream extends net.Socket { - isRaw: boolean; - setRawMode(mode: boolean): void; - isTTY: boolean; - } - export class WriteStream extends net.Socket { - columns: number; - rows: number; - isTTY: boolean; - } -} - -declare module "domain" { - import * as events from "events"; - - export class Domain extends events.EventEmitter implements NodeJS.Domain { - run(fn: Function): void; - add(emitter: events.EventEmitter): void; - remove(emitter: events.EventEmitter): void; - bind(cb: (err: Error, data: any) => any): any; - intercept(cb: (data: any) => any): any; - members: any[]; - enter(): void; - exit(): void; - } - - export function create(): Domain; -} - -declare module "constants" { - export var E2BIG: number; - export var EACCES: number; - export var EADDRINUSE: number; - export var EADDRNOTAVAIL: number; - export var EAFNOSUPPORT: number; - export var EAGAIN: number; - export var EALREADY: number; - export var EBADF: number; - export var EBADMSG: number; - export var EBUSY: number; - export var ECANCELED: number; - export var ECHILD: number; - export var ECONNABORTED: number; - export var ECONNREFUSED: number; - export var ECONNRESET: number; - export var EDEADLK: number; - export var EDESTADDRREQ: number; - export var EDOM: number; - export var EEXIST: number; - export var EFAULT: number; - export var EFBIG: number; - export var EHOSTUNREACH: number; - export var EIDRM: number; - export var EILSEQ: number; - export var EINPROGRESS: number; - export var EINTR: number; - export var EINVAL: number; - export var EIO: number; - export var EISCONN: number; - export var EISDIR: number; - export var ELOOP: number; - export var EMFILE: number; - export var EMLINK: number; - export var EMSGSIZE: number; - export var ENAMETOOLONG: number; - export var ENETDOWN: number; - export var ENETRESET: number; - export var ENETUNREACH: number; - export var ENFILE: number; - export var ENOBUFS: number; - export var ENODATA: number; - export var ENODEV: number; - export var ENOENT: number; - export var ENOEXEC: number; - export var ENOLCK: number; - export var ENOLINK: number; - export var ENOMEM: number; - export var ENOMSG: number; - export var ENOPROTOOPT: number; - export var ENOSPC: number; - export var ENOSR: number; - export var ENOSTR: number; - export var ENOSYS: number; - export var ENOTCONN: number; - export var ENOTDIR: number; - export var ENOTEMPTY: number; - export var ENOTSOCK: number; - export var ENOTSUP: number; - export var ENOTTY: number; - export var ENXIO: number; - export var EOPNOTSUPP: number; - export var EOVERFLOW: number; - export var EPERM: number; - export var EPIPE: number; - export var EPROTO: number; - export var EPROTONOSUPPORT: number; - export var EPROTOTYPE: number; - export var ERANGE: number; - export var EROFS: number; - export var ESPIPE: number; - export var ESRCH: number; - export var ETIME: number; - export var ETIMEDOUT: number; - export var ETXTBSY: number; - export var EWOULDBLOCK: number; - export var EXDEV: number; - export var WSAEINTR: number; - export var WSAEBADF: number; - export var WSAEACCES: number; - export var WSAEFAULT: number; - export var WSAEINVAL: number; - export var WSAEMFILE: number; - export var WSAEWOULDBLOCK: number; - export var WSAEINPROGRESS: number; - export var WSAEALREADY: number; - export var WSAENOTSOCK: number; - export var WSAEDESTADDRREQ: number; - export var WSAEMSGSIZE: number; - export var WSAEPROTOTYPE: number; - export var WSAENOPROTOOPT: number; - export var WSAEPROTONOSUPPORT: number; - export var WSAESOCKTNOSUPPORT: number; - export var WSAEOPNOTSUPP: number; - export var WSAEPFNOSUPPORT: number; - export var WSAEAFNOSUPPORT: number; - export var WSAEADDRINUSE: number; - export var WSAEADDRNOTAVAIL: number; - export var WSAENETDOWN: number; - export var WSAENETUNREACH: number; - export var WSAENETRESET: number; - export var WSAECONNABORTED: number; - export var WSAECONNRESET: number; - export var WSAENOBUFS: number; - export var WSAEISCONN: number; - export var WSAENOTCONN: number; - export var WSAESHUTDOWN: number; - export var WSAETOOMANYREFS: number; - export var WSAETIMEDOUT: number; - export var WSAECONNREFUSED: number; - export var WSAELOOP: number; - export var WSAENAMETOOLONG: number; - export var WSAEHOSTDOWN: number; - export var WSAEHOSTUNREACH: number; - export var WSAENOTEMPTY: number; - export var WSAEPROCLIM: number; - export var WSAEUSERS: number; - export var WSAEDQUOT: number; - export var WSAESTALE: number; - export var WSAEREMOTE: number; - export var WSASYSNOTREADY: number; - export var WSAVERNOTSUPPORTED: number; - export var WSANOTINITIALISED: number; - export var WSAEDISCON: number; - export var WSAENOMORE: number; - export var WSAECANCELLED: number; - export var WSAEINVALIDPROCTABLE: number; - export var WSAEINVALIDPROVIDER: number; - export var WSAEPROVIDERFAILEDINIT: number; - export var WSASYSCALLFAILURE: number; - export var WSASERVICE_NOT_FOUND: number; - export var WSATYPE_NOT_FOUND: number; - export var WSA_E_NO_MORE: number; - export var WSA_E_CANCELLED: number; - export var WSAEREFUSED: number; - export var SIGHUP: number; - export var SIGINT: number; - export var SIGILL: number; - export var SIGABRT: number; - export var SIGFPE: number; - export var SIGKILL: number; - export var SIGSEGV: number; - export var SIGTERM: number; - export var SIGBREAK: number; - export var SIGWINCH: number; - export var SSL_OP_ALL: number; - export var SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION: number; - export var SSL_OP_CIPHER_SERVER_PREFERENCE: number; - export var SSL_OP_CISCO_ANYCONNECT: number; - export var SSL_OP_COOKIE_EXCHANGE: number; - export var SSL_OP_CRYPTOPRO_TLSEXT_BUG: number; - export var SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS: number; - export var SSL_OP_EPHEMERAL_RSA: number; - export var SSL_OP_LEGACY_SERVER_CONNECT: number; - export var SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER: number; - export var SSL_OP_MICROSOFT_SESS_ID_BUG: number; - export var SSL_OP_MSIE_SSLV2_RSA_PADDING: number; - export var SSL_OP_NETSCAPE_CA_DN_BUG: number; - export var SSL_OP_NETSCAPE_CHALLENGE_BUG: number; - export var SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG: number; - export var SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG: number; - export var SSL_OP_NO_COMPRESSION: number; - export var SSL_OP_NO_QUERY_MTU: number; - export var SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION: number; - export var SSL_OP_NO_SSLv2: number; - export var SSL_OP_NO_SSLv3: number; - export var SSL_OP_NO_TICKET: number; - export var SSL_OP_NO_TLSv1: number; - export var SSL_OP_NO_TLSv1_1: number; - export var SSL_OP_NO_TLSv1_2: number; - export var SSL_OP_PKCS1_CHECK_1: number; - export var SSL_OP_PKCS1_CHECK_2: number; - export var SSL_OP_SINGLE_DH_USE: number; - export var SSL_OP_SINGLE_ECDH_USE: number; - export var SSL_OP_SSLEAY_080_CLIENT_DH_BUG: number; - export var SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG: number; - export var SSL_OP_TLS_BLOCK_PADDING_BUG: number; - export var SSL_OP_TLS_D5_BUG: number; - export var SSL_OP_TLS_ROLLBACK_BUG: number; - export var ENGINE_METHOD_DSA: number; - export var ENGINE_METHOD_DH: number; - export var ENGINE_METHOD_RAND: number; - export var ENGINE_METHOD_ECDH: number; - export var ENGINE_METHOD_ECDSA: number; - export var ENGINE_METHOD_CIPHERS: number; - export var ENGINE_METHOD_DIGESTS: number; - export var ENGINE_METHOD_STORE: number; - export var ENGINE_METHOD_PKEY_METHS: number; - export var ENGINE_METHOD_PKEY_ASN1_METHS: number; - export var ENGINE_METHOD_ALL: number; - export var ENGINE_METHOD_NONE: number; - export var DH_CHECK_P_NOT_SAFE_PRIME: number; - export var DH_CHECK_P_NOT_PRIME: number; - export var DH_UNABLE_TO_CHECK_GENERATOR: number; - export var DH_NOT_SUITABLE_GENERATOR: number; - export var NPN_ENABLED: number; - export var RSA_PKCS1_PADDING: number; - export var RSA_SSLV23_PADDING: number; - export var RSA_NO_PADDING: number; - export var RSA_PKCS1_OAEP_PADDING: number; - export var RSA_X931_PADDING: number; - export var RSA_PKCS1_PSS_PADDING: number; - export var POINT_CONVERSION_COMPRESSED: number; - export var POINT_CONVERSION_UNCOMPRESSED: number; - export var POINT_CONVERSION_HYBRID: number; - export var O_RDONLY: number; - export var O_WRONLY: number; - export var O_RDWR: number; - export var S_IFMT: number; - export var S_IFREG: number; - export var S_IFDIR: number; - export var S_IFCHR: number; - export var S_IFBLK: number; - export var S_IFIFO: number; - export var S_IFSOCK: number; - export var S_IRWXU: number; - export var S_IRUSR: number; - export var S_IWUSR: number; - export var S_IXUSR: number; - export var S_IRWXG: number; - export var S_IRGRP: number; - export var S_IWGRP: number; - export var S_IXGRP: number; - export var S_IRWXO: number; - export var S_IROTH: number; - export var S_IWOTH: number; - export var S_IXOTH: number; - export var S_IFLNK: number; - export var O_CREAT: number; - export var O_EXCL: number; - export var O_NOCTTY: number; - export var O_DIRECTORY: number; - export var O_NOATIME: number; - export var O_NOFOLLOW: number; - export var O_SYNC: number; - export var O_DSYNC: number; - export var O_SYMLINK: number; - export var O_DIRECT: number; - export var O_NONBLOCK: number; - export var O_TRUNC: number; - export var O_APPEND: number; - export var F_OK: number; - export var R_OK: number; - export var W_OK: number; - export var X_OK: number; - export var COPYFILE_EXCL: number; - export var COPYFILE_FICLONE: number; - export var COPYFILE_FICLONE_FORCE: number; - export var UV_UDP_REUSEADDR: number; - export var SIGQUIT: number; - export var SIGTRAP: number; - export var SIGIOT: number; - export var SIGBUS: number; - export var SIGUSR1: number; - export var SIGUSR2: number; - export var SIGPIPE: number; - export var SIGALRM: number; - export var SIGCHLD: number; - export var SIGSTKFLT: number; - export var SIGCONT: number; - export var SIGSTOP: number; - export var SIGTSTP: number; - export var SIGTTIN: number; - export var SIGTTOU: number; - export var SIGURG: number; - export var SIGXCPU: number; - export var SIGXFSZ: number; - export var SIGVTALRM: number; - export var SIGPROF: number; - export var SIGIO: number; - export var SIGPOLL: number; - export var SIGPWR: number; - export var SIGSYS: number; - export var SIGUNUSED: number; - export var defaultCoreCipherList: string; - export var defaultCipherList: string; - export var ENGINE_METHOD_RSA: number; - export var ALPN_ENABLED: number; -} - -declare module "module" { - export = NodeJS.Module; -} - -declare module "process" { - export = process; -} - -declare module "v8" { - interface HeapSpaceInfo { - space_name: string; - space_size: number; - space_used_size: number; - space_available_size: number; - physical_space_size: number; - } - - // ** Signifies if the --zap_code_space option is enabled or not. 1 == enabled, 0 == disabled. */ - type DoesZapCodeSpaceFlag = 0 | 1; - - interface HeapInfo { - total_heap_size: number; - total_heap_size_executable: number; - total_physical_size: number; - total_available_size: number; - used_heap_size: number; - heap_size_limit: number; - malloced_memory: number; - peak_malloced_memory: number; - does_zap_garbage: DoesZapCodeSpaceFlag; - } - - export function getHeapStatistics(): HeapInfo; - export function getHeapSpaceStatistics(): HeapSpaceInfo[]; - export function setFlagsFromString(flags: string): void; -} - -declare module "timers" { - export function setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; - export namespace setTimeout { - export function __promisify__(ms: number): Promise; - export function __promisify__(ms: number, value: T): Promise; - } - export function clearTimeout(timeoutId: NodeJS.Timer): void; - export function setInterval(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; - export function clearInterval(intervalId: NodeJS.Timer): void; - export function setImmediate(callback: (...args: any[]) => void, ...args: any[]): any; - export namespace setImmediate { - export function __promisify__(): Promise; - export function __promisify__(value: T): Promise; - } - export function clearImmediate(immediateId: any): void; -} - -declare module "console" { - export = console; -} - -/** - * Async Hooks module: https://nodejs.org/api/async_hooks.html - */ -declare module "async_hooks" { - /** - * Returns the asyncId of the current execution context. - */ - export function executionAsyncId(): number; - - /** - * Returns the ID of the resource responsible for calling the callback that is currently being executed. - */ - export function triggerAsyncId(): number; - - export interface HookCallbacks { - /** - * Called when a class is constructed that has the possibility to emit an asynchronous event. - * @param asyncId a unique ID for the async resource - * @param type the type of the async resource - * @param triggerAsyncId the unique ID of the async resource in whose execution context this async resource was created - * @param resource reference to the resource representing the async operation, needs to be released during destroy - */ - init?(asyncId: number, type: string, triggerAsyncId: number, resource: Object): void; - - /** - * When an asynchronous operation is initiated or completes a callback is called to notify the user. - * The before callback is called just before said callback is executed. - * @param asyncId the unique identifier assigned to the resource about to execute the callback. - */ - before?(asyncId: number): void; - - /** - * Called immediately after the callback specified in before is completed. - * @param asyncId the unique identifier assigned to the resource which has executed the callback. - */ - after?(asyncId: number): void; - - /** - * Called when a promise has resolve() called. This may not be in the same execution id - * as the promise itself. - * @param asyncId the unique id for the promise that was resolve()d. - */ - promiseResolve?(asyncId: number): void; - - /** - * Called after the resource corresponding to asyncId is destroyed - * @param asyncId a unique ID for the async resource - */ - destroy?(asyncId: number): void; - } - - export interface AsyncHook { - /** - * Enable the callbacks for a given AsyncHook instance. If no callbacks are provided enabling is a noop. - */ - enable(): this; - - /** - * Disable the callbacks for a given AsyncHook instance from the global pool of AsyncHook callbacks to be executed. Once a hook has been disabled it will not be called again until enabled. - */ - disable(): this; - } - - /** - * Registers functions to be called for different lifetime events of each async operation. - * @param options the callbacks to register - * @return an AsyncHooks instance used for disabling and enabling hooks - */ - export function createHook(options: HookCallbacks): AsyncHook; - - export interface AsyncResourceOptions { - /** - * The ID of the execution context that created this async event. - * Default: `executionAsyncId()` - */ - triggerAsyncId?: number; - - /** - * Disables automatic `emitDestroy` when the object is garbage collected. - * This usually does not need to be set (even if `emitDestroy` is called - * manually), unless the resource's `asyncId` is retrieved and the - * sensitive API's `emitDestroy` is called with it. - * Default: `false` - */ - requireManualDestroy?: boolean; - } - - /** - * The class AsyncResource was designed to be extended by the embedder's async resources. - * Using this users can easily trigger the lifetime events of their own resources. - */ - export class AsyncResource { - /** - * AsyncResource() is meant to be extended. Instantiating a - * new AsyncResource() also triggers init. If triggerAsyncId is omitted then - * async_hook.executionAsyncId() is used. - * @param type The type of async event. - * @param triggerAsyncId The ID of the execution context that created - * this async event (default: `executionAsyncId()`), or an - * AsyncResourceOptions object (since 9.3) - */ - constructor(type: string, triggerAsyncId?: number|AsyncResourceOptions); - - /** - * Call AsyncHooks before callbacks. - * @deprecated since 9.6 - Use asyncResource.runInAsyncScope() instead. - */ - emitBefore(): void; - - /** - * Call AsyncHooks after callbacks. - * @deprecated since 9.6 - Use asyncResource.runInAsyncScope() instead. - */ - emitAfter(): void; - - /** - * Call the provided function with the provided arguments in the - * execution context of the async resource. This will establish the - * context, trigger the AsyncHooks before callbacks, call the function, - * trigger the AsyncHooks after callbacks, and then restore the original - * execution context. - * @param fn The function to call in the execution context of this - * async resource. - * @param thisArg The receiver to be used for the function call. - * @param args Optional arguments to pass to the function. - */ - runInAsyncScope(fn: (this: This, ...args: any[]) => Result, thisArg?: This, ...args: any[]): Result; - - /** - * Call AsyncHooks destroy callbacks. - */ - emitDestroy(): void; - - /** - * @return the unique ID assigned to this AsyncResource instance. - */ - asyncId(): number; - - /** - * @return the trigger ID for this AsyncResource instance. - */ - triggerAsyncId(): number; - } -} - -declare module "http2" { - import * as events from "events"; - import * as fs from "fs"; - import * as net from "net"; - import * as stream from "stream"; - import * as tls from "tls"; - import * as url from "url"; - - import { IncomingHttpHeaders as Http1IncomingHttpHeaders, OutgoingHttpHeaders } from "http"; - export { OutgoingHttpHeaders } from "http"; - - export interface IncomingHttpStatusHeader { - ":status"?: number; - } - - export interface IncomingHttpHeaders extends Http1IncomingHttpHeaders { - ":path"?: string; - ":method"?: string; - ":authority"?: string; - ":scheme"?: string; - } - - // Http2Stream - - export interface StreamPriorityOptions { - exclusive?: boolean; - parent?: number; - weight?: number; - silent?: boolean; - } - - export interface StreamState { - localWindowSize?: number; - state?: number; - streamLocalClose?: number; - streamRemoteClose?: number; - sumDependencyWeight?: number; - weight?: number; - } - - export interface ServerStreamResponseOptions { - endStream?: boolean; - getTrailers?: (trailers: OutgoingHttpHeaders) => void; - } - - export interface StatOptions { - offset: number; - length: number; - } - - export interface ServerStreamFileResponseOptions { - statCheck?: (stats: fs.Stats, headers: OutgoingHttpHeaders, statOptions: StatOptions) => void | boolean; - getTrailers?: (trailers: OutgoingHttpHeaders) => void; - offset?: number; - length?: number; - } - - export interface ServerStreamFileResponseOptionsWithError extends ServerStreamFileResponseOptions { - onError?: (err: NodeJS.ErrnoException) => void; - } - - export interface Http2Stream extends stream.Duplex { - readonly aborted: boolean; - close(code?: number, callback?: () => void): void; - readonly closed: boolean; - readonly destroyed: boolean; - readonly pending: boolean; - priority(options: StreamPriorityOptions): void; - readonly rstCode: number; - readonly session: Http2Session; - setTimeout(msecs: number, callback?: () => void): void; - readonly state: StreamState; - - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "aborted", listener: () => void): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "data", listener: (chunk: Buffer | string) => void): this; - addListener(event: "drain", listener: () => void): this; - addListener(event: "end", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "finish", listener: () => void): this; - addListener(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; - addListener(event: "pipe", listener: (src: stream.Readable) => void): this; - addListener(event: "unpipe", listener: (src: stream.Readable) => void): this; - addListener(event: "streamClosed", listener: (code: number) => void): this; - addListener(event: "timeout", listener: () => void): this; - addListener(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "aborted"): boolean; - emit(event: "close"): boolean; - emit(event: "data", chunk: Buffer | string): boolean; - emit(event: "drain"): boolean; - emit(event: "end"): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "finish"): boolean; - emit(event: "frameError", frameType: number, errorCode: number): boolean; - emit(event: "pipe", src: stream.Readable): boolean; - emit(event: "unpipe", src: stream.Readable): boolean; - emit(event: "streamClosed", code: number): boolean; - emit(event: "timeout"): boolean; - emit(event: "trailers", trailers: IncomingHttpHeaders, flags: number): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "aborted", listener: () => void): this; - on(event: "close", listener: () => void): this; - on(event: "data", listener: (chunk: Buffer | string) => void): this; - on(event: "drain", listener: () => void): this; - on(event: "end", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "finish", listener: () => void): this; - on(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; - on(event: "pipe", listener: (src: stream.Readable) => void): this; - on(event: "unpipe", listener: (src: stream.Readable) => void): this; - on(event: "streamClosed", listener: (code: number) => void): this; - on(event: "timeout", listener: () => void): this; - on(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "aborted", listener: () => void): this; - once(event: "close", listener: () => void): this; - once(event: "data", listener: (chunk: Buffer | string) => void): this; - once(event: "drain", listener: () => void): this; - once(event: "end", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "finish", listener: () => void): this; - once(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; - once(event: "pipe", listener: (src: stream.Readable) => void): this; - once(event: "unpipe", listener: (src: stream.Readable) => void): this; - once(event: "streamClosed", listener: (code: number) => void): this; - once(event: "timeout", listener: () => void): this; - once(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "aborted", listener: () => void): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "data", listener: (chunk: Buffer | string) => void): this; - prependListener(event: "drain", listener: () => void): this; - prependListener(event: "end", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "finish", listener: () => void): this; - prependListener(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; - prependListener(event: "pipe", listener: (src: stream.Readable) => void): this; - prependListener(event: "unpipe", listener: (src: stream.Readable) => void): this; - prependListener(event: "streamClosed", listener: (code: number) => void): this; - prependListener(event: "timeout", listener: () => void): this; - prependListener(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "aborted", listener: () => void): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "data", listener: (chunk: Buffer | string) => void): this; - prependOnceListener(event: "drain", listener: () => void): this; - prependOnceListener(event: "end", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "finish", listener: () => void): this; - prependOnceListener(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; - prependOnceListener(event: "pipe", listener: (src: stream.Readable) => void): this; - prependOnceListener(event: "unpipe", listener: (src: stream.Readable) => void): this; - prependOnceListener(event: "streamClosed", listener: (code: number) => void): this; - prependOnceListener(event: "timeout", listener: () => void): this; - prependOnceListener(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; - } - - export interface ClientHttp2Stream extends Http2Stream { - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "headers", listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void): this; - addListener(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - addListener(event: "response", listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "headers", headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number): boolean; - emit(event: "push", headers: IncomingHttpHeaders, flags: number): boolean; - emit(event: "response", headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "headers", listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void): this; - on(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - on(event: "response", listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "headers", listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void): this; - once(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - once(event: "response", listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "headers", listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void): this; - prependListener(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - prependListener(event: "response", listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "headers", listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void): this; - prependOnceListener(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - prependOnceListener(event: "response", listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void): this; - } - - export interface ServerHttp2Stream extends Http2Stream { - additionalHeaders(headers: OutgoingHttpHeaders): void; - readonly headersSent: boolean; - readonly pushAllowed: boolean; - pushStream(headers: OutgoingHttpHeaders, callback?: (err: Error | null, pushStream: ServerHttp2Stream, headers: OutgoingHttpHeaders) => void): void; - pushStream(headers: OutgoingHttpHeaders, options?: StreamPriorityOptions, callback?: (err: Error | null, pushStream: ServerHttp2Stream, headers: OutgoingHttpHeaders) => void): void; - respond(headers?: OutgoingHttpHeaders, options?: ServerStreamResponseOptions): void; - respondWithFD(fd: number, headers?: OutgoingHttpHeaders, options?: ServerStreamFileResponseOptions): void; - respondWithFile(path: string, headers?: OutgoingHttpHeaders, options?: ServerStreamFileResponseOptionsWithError): void; - } - - // Http2Session - - export interface Settings { - headerTableSize?: number; - enablePush?: boolean; - initialWindowSize?: number; - maxFrameSize?: number; - maxConcurrentStreams?: number; - maxHeaderListSize?: number; - } - - export interface ClientSessionRequestOptions { - endStream?: boolean; - exclusive?: boolean; - parent?: number; - weight?: number; - getTrailers?: (trailers: OutgoingHttpHeaders, flags: number) => void; - } - - export interface SessionState { - effectiveLocalWindowSize?: number; - effectiveRecvDataLength?: number; - nextStreamID?: number; - localWindowSize?: number; - lastProcStreamID?: number; - remoteWindowSize?: number; - outboundQueueSize?: number; - deflateDynamicTableSize?: number; - inflateDynamicTableSize?: number; - } - - export interface Http2Session extends events.EventEmitter { - readonly alpnProtocol?: string; - close(callback?: () => void): void; - readonly closed: boolean; - readonly connecting: boolean; - destroy(error?: Error, code?: number): void; - readonly destroyed: boolean; - readonly encrypted?: boolean; - goaway(code?: number, lastStreamID?: number, opaqueData?: Buffer | DataView | NodeJS.TypedArray): void; - readonly localSettings: Settings; - readonly originSet?: string[]; - readonly pendingSettingsAck: boolean; - ping(callback: (err: Error | null, duration: number, payload: Buffer) => void): boolean; - ping(payload: Buffer | DataView | NodeJS.TypedArray , callback: (err: Error | null, duration: number, payload: Buffer) => void): boolean; - ref(): void; - readonly remoteSettings: Settings; - rstStream(stream: Http2Stream, code?: number): void; - setTimeout(msecs: number, callback?: () => void): void; - readonly socket: net.Socket | tls.TLSSocket; - readonly state: SessionState; - priority(stream: Http2Stream, options: StreamPriorityOptions): void; - settings(settings: Settings): void; - readonly type: number; - unref(): void; - - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; - addListener(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData: Buffer) => void): this; - addListener(event: "localSettings", listener: (settings: Settings) => void): this; - addListener(event: "remoteSettings", listener: (settings: Settings) => void): this; - addListener(event: "timeout", listener: () => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close"): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "frameError", frameType: number, errorCode: number, streamID: number): boolean; - emit(event: "goaway", errorCode: number, lastStreamID: number, opaqueData: Buffer): boolean; - emit(event: "localSettings", settings: Settings): boolean; - emit(event: "remoteSettings", settings: Settings): boolean; - emit(event: "timeout"): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "close", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; - on(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData: Buffer) => void): this; - on(event: "localSettings", listener: (settings: Settings) => void): this; - on(event: "remoteSettings", listener: (settings: Settings) => void): this; - on(event: "timeout", listener: () => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "close", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; - once(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData: Buffer) => void): this; - once(event: "localSettings", listener: (settings: Settings) => void): this; - once(event: "remoteSettings", listener: (settings: Settings) => void): this; - once(event: "timeout", listener: () => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; - prependListener(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData: Buffer) => void): this; - prependListener(event: "localSettings", listener: (settings: Settings) => void): this; - prependListener(event: "remoteSettings", listener: (settings: Settings) => void): this; - prependListener(event: "timeout", listener: () => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; - prependOnceListener(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData: Buffer) => void): this; - prependOnceListener(event: "localSettings", listener: (settings: Settings) => void): this; - prependOnceListener(event: "remoteSettings", listener: (settings: Settings) => void): this; - prependOnceListener(event: "timeout", listener: () => void): this; - } - - export interface ClientHttp2Session extends Http2Session { - request(headers?: OutgoingHttpHeaders, options?: ClientSessionRequestOptions): ClientHttp2Stream; - - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "altsvc", listener: (alt: string, origin: string, stream: number) => void): this; - addListener(event: "connect", listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - addListener(event: "stream", listener: (stream: ClientHttp2Stream, headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "altsvc", alt: string, origin: string, stream: number): boolean; - emit(event: "connect", session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket): boolean; - emit(event: "stream", stream: ClientHttp2Stream, headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "altsvc", listener: (alt: string, origin: string, stream: number) => void): this; - on(event: "connect", listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - on(event: "stream", listener: (stream: ClientHttp2Stream, headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "altsvc", listener: (alt: string, origin: string, stream: number) => void): this; - once(event: "connect", listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - once(event: "stream", listener: (stream: ClientHttp2Stream, headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "altsvc", listener: (alt: string, origin: string, stream: number) => void): this; - prependListener(event: "connect", listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - prependListener(event: "stream", listener: (stream: ClientHttp2Stream, headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "altsvc", listener: (alt: string, origin: string, stream: number) => void): this; - prependOnceListener(event: "connect", listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - prependOnceListener(event: "stream", listener: (stream: ClientHttp2Stream, headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void): this; - } - - export interface AlternativeServiceOptions { - origin: number | string | url.URL; - } - - export interface ServerHttp2Session extends Http2Session { - altsvc(alt: string, originOrStream: number | string | url.URL | AlternativeServiceOptions): void; - readonly server: Http2Server | Http2SecureServer; - - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "connect", listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - addListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "connect", session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket): boolean; - emit(event: "stream", stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "connect", listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - on(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "connect", listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - once(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "connect", listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - prependListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "connect", listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - prependOnceListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - } - - // Http2Server - - export interface SessionOptions { - maxDeflateDynamicTableSize?: number; - maxReservedRemoteStreams?: number; - maxSendHeaderBlockLength?: number; - paddingStrategy?: number; - peerMaxConcurrentStreams?: number; - selectPadding?: (frameLen: number, maxFrameLen: number) => number; - settings?: Settings; - } - - export type ClientSessionOptions = SessionOptions; - export type ServerSessionOptions = SessionOptions; - - export interface SecureClientSessionOptions extends ClientSessionOptions, tls.ConnectionOptions { } - export interface SecureServerSessionOptions extends ServerSessionOptions, tls.TlsOptions { } - - export interface ServerOptions extends ServerSessionOptions { - allowHTTP1?: boolean; - } - - export interface SecureServerOptions extends SecureServerSessionOptions { - allowHTTP1?: boolean; - } - - export interface Http2Server extends net.Server { - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "checkContinue", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - addListener(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - addListener(event: "sessionError", listener: (err: Error) => void): this; - addListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - addListener(event: "timeout", listener: () => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "checkContinue", request: Http2ServerRequest, response: Http2ServerResponse): boolean; - emit(event: "request", request: Http2ServerRequest, response: Http2ServerResponse): boolean; - emit(event: "sessionError", err: Error): boolean; - emit(event: "stream", stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number): boolean; - emit(event: "timeout"): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "checkContinue", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - on(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - on(event: "sessionError", listener: (err: Error) => void): this; - on(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - on(event: "timeout", listener: () => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "checkContinue", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - once(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - once(event: "sessionError", listener: (err: Error) => void): this; - once(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - once(event: "timeout", listener: () => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "checkContinue", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - prependListener(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - prependListener(event: "sessionError", listener: (err: Error) => void): this; - prependListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - prependListener(event: "timeout", listener: () => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "checkContinue", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - prependOnceListener(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - prependOnceListener(event: "sessionError", listener: (err: Error) => void): this; - prependOnceListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - prependOnceListener(event: "timeout", listener: () => void): this; - } - - export interface Http2SecureServer extends tls.Server { - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "checkContinue", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - addListener(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - addListener(event: "sessionError", listener: (err: Error) => void): this; - addListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - addListener(event: "timeout", listener: () => void): this; - addListener(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "checkContinue", request: Http2ServerRequest, response: Http2ServerResponse): boolean; - emit(event: "request", request: Http2ServerRequest, response: Http2ServerResponse): boolean; - emit(event: "sessionError", err: Error): boolean; - emit(event: "stream", stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number): boolean; - emit(event: "timeout"): boolean; - emit(event: "unknownProtocol", socket: tls.TLSSocket): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "checkContinue", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - on(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - on(event: "sessionError", listener: (err: Error) => void): this; - on(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - on(event: "timeout", listener: () => void): this; - on(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "checkContinue", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - once(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - once(event: "sessionError", listener: (err: Error) => void): this; - once(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - once(event: "timeout", listener: () => void): this; - once(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "checkContinue", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - prependListener(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - prependListener(event: "sessionError", listener: (err: Error) => void): this; - prependListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - prependListener(event: "timeout", listener: () => void): this; - prependListener(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "checkContinue", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - prependOnceListener(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - prependOnceListener(event: "sessionError", listener: (err: Error) => void): this; - prependOnceListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - prependOnceListener(event: "timeout", listener: () => void): this; - prependOnceListener(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; - } - - export interface Http2ServerRequest extends stream.Readable { - headers: IncomingHttpHeaders; - httpVersion: string; - method: string; - rawHeaders: string[]; - rawTrailers: string[]; - setTimeout(msecs: number, callback?: () => void): void; - socket: net.Socket | tls.TLSSocket; - stream: ServerHttp2Stream; - trailers: IncomingHttpHeaders; - url: string; - - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "aborted", hadError: boolean, code: number): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - } - - export interface Http2ServerResponse extends events.EventEmitter { - addTrailers(trailers: OutgoingHttpHeaders): void; - connection: net.Socket | tls.TLSSocket; - end(callback?: () => void): void; - end(data?: string | Buffer, callback?: () => void): void; - end(data?: string | Buffer, encoding?: string, callback?: () => void): void; - readonly finished: boolean; - getHeader(name: string): string; - getHeaderNames(): string[]; - getHeaders(): OutgoingHttpHeaders; - hasHeader(name: string): boolean; - readonly headersSent: boolean; - removeHeader(name: string): void; - sendDate: boolean; - setHeader(name: string, value: number | string | string[]): void; - setTimeout(msecs: number, callback?: () => void): void; - socket: net.Socket | tls.TLSSocket; - statusCode: number; - statusMessage: ''; - stream: ServerHttp2Stream; - write(chunk: string | Buffer, callback?: (err: Error) => void): boolean; - write(chunk: string | Buffer, encoding?: string, callback?: (err: Error) => void): boolean; - writeContinue(): void; - writeHead(statusCode: number, headers?: OutgoingHttpHeaders): void; - writeHead(statusCode: number, statusMessage?: string, headers?: OutgoingHttpHeaders): void; - createPushResponse(headers: OutgoingHttpHeaders, callback: (err: Error | null, res: Http2ServerResponse) => void): void; - - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "drain", listener: () => void): this; - addListener(event: "error", listener: (error: Error) => void): this; - addListener(event: "finish", listener: () => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "aborted", hadError: boolean, code: number): boolean; - emit(event: "close"): boolean; - emit(event: "drain"): boolean; - emit(event: "error", error: Error): boolean; - emit(event: "finish"): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - on(event: "close", listener: () => void): this; - on(event: "drain", listener: () => void): this; - on(event: "error", listener: (error: Error) => void): this; - on(event: "finish", listener: () => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - once(event: "close", listener: () => void): this; - once(event: "drain", listener: () => void): this; - once(event: "error", listener: (error: Error) => void): this; - once(event: "finish", listener: () => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "drain", listener: () => void): this; - prependListener(event: "error", listener: (error: Error) => void): this; - prependListener(event: "finish", listener: () => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "drain", listener: () => void): this; - prependOnceListener(event: "error", listener: (error: Error) => void): this; - prependOnceListener(event: "finish", listener: () => void): this; - } - - // Public API - - export namespace constants { - export const NGHTTP2_SESSION_SERVER: number; - export const NGHTTP2_SESSION_CLIENT: number; - export const NGHTTP2_STREAM_STATE_IDLE: number; - export const NGHTTP2_STREAM_STATE_OPEN: number; - export const NGHTTP2_STREAM_STATE_RESERVED_LOCAL: number; - export const NGHTTP2_STREAM_STATE_RESERVED_REMOTE: number; - export const NGHTTP2_STREAM_STATE_HALF_CLOSED_LOCAL: number; - export const NGHTTP2_STREAM_STATE_HALF_CLOSED_REMOTE: number; - export const NGHTTP2_STREAM_STATE_CLOSED: number; - export const NGHTTP2_NO_ERROR: number; - export const NGHTTP2_PROTOCOL_ERROR: number; - export const NGHTTP2_INTERNAL_ERROR: number; - export const NGHTTP2_FLOW_CONTROL_ERROR: number; - export const NGHTTP2_SETTINGS_TIMEOUT: number; - export const NGHTTP2_STREAM_CLOSED: number; - export const NGHTTP2_FRAME_SIZE_ERROR: number; - export const NGHTTP2_REFUSED_STREAM: number; - export const NGHTTP2_CANCEL: number; - export const NGHTTP2_COMPRESSION_ERROR: number; - export const NGHTTP2_CONNECT_ERROR: number; - export const NGHTTP2_ENHANCE_YOUR_CALM: number; - export const NGHTTP2_INADEQUATE_SECURITY: number; - export const NGHTTP2_HTTP_1_1_REQUIRED: number; - export const NGHTTP2_ERR_FRAME_SIZE_ERROR: number; - export const NGHTTP2_FLAG_NONE: number; - export const NGHTTP2_FLAG_END_STREAM: number; - export const NGHTTP2_FLAG_END_HEADERS: number; - export const NGHTTP2_FLAG_ACK: number; - export const NGHTTP2_FLAG_PADDED: number; - export const NGHTTP2_FLAG_PRIORITY: number; - export const DEFAULT_SETTINGS_HEADER_TABLE_SIZE: number; - export const DEFAULT_SETTINGS_ENABLE_PUSH: number; - export const DEFAULT_SETTINGS_INITIAL_WINDOW_SIZE: number; - export const DEFAULT_SETTINGS_MAX_FRAME_SIZE: number; - export const MAX_MAX_FRAME_SIZE: number; - export const MIN_MAX_FRAME_SIZE: number; - export const MAX_INITIAL_WINDOW_SIZE: number; - export const NGHTTP2_DEFAULT_WEIGHT: number; - export const NGHTTP2_SETTINGS_HEADER_TABLE_SIZE: number; - export const NGHTTP2_SETTINGS_ENABLE_PUSH: number; - export const NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS: number; - export const NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE: number; - export const NGHTTP2_SETTINGS_MAX_FRAME_SIZE: number; - export const NGHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE: number; - export const PADDING_STRATEGY_NONE: number; - export const PADDING_STRATEGY_MAX: number; - export const PADDING_STRATEGY_CALLBACK: number; - export const HTTP2_HEADER_STATUS: string; - export const HTTP2_HEADER_METHOD: string; - export const HTTP2_HEADER_AUTHORITY: string; - export const HTTP2_HEADER_SCHEME: string; - export const HTTP2_HEADER_PATH: string; - export const HTTP2_HEADER_ACCEPT_CHARSET: string; - export const HTTP2_HEADER_ACCEPT_ENCODING: string; - export const HTTP2_HEADER_ACCEPT_LANGUAGE: string; - export const HTTP2_HEADER_ACCEPT_RANGES: string; - export const HTTP2_HEADER_ACCEPT: string; - export const HTTP2_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN: string; - export const HTTP2_HEADER_AGE: string; - export const HTTP2_HEADER_ALLOW: string; - export const HTTP2_HEADER_AUTHORIZATION: string; - export const HTTP2_HEADER_CACHE_CONTROL: string; - export const HTTP2_HEADER_CONNECTION: string; - export const HTTP2_HEADER_CONTENT_DISPOSITION: string; - export const HTTP2_HEADER_CONTENT_ENCODING: string; - export const HTTP2_HEADER_CONTENT_LANGUAGE: string; - export const HTTP2_HEADER_CONTENT_LENGTH: string; - export const HTTP2_HEADER_CONTENT_LOCATION: string; - export const HTTP2_HEADER_CONTENT_MD5: string; - export const HTTP2_HEADER_CONTENT_RANGE: string; - export const HTTP2_HEADER_CONTENT_TYPE: string; - export const HTTP2_HEADER_COOKIE: string; - export const HTTP2_HEADER_DATE: string; - export const HTTP2_HEADER_ETAG: string; - export const HTTP2_HEADER_EXPECT: string; - export const HTTP2_HEADER_EXPIRES: string; - export const HTTP2_HEADER_FROM: string; - export const HTTP2_HEADER_HOST: string; - export const HTTP2_HEADER_IF_MATCH: string; - export const HTTP2_HEADER_IF_MODIFIED_SINCE: string; - export const HTTP2_HEADER_IF_NONE_MATCH: string; - export const HTTP2_HEADER_IF_RANGE: string; - export const HTTP2_HEADER_IF_UNMODIFIED_SINCE: string; - export const HTTP2_HEADER_LAST_MODIFIED: string; - export const HTTP2_HEADER_LINK: string; - export const HTTP2_HEADER_LOCATION: string; - export const HTTP2_HEADER_MAX_FORWARDS: string; - export const HTTP2_HEADER_PREFER: string; - export const HTTP2_HEADER_PROXY_AUTHENTICATE: string; - export const HTTP2_HEADER_PROXY_AUTHORIZATION: string; - export const HTTP2_HEADER_RANGE: string; - export const HTTP2_HEADER_REFERER: string; - export const HTTP2_HEADER_REFRESH: string; - export const HTTP2_HEADER_RETRY_AFTER: string; - export const HTTP2_HEADER_SERVER: string; - export const HTTP2_HEADER_SET_COOKIE: string; - export const HTTP2_HEADER_STRICT_TRANSPORT_SECURITY: string; - export const HTTP2_HEADER_TRANSFER_ENCODING: string; - export const HTTP2_HEADER_TE: string; - export const HTTP2_HEADER_UPGRADE: string; - export const HTTP2_HEADER_USER_AGENT: string; - export const HTTP2_HEADER_VARY: string; - export const HTTP2_HEADER_VIA: string; - export const HTTP2_HEADER_WWW_AUTHENTICATE: string; - export const HTTP2_HEADER_HTTP2_SETTINGS: string; - export const HTTP2_HEADER_KEEP_ALIVE: string; - export const HTTP2_HEADER_PROXY_CONNECTION: string; - export const HTTP2_METHOD_ACL: string; - export const HTTP2_METHOD_BASELINE_CONTROL: string; - export const HTTP2_METHOD_BIND: string; - export const HTTP2_METHOD_CHECKIN: string; - export const HTTP2_METHOD_CHECKOUT: string; - export const HTTP2_METHOD_CONNECT: string; - export const HTTP2_METHOD_COPY: string; - export const HTTP2_METHOD_DELETE: string; - export const HTTP2_METHOD_GET: string; - export const HTTP2_METHOD_HEAD: string; - export const HTTP2_METHOD_LABEL: string; - export const HTTP2_METHOD_LINK: string; - export const HTTP2_METHOD_LOCK: string; - export const HTTP2_METHOD_MERGE: string; - export const HTTP2_METHOD_MKACTIVITY: string; - export const HTTP2_METHOD_MKCALENDAR: string; - export const HTTP2_METHOD_MKCOL: string; - export const HTTP2_METHOD_MKREDIRECTREF: string; - export const HTTP2_METHOD_MKWORKSPACE: string; - export const HTTP2_METHOD_MOVE: string; - export const HTTP2_METHOD_OPTIONS: string; - export const HTTP2_METHOD_ORDERPATCH: string; - export const HTTP2_METHOD_PATCH: string; - export const HTTP2_METHOD_POST: string; - export const HTTP2_METHOD_PRI: string; - export const HTTP2_METHOD_PROPFIND: string; - export const HTTP2_METHOD_PROPPATCH: string; - export const HTTP2_METHOD_PUT: string; - export const HTTP2_METHOD_REBIND: string; - export const HTTP2_METHOD_REPORT: string; - export const HTTP2_METHOD_SEARCH: string; - export const HTTP2_METHOD_TRACE: string; - export const HTTP2_METHOD_UNBIND: string; - export const HTTP2_METHOD_UNCHECKOUT: string; - export const HTTP2_METHOD_UNLINK: string; - export const HTTP2_METHOD_UNLOCK: string; - export const HTTP2_METHOD_UPDATE: string; - export const HTTP2_METHOD_UPDATEREDIRECTREF: string; - export const HTTP2_METHOD_VERSION_CONTROL: string; - export const HTTP_STATUS_CONTINUE: number; - export const HTTP_STATUS_SWITCHING_PROTOCOLS: number; - export const HTTP_STATUS_PROCESSING: number; - export const HTTP_STATUS_OK: number; - export const HTTP_STATUS_CREATED: number; - export const HTTP_STATUS_ACCEPTED: number; - export const HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION: number; - export const HTTP_STATUS_NO_CONTENT: number; - export const HTTP_STATUS_RESET_CONTENT: number; - export const HTTP_STATUS_PARTIAL_CONTENT: number; - export const HTTP_STATUS_MULTI_STATUS: number; - export const HTTP_STATUS_ALREADY_REPORTED: number; - export const HTTP_STATUS_IM_USED: number; - export const HTTP_STATUS_MULTIPLE_CHOICES: number; - export const HTTP_STATUS_MOVED_PERMANENTLY: number; - export const HTTP_STATUS_FOUND: number; - export const HTTP_STATUS_SEE_OTHER: number; - export const HTTP_STATUS_NOT_MODIFIED: number; - export const HTTP_STATUS_USE_PROXY: number; - export const HTTP_STATUS_TEMPORARY_REDIRECT: number; - export const HTTP_STATUS_PERMANENT_REDIRECT: number; - export const HTTP_STATUS_BAD_REQUEST: number; - export const HTTP_STATUS_UNAUTHORIZED: number; - export const HTTP_STATUS_PAYMENT_REQUIRED: number; - export const HTTP_STATUS_FORBIDDEN: number; - export const HTTP_STATUS_NOT_FOUND: number; - export const HTTP_STATUS_METHOD_NOT_ALLOWED: number; - export const HTTP_STATUS_NOT_ACCEPTABLE: number; - export const HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED: number; - export const HTTP_STATUS_REQUEST_TIMEOUT: number; - export const HTTP_STATUS_CONFLICT: number; - export const HTTP_STATUS_GONE: number; - export const HTTP_STATUS_LENGTH_REQUIRED: number; - export const HTTP_STATUS_PRECONDITION_FAILED: number; - export const HTTP_STATUS_PAYLOAD_TOO_LARGE: number; - export const HTTP_STATUS_URI_TOO_LONG: number; - export const HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE: number; - export const HTTP_STATUS_RANGE_NOT_SATISFIABLE: number; - export const HTTP_STATUS_EXPECTATION_FAILED: number; - export const HTTP_STATUS_TEAPOT: number; - export const HTTP_STATUS_MISDIRECTED_REQUEST: number; - export const HTTP_STATUS_UNPROCESSABLE_ENTITY: number; - export const HTTP_STATUS_LOCKED: number; - export const HTTP_STATUS_FAILED_DEPENDENCY: number; - export const HTTP_STATUS_UNORDERED_COLLECTION: number; - export const HTTP_STATUS_UPGRADE_REQUIRED: number; - export const HTTP_STATUS_PRECONDITION_REQUIRED: number; - export const HTTP_STATUS_TOO_MANY_REQUESTS: number; - export const HTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE: number; - export const HTTP_STATUS_UNAVAILABLE_FOR_LEGAL_REASONS: number; - export const HTTP_STATUS_INTERNAL_SERVER_ERROR: number; - export const HTTP_STATUS_NOT_IMPLEMENTED: number; - export const HTTP_STATUS_BAD_GATEWAY: number; - export const HTTP_STATUS_SERVICE_UNAVAILABLE: number; - export const HTTP_STATUS_GATEWAY_TIMEOUT: number; - export const HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED: number; - export const HTTP_STATUS_VARIANT_ALSO_NEGOTIATES: number; - export const HTTP_STATUS_INSUFFICIENT_STORAGE: number; - export const HTTP_STATUS_LOOP_DETECTED: number; - export const HTTP_STATUS_BANDWIDTH_LIMIT_EXCEEDED: number; - export const HTTP_STATUS_NOT_EXTENDED: number; - export const HTTP_STATUS_NETWORK_AUTHENTICATION_REQUIRED: number; - } - - export function getDefaultSettings(): Settings; - export function getPackedSettings(settings: Settings): Settings; - export function getUnpackedSettings(buf: Buffer | Uint8Array): Settings; - - export function createServer(onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void): Http2Server; - export function createServer(options: ServerOptions, onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void): Http2Server; - - export function createSecureServer(onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void): Http2SecureServer; - export function createSecureServer(options: SecureServerOptions, onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void): Http2SecureServer; - - export function connect(authority: string | url.URL, listener?: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): ClientHttp2Session; - export function connect(authority: string | url.URL, options?: ClientSessionOptions | SecureClientSessionOptions, listener?: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): ClientHttp2Session; -} - -declare module "perf_hooks" { - import { AsyncResource } from "async_hooks"; - - export interface PerformanceEntry { - /** - * The total number of milliseconds elapsed for this entry. - * This value will not be meaningful for all Performance Entry types. - */ - readonly duration: number; - - /** - * The name of the performance entry. - */ - readonly name: string; - - /** - * The high resolution millisecond timestamp marking the starting time of the Performance Entry. - */ - readonly startTime: number; - - /** - * The type of the performance entry. - * Currently it may be one of: 'node', 'mark', 'measure', 'gc', or 'function'. - */ - readonly entryType: string; - - /** - * When performanceEntry.entryType is equal to 'gc', the performance.kind property identifies - * the type of garbage collection operation that occurred. - * The value may be one of perf_hooks.constants. - */ - readonly kind?: number; - } - - export interface PerformanceNodeTiming extends PerformanceEntry { - /** - * The high resolution millisecond timestamp at which the Node.js process completed bootstrap. - */ - readonly bootstrapComplete: number; - - /** - * The high resolution millisecond timestamp at which cluster processing ended. - */ - readonly clusterSetupEnd: number; - - /** - * The high resolution millisecond timestamp at which cluster processing started. - */ - readonly clusterSetupStart: number; - - /** - * The high resolution millisecond timestamp at which the Node.js event loop exited. - */ - readonly loopExit: number; - - /** - * The high resolution millisecond timestamp at which the Node.js event loop started. - */ - readonly loopStart: number; - - /** - * The high resolution millisecond timestamp at which main module load ended. - */ - readonly moduleLoadEnd: number; - - /** - * The high resolution millisecond timestamp at which main module load started. - */ - readonly moduleLoadStart: number; - - /** - * The high resolution millisecond timestamp at which the Node.js process was initialized. - */ - readonly nodeStart: number; - - /** - * The high resolution millisecond timestamp at which preload module load ended. - */ - readonly preloadModuleLoadEnd: number; - - /** - * The high resolution millisecond timestamp at which preload module load started. - */ - readonly preloadModuleLoadStart: number; - - /** - * The high resolution millisecond timestamp at which third_party_main processing ended. - */ - readonly thirdPartyMainEnd: number; - - /** - * The high resolution millisecond timestamp at which third_party_main processing started. - */ - readonly thirdPartyMainStart: number; - - /** - * The high resolution millisecond timestamp at which the V8 platform was initialized. - */ - readonly v8Start: number; - } - - export interface Performance { - /** - * If name is not provided, removes all PerformanceFunction objects from the Performance Timeline. - * If name is provided, removes entries with name. - * @param name - */ - clearFunctions(name?: string): void; - - /** - * If name is not provided, removes all PerformanceMark objects from the Performance Timeline. - * If name is provided, removes only the named mark. - * @param name - */ - clearMarks(name?: string): void; - - /** - * If name is not provided, removes all PerformanceMeasure objects from the Performance Timeline. - * If name is provided, removes only objects whose performanceEntry.name matches name. - */ - clearMeasures(name?: string): void; - - /** - * Returns a list of all PerformanceEntry objects in chronological order with respect to performanceEntry.startTime. - * @return list of all PerformanceEntry objects - */ - getEntries(): PerformanceEntry[]; - - /** - * Returns a list of all PerformanceEntry objects in chronological order with respect to performanceEntry.startTime - * whose performanceEntry.name is equal to name, and optionally, whose performanceEntry.entryType is equal to type. - * @param name - * @param type - * @return list of all PerformanceEntry objects - */ - getEntriesByName(name: string, type?: string): PerformanceEntry[]; - - /** - * Returns a list of all PerformanceEntry objects in chronological order with respect to performanceEntry.startTime - * whose performanceEntry.entryType is equal to type. - * @param type - * @return list of all PerformanceEntry objects - */ - getEntriesByType(type: string): PerformanceEntry[]; - - /** - * Creates a new PerformanceMark entry in the Performance Timeline. - * A PerformanceMark is a subclass of PerformanceEntry whose performanceEntry.entryType is always 'mark', - * and whose performanceEntry.duration is always 0. - * Performance marks are used to mark specific significant moments in the Performance Timeline. - * @param name - */ - mark(name?: string): void; - - /** - * Creates a new PerformanceMeasure entry in the Performance Timeline. - * A PerformanceMeasure is a subclass of PerformanceEntry whose performanceEntry.entryType is always 'measure', - * and whose performanceEntry.duration measures the number of milliseconds elapsed since startMark and endMark. - * - * The startMark argument may identify any existing PerformanceMark in the the Performance Timeline, or may identify - * any of the timestamp properties provided by the PerformanceNodeTiming class. If the named startMark does not exist, - * then startMark is set to timeOrigin by default. - * - * The endMark argument must identify any existing PerformanceMark in the the Performance Timeline or any of the timestamp - * properties provided by the PerformanceNodeTiming class. If the named endMark does not exist, an error will be thrown. - * @param name - * @param startMark - * @param endMark - */ - measure(name: string, startMark: string, endMark: string): void; - - /** - * An instance of the PerformanceNodeTiming class that provides performance metrics for specific Node.js operational milestones. - */ - readonly nodeTiming: PerformanceNodeTiming; - - /** - * @return the current high resolution millisecond timestamp - */ - now(): number; - - /** - * The timeOrigin specifies the high resolution millisecond timestamp from which all performance metric durations are measured. - */ - readonly timeOrigin: number; - - /** - * Wraps a function within a new function that measures the running time of the wrapped function. - * A PerformanceObserver must be subscribed to the 'function' event type in order for the timing details to be accessed. - * @param fn - */ - timerify any>(fn: T): T; - } - - export interface PerformanceObserverEntryList { - /** - * @return a list of PerformanceEntry objects in chronological order with respect to performanceEntry.startTime. - */ - getEntries(): PerformanceEntry[]; - - /** - * @return a list of PerformanceEntry objects in chronological order with respect to performanceEntry.startTime - * whose performanceEntry.name is equal to name, and optionally, whose performanceEntry.entryType is equal to type. - */ - getEntriesByName(name: string, type?: string): PerformanceEntry[]; - - /** - * @return Returns a list of PerformanceEntry objects in chronological order with respect to performanceEntry.startTime - * whose performanceEntry.entryType is equal to type. - */ - getEntriesByType(type: string): PerformanceEntry[]; - } - - export type PerformanceObserverCallback = (list: PerformanceObserverEntryList, observer: PerformanceObserver) => void; - - export class PerformanceObserver extends AsyncResource { - constructor(callback: PerformanceObserverCallback); - - /** - * Disconnects the PerformanceObserver instance from all notifications. - */ - disconnect(): void; - - /** - * Subscribes the PerformanceObserver instance to notifications of new PerformanceEntry instances identified by options.entryTypes. - * When options.buffered is false, the callback will be invoked once for every PerformanceEntry instance. - * Property buffered defaults to false. - * @param options - */ - observe(options: { entryTypes: string[], buffered?: boolean }): void; - } - - export namespace constants { - export const NODE_PERFORMANCE_GC_MAJOR: number; - export const NODE_PERFORMANCE_GC_MINOR: number; - export const NODE_PERFORMANCE_GC_INCREMENTAL: number; - export const NODE_PERFORMANCE_GC_WEAKCB: number; - } - - const performance: Performance; -} diff --git a/node_modules/@types/node/inspector.d.ts b/node_modules/@types/node/inspector.d.ts deleted file mode 100644 index 955239b486aa9..0000000000000 --- a/node_modules/@types/node/inspector.d.ts +++ /dev/null @@ -1,2488 +0,0 @@ -// Type definitions for inspector - -// These definitions are auto-generated. -// Please see https://github.com/DefinitelyTyped/DefinitelyTyped/pull/19330 -// for more information. - -/** - * The inspector module provides an API for interacting with the V8 inspector. - */ -declare module "inspector" { - import { EventEmitter } from 'events'; - - export interface InspectorNotification { - method: string; - params: T; - } - - export namespace Schema { - /** - * Description of the protocol domain. - */ - export interface Domain { - /** - * Domain name. - */ - name: string; - /** - * Domain version. - */ - version: string; - } - - export interface GetDomainsReturnType { - /** - * List of supported domains. - */ - domains: Schema.Domain[]; - } - } - - export namespace Runtime { - /** - * Unique script identifier. - */ - export type ScriptId = string; - - /** - * Unique object identifier. - */ - export type RemoteObjectId = string; - - /** - * Primitive value which cannot be JSON-stringified. - */ - export type UnserializableValue = string; - - /** - * Mirror object referencing original JavaScript object. - */ - export interface RemoteObject { - /** - * Object type. - */ - type: string; - /** - * Object subtype hint. Specified for object type values only. - */ - subtype?: string; - /** - * Object class (constructor) name. Specified for object type values only. - */ - className?: string; - /** - * Remote object value in case of primitive values or JSON values (if it was requested). - */ - value?: any; - /** - * Primitive value which can not be JSON-stringified does not have value, but gets this property. - */ - unserializableValue?: Runtime.UnserializableValue; - /** - * String representation of the object. - */ - description?: string; - /** - * Unique object identifier (for non-primitive values). - */ - objectId?: Runtime.RemoteObjectId; - /** - * Preview containing abbreviated property values. Specified for object type values only. - * @experimental - */ - preview?: Runtime.ObjectPreview; - /** - * @experimental - */ - customPreview?: Runtime.CustomPreview; - } - - /** - * @experimental - */ - export interface CustomPreview { - header: string; - hasBody: boolean; - formatterObjectId: Runtime.RemoteObjectId; - bindRemoteObjectFunctionId: Runtime.RemoteObjectId; - configObjectId?: Runtime.RemoteObjectId; - } - - /** - * Object containing abbreviated remote object value. - * @experimental - */ - export interface ObjectPreview { - /** - * Object type. - */ - type: string; - /** - * Object subtype hint. Specified for object type values only. - */ - subtype?: string; - /** - * String representation of the object. - */ - description?: string; - /** - * True iff some of the properties or entries of the original object did not fit. - */ - overflow: boolean; - /** - * List of the properties. - */ - properties: Runtime.PropertyPreview[]; - /** - * List of the entries. Specified for map and set subtype values only. - */ - entries?: Runtime.EntryPreview[]; - } - - /** - * @experimental - */ - export interface PropertyPreview { - /** - * Property name. - */ - name: string; - /** - * Object type. Accessor means that the property itself is an accessor property. - */ - type: string; - /** - * User-friendly property value string. - */ - value?: string; - /** - * Nested value preview. - */ - valuePreview?: Runtime.ObjectPreview; - /** - * Object subtype hint. Specified for object type values only. - */ - subtype?: string; - } - - /** - * @experimental - */ - export interface EntryPreview { - /** - * Preview of the key. Specified for map-like collection entries. - */ - key?: Runtime.ObjectPreview; - /** - * Preview of the value. - */ - value: Runtime.ObjectPreview; - } - - /** - * Object property descriptor. - */ - export interface PropertyDescriptor { - /** - * Property name or symbol description. - */ - name: string; - /** - * The value associated with the property. - */ - value?: Runtime.RemoteObject; - /** - * True if the value associated with the property may be changed (data descriptors only). - */ - writable?: boolean; - /** - * A function which serves as a getter for the property, or undefined if there is no getter (accessor descriptors only). - */ - get?: Runtime.RemoteObject; - /** - * A function which serves as a setter for the property, or undefined if there is no setter (accessor descriptors only). - */ - set?: Runtime.RemoteObject; - /** - * True if the type of this property descriptor may be changed and if the property may be deleted from the corresponding object. - */ - configurable: boolean; - /** - * True if this property shows up during enumeration of the properties on the corresponding object. - */ - enumerable: boolean; - /** - * True if the result was thrown during the evaluation. - */ - wasThrown?: boolean; - /** - * True if the property is owned for the object. - */ - isOwn?: boolean; - /** - * Property symbol object, if the property is of the symbol type. - */ - symbol?: Runtime.RemoteObject; - } - - /** - * Object internal property descriptor. This property isn't normally visible in JavaScript code. - */ - export interface InternalPropertyDescriptor { - /** - * Conventional property name. - */ - name: string; - /** - * The value associated with the property. - */ - value?: Runtime.RemoteObject; - } - - /** - * Represents function call argument. Either remote object id objectId, primitive value, unserializable primitive value or neither of (for undefined) them should be specified. - */ - export interface CallArgument { - /** - * Primitive value. - */ - value?: any; - /** - * Primitive value which can not be JSON-stringified. - */ - unserializableValue?: Runtime.UnserializableValue; - /** - * Remote object handle. - */ - objectId?: Runtime.RemoteObjectId; - } - - /** - * Id of an execution context. - */ - export type ExecutionContextId = number; - - /** - * Description of an isolated world. - */ - export interface ExecutionContextDescription { - /** - * Unique id of the execution context. It can be used to specify in which execution context script evaluation should be performed. - */ - id: Runtime.ExecutionContextId; - /** - * Execution context origin. - */ - origin: string; - /** - * Human readable name describing given context. - */ - name: string; - /** - * Embedder-specific auxiliary data. - */ - auxData?: {}; - } - - /** - * Detailed information about exception (or error) that was thrown during script compilation or execution. - */ - export interface ExceptionDetails { - /** - * Exception id. - */ - exceptionId: number; - /** - * Exception text, which should be used together with exception object when available. - */ - text: string; - /** - * Line number of the exception location (0-based). - */ - lineNumber: number; - /** - * Column number of the exception location (0-based). - */ - columnNumber: number; - /** - * Script ID of the exception location. - */ - scriptId?: Runtime.ScriptId; - /** - * URL of the exception location, to be used when the script was not reported. - */ - url?: string; - /** - * JavaScript stack trace if available. - */ - stackTrace?: Runtime.StackTrace; - /** - * Exception object if available. - */ - exception?: Runtime.RemoteObject; - /** - * Identifier of the context where exception happened. - */ - executionContextId?: Runtime.ExecutionContextId; - } - - /** - * Number of milliseconds since epoch. - */ - export type Timestamp = number; - - /** - * Stack entry for runtime errors and assertions. - */ - export interface CallFrame { - /** - * JavaScript function name. - */ - functionName: string; - /** - * JavaScript script id. - */ - scriptId: Runtime.ScriptId; - /** - * JavaScript script name or url. - */ - url: string; - /** - * JavaScript script line number (0-based). - */ - lineNumber: number; - /** - * JavaScript script column number (0-based). - */ - columnNumber: number; - } - - /** - * Call frames for assertions or error messages. - */ - export interface StackTrace { - /** - * String label of this stack trace. For async traces this may be a name of the function that initiated the async call. - */ - description?: string; - /** - * JavaScript function name. - */ - callFrames: Runtime.CallFrame[]; - /** - * Asynchronous JavaScript stack trace that preceded this stack, if available. - */ - parent?: Runtime.StackTrace; - /** - * Creation frame of the Promise which produced the next synchronous trace when resolved, if available. - * @experimental - */ - promiseCreationFrame?: Runtime.CallFrame; - } - - export interface EvaluateParameterType { - /** - * Expression to evaluate. - */ - expression: string; - /** - * Symbolic group name that can be used to release multiple objects. - */ - objectGroup?: string; - /** - * Determines whether Command Line API should be available during the evaluation. - */ - includeCommandLineAPI?: boolean; - /** - * In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides setPauseOnException state. - */ - silent?: boolean; - /** - * Specifies in which execution context to perform evaluation. If the parameter is omitted the evaluation will be performed in the context of the inspected page. - */ - contextId?: Runtime.ExecutionContextId; - /** - * Whether the result is expected to be a JSON object that should be sent by value. - */ - returnByValue?: boolean; - /** - * Whether preview should be generated for the result. - * @experimental - */ - generatePreview?: boolean; - /** - * Whether execution should be treated as initiated by user in the UI. - * @experimental - */ - userGesture?: boolean; - /** - * Whether execution should wait for promise to be resolved. If the result of evaluation is not a Promise, it's considered to be an error. - */ - awaitPromise?: boolean; - } - - export interface AwaitPromiseParameterType { - /** - * Identifier of the promise. - */ - promiseObjectId: Runtime.RemoteObjectId; - /** - * Whether the result is expected to be a JSON object that should be sent by value. - */ - returnByValue?: boolean; - /** - * Whether preview should be generated for the result. - */ - generatePreview?: boolean; - } - - export interface CallFunctionOnParameterType { - /** - * Identifier of the object to call function on. - */ - objectId: Runtime.RemoteObjectId; - /** - * Declaration of the function to call. - */ - functionDeclaration: string; - /** - * Call arguments. All call arguments must belong to the same JavaScript world as the target object. - */ - arguments?: Runtime.CallArgument[]; - /** - * In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides setPauseOnException state. - */ - silent?: boolean; - /** - * Whether the result is expected to be a JSON object which should be sent by value. - */ - returnByValue?: boolean; - /** - * Whether preview should be generated for the result. - * @experimental - */ - generatePreview?: boolean; - /** - * Whether execution should be treated as initiated by user in the UI. - * @experimental - */ - userGesture?: boolean; - /** - * Whether execution should wait for promise to be resolved. If the result of evaluation is not a Promise, it's considered to be an error. - */ - awaitPromise?: boolean; - } - - export interface GetPropertiesParameterType { - /** - * Identifier of the object to return properties for. - */ - objectId: Runtime.RemoteObjectId; - /** - * If true, returns properties belonging only to the element itself, not to its prototype chain. - */ - ownProperties?: boolean; - /** - * If true, returns accessor properties (with getter/setter) only; internal properties are not returned either. - * @experimental - */ - accessorPropertiesOnly?: boolean; - /** - * Whether preview should be generated for the results. - * @experimental - */ - generatePreview?: boolean; - } - - export interface ReleaseObjectParameterType { - /** - * Identifier of the object to release. - */ - objectId: Runtime.RemoteObjectId; - } - - export interface ReleaseObjectGroupParameterType { - /** - * Symbolic object group name. - */ - objectGroup: string; - } - - export interface SetCustomObjectFormatterEnabledParameterType { - enabled: boolean; - } - - export interface CompileScriptParameterType { - /** - * Expression to compile. - */ - expression: string; - /** - * Source url to be set for the script. - */ - sourceURL: string; - /** - * Specifies whether the compiled script should be persisted. - */ - persistScript: boolean; - /** - * Specifies in which execution context to perform script run. If the parameter is omitted the evaluation will be performed in the context of the inspected page. - */ - executionContextId?: Runtime.ExecutionContextId; - } - - export interface RunScriptParameterType { - /** - * Id of the script to run. - */ - scriptId: Runtime.ScriptId; - /** - * Specifies in which execution context to perform script run. If the parameter is omitted the evaluation will be performed in the context of the inspected page. - */ - executionContextId?: Runtime.ExecutionContextId; - /** - * Symbolic group name that can be used to release multiple objects. - */ - objectGroup?: string; - /** - * In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides setPauseOnException state. - */ - silent?: boolean; - /** - * Determines whether Command Line API should be available during the evaluation. - */ - includeCommandLineAPI?: boolean; - /** - * Whether the result is expected to be a JSON object which should be sent by value. - */ - returnByValue?: boolean; - /** - * Whether preview should be generated for the result. - */ - generatePreview?: boolean; - /** - * Whether execution should wait for promise to be resolved. If the result of evaluation is not a Promise, it's considered to be an error. - */ - awaitPromise?: boolean; - } - - export interface EvaluateReturnType { - /** - * Evaluation result. - */ - result: Runtime.RemoteObject; - /** - * Exception details. - */ - exceptionDetails?: Runtime.ExceptionDetails; - } - - export interface AwaitPromiseReturnType { - /** - * Promise result. Will contain rejected value if promise was rejected. - */ - result: Runtime.RemoteObject; - /** - * Exception details if stack strace is available. - */ - exceptionDetails?: Runtime.ExceptionDetails; - } - - export interface CallFunctionOnReturnType { - /** - * Call result. - */ - result: Runtime.RemoteObject; - /** - * Exception details. - */ - exceptionDetails?: Runtime.ExceptionDetails; - } - - export interface GetPropertiesReturnType { - /** - * Object properties. - */ - result: Runtime.PropertyDescriptor[]; - /** - * Internal object properties (only of the element itself). - */ - internalProperties?: Runtime.InternalPropertyDescriptor[]; - /** - * Exception details. - */ - exceptionDetails?: Runtime.ExceptionDetails; - } - - export interface CompileScriptReturnType { - /** - * Id of the script. - */ - scriptId?: Runtime.ScriptId; - /** - * Exception details. - */ - exceptionDetails?: Runtime.ExceptionDetails; - } - - export interface RunScriptReturnType { - /** - * Run result. - */ - result: Runtime.RemoteObject; - /** - * Exception details. - */ - exceptionDetails?: Runtime.ExceptionDetails; - } - - export interface ExecutionContextCreatedEventDataType { - /** - * A newly created execution context. - */ - context: Runtime.ExecutionContextDescription; - } - - export interface ExecutionContextDestroyedEventDataType { - /** - * Id of the destroyed context - */ - executionContextId: Runtime.ExecutionContextId; - } - - export interface ExceptionThrownEventDataType { - /** - * Timestamp of the exception. - */ - timestamp: Runtime.Timestamp; - exceptionDetails: Runtime.ExceptionDetails; - } - - export interface ExceptionRevokedEventDataType { - /** - * Reason describing why exception was revoked. - */ - reason: string; - /** - * The id of revoked exception, as reported in exceptionUnhandled. - */ - exceptionId: number; - } - - export interface ConsoleAPICalledEventDataType { - /** - * Type of the call. - */ - type: string; - /** - * Call arguments. - */ - args: Runtime.RemoteObject[]; - /** - * Identifier of the context where the call was made. - */ - executionContextId: Runtime.ExecutionContextId; - /** - * Call timestamp. - */ - timestamp: Runtime.Timestamp; - /** - * Stack trace captured when the call was made. - */ - stackTrace?: Runtime.StackTrace; - /** - * Console context descriptor for calls on non-default console context (not console.*): 'anonymous#unique-logger-id' for call on unnamed context, 'name#unique-logger-id' for call on named context. - * @experimental - */ - context?: string; - } - - export interface InspectRequestedEventDataType { - object: Runtime.RemoteObject; - hints: {}; - } - } - - export namespace Debugger { - /** - * Breakpoint identifier. - */ - export type BreakpointId = string; - - /** - * Call frame identifier. - */ - export type CallFrameId = string; - - /** - * Location in the source code. - */ - export interface Location { - /** - * Script identifier as reported in the Debugger.scriptParsed. - */ - scriptId: Runtime.ScriptId; - /** - * Line number in the script (0-based). - */ - lineNumber: number; - /** - * Column number in the script (0-based). - */ - columnNumber?: number; - } - - /** - * Location in the source code. - * @experimental - */ - export interface ScriptPosition { - lineNumber: number; - columnNumber: number; - } - - /** - * JavaScript call frame. Array of call frames form the call stack. - */ - export interface CallFrame { - /** - * Call frame identifier. This identifier is only valid while the virtual machine is paused. - */ - callFrameId: Debugger.CallFrameId; - /** - * Name of the JavaScript function called on this call frame. - */ - functionName: string; - /** - * Location in the source code. - * @experimental - */ - functionLocation?: Debugger.Location; - /** - * Location in the source code. - */ - location: Debugger.Location; - /** - * Scope chain for this call frame. - */ - scopeChain: Debugger.Scope[]; - /** - * this object for this call frame. - */ - this: Runtime.RemoteObject; - /** - * The value being returned, if the function is at return point. - */ - returnValue?: Runtime.RemoteObject; - } - - /** - * Scope description. - */ - export interface Scope { - /** - * Scope type. - */ - type: string; - /** - * Object representing the scope. For global and with scopes it represents the actual object; for the rest of the scopes, it is artificial transient object enumerating scope variables as its properties. - */ - object: Runtime.RemoteObject; - name?: string; - /** - * Location in the source code where scope starts - */ - startLocation?: Debugger.Location; - /** - * Location in the source code where scope ends - */ - endLocation?: Debugger.Location; - } - - /** - * Search match for resource. - * @experimental - */ - export interface SearchMatch { - /** - * Line number in resource content. - */ - lineNumber: number; - /** - * Line with match content. - */ - lineContent: string; - } - - /** - * @experimental - */ - export interface BreakLocation { - /** - * Script identifier as reported in the Debugger.scriptParsed. - */ - scriptId: Runtime.ScriptId; - /** - * Line number in the script (0-based). - */ - lineNumber: number; - /** - * Column number in the script (0-based). - */ - columnNumber?: number; - type?: string; - } - - export interface SetBreakpointsActiveParameterType { - /** - * New value for breakpoints active state. - */ - active: boolean; - } - - export interface SetSkipAllPausesParameterType { - /** - * New value for skip pauses state. - */ - skip: boolean; - } - - export interface SetBreakpointByUrlParameterType { - /** - * Line number to set breakpoint at. - */ - lineNumber: number; - /** - * URL of the resources to set breakpoint on. - */ - url?: string; - /** - * Regex pattern for the URLs of the resources to set breakpoints on. Either url or urlRegex must be specified. - */ - urlRegex?: string; - /** - * Offset in the line to set breakpoint at. - */ - columnNumber?: number; - /** - * Expression to use as a breakpoint condition. When specified, debugger will only stop on the breakpoint if this expression evaluates to true. - */ - condition?: string; - } - - export interface SetBreakpointParameterType { - /** - * Location to set breakpoint in. - */ - location: Debugger.Location; - /** - * Expression to use as a breakpoint condition. When specified, debugger will only stop on the breakpoint if this expression evaluates to true. - */ - condition?: string; - } - - export interface RemoveBreakpointParameterType { - breakpointId: Debugger.BreakpointId; - } - - export interface GetPossibleBreakpointsParameterType { - /** - * Start of range to search possible breakpoint locations in. - */ - start: Debugger.Location; - /** - * End of range to search possible breakpoint locations in (excluding). When not specified, end of scripts is used as end of range. - */ - end?: Debugger.Location; - /** - * Only consider locations which are in the same (non-nested) function as start. - */ - restrictToFunction?: boolean; - } - - export interface ContinueToLocationParameterType { - /** - * Location to continue to. - */ - location: Debugger.Location; - /** - * @experimental - */ - targetCallFrames?: string; - } - - export interface SearchInContentParameterType { - /** - * Id of the script to search in. - */ - scriptId: Runtime.ScriptId; - /** - * String to search for. - */ - query: string; - /** - * If true, search is case sensitive. - */ - caseSensitive?: boolean; - /** - * If true, treats string parameter as regex. - */ - isRegex?: boolean; - } - - export interface SetScriptSourceParameterType { - /** - * Id of the script to edit. - */ - scriptId: Runtime.ScriptId; - /** - * New content of the script. - */ - scriptSource: string; - /** - * If true the change will not actually be applied. Dry run may be used to get result description without actually modifying the code. - */ - dryRun?: boolean; - } - - export interface RestartFrameParameterType { - /** - * Call frame identifier to evaluate on. - */ - callFrameId: Debugger.CallFrameId; - } - - export interface GetScriptSourceParameterType { - /** - * Id of the script to get source for. - */ - scriptId: Runtime.ScriptId; - } - - export interface SetPauseOnExceptionsParameterType { - /** - * Pause on exceptions mode. - */ - state: string; - } - - export interface EvaluateOnCallFrameParameterType { - /** - * Call frame identifier to evaluate on. - */ - callFrameId: Debugger.CallFrameId; - /** - * Expression to evaluate. - */ - expression: string; - /** - * String object group name to put result into (allows rapid releasing resulting object handles using releaseObjectGroup). - */ - objectGroup?: string; - /** - * Specifies whether command line API should be available to the evaluated expression, defaults to false. - */ - includeCommandLineAPI?: boolean; - /** - * In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides setPauseOnException state. - */ - silent?: boolean; - /** - * Whether the result is expected to be a JSON object that should be sent by value. - */ - returnByValue?: boolean; - /** - * Whether preview should be generated for the result. - * @experimental - */ - generatePreview?: boolean; - /** - * Whether to throw an exception if side effect cannot be ruled out during evaluation. - * @experimental - */ - throwOnSideEffect?: boolean; - } - - export interface SetVariableValueParameterType { - /** - * 0-based number of scope as was listed in scope chain. Only 'local', 'closure' and 'catch' scope types are allowed. Other scopes could be manipulated manually. - */ - scopeNumber: number; - /** - * Variable name. - */ - variableName: string; - /** - * New variable value. - */ - newValue: Runtime.CallArgument; - /** - * Id of callframe that holds variable. - */ - callFrameId: Debugger.CallFrameId; - } - - export interface SetAsyncCallStackDepthParameterType { - /** - * Maximum depth of async call stacks. Setting to 0 will effectively disable collecting async call stacks (default). - */ - maxDepth: number; - } - - export interface SetBlackboxPatternsParameterType { - /** - * Array of regexps that will be used to check script url for blackbox state. - */ - patterns: string[]; - } - - export interface SetBlackboxedRangesParameterType { - /** - * Id of the script. - */ - scriptId: Runtime.ScriptId; - positions: Debugger.ScriptPosition[]; - } - - export interface SetBreakpointByUrlReturnType { - /** - * Id of the created breakpoint for further reference. - */ - breakpointId: Debugger.BreakpointId; - /** - * List of the locations this breakpoint resolved into upon addition. - */ - locations: Debugger.Location[]; - } - - export interface SetBreakpointReturnType { - /** - * Id of the created breakpoint for further reference. - */ - breakpointId: Debugger.BreakpointId; - /** - * Location this breakpoint resolved into. - */ - actualLocation: Debugger.Location; - } - - export interface GetPossibleBreakpointsReturnType { - /** - * List of the possible breakpoint locations. - */ - locations: Debugger.BreakLocation[]; - } - - export interface SearchInContentReturnType { - /** - * List of search matches. - */ - result: Debugger.SearchMatch[]; - } - - export interface SetScriptSourceReturnType { - /** - * New stack trace in case editing has happened while VM was stopped. - */ - callFrames?: Debugger.CallFrame[]; - /** - * Whether current call stack was modified after applying the changes. - */ - stackChanged?: boolean; - /** - * Async stack trace, if any. - */ - asyncStackTrace?: Runtime.StackTrace; - /** - * Exception details if any. - */ - exceptionDetails?: Runtime.ExceptionDetails; - } - - export interface RestartFrameReturnType { - /** - * New stack trace. - */ - callFrames: Debugger.CallFrame[]; - /** - * Async stack trace, if any. - */ - asyncStackTrace?: Runtime.StackTrace; - } - - export interface GetScriptSourceReturnType { - /** - * Script source. - */ - scriptSource: string; - } - - export interface EvaluateOnCallFrameReturnType { - /** - * Object wrapper for the evaluation result. - */ - result: Runtime.RemoteObject; - /** - * Exception details. - */ - exceptionDetails?: Runtime.ExceptionDetails; - } - - export interface ScriptParsedEventDataType { - /** - * Identifier of the script parsed. - */ - scriptId: Runtime.ScriptId; - /** - * URL or name of the script parsed (if any). - */ - url: string; - /** - * Line offset of the script within the resource with given URL (for script tags). - */ - startLine: number; - /** - * Column offset of the script within the resource with given URL. - */ - startColumn: number; - /** - * Last line of the script. - */ - endLine: number; - /** - * Length of the last line of the script. - */ - endColumn: number; - /** - * Specifies script creation context. - */ - executionContextId: Runtime.ExecutionContextId; - /** - * Content hash of the script. - */ - hash: string; - /** - * Embedder-specific auxiliary data. - */ - executionContextAuxData?: {}; - /** - * True, if this script is generated as a result of the live edit operation. - * @experimental - */ - isLiveEdit?: boolean; - /** - * URL of source map associated with script (if any). - */ - sourceMapURL?: string; - /** - * True, if this script has sourceURL. - * @experimental - */ - hasSourceURL?: boolean; - /** - * True, if this script is ES6 module. - * @experimental - */ - isModule?: boolean; - /** - * This script length. - * @experimental - */ - length?: number; - /** - * JavaScript top stack frame of where the script parsed event was triggered if available. - * @experimental - */ - stackTrace?: Runtime.StackTrace; - } - - export interface ScriptFailedToParseEventDataType { - /** - * Identifier of the script parsed. - */ - scriptId: Runtime.ScriptId; - /** - * URL or name of the script parsed (if any). - */ - url: string; - /** - * Line offset of the script within the resource with given URL (for script tags). - */ - startLine: number; - /** - * Column offset of the script within the resource with given URL. - */ - startColumn: number; - /** - * Last line of the script. - */ - endLine: number; - /** - * Length of the last line of the script. - */ - endColumn: number; - /** - * Specifies script creation context. - */ - executionContextId: Runtime.ExecutionContextId; - /** - * Content hash of the script. - */ - hash: string; - /** - * Embedder-specific auxiliary data. - */ - executionContextAuxData?: {}; - /** - * URL of source map associated with script (if any). - */ - sourceMapURL?: string; - /** - * True, if this script has sourceURL. - * @experimental - */ - hasSourceURL?: boolean; - /** - * True, if this script is ES6 module. - * @experimental - */ - isModule?: boolean; - /** - * This script length. - * @experimental - */ - length?: number; - /** - * JavaScript top stack frame of where the script parsed event was triggered if available. - * @experimental - */ - stackTrace?: Runtime.StackTrace; - } - - export interface BreakpointResolvedEventDataType { - /** - * Breakpoint unique identifier. - */ - breakpointId: Debugger.BreakpointId; - /** - * Actual breakpoint location. - */ - location: Debugger.Location; - } - - export interface PausedEventDataType { - /** - * Call stack the virtual machine stopped on. - */ - callFrames: Debugger.CallFrame[]; - /** - * Pause reason. - */ - reason: string; - /** - * Object containing break-specific auxiliary properties. - */ - data?: {}; - /** - * Hit breakpoints IDs - */ - hitBreakpoints?: string[]; - /** - * Async stack trace, if any. - */ - asyncStackTrace?: Runtime.StackTrace; - } - } - - export namespace Console { - /** - * Console message. - */ - export interface ConsoleMessage { - /** - * Message source. - */ - source: string; - /** - * Message severity. - */ - level: string; - /** - * Message text. - */ - text: string; - /** - * URL of the message origin. - */ - url?: string; - /** - * Line number in the resource that generated this message (1-based). - */ - line?: number; - /** - * Column number in the resource that generated this message (1-based). - */ - column?: number; - } - - export interface MessageAddedEventDataType { - /** - * Console message that has been added. - */ - message: Console.ConsoleMessage; - } - } - - export namespace Profiler { - /** - * Profile node. Holds callsite information, execution statistics and child nodes. - */ - export interface ProfileNode { - /** - * Unique id of the node. - */ - id: number; - /** - * Function location. - */ - callFrame: Runtime.CallFrame; - /** - * Number of samples where this node was on top of the call stack. - * @experimental - */ - hitCount?: number; - /** - * Child node ids. - */ - children?: number[]; - /** - * The reason of being not optimized. The function may be deoptimized or marked as don't optimize. - */ - deoptReason?: string; - /** - * An array of source position ticks. - * @experimental - */ - positionTicks?: Profiler.PositionTickInfo[]; - } - - /** - * Profile. - */ - export interface Profile { - /** - * The list of profile nodes. First item is the root node. - */ - nodes: Profiler.ProfileNode[]; - /** - * Profiling start timestamp in microseconds. - */ - startTime: number; - /** - * Profiling end timestamp in microseconds. - */ - endTime: number; - /** - * Ids of samples top nodes. - */ - samples?: number[]; - /** - * Time intervals between adjacent samples in microseconds. The first delta is relative to the profile startTime. - */ - timeDeltas?: number[]; - } - - /** - * Specifies a number of samples attributed to a certain source position. - * @experimental - */ - export interface PositionTickInfo { - /** - * Source line number (1-based). - */ - line: number; - /** - * Number of samples attributed to the source line. - */ - ticks: number; - } - - /** - * Coverage data for a source range. - * @experimental - */ - export interface CoverageRange { - /** - * JavaScript script source offset for the range start. - */ - startOffset: number; - /** - * JavaScript script source offset for the range end. - */ - endOffset: number; - /** - * Collected execution count of the source range. - */ - count: number; - } - - /** - * Coverage data for a JavaScript function. - * @experimental - */ - export interface FunctionCoverage { - /** - * JavaScript function name. - */ - functionName: string; - /** - * Source ranges inside the function with coverage data. - */ - ranges: Profiler.CoverageRange[]; - /** - * Whether coverage data for this function has block granularity. - */ - isBlockCoverage: boolean; - } - - /** - * Coverage data for a JavaScript script. - * @experimental - */ - export interface ScriptCoverage { - /** - * JavaScript script id. - */ - scriptId: Runtime.ScriptId; - /** - * JavaScript script name or url. - */ - url: string; - /** - * Functions contained in the script that has coverage data. - */ - functions: Profiler.FunctionCoverage[]; - } - - export interface SetSamplingIntervalParameterType { - /** - * New sampling interval in microseconds. - */ - interval: number; - } - - export interface StartPreciseCoverageParameterType { - /** - * Collect accurate call counts beyond simple 'covered' or 'not covered'. - */ - callCount?: boolean; - } - - export interface StopReturnType { - /** - * Recorded profile. - */ - profile: Profiler.Profile; - } - - export interface TakePreciseCoverageReturnType { - /** - * Coverage data for the current isolate. - */ - result: Profiler.ScriptCoverage[]; - } - - export interface GetBestEffortCoverageReturnType { - /** - * Coverage data for the current isolate. - */ - result: Profiler.ScriptCoverage[]; - } - - export interface ConsoleProfileStartedEventDataType { - id: string; - /** - * Location of console.profile(). - */ - location: Debugger.Location; - /** - * Profile title passed as an argument to console.profile(). - */ - title?: string; - } - - export interface ConsoleProfileFinishedEventDataType { - id: string; - /** - * Location of console.profileEnd(). - */ - location: Debugger.Location; - profile: Profiler.Profile; - /** - * Profile title passed as an argument to console.profile(). - */ - title?: string; - } - } - - export namespace HeapProfiler { - /** - * Heap snapshot object id. - */ - export type HeapSnapshotObjectId = string; - - /** - * Sampling Heap Profile node. Holds callsite information, allocation statistics and child nodes. - */ - export interface SamplingHeapProfileNode { - /** - * Function location. - */ - callFrame: Runtime.CallFrame; - /** - * Allocations size in bytes for the node excluding children. - */ - selfSize: number; - /** - * Child nodes. - */ - children: HeapProfiler.SamplingHeapProfileNode[]; - } - - /** - * Profile. - */ - export interface SamplingHeapProfile { - head: HeapProfiler.SamplingHeapProfileNode; - } - - export interface StartTrackingHeapObjectsParameterType { - trackAllocations?: boolean; - } - - export interface StopTrackingHeapObjectsParameterType { - /** - * If true 'reportHeapSnapshotProgress' events will be generated while snapshot is being taken when the tracking is stopped. - */ - reportProgress?: boolean; - } - - export interface TakeHeapSnapshotParameterType { - /** - * If true 'reportHeapSnapshotProgress' events will be generated while snapshot is being taken. - */ - reportProgress?: boolean; - } - - export interface GetObjectByHeapObjectIdParameterType { - objectId: HeapProfiler.HeapSnapshotObjectId; - /** - * Symbolic group name that can be used to release multiple objects. - */ - objectGroup?: string; - } - - export interface AddInspectedHeapObjectParameterType { - /** - * Heap snapshot object id to be accessible by means of $x command line API. - */ - heapObjectId: HeapProfiler.HeapSnapshotObjectId; - } - - export interface GetHeapObjectIdParameterType { - /** - * Identifier of the object to get heap object id for. - */ - objectId: Runtime.RemoteObjectId; - } - - export interface StartSamplingParameterType { - /** - * Average sample interval in bytes. Poisson distribution is used for the intervals. The default value is 32768 bytes. - */ - samplingInterval?: number; - } - - export interface GetObjectByHeapObjectIdReturnType { - /** - * Evaluation result. - */ - result: Runtime.RemoteObject; - } - - export interface GetHeapObjectIdReturnType { - /** - * Id of the heap snapshot object corresponding to the passed remote object id. - */ - heapSnapshotObjectId: HeapProfiler.HeapSnapshotObjectId; - } - - export interface StopSamplingReturnType { - /** - * Recorded sampling heap profile. - */ - profile: HeapProfiler.SamplingHeapProfile; - } - - export interface AddHeapSnapshotChunkEventDataType { - chunk: string; - } - - export interface ReportHeapSnapshotProgressEventDataType { - done: number; - total: number; - finished?: boolean; - } - - export interface LastSeenObjectIdEventDataType { - lastSeenObjectId: number; - timestamp: number; - } - - export interface HeapStatsUpdateEventDataType { - /** - * An array of triplets. Each triplet describes a fragment. The first integer is the fragment index, the second integer is a total count of objects for the fragment, the third integer is a total size of the objects for the fragment. - */ - statsUpdate: number[]; - } - } - - /** - * The inspector.Session is used for dispatching messages to the V8 inspector back-end and receiving message responses and notifications. - */ - export class Session extends EventEmitter { - /** - * Create a new instance of the inspector.Session class. The inspector session needs to be connected through session.connect() before the messages can be dispatched to the inspector backend. - */ - constructor(); - - /** - * Connects a session to the inspector back-end. An exception will be thrown if there is already a connected session established either through the API or by a front-end connected to the Inspector WebSocket port. - */ - connect(): void; - - /** - * Immediately close the session. All pending message callbacks will be called with an error. session.connect() will need to be called to be able to send messages again. Reconnected session will lose all inspector state, such as enabled agents or configured breakpoints. - */ - disconnect(): void; - - /** - * Posts a message to the inspector back-end. callback will be notified when a response is received. callback is a function that accepts two optional arguments - error and message-specific result. - */ - post(method: string, params?: {}, callback?: (err: Error | null, params?: {}) => void): void; - post(method: string, callback?: (err: Error | null, params?: {}) => void): void; - - /** - * Returns supported domains. - */ - post(method: "Schema.getDomains", callback?: (err: Error | null, params: Schema.GetDomainsReturnType) => void): void; - /** - * Evaluates expression on global object. - */ - post(method: "Runtime.evaluate", params?: Runtime.EvaluateParameterType, callback?: (err: Error | null, params: Runtime.EvaluateReturnType) => void): void; - post(method: "Runtime.evaluate", callback?: (err: Error | null, params: Runtime.EvaluateReturnType) => void): void; - - /** - * Add handler to promise with given promise object id. - */ - post(method: "Runtime.awaitPromise", params?: Runtime.AwaitPromiseParameterType, callback?: (err: Error | null, params: Runtime.AwaitPromiseReturnType) => void): void; - post(method: "Runtime.awaitPromise", callback?: (err: Error | null, params: Runtime.AwaitPromiseReturnType) => void): void; - - /** - * Calls function with given declaration on the given object. Object group of the result is inherited from the target object. - */ - post(method: "Runtime.callFunctionOn", params?: Runtime.CallFunctionOnParameterType, callback?: (err: Error | null, params: Runtime.CallFunctionOnReturnType) => void): void; - post(method: "Runtime.callFunctionOn", callback?: (err: Error | null, params: Runtime.CallFunctionOnReturnType) => void): void; - - /** - * Returns properties of a given object. Object group of the result is inherited from the target object. - */ - post(method: "Runtime.getProperties", params?: Runtime.GetPropertiesParameterType, callback?: (err: Error | null, params: Runtime.GetPropertiesReturnType) => void): void; - post(method: "Runtime.getProperties", callback?: (err: Error | null, params: Runtime.GetPropertiesReturnType) => void): void; - - /** - * Releases remote object with given id. - */ - post(method: "Runtime.releaseObject", params?: Runtime.ReleaseObjectParameterType, callback?: (err: Error | null) => void): void; - post(method: "Runtime.releaseObject", callback?: (err: Error | null) => void): void; - - /** - * Releases all remote objects that belong to a given group. - */ - post(method: "Runtime.releaseObjectGroup", params?: Runtime.ReleaseObjectGroupParameterType, callback?: (err: Error | null) => void): void; - post(method: "Runtime.releaseObjectGroup", callback?: (err: Error | null) => void): void; - - /** - * Tells inspected instance to run if it was waiting for debugger to attach. - */ - post(method: "Runtime.runIfWaitingForDebugger", callback?: (err: Error | null) => void): void; - - /** - * Enables reporting of execution contexts creation by means of executionContextCreated event. When the reporting gets enabled the event will be sent immediately for each existing execution context. - */ - post(method: "Runtime.enable", callback?: (err: Error | null) => void): void; - - /** - * Disables reporting of execution contexts creation. - */ - post(method: "Runtime.disable", callback?: (err: Error | null) => void): void; - - /** - * Discards collected exceptions and console API calls. - */ - post(method: "Runtime.discardConsoleEntries", callback?: (err: Error | null) => void): void; - - /** - * @experimental - */ - post(method: "Runtime.setCustomObjectFormatterEnabled", params?: Runtime.SetCustomObjectFormatterEnabledParameterType, callback?: (err: Error | null) => void): void; - post(method: "Runtime.setCustomObjectFormatterEnabled", callback?: (err: Error | null) => void): void; - - /** - * Compiles expression. - */ - post(method: "Runtime.compileScript", params?: Runtime.CompileScriptParameterType, callback?: (err: Error | null, params: Runtime.CompileScriptReturnType) => void): void; - post(method: "Runtime.compileScript", callback?: (err: Error | null, params: Runtime.CompileScriptReturnType) => void): void; - - /** - * Runs script with given id in a given context. - */ - post(method: "Runtime.runScript", params?: Runtime.RunScriptParameterType, callback?: (err: Error | null, params: Runtime.RunScriptReturnType) => void): void; - post(method: "Runtime.runScript", callback?: (err: Error | null, params: Runtime.RunScriptReturnType) => void): void; - /** - * Enables debugger for the given page. Clients should not assume that the debugging has been enabled until the result for this command is received. - */ - post(method: "Debugger.enable", callback?: (err: Error | null) => void): void; - - /** - * Disables debugger for given page. - */ - post(method: "Debugger.disable", callback?: (err: Error | null) => void): void; - - /** - * Activates / deactivates all breakpoints on the page. - */ - post(method: "Debugger.setBreakpointsActive", params?: Debugger.SetBreakpointsActiveParameterType, callback?: (err: Error | null) => void): void; - post(method: "Debugger.setBreakpointsActive", callback?: (err: Error | null) => void): void; - - /** - * Makes page not interrupt on any pauses (breakpoint, exception, dom exception etc). - */ - post(method: "Debugger.setSkipAllPauses", params?: Debugger.SetSkipAllPausesParameterType, callback?: (err: Error | null) => void): void; - post(method: "Debugger.setSkipAllPauses", callback?: (err: Error | null) => void): void; - - /** - * Sets JavaScript breakpoint at given location specified either by URL or URL regex. Once this command is issued, all existing parsed scripts will have breakpoints resolved and returned in locations property. Further matching script parsing will result in subsequent breakpointResolved events issued. This logical breakpoint will survive page reloads. - */ - post(method: "Debugger.setBreakpointByUrl", params?: Debugger.SetBreakpointByUrlParameterType, callback?: (err: Error | null, params: Debugger.SetBreakpointByUrlReturnType) => void): void; - post(method: "Debugger.setBreakpointByUrl", callback?: (err: Error | null, params: Debugger.SetBreakpointByUrlReturnType) => void): void; - - /** - * Sets JavaScript breakpoint at a given location. - */ - post(method: "Debugger.setBreakpoint", params?: Debugger.SetBreakpointParameterType, callback?: (err: Error | null, params: Debugger.SetBreakpointReturnType) => void): void; - post(method: "Debugger.setBreakpoint", callback?: (err: Error | null, params: Debugger.SetBreakpointReturnType) => void): void; - - /** - * Removes JavaScript breakpoint. - */ - post(method: "Debugger.removeBreakpoint", params?: Debugger.RemoveBreakpointParameterType, callback?: (err: Error | null) => void): void; - post(method: "Debugger.removeBreakpoint", callback?: (err: Error | null) => void): void; - - /** - * Returns possible locations for breakpoint. scriptId in start and end range locations should be the same. - * @experimental - */ - post(method: "Debugger.getPossibleBreakpoints", params?: Debugger.GetPossibleBreakpointsParameterType, callback?: (err: Error | null, params: Debugger.GetPossibleBreakpointsReturnType) => void): void; - post(method: "Debugger.getPossibleBreakpoints", callback?: (err: Error | null, params: Debugger.GetPossibleBreakpointsReturnType) => void): void; - - /** - * Continues execution until specific location is reached. - */ - post(method: "Debugger.continueToLocation", params?: Debugger.ContinueToLocationParameterType, callback?: (err: Error | null) => void): void; - post(method: "Debugger.continueToLocation", callback?: (err: Error | null) => void): void; - - /** - * Steps over the statement. - */ - post(method: "Debugger.stepOver", callback?: (err: Error | null) => void): void; - - /** - * Steps into the function call. - */ - post(method: "Debugger.stepInto", callback?: (err: Error | null) => void): void; - - /** - * Steps out of the function call. - */ - post(method: "Debugger.stepOut", callback?: (err: Error | null) => void): void; - - /** - * Stops on the next JavaScript statement. - */ - post(method: "Debugger.pause", callback?: (err: Error | null) => void): void; - - /** - * Steps into next scheduled async task if any is scheduled before next pause. Returns success when async task is actually scheduled, returns error if no task were scheduled or another scheduleStepIntoAsync was called. - * @experimental - */ - post(method: "Debugger.scheduleStepIntoAsync", callback?: (err: Error | null) => void): void; - - /** - * Resumes JavaScript execution. - */ - post(method: "Debugger.resume", callback?: (err: Error | null) => void): void; - - /** - * Searches for given string in script content. - * @experimental - */ - post(method: "Debugger.searchInContent", params?: Debugger.SearchInContentParameterType, callback?: (err: Error | null, params: Debugger.SearchInContentReturnType) => void): void; - post(method: "Debugger.searchInContent", callback?: (err: Error | null, params: Debugger.SearchInContentReturnType) => void): void; - - /** - * Edits JavaScript source live. - */ - post(method: "Debugger.setScriptSource", params?: Debugger.SetScriptSourceParameterType, callback?: (err: Error | null, params: Debugger.SetScriptSourceReturnType) => void): void; - post(method: "Debugger.setScriptSource", callback?: (err: Error | null, params: Debugger.SetScriptSourceReturnType) => void): void; - - /** - * Restarts particular call frame from the beginning. - */ - post(method: "Debugger.restartFrame", params?: Debugger.RestartFrameParameterType, callback?: (err: Error | null, params: Debugger.RestartFrameReturnType) => void): void; - post(method: "Debugger.restartFrame", callback?: (err: Error | null, params: Debugger.RestartFrameReturnType) => void): void; - - /** - * Returns source for the script with given id. - */ - post(method: "Debugger.getScriptSource", params?: Debugger.GetScriptSourceParameterType, callback?: (err: Error | null, params: Debugger.GetScriptSourceReturnType) => void): void; - post(method: "Debugger.getScriptSource", callback?: (err: Error | null, params: Debugger.GetScriptSourceReturnType) => void): void; - - /** - * Defines pause on exceptions state. Can be set to stop on all exceptions, uncaught exceptions or no exceptions. Initial pause on exceptions state is none. - */ - post(method: "Debugger.setPauseOnExceptions", params?: Debugger.SetPauseOnExceptionsParameterType, callback?: (err: Error | null) => void): void; - post(method: "Debugger.setPauseOnExceptions", callback?: (err: Error | null) => void): void; - - /** - * Evaluates expression on a given call frame. - */ - post(method: "Debugger.evaluateOnCallFrame", params?: Debugger.EvaluateOnCallFrameParameterType, callback?: (err: Error | null, params: Debugger.EvaluateOnCallFrameReturnType) => void): void; - post(method: "Debugger.evaluateOnCallFrame", callback?: (err: Error | null, params: Debugger.EvaluateOnCallFrameReturnType) => void): void; - - /** - * Changes value of variable in a callframe. Object-based scopes are not supported and must be mutated manually. - */ - post(method: "Debugger.setVariableValue", params?: Debugger.SetVariableValueParameterType, callback?: (err: Error | null) => void): void; - post(method: "Debugger.setVariableValue", callback?: (err: Error | null) => void): void; - - /** - * Enables or disables async call stacks tracking. - */ - post(method: "Debugger.setAsyncCallStackDepth", params?: Debugger.SetAsyncCallStackDepthParameterType, callback?: (err: Error | null) => void): void; - post(method: "Debugger.setAsyncCallStackDepth", callback?: (err: Error | null) => void): void; - - /** - * Replace previous blackbox patterns with passed ones. Forces backend to skip stepping/pausing in scripts with url matching one of the patterns. VM will try to leave blackboxed script by performing 'step in' several times, finally resorting to 'step out' if unsuccessful. - * @experimental - */ - post(method: "Debugger.setBlackboxPatterns", params?: Debugger.SetBlackboxPatternsParameterType, callback?: (err: Error | null) => void): void; - post(method: "Debugger.setBlackboxPatterns", callback?: (err: Error | null) => void): void; - - /** - * Makes backend skip steps in the script in blackboxed ranges. VM will try leave blacklisted scripts by performing 'step in' several times, finally resorting to 'step out' if unsuccessful. Positions array contains positions where blackbox state is changed. First interval isn't blackboxed. Array should be sorted. - * @experimental - */ - post(method: "Debugger.setBlackboxedRanges", params?: Debugger.SetBlackboxedRangesParameterType, callback?: (err: Error | null) => void): void; - post(method: "Debugger.setBlackboxedRanges", callback?: (err: Error | null) => void): void; - /** - * Enables console domain, sends the messages collected so far to the client by means of the messageAdded notification. - */ - post(method: "Console.enable", callback?: (err: Error | null) => void): void; - - /** - * Disables console domain, prevents further console messages from being reported to the client. - */ - post(method: "Console.disable", callback?: (err: Error | null) => void): void; - - /** - * Does nothing. - */ - post(method: "Console.clearMessages", callback?: (err: Error | null) => void): void; - post(method: "Profiler.enable", callback?: (err: Error | null) => void): void; - - post(method: "Profiler.disable", callback?: (err: Error | null) => void): void; - - /** - * Changes CPU profiler sampling interval. Must be called before CPU profiles recording started. - */ - post(method: "Profiler.setSamplingInterval", params?: Profiler.SetSamplingIntervalParameterType, callback?: (err: Error | null) => void): void; - post(method: "Profiler.setSamplingInterval", callback?: (err: Error | null) => void): void; - - post(method: "Profiler.start", callback?: (err: Error | null) => void): void; - - post(method: "Profiler.stop", callback?: (err: Error | null, params: Profiler.StopReturnType) => void): void; - - /** - * Enable precise code coverage. Coverage data for JavaScript executed before enabling precise code coverage may be incomplete. Enabling prevents running optimized code and resets execution counters. - * @experimental - */ - post(method: "Profiler.startPreciseCoverage", params?: Profiler.StartPreciseCoverageParameterType, callback?: (err: Error | null) => void): void; - post(method: "Profiler.startPreciseCoverage", callback?: (err: Error | null) => void): void; - - /** - * Disable precise code coverage. Disabling releases unnecessary execution count records and allows executing optimized code. - * @experimental - */ - post(method: "Profiler.stopPreciseCoverage", callback?: (err: Error | null) => void): void; - - /** - * Collect coverage data for the current isolate, and resets execution counters. Precise code coverage needs to have started. - * @experimental - */ - post(method: "Profiler.takePreciseCoverage", callback?: (err: Error | null, params: Profiler.TakePreciseCoverageReturnType) => void): void; - - /** - * Collect coverage data for the current isolate. The coverage data may be incomplete due to garbage collection. - * @experimental - */ - post(method: "Profiler.getBestEffortCoverage", callback?: (err: Error | null, params: Profiler.GetBestEffortCoverageReturnType) => void): void; - post(method: "HeapProfiler.enable", callback?: (err: Error | null) => void): void; - - post(method: "HeapProfiler.disable", callback?: (err: Error | null) => void): void; - - post(method: "HeapProfiler.startTrackingHeapObjects", params?: HeapProfiler.StartTrackingHeapObjectsParameterType, callback?: (err: Error | null) => void): void; - post(method: "HeapProfiler.startTrackingHeapObjects", callback?: (err: Error | null) => void): void; - - post(method: "HeapProfiler.stopTrackingHeapObjects", params?: HeapProfiler.StopTrackingHeapObjectsParameterType, callback?: (err: Error | null) => void): void; - post(method: "HeapProfiler.stopTrackingHeapObjects", callback?: (err: Error | null) => void): void; - - post(method: "HeapProfiler.takeHeapSnapshot", params?: HeapProfiler.TakeHeapSnapshotParameterType, callback?: (err: Error | null) => void): void; - post(method: "HeapProfiler.takeHeapSnapshot", callback?: (err: Error | null) => void): void; - - post(method: "HeapProfiler.collectGarbage", callback?: (err: Error | null) => void): void; - - post(method: "HeapProfiler.getObjectByHeapObjectId", params?: HeapProfiler.GetObjectByHeapObjectIdParameterType, callback?: (err: Error | null, params: HeapProfiler.GetObjectByHeapObjectIdReturnType) => void): void; - post(method: "HeapProfiler.getObjectByHeapObjectId", callback?: (err: Error | null, params: HeapProfiler.GetObjectByHeapObjectIdReturnType) => void): void; - - /** - * Enables console to refer to the node with given id via $x (see Command Line API for more details $x functions). - */ - post(method: "HeapProfiler.addInspectedHeapObject", params?: HeapProfiler.AddInspectedHeapObjectParameterType, callback?: (err: Error | null) => void): void; - post(method: "HeapProfiler.addInspectedHeapObject", callback?: (err: Error | null) => void): void; - - post(method: "HeapProfiler.getHeapObjectId", params?: HeapProfiler.GetHeapObjectIdParameterType, callback?: (err: Error | null, params: HeapProfiler.GetHeapObjectIdReturnType) => void): void; - post(method: "HeapProfiler.getHeapObjectId", callback?: (err: Error | null, params: HeapProfiler.GetHeapObjectIdReturnType) => void): void; - - post(method: "HeapProfiler.startSampling", params?: HeapProfiler.StartSamplingParameterType, callback?: (err: Error | null) => void): void; - post(method: "HeapProfiler.startSampling", callback?: (err: Error | null) => void): void; - - post(method: "HeapProfiler.stopSampling", callback?: (err: Error | null, params: HeapProfiler.StopSamplingReturnType) => void): void; - - // Events - - addListener(event: string, listener: (...args: any[]) => void): this; - - /** - * Emitted when any notification from the V8 Inspector is received. - */ - addListener(event: "inspectorNotification", listener: (message: InspectorNotification<{}>) => void): this; - - /** - * Issued when new execution context is created. - */ - addListener(event: "Runtime.executionContextCreated", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when execution context is destroyed. - */ - addListener(event: "Runtime.executionContextDestroyed", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when all executionContexts were cleared in browser - */ - addListener(event: "Runtime.executionContextsCleared", listener: () => void): this; - - /** - * Issued when exception was thrown and unhandled. - */ - addListener(event: "Runtime.exceptionThrown", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when unhandled exception was revoked. - */ - addListener(event: "Runtime.exceptionRevoked", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when console API was called. - */ - addListener(event: "Runtime.consoleAPICalled", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when object should be inspected (for example, as a result of inspect() command line API call). - */ - addListener(event: "Runtime.inspectRequested", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when virtual machine parses script. This event is also fired for all known and uncollected scripts upon enabling debugger. - */ - addListener(event: "Debugger.scriptParsed", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when virtual machine fails to parse the script. - */ - addListener(event: "Debugger.scriptFailedToParse", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when breakpoint is resolved to an actual script and location. - */ - addListener(event: "Debugger.breakpointResolved", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when the virtual machine stopped on breakpoint or exception or any other stop criteria. - */ - addListener(event: "Debugger.paused", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when the virtual machine resumed execution. - */ - addListener(event: "Debugger.resumed", listener: () => void): this; - - /** - * Issued when new console message is added. - */ - addListener(event: "Console.messageAdded", listener: (message: InspectorNotification) => void): this; - - /** - * Sent when new profile recording is started using console.profile() call. - */ - addListener(event: "Profiler.consoleProfileStarted", listener: (message: InspectorNotification) => void): this; - - addListener(event: "Profiler.consoleProfileFinished", listener: (message: InspectorNotification) => void): this; - addListener(event: "HeapProfiler.addHeapSnapshotChunk", listener: (message: InspectorNotification) => void): this; - addListener(event: "HeapProfiler.resetProfiles", listener: () => void): this; - addListener(event: "HeapProfiler.reportHeapSnapshotProgress", listener: (message: InspectorNotification) => void): this; - - /** - * If heap objects tracking has been started then backend regularly sends a current value for last seen object id and corresponding timestamp. If the were changes in the heap since last event then one or more heapStatsUpdate events will be sent before a new lastSeenObjectId event. - */ - addListener(event: "HeapProfiler.lastSeenObjectId", listener: (message: InspectorNotification) => void): this; - - /** - * If heap objects tracking has been started then backend may send update for one or more fragments - */ - addListener(event: "HeapProfiler.heapStatsUpdate", listener: (message: InspectorNotification) => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "inspectorNotification", message: InspectorNotification<{}>): boolean; - emit(event: "Runtime.executionContextCreated", message: InspectorNotification): boolean; - emit(event: "Runtime.executionContextDestroyed", message: InspectorNotification): boolean; - emit(event: "Runtime.executionContextsCleared"): boolean; - emit(event: "Runtime.exceptionThrown", message: InspectorNotification): boolean; - emit(event: "Runtime.exceptionRevoked", message: InspectorNotification): boolean; - emit(event: "Runtime.consoleAPICalled", message: InspectorNotification): boolean; - emit(event: "Runtime.inspectRequested", message: InspectorNotification): boolean; - emit(event: "Debugger.scriptParsed", message: InspectorNotification): boolean; - emit(event: "Debugger.scriptFailedToParse", message: InspectorNotification): boolean; - emit(event: "Debugger.breakpointResolved", message: InspectorNotification): boolean; - emit(event: "Debugger.paused", message: InspectorNotification): boolean; - emit(event: "Debugger.resumed"): boolean; - emit(event: "Console.messageAdded", message: InspectorNotification): boolean; - emit(event: "Profiler.consoleProfileStarted", message: InspectorNotification): boolean; - emit(event: "Profiler.consoleProfileFinished", message: InspectorNotification): boolean; - emit(event: "HeapProfiler.addHeapSnapshotChunk", message: InspectorNotification): boolean; - emit(event: "HeapProfiler.resetProfiles"): boolean; - emit(event: "HeapProfiler.reportHeapSnapshotProgress", message: InspectorNotification): boolean; - emit(event: "HeapProfiler.lastSeenObjectId", message: InspectorNotification): boolean; - emit(event: "HeapProfiler.heapStatsUpdate", message: InspectorNotification): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - - /** - * Emitted when any notification from the V8 Inspector is received. - */ - on(event: "inspectorNotification", listener: (message: InspectorNotification<{}>) => void): this; - - /** - * Issued when new execution context is created. - */ - on(event: "Runtime.executionContextCreated", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when execution context is destroyed. - */ - on(event: "Runtime.executionContextDestroyed", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when all executionContexts were cleared in browser - */ - on(event: "Runtime.executionContextsCleared", listener: () => void): this; - - /** - * Issued when exception was thrown and unhandled. - */ - on(event: "Runtime.exceptionThrown", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when unhandled exception was revoked. - */ - on(event: "Runtime.exceptionRevoked", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when console API was called. - */ - on(event: "Runtime.consoleAPICalled", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when object should be inspected (for example, as a result of inspect() command line API call). - */ - on(event: "Runtime.inspectRequested", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when virtual machine parses script. This event is also fired for all known and uncollected scripts upon enabling debugger. - */ - on(event: "Debugger.scriptParsed", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when virtual machine fails to parse the script. - */ - on(event: "Debugger.scriptFailedToParse", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when breakpoint is resolved to an actual script and location. - */ - on(event: "Debugger.breakpointResolved", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when the virtual machine stopped on breakpoint or exception or any other stop criteria. - */ - on(event: "Debugger.paused", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when the virtual machine resumed execution. - */ - on(event: "Debugger.resumed", listener: () => void): this; - - /** - * Issued when new console message is added. - */ - on(event: "Console.messageAdded", listener: (message: InspectorNotification) => void): this; - - /** - * Sent when new profile recording is started using console.profile() call. - */ - on(event: "Profiler.consoleProfileStarted", listener: (message: InspectorNotification) => void): this; - - on(event: "Profiler.consoleProfileFinished", listener: (message: InspectorNotification) => void): this; - on(event: "HeapProfiler.addHeapSnapshotChunk", listener: (message: InspectorNotification) => void): this; - on(event: "HeapProfiler.resetProfiles", listener: () => void): this; - on(event: "HeapProfiler.reportHeapSnapshotProgress", listener: (message: InspectorNotification) => void): this; - - /** - * If heap objects tracking has been started then backend regularly sends a current value for last seen object id and corresponding timestamp. If the were changes in the heap since last event then one or more heapStatsUpdate events will be sent before a new lastSeenObjectId event. - */ - on(event: "HeapProfiler.lastSeenObjectId", listener: (message: InspectorNotification) => void): this; - - /** - * If heap objects tracking has been started then backend may send update for one or more fragments - */ - on(event: "HeapProfiler.heapStatsUpdate", listener: (message: InspectorNotification) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - - /** - * Emitted when any notification from the V8 Inspector is received. - */ - once(event: "inspectorNotification", listener: (message: InspectorNotification<{}>) => void): this; - - /** - * Issued when new execution context is created. - */ - once(event: "Runtime.executionContextCreated", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when execution context is destroyed. - */ - once(event: "Runtime.executionContextDestroyed", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when all executionContexts were cleared in browser - */ - once(event: "Runtime.executionContextsCleared", listener: () => void): this; - - /** - * Issued when exception was thrown and unhandled. - */ - once(event: "Runtime.exceptionThrown", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when unhandled exception was revoked. - */ - once(event: "Runtime.exceptionRevoked", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when console API was called. - */ - once(event: "Runtime.consoleAPICalled", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when object should be inspected (for example, as a result of inspect() command line API call). - */ - once(event: "Runtime.inspectRequested", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when virtual machine parses script. This event is also fired for all known and uncollected scripts upon enabling debugger. - */ - once(event: "Debugger.scriptParsed", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when virtual machine fails to parse the script. - */ - once(event: "Debugger.scriptFailedToParse", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when breakpoint is resolved to an actual script and location. - */ - once(event: "Debugger.breakpointResolved", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when the virtual machine stopped on breakpoint or exception or any other stop criteria. - */ - once(event: "Debugger.paused", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when the virtual machine resumed execution. - */ - once(event: "Debugger.resumed", listener: () => void): this; - - /** - * Issued when new console message is added. - */ - once(event: "Console.messageAdded", listener: (message: InspectorNotification) => void): this; - - /** - * Sent when new profile recording is started using console.profile() call. - */ - once(event: "Profiler.consoleProfileStarted", listener: (message: InspectorNotification) => void): this; - - once(event: "Profiler.consoleProfileFinished", listener: (message: InspectorNotification) => void): this; - once(event: "HeapProfiler.addHeapSnapshotChunk", listener: (message: InspectorNotification) => void): this; - once(event: "HeapProfiler.resetProfiles", listener: () => void): this; - once(event: "HeapProfiler.reportHeapSnapshotProgress", listener: (message: InspectorNotification) => void): this; - - /** - * If heap objects tracking has been started then backend regularly sends a current value for last seen object id and corresponding timestamp. If the were changes in the heap since last event then one or more heapStatsUpdate events will be sent before a new lastSeenObjectId event. - */ - once(event: "HeapProfiler.lastSeenObjectId", listener: (message: InspectorNotification) => void): this; - - /** - * If heap objects tracking has been started then backend may send update for one or more fragments - */ - once(event: "HeapProfiler.heapStatsUpdate", listener: (message: InspectorNotification) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - - /** - * Emitted when any notification from the V8 Inspector is received. - */ - prependListener(event: "inspectorNotification", listener: (message: InspectorNotification<{}>) => void): this; - - /** - * Issued when new execution context is created. - */ - prependListener(event: "Runtime.executionContextCreated", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when execution context is destroyed. - */ - prependListener(event: "Runtime.executionContextDestroyed", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when all executionContexts were cleared in browser - */ - prependListener(event: "Runtime.executionContextsCleared", listener: () => void): this; - - /** - * Issued when exception was thrown and unhandled. - */ - prependListener(event: "Runtime.exceptionThrown", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when unhandled exception was revoked. - */ - prependListener(event: "Runtime.exceptionRevoked", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when console API was called. - */ - prependListener(event: "Runtime.consoleAPICalled", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when object should be inspected (for example, as a result of inspect() command line API call). - */ - prependListener(event: "Runtime.inspectRequested", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when virtual machine parses script. This event is also fired for all known and uncollected scripts upon enabling debugger. - */ - prependListener(event: "Debugger.scriptParsed", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when virtual machine fails to parse the script. - */ - prependListener(event: "Debugger.scriptFailedToParse", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when breakpoint is resolved to an actual script and location. - */ - prependListener(event: "Debugger.breakpointResolved", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when the virtual machine stopped on breakpoint or exception or any other stop criteria. - */ - prependListener(event: "Debugger.paused", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when the virtual machine resumed execution. - */ - prependListener(event: "Debugger.resumed", listener: () => void): this; - - /** - * Issued when new console message is added. - */ - prependListener(event: "Console.messageAdded", listener: (message: InspectorNotification) => void): this; - - /** - * Sent when new profile recording is started using console.profile() call. - */ - prependListener(event: "Profiler.consoleProfileStarted", listener: (message: InspectorNotification) => void): this; - - prependListener(event: "Profiler.consoleProfileFinished", listener: (message: InspectorNotification) => void): this; - prependListener(event: "HeapProfiler.addHeapSnapshotChunk", listener: (message: InspectorNotification) => void): this; - prependListener(event: "HeapProfiler.resetProfiles", listener: () => void): this; - prependListener(event: "HeapProfiler.reportHeapSnapshotProgress", listener: (message: InspectorNotification) => void): this; - - /** - * If heap objects tracking has been started then backend regularly sends a current value for last seen object id and corresponding timestamp. If the were changes in the heap since last event then one or more heapStatsUpdate events will be sent before a new lastSeenObjectId event. - */ - prependListener(event: "HeapProfiler.lastSeenObjectId", listener: (message: InspectorNotification) => void): this; - - /** - * If heap objects tracking has been started then backend may send update for one or more fragments - */ - prependListener(event: "HeapProfiler.heapStatsUpdate", listener: (message: InspectorNotification) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - - /** - * Emitted when any notification from the V8 Inspector is received. - */ - prependOnceListener(event: "inspectorNotification", listener: (message: InspectorNotification<{}>) => void): this; - - /** - * Issued when new execution context is created. - */ - prependOnceListener(event: "Runtime.executionContextCreated", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when execution context is destroyed. - */ - prependOnceListener(event: "Runtime.executionContextDestroyed", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when all executionContexts were cleared in browser - */ - prependOnceListener(event: "Runtime.executionContextsCleared", listener: () => void): this; - - /** - * Issued when exception was thrown and unhandled. - */ - prependOnceListener(event: "Runtime.exceptionThrown", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when unhandled exception was revoked. - */ - prependOnceListener(event: "Runtime.exceptionRevoked", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when console API was called. - */ - prependOnceListener(event: "Runtime.consoleAPICalled", listener: (message: InspectorNotification) => void): this; - - /** - * Issued when object should be inspected (for example, as a result of inspect() command line API call). - */ - prependOnceListener(event: "Runtime.inspectRequested", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when virtual machine parses script. This event is also fired for all known and uncollected scripts upon enabling debugger. - */ - prependOnceListener(event: "Debugger.scriptParsed", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when virtual machine fails to parse the script. - */ - prependOnceListener(event: "Debugger.scriptFailedToParse", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when breakpoint is resolved to an actual script and location. - */ - prependOnceListener(event: "Debugger.breakpointResolved", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when the virtual machine stopped on breakpoint or exception or any other stop criteria. - */ - prependOnceListener(event: "Debugger.paused", listener: (message: InspectorNotification) => void): this; - - /** - * Fired when the virtual machine resumed execution. - */ - prependOnceListener(event: "Debugger.resumed", listener: () => void): this; - - /** - * Issued when new console message is added. - */ - prependOnceListener(event: "Console.messageAdded", listener: (message: InspectorNotification) => void): this; - - /** - * Sent when new profile recording is started using console.profile() call. - */ - prependOnceListener(event: "Profiler.consoleProfileStarted", listener: (message: InspectorNotification) => void): this; - - prependOnceListener(event: "Profiler.consoleProfileFinished", listener: (message: InspectorNotification) => void): this; - prependOnceListener(event: "HeapProfiler.addHeapSnapshotChunk", listener: (message: InspectorNotification) => void): this; - prependOnceListener(event: "HeapProfiler.resetProfiles", listener: () => void): this; - prependOnceListener(event: "HeapProfiler.reportHeapSnapshotProgress", listener: (message: InspectorNotification) => void): this; - - /** - * If heap objects tracking has been started then backend regularly sends a current value for last seen object id and corresponding timestamp. If the were changes in the heap since last event then one or more heapStatsUpdate events will be sent before a new lastSeenObjectId event. - */ - prependOnceListener(event: "HeapProfiler.lastSeenObjectId", listener: (message: InspectorNotification) => void): this; - - /** - * If heap objects tracking has been started then backend may send update for one or more fragments - */ - prependOnceListener(event: "HeapProfiler.heapStatsUpdate", listener: (message: InspectorNotification) => void): this; - } - - // Top Level API - - /** - * Activate inspector on host and port. Equivalent to node --inspect=[[host:]port], but can be done programatically after node has started. - * If wait is true, will block until a client has connected to the inspect port and flow control has been passed to the debugger client. - * @param port Port to listen on for inspector connections. Optional, defaults to what was specified on the CLI. - * @param host Host to listen on for inspector connections. Optional, defaults to what was specified on the CLI. - * @param wait Block until a client has connected. Optional, defaults to false. - */ - export function open(port?: number, host?: string, wait?: boolean): void; - - /** - * Deactivate the inspector. Blocks until there are no active connections. - */ - export function close(): void; - - /** - * Return the URL of the active inspector, or undefined if there is none. - */ - export function url(): string; -} diff --git a/node_modules/@types/node/package.json b/node_modules/@types/node/package.json deleted file mode 100644 index 4e98d7b411cff..0000000000000 --- a/node_modules/@types/node/package.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "_from": "@types/node@*", - "_id": "@types/node@10.7.0", - "_inBundle": false, - "_integrity": "sha512-dmYIvoQEZWnyQfgrwPCoxztv/93NYQGEiOoQhuI56rJahv9de6Q2apZl3bufV46YJ0OAXdaktIuw4RIRl4DTeA==", - "_location": "/@types/node", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "@types/node@*", - "name": "@types/node", - "escapedName": "@types%2fnode", - "scope": "@types", - "rawSpec": "*", - "saveSpec": null, - "fetchSpec": "*" - }, - "_requiredBy": [ - "/@types/form-data", - "/@types/request" - ], - "_resolved": "https://registry.npmjs.org/@types/node/-/node-10.7.0.tgz", - "_shasum": "d384b2c8625414ab2aa18fdf989c288d6a7a8202", - "_spec": "@types/node@*", - "_where": "/Users/zkat/Documents/code/work/npm/node_modules/@types/request", - "bugs": { - "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/issues" - }, - "bundleDependencies": false, - "contributors": [ - { - "name": "Microsoft TypeScript", - "url": "http://typescriptlang.org" - }, - { - "name": "DefinitelyTyped", - "url": "https://github.com/DefinitelyTyped/DefinitelyTyped" - }, - { - "name": "Parambir Singh", - "url": "https://github.com/parambirs" - }, - { - "name": "Christian Vaagland Tellnes", - "url": "https://github.com/tellnes" - }, - { - "name": "Wilco Bakker", - "url": "https://github.com/WilcoBakker" - }, - { - "name": "Nicolas Voigt", - "url": "https://github.com/octo-sniffle" - }, - { - "name": "Chigozirim C.", - "url": "https://github.com/smac89" - }, - { - "name": "Flarna", - "url": "https://github.com/Flarna" - }, - { - "name": "Mariusz Wiktorczyk", - "url": "https://github.com/mwiktorczyk" - }, - { - "name": "wwwy3y3", - "url": "https://github.com/wwwy3y3" - }, - { - "name": "Deividas Bakanas", - "url": "https://github.com/DeividasBakanas" - }, - { - "name": "Kelvin Jin", - "url": "https://github.com/kjin" - }, - { - "name": "Alvis HT Tang", - "url": "https://github.com/alvis" - }, - { - "name": "Sebastian Silbermann", - "url": "https://github.com/eps1lon" - }, - { - "name": "Hannes Magnusson", - "url": "https://github.com/Hannes-Magnusson-CK" - }, - { - "name": "Alberto Schiabel", - "url": "https://github.com/jkomyno" - }, - { - "name": "Klaus Meinhardt", - "url": "https://github.com/ajafff" - }, - { - "name": "Huw", - "url": "https://github.com/hoo29" - }, - { - "name": "Nicolas Even", - "url": "https://github.com/n-e" - }, - { - "name": "Bruno Scheufler", - "url": "https://github.com/brunoscheufler" - }, - { - "name": "Mohsen Azimi", - "url": "https://github.com/mohsen1" - }, - { - "name": "Hoàng Văn Khải", - "url": "https://github.com/KSXGitHub" - }, - { - "name": "Alexander T.", - "url": "https://github.com/a-tarasyuk" - }, - { - "name": "Lishude", - "url": "https://github.com/islishude" - }, - { - "name": "Andrew Makarov", - "url": "https://github.com/r3nya" - }, - { - "name": "Zane Hannan AU", - "url": "https://github.com/ZaneHannanAU" - }, - { - "name": "Eugene Y. Q. Shen", - "url": "https://github.com/eyqs" - } - ], - "dependencies": {}, - "deprecated": false, - "description": "TypeScript definitions for Node.js", - "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped#readme", - "license": "MIT", - "main": "", - "name": "@types/node", - "repository": { - "type": "git", - "url": "git+https://github.com/DefinitelyTyped/DefinitelyTyped.git" - }, - "scripts": {}, - "typeScriptVersion": "2.0", - "typesPublisherContentHash": "2bbf8205320aa5fb12aaaa8dab46553da05dde879dcbf3276c12a0af32e104a2", - "version": "10.7.0" -} diff --git a/node_modules/@types/request/LICENSE b/node_modules/@types/request/LICENSE deleted file mode 100644 index 21071075c2459..0000000000000 --- a/node_modules/@types/request/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - MIT License - - Copyright (c) Microsoft Corporation. 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/node_modules/@types/request/README.md b/node_modules/@types/request/README.md deleted file mode 100644 index bbf6b9da6fe86..0000000000000 --- a/node_modules/@types/request/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Installation -> `npm install --save @types/request` - -# Summary -This package contains type definitions for request (https://github.com/request/request). - -# Details -Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/request - -Additional Details - * Last updated: Fri, 15 Jun 2018 21:26:44 GMT - * Dependencies: caseless, stream, http, https, fs, form-data, net, tough-cookie, url, node - * Global values: none - -# Credits -These definitions were written by Carlos Ballesteros Velasco , bonnici , Bart van der Schoor , Joe Skeen , Christopher Currens , Jon Stevens , Matt R. Wilson , Jose Colella . diff --git a/node_modules/@types/request/index.d.ts b/node_modules/@types/request/index.d.ts deleted file mode 100644 index 60e24b7692a8c..0000000000000 --- a/node_modules/@types/request/index.d.ts +++ /dev/null @@ -1,395 +0,0 @@ -// Type definitions for request 2.47 -// Project: https://github.com/request/request -// Definitions by: Carlos Ballesteros Velasco , -// bonnici , -// Bart van der Schoor , -// Joe Skeen , -// Christopher Currens , -// Jon Stevens , -// Matt R. Wilson -// Jose Colella -// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped -// TypeScript Version: 2.3 - -// Imported from: https://github.com/soywiz/typescript-node-definitions/d.ts - -/// - -import caseless = require('caseless'); -import stream = require('stream'); -import http = require('http'); -import https = require('https'); -import fs = require('fs'); -import FormData = require('form-data'); -import net = require('net'); -import tough = require('tough-cookie'); -import { Url } from 'url'; - -declare namespace request { - interface RequestAPI { - defaults(options: TOptions): RequestAPI; - defaults(options: RequiredUriUrl & TOptions): DefaultUriUrlRequestApi; - - (uri: string, options?: TOptions, callback?: RequestCallback): TRequest; - (uri: string, callback?: RequestCallback): TRequest; - (options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest; - - get(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; - get(uri: string, callback?: RequestCallback): TRequest; - get(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest; - - post(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; - post(uri: string, callback?: RequestCallback): TRequest; - post(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest; - - put(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; - put(uri: string, callback?: RequestCallback): TRequest; - put(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest; - - head(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; - head(uri: string, callback?: RequestCallback): TRequest; - head(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest; - - patch(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; - patch(uri: string, callback?: RequestCallback): TRequest; - patch(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest; - - del(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; - del(uri: string, callback?: RequestCallback): TRequest; - del(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest; - - delete(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; - delete(uri: string, callback?: RequestCallback): TRequest; - delete(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest; - - initParams(uri: string, options?: TOptions, callback?: RequestCallback): RequiredUriUrl & TOptions; - initParams(uriOrOpts: string | RequiredUriUrl & TOptions, callback?: RequestCallback): RequiredUriUrl & TOptions; - - forever(agentOptions: any, optionsArg: any): TRequest; - jar(store?: any): CookieJar; - cookie(str: string): Cookie | undefined; - - debug: boolean; - } - - interface DefaultUriUrlRequestApi extends RequestAPI { - defaults(options: TOptions): DefaultUriUrlRequestApi; - (callback?: RequestCallback): TRequest; - - get(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; - get(uri: string, callback?: RequestCallback): TRequest; - get(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest; - get(callback?: RequestCallback): TRequest; - - post(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; - post(uri: string, callback?: RequestCallback): TRequest; - post(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest; - post(callback?: RequestCallback): TRequest; - - put(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; - put(uri: string, callback?: RequestCallback): TRequest; - put(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest; - put(callback?: RequestCallback): TRequest; - - head(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; - head(uri: string, callback?: RequestCallback): TRequest; - head(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest; - head(callback?: RequestCallback): TRequest; - - patch(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; - patch(uri: string, callback?: RequestCallback): TRequest; - patch(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest; - patch(callback?: RequestCallback): TRequest; - - del(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; - del(uri: string, callback?: RequestCallback): TRequest; - del(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest; - del(callback?: RequestCallback): TRequest; - - delete(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; - delete(uri: string, callback?: RequestCallback): TRequest; - delete(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest; - delete(callback?: RequestCallback): TRequest; - } - - interface CoreOptions { - baseUrl?: string; - callback?: RequestCallback; - jar?: CookieJar | boolean; - formData?: { [key: string]: any }; - form?: { [key: string]: any } | string; - auth?: AuthOptions; - oauth?: OAuthOptions; - aws?: AWSOptions; - hawk?: HawkOptions; - qs?: any; - qsStringifyOptions?: any; - qsParseOptions?: any; - json?: any; - jsonReviver?: (key: string, value: any) => any; - jsonReplacer?: (key: string, value: any) => any; - multipart?: RequestPart[] | Multipart; - agent?: http.Agent | https.Agent; - agentOptions?: any; - agentClass?: any; - forever?: any; - host?: string; - port?: number; - method?: string; - headers?: Headers; - body?: any; - family?: 4 | 6; - followRedirect?: boolean | ((response: http.IncomingMessage) => boolean); - followAllRedirects?: boolean; - followOriginalHttpMethod?: boolean; - maxRedirects?: number; - removeRefererHeader?: boolean; - encoding?: string | null; - pool?: any; - timeout?: number; - localAddress?: string; - proxy?: any; - tunnel?: boolean; - strictSSL?: boolean; - rejectUnauthorized?: boolean; - time?: boolean; - gzip?: boolean; - preambleCRLF?: boolean; - postambleCRLF?: boolean; - withCredentials?: boolean; - key?: Buffer; - cert?: Buffer; - passphrase?: string; - ca?: string | Buffer | string[] | Buffer[]; - har?: HttpArchiveRequest; - useQuerystring?: boolean; - } - - interface UriOptions { - uri: string | Url; - } - interface UrlOptions { - url: string | Url; - } - type RequiredUriUrl = UriOptions | UrlOptions; - - type OptionalUriUrl = RequiredUriUrl | {}; - - type OptionsWithUri = UriOptions & CoreOptions; - type OptionsWithUrl = UrlOptions & CoreOptions; - type Options = OptionsWithUri | OptionsWithUrl; - - type RequestCallback = (error: any, response: Response, body: any) => void; - - interface HttpArchiveRequest { - url?: string; - method?: string; - headers?: NameValuePair[]; - postData?: { - mimeType?: string; - params?: NameValuePair[]; - }; - } - - interface NameValuePair { - name: string; - value: string; - } - - interface Multipart { - chunked?: boolean; - data?: Array<{ - 'content-type'?: string, - body: string - }>; - } - - interface RequestPart { - headers?: Headers; - body: any; - } - - interface Request extends caseless.Httpified, stream.Stream { - readable: boolean; - writable: boolean; - explicitMethod?: true; - - debug(...args: any[]): void; - pipeDest(dest: any): void; - qs(q: object, clobber?: boolean): Request; - form(): FormData; - form(form: any): Request; - multipart(multipart: RequestPart[]): Request; - json(val: any): Request; - aws(opts: AWSOptions, now?: boolean): Request; - hawk(opts: HawkOptions): void; - auth(username: string, password: string, sendImmediately?: boolean, bearer?: string): Request; - oauth(oauth: OAuthOptions): Request; - jar(jar: CookieJar): Request; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: 'request', listener: (req: http.ClientRequest) => void): this; - on(event: 'response', listener: (resp: Response) => void): this; - on(event: 'data', listener: (data: Buffer | string) => void): this; - on(event: 'error', listener: (e: Error) => void): this; - on(event: 'complete', listener: (resp: Response, body?: string | Buffer) => void): this; - on(event: 'pipe', listener: (src: stream.Readable) => void): this; - on(event: 'socket', listener: (src: net.Socket) => void): this; - - write(buffer: Buffer | string, cb?: (err?: Error) => void): boolean; - write(str: string, encoding?: string, cb?: (err?: Error) => void): boolean; - end(cb?: () => void): void; - end(chunk: string | Buffer, cb?: () => void): void; - end(str: string, encoding?: string, cb?: () => void): void; - - pause(): void; - resume(): void; - abort(): void; - destroy(): void; - toJSON(): RequestAsJSON; - - // several of the CoreOptions are copied onto the request instance - host?: string; - port?: number; - followAllRedirects?: boolean; - followOriginalHttpMethod?: boolean; - maxRedirects?: number; - removeRefererHeader?: boolean; - encoding?: string | null; - timeout?: number; - localAddress?: string; - strictSSL?: boolean; - rejectUnauthorized?: boolean; - time?: boolean; - gzip?: boolean; - preambleCRLF?: boolean; - postambleCRLF?: boolean; - withCredentials?: boolean; - key?: Buffer; - cert?: Buffer; - passphrase?: string; - ca?: string | Buffer | string[] | Buffer[]; - har?: HttpArchiveRequest; - - // set in `Request.prototype.init` - headers: Headers; - method: string; - pool: false | { [key: string]: http.Agent | https.Agent }; - dests: stream.Readable[]; - callback?: RequestCallback; - uri: Url & { href: string, pathname: string }; - proxy: null | string | Url; - tunnel: boolean; - setHost: boolean; - path: string; - agent: false | http.Agent | https.Agent; - body: Buffer | Buffer[] | string | string[] | stream.Readable; - timing?: boolean; - src?: stream.Readable; - - // set in `Request.prototype.start` - href: string; - startTime?: number; - startTimeNow?: number; - timings?: { - socket: number; - lookup: number; - connect: number; - response: number; - end: number; - }; - - // set in `Request.prototype.onRequestResponse` - elapsedTime?: number; - response?: Response; - } - - interface Response extends http.IncomingMessage { - statusCode: number; - statusMessage: string; - request: Request; - body: any; // Buffer, string, stream.Readable, or a plain object if `json` was truthy - caseless: caseless.Caseless; // case-insensitive access to headers - toJSON(): ResponseAsJSON; - - timingStart?: number; - elapsedTime?: number; - timings?: { - socket: number; - lookup: number; - connect: number; - response: number; - end: number; - }; - timingPhases?: { - wait: number; - dns: number; - tcp: number; - firstByte: number; - download: number; - total: number; - }; - } - - // aliases for backwards compatibility - type ResponseRequest = Request; - type RequestResponse = Response; - - interface Headers { - [key: string]: any; - } - - interface AuthOptions { - user?: string; - username?: string; - pass?: string; - password?: string; - sendImmediately?: boolean; - bearer?: string | (() => string); - } - - interface OAuthOptions { - callback?: string; - consumer_key?: string; - consumer_secret?: string; - token?: string; - token_secret?: string; - transport_method?: 'body' | 'header' | 'query'; - verifier?: string; - body_hash?: true | string; - } - - interface HawkOptions { - credentials: any; - } - - interface AWSOptions { - secret: string; - bucket?: string; - } - - interface RequestAsJSON { - uri: Url; - method: string; - headers: Headers; - } - - interface ResponseAsJSON { - statusCode: number; - body: any; - headers: Headers; - request: RequestAsJSON; - } - - type Cookie = tough.Cookie; - - interface CookieJar { - setCookie(cookieOrStr: Cookie | string, uri: string | Url, options?: tough.CookieJar.SetCookieOptions): void; - getCookieString(uri: string | Url): string; - getCookies(uri: string | Url): Cookie[]; - } -} -declare var request: request.RequestAPI; -export = request; diff --git a/node_modules/@types/request/package.json b/node_modules/@types/request/package.json deleted file mode 100644 index f9dd90eb0f92d..0000000000000 --- a/node_modules/@types/request/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "_from": "@types/request@^2.47.1", - "_id": "@types/request@2.47.1", - "_inBundle": false, - "_integrity": "sha512-TV3XLvDjQbIeVxJ1Z3oCTDk/KuYwwcNKVwz2YaT0F5u86Prgc4syDAp6P96rkTQQ4bIdh+VswQIC9zS6NjY7/g==", - "_location": "/@types/request", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "@types/request@^2.47.1", - "name": "@types/request", - "escapedName": "@types%2frequest", - "scope": "@types", - "rawSpec": "^2.47.1", - "saveSpec": null, - "fetchSpec": "^2.47.1" - }, - "_requiredBy": [ - "/nano" - ], - "_resolved": "https://registry.npmjs.org/@types/request/-/request-2.47.1.tgz", - "_shasum": "25410d3afbdac04c91a94ad9efc9824100735824", - "_spec": "@types/request@^2.47.1", - "_where": "/Users/zkat/Documents/code/work/npm/node_modules/nano", - "bugs": { - "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/issues" - }, - "bundleDependencies": false, - "contributors": [ - { - "name": "Carlos Ballesteros Velasco", - "url": "https://github.com/soywiz" - }, - { - "name": "bonnici", - "url": "https://github.com/bonnici" - }, - { - "name": "Bart van der Schoor", - "url": "https://github.com/Bartvds" - }, - { - "name": "Joe Skeen", - "url": "https://github.com/joeskeen" - }, - { - "name": "Christopher Currens", - "url": "https://github.com/ccurrens" - }, - { - "name": "Jon Stevens", - "url": "https://github.com/lookfirst" - }, - { - "name": "Matt R. Wilson", - "url": "https://github.com/mastermatt" - }, - { - "name": "Jose Colella", - "url": "https://github.com/josecolella" - } - ], - "dependencies": { - "@types/caseless": "*", - "@types/form-data": "*", - "@types/node": "*", - "@types/tough-cookie": "*" - }, - "deprecated": false, - "description": "TypeScript definitions for request", - "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped#readme", - "license": "MIT", - "main": "", - "name": "@types/request", - "repository": { - "type": "git", - "url": "git+https://github.com/DefinitelyTyped/DefinitelyTyped.git" - }, - "scripts": {}, - "typeScriptVersion": "2.3", - "typesPublisherContentHash": "5b1574ed6feec1a1a58d64c2fd2eddab01d7594c6209159ef0ac92ed906e67b9", - "version": "2.47.1" -} diff --git a/node_modules/@types/tough-cookie/LICENSE b/node_modules/@types/tough-cookie/LICENSE deleted file mode 100644 index 21071075c2459..0000000000000 --- a/node_modules/@types/tough-cookie/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - MIT License - - Copyright (c) Microsoft Corporation. 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/node_modules/@types/tough-cookie/README.md b/node_modules/@types/tough-cookie/README.md deleted file mode 100644 index d01fca3928ff7..0000000000000 --- a/node_modules/@types/tough-cookie/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Installation -> `npm install --save @types/tough-cookie` - -# Summary -This package contains type definitions for tough-cookie (https://github.com/salesforce/tough-cookie). - -# Details -Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped.git/tree/master/types/tough-cookie - -Additional Details - * Last updated: Tue, 08 May 2018 22:09:43 GMT - * Dependencies: none - * Global values: none - -# Credits -These definitions were written by Leonard Thieu , LiJinyao , Michael Wei . diff --git a/node_modules/@types/tough-cookie/index.d.ts b/node_modules/@types/tough-cookie/index.d.ts deleted file mode 100644 index d4e9a585489ea..0000000000000 --- a/node_modules/@types/tough-cookie/index.d.ts +++ /dev/null @@ -1,244 +0,0 @@ -// Type definitions for tough-cookie 2.3 -// Project: https://github.com/salesforce/tough-cookie -// Definitions by: Leonard Thieu -// LiJinyao -// Michael Wei -// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped -// TypeScript Version: 2.2 - -/** - * Parse a cookie date string into a Date. - * Parses according to RFC6265 Section 5.1.1, not Date.parse(). - */ -export function parseDate(string: string): Date; - -/** - * Format a Date into a RFC1123 string (the RFC6265-recommended format). - */ -export function formatDate(date: Date): string; - -/** - * Transforms a domain-name into a canonical domain-name. - * The canonical domain-name is a trimmed, lowercased, stripped-of-leading-dot - * and optionally punycode-encoded domain-name (Section 5.1.2 of RFC6265). - * For the most part, this function is idempotent (can be run again on its output without ill effects). - */ -export function canonicalDomain(str: string): string; - -/** - * Answers "does this real domain match the domain in a cookie?". - * The str is the "current" domain-name and the domStr is the "cookie" domain-name. - * Matches according to RFC6265 Section 5.1.3, but it helps to think of it as a "suffix match". - * - * The canonicalize parameter will run the other two paramters through canonicalDomain or not. - */ -export function domainMatch(str: string, domStr: string, canonicalize?: boolean): boolean; - -/** - * Given a current request/response path, gives the Path apropriate for storing in a cookie. - * This is basically the "directory" of a "file" in the path, but is specified by Section 5.1.4 of the RFC. - * - * The path parameter MUST be only the pathname part of a URI (i.e. excludes the hostname, query, fragment, etc.). - * This is the .pathname property of node's uri.parse() output. - */ -export function defaultPath(path: string): string; - -/** - * Answers "does the request-path path-match a given cookie-path?" as per RFC6265 Section 5.1.4. - * Returns a boolean. - * - * This is essentially a prefix-match where cookiePath is a prefix of reqPath. - */ -export function pathMatch(reqPath: string, cookiePath: string): boolean; - -/** - * alias for Cookie.fromJSON(string) - */ -export function fromJSON(string: string): Cookie; - -export function getPublicSuffix(hostname: string): string | null; - -export function cookieCompare(a: Cookie, b: Cookie): number; - -export function permuteDomain(domain: string): string[]; - -export function permutePath(path: string): string[]; - -// region Cookie - -export class Cookie { - static parse(cookieString: string, options?: Cookie.ParseOptions): Cookie | undefined; - - static fromJSON(strOrObj: string | object): Cookie | null; - - constructor(properties?: Cookie.Properties); - - // TODO: Some of the following properties might actually be nullable. - - key: string; - value: string; - expires: Date; - maxAge: number | 'Infinity' | '-Infinity'; - domain: string; - path: string; - secure: boolean; - httpOnly: boolean; - extensions: string[]; - creation: Date; - creationIndex: number; - - hostOnly: boolean | null; - pathIsDefault: boolean | null; - lastAccessed: Date | null; - - toString(): string; - - cookieString(): string; - - setExpires(String: string): void; - - setMaxAge(number: number): void; - - expiryTime(now?: number): number | typeof Infinity; - - expiryDate(now?: number): Date; - - TTL(now?: Date): number | typeof Infinity; - - canonicalizedDomain(): string; - - cdomain(): string; - - toJSON(): { [key: string]: any; }; - - clone(): Cookie; - - validate(): boolean | string; -} - -export namespace Cookie { - interface ParseOptions { - loose?: boolean; - } - - interface Properties { - key?: string; - value?: string; - expires?: Date; - maxAge?: number | 'Infinity' | '-Infinity'; - domain?: string; - path?: string; - secure?: boolean; - httpOnly?: boolean; - extensions?: string[]; - creation?: Date; - creationIndex?: number; - - hostOnly?: boolean; - pathIsDefault?: boolean; - lastAccessed?: Date; - } - - interface Serialized { - [key: string]: any; - } -} - -// endregion - -// region CookieJar - -export class CookieJar { - static deserialize(serialized: CookieJar.Serialized | string, store: Store, cb: (err: Error | null, object: CookieJar) => void): void; - static deserialize(serialized: CookieJar.Serialized | string, cb: (err: Error | null, object: CookieJar) => void): void; - - static deserializeSync(serialized: CookieJar.Serialized | string, store?: Store): CookieJar; - - static fromJSON(string: string): CookieJar; - - constructor(store?: Store, options?: CookieJar.Options); - - setCookie(cookieOrString: Cookie | string, currentUrl: string, options: CookieJar.SetCookieOptions, cb: (err: Error | null, cookie: Cookie) => void): void; - setCookie(cookieOrString: Cookie | string, currentUrl: string, cb: (err: Error, cookie: Cookie) => void): void; - - setCookieSync(cookieOrString: Cookie | string, currentUrl: string, options?: CookieJar.SetCookieOptions): void; - - getCookies(currentUrl: string, options: CookieJar.GetCookiesOptions, cb: (err: Error | null, cookies: Cookie[]) => void): void; - getCookies(currentUrl: string, cb: (err: Error | null, cookies: Cookie[]) => void): void; - - getCookiesSync(currentUrl: string, options?: CookieJar.GetCookiesOptions): Cookie[]; - - getCookieString(currentUrl: string, options: CookieJar.GetCookiesOptions, cb: (err: Error | null, cookies: string) => void): void; - getCookieString(currentUrl: string, cb: (err: Error | null, cookies: string) => void): void; - - getCookieStringSync(currentUrl: string, options?: CookieJar.GetCookiesOptions): string; - - getSetCookieStrings(currentUrl: string, options: CookieJar.GetCookiesOptions, cb: (err: Error | null, cookies: string) => void): void; - getSetCookieStrings(currentUrl: string, cb: (err: Error | null, cookies: string) => void): void; - - getSetCookieStringsSync(currentUrl: string, options?: CookieJar.GetCookiesOptions): string; - - serialize(cb: (err: Error | null, serializedObject: CookieJar.Serialized) => void): void; - - serializeSync(): CookieJar.Serialized; - - toJSON(): CookieJar.Serialized; - - clone(store: Store, cb: (err: Error | null, newJar: CookieJar) => void): void; - clone(cb: (err: Error | null, newJar: CookieJar) => void): void; - - cloneSync(store: Store): CookieJar; -} - -export namespace CookieJar { - interface Options { - rejectPublicSuffixes?: boolean; - looseMode?: boolean; - } - - interface SetCookieOptions { - http?: boolean; - secure?: boolean; - now?: Date; - ignoreError?: boolean; - } - - interface GetCookiesOptions { - http?: boolean; - secure?: boolean; - date?: Date; - expire?: boolean; - allPoints?: boolean; - } - - interface Serialized { - version: string; - storeType: string; - rejectPublicSuffixes: boolean; - cookies: Cookie.Serialized[]; - } -} - -// endregion - -// region Store - -export abstract class Store { - findCookie(domain: string, path: string, key: string, cb: (err: Error | null, cookie: Cookie | null) => void): void; - - findCookies(domain: string, path: string, cb: (err: Error | null, cookie: Cookie[]) => void): void; - - putCookie(cookie: Cookie, cb: (err: Error | null) => void): void; - - updateCookie(oldCookie: Cookie, newCookie: Cookie, cb: (err: Error | null) => void): void; - - removeCookie(domain: string, path: string, key: string, cb: (err: Error | null) => void): void; - - removeCookies(domain: string, path: string, cb: (err: Error | null) => void): void; - - getAllCookies(cb: (err: Error | null, cookie: Cookie[]) => void): void; -} - -export class MemoryCookieStore extends Store { } - -// endregion diff --git a/node_modules/@types/tough-cookie/package.json b/node_modules/@types/tough-cookie/package.json deleted file mode 100644 index 659ea6cde7678..0000000000000 --- a/node_modules/@types/tough-cookie/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "_from": "@types/tough-cookie@*", - "_id": "@types/tough-cookie@2.3.3", - "_inBundle": false, - "_integrity": "sha512-MDQLxNFRLasqS4UlkWMSACMKeSm1x4Q3TxzUC7KQUsh6RK1ZrQ0VEyE3yzXcBu+K8ejVj4wuX32eUG02yNp+YQ==", - "_location": "/@types/tough-cookie", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "@types/tough-cookie@*", - "name": "@types/tough-cookie", - "escapedName": "@types%2ftough-cookie", - "scope": "@types", - "rawSpec": "*", - "saveSpec": null, - "fetchSpec": "*" - }, - "_requiredBy": [ - "/@types/request" - ], - "_resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.3.tgz", - "_shasum": "7f226d67d654ec9070e755f46daebf014628e9d9", - "_spec": "@types/tough-cookie@*", - "_where": "/Users/zkat/Documents/code/work/npm/node_modules/@types/request", - "bugs": { - "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git/issues" - }, - "bundleDependencies": false, - "contributors": [ - { - "name": "Leonard Thieu", - "url": "https://github.com/leonard-thieu" - }, - { - "name": "LiJinyao", - "url": "https://github.com/LiJinyao" - }, - { - "name": "Michael Wei", - "url": "https://github.com/no2chem" - } - ], - "dependencies": {}, - "deprecated": false, - "description": "TypeScript definitions for tough-cookie", - "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped.git#readme", - "license": "MIT", - "main": "", - "name": "@types/tough-cookie", - "repository": { - "type": "git", - "url": "git+https://github.com/DefinitelyTyped/DefinitelyTyped.git.git" - }, - "scripts": {}, - "typeScriptVersion": "2.2", - "typesPublisherContentHash": "9e1c460bd876543784250bfe8e617c1d0413eda93f509efcf07ff11d482ab6b1", - "version": "2.3.3" -} diff --git a/node_modules/get-stream/package.json b/node_modules/get-stream/package.json index f4d9711d21ff7..a34aa1daf0bfd 100644 --- a/node_modules/get-stream/package.json +++ b/node_modules/get-stream/package.json @@ -1,27 +1,34 @@ { - "_from": "get-stream@^4.1.0", + "_from": "get-stream@", "_id": "get-stream@4.1.0", "_inBundle": false, "_integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "_location": "/get-stream", "_phantomChildren": {}, "_requested": { - "type": "range", + "type": "tag", "registry": true, - "raw": "get-stream@^4.1.0", + "raw": "get-stream@", "name": "get-stream", "escapedName": "get-stream", - "rawSpec": "^4.1.0", + "rawSpec": "", "saveSpec": null, - "fetchSpec": "^4.1.0" + "fetchSpec": "latest" }, "_requiredBy": [ "#DEV:/", - "#USER" + "#USER", + "/libnpm/libnpmhook", + "/libnpmaccess", + "/libnpmorg", + "/libnpmpublish", + "/libnpmsearch", + "/libnpmteam", + "/pacote" ], "_resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "_shasum": "c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5", - "_spec": "get-stream@^4.1.0", + "_spec": "get-stream@", "_where": "/Users/zkat/Documents/code/work/npm", "author": { "name": "Sindre Sorhus", diff --git a/package-lock.json b/package-lock.json index 9b9d63ef379e4..4250112660ee1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,15 +20,15 @@ } }, "@types/node": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.7.0.tgz", - "integrity": "sha512-dmYIvoQEZWnyQfgrwPCoxztv/93NYQGEiOoQhuI56rJahv9de6Q2apZl3bufV46YJ0OAXdaktIuw4RIRl4DTeA==", + "version": "10.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.12.tgz", + "integrity": "sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A==", "dev": true }, "@types/request": { - "version": "2.47.1", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.47.1.tgz", - "integrity": "sha512-TV3XLvDjQbIeVxJ1Z3oCTDk/KuYwwcNKVwz2YaT0F5u86Prgc4syDAp6P96rkTQQ4bIdh+VswQIC9zS6NjY7/g==", + "version": "2.48.1", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.1.tgz", + "integrity": "sha512-ZgEZ1TiD+KGA9LiAAPPJL68Id2UWfeSO62ijSXZjFJArVV+2pKcsVHmrcu+1oiE3q6eDGiFiSolRc4JHoerBBg==", "dev": true, "requires": { "@types/caseless": "*", @@ -38,9 +38,9 @@ } }, "@types/tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha512-MDQLxNFRLasqS4UlkWMSACMKeSm1x4Q3TxzUC7KQUsh6RK1ZrQ0VEyE3yzXcBu+K8ejVj4wuX32eUG02yNp+YQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-Set5ZdrAaKI/qHdFlVMgm/GsAv/wkXhSTuZFkJ+JI7HK+wIkIlOaUXSXieIvJ0+OvGIqtREFoE+NHJtEq0gtEw==", "dev": true }, "JSONStream": { @@ -58,14 +58,14 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true }, "acorn-jsx": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { @@ -74,7 +74,7 @@ "dependencies": { "acorn": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", "dev": true } @@ -123,7 +123,7 @@ }, "ansi-escapes": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, @@ -180,7 +180,7 @@ "dependencies": { "sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true } @@ -202,27 +202,6 @@ "es-abstract": "^1.7.0" } }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -275,7 +254,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -362,6 +341,12 @@ "concat-map": "0.0.1" } }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, "browser-request": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", @@ -436,7 +421,7 @@ }, "callsites": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "resolved": "http://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, @@ -571,14 +556,25 @@ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" }, "cloudant-follow": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/cloudant-follow/-/cloudant-follow-0.17.0.tgz", - "integrity": "sha512-JQ1xvKAHh8rsnSVBjATLCjz/vQw1sWBGadxr2H69yFMwD7hShUGDwwEefdypaxroUJ/w6t1cSwilp/hRUxEW8w==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/cloudant-follow/-/cloudant-follow-0.18.0.tgz", + "integrity": "sha512-jsplCsI0EpJvTrlgeuuYFrmrKGxm8TlSkyKzOLZa6fc6p+FNT8UDPAwYeh0yaT8IdI+sxT5DTdCD2G45HWpSaw==", "dev": true, "requires": { "browser-request": "~0.3.0", - "debug": "^3.0.0", - "request": "^2.83.0" + "debug": "^4.0.1", + "request": "^2.88.0" + }, + "dependencies": { + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "cmd-shim": { @@ -746,12 +742,6 @@ } } }, - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", - "dev": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -773,21 +763,22 @@ } }, "coveralls": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.1.tgz", - "integrity": "sha512-FAzXwiDOYLGDWH+zgoIA+8GbWv50hlx+kpEJyvzLKOdnIBv9uWoVl4DhqGgyUHpiRjAlF8KYZSipWXYtllWH6Q==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.2.tgz", + "integrity": "sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw==", "dev": true, "requires": { - "js-yaml": "^3.6.1", + "growl": "~> 1.10.0", + "js-yaml": "^3.11.0", "lcov-parse": "^0.0.10", - "log-driver": "^1.2.5", + "log-driver": "^1.2.7", "minimist": "^1.2.0", - "request": "^2.79.0" + "request": "^2.85.0" }, "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -846,7 +837,7 @@ }, "debug-log": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", "dev": true }, @@ -891,19 +882,18 @@ } }, "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" + "object-keys": "^1.0.12" } }, "deglob": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz", - "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", + "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", "dev": true, "requires": { "find-root": "^1.0.0", @@ -914,29 +904,6 @@ "uniq": "^1.0.1" } }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -987,6 +954,12 @@ "esutils": "^2.0.2" } }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", @@ -1073,9 +1046,9 @@ } }, "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" @@ -1088,9 +1061,9 @@ "dev": true }, "es-abstract": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", - "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", "dev": true, "requires": { "es-to-primitive": "^1.1.1", @@ -1101,14 +1074,14 @@ } }, "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", "dev": true, "requires": { - "is-callable": "^1.1.1", + "is-callable": "^1.1.4", "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" + "is-symbol": "^1.0.2" } }, "es6-promise": { @@ -1137,7 +1110,7 @@ }, "eslint": { "version": "4.18.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.18.2.tgz", + "resolved": "http://registry.npmjs.org/eslint/-/eslint-4.18.2.tgz", "integrity": "sha512-qy4i3wODqKMYfz9LUI8N2qYDkHkoieTbiHpMrYUI/WbjhXJQr7lI4VngixTgaG+yHX+NBCv7nW4hA0ShbvaNKw==", "dev": true, "requires": { @@ -1186,12 +1159,6 @@ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -1205,13 +1172,13 @@ }, "eslint-config-standard": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz", + "resolved": "http://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz", "integrity": "sha512-oDdENzpViEe5fwuRCWla7AXQd++/oyIp8zP+iP9jiUPG6NBj3SHgdgtl/kTn00AjeN+1HNvavTKmYbMo+xMOlw==", "dev": true }, "eslint-config-standard-jsx": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-5.0.0.tgz", + "resolved": "http://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-5.0.0.tgz", "integrity": "sha512-rLToPAEqLMPBfWnYTu6xRhm2OWziS2n40QFqJ8jAM8NSVzeVKTa3nclhsU4DpPJQRY60F34Oo1wi/71PN/eITg==", "dev": true }, @@ -1271,7 +1238,7 @@ }, "eslint-plugin-import": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.9.0.tgz", + "resolved": "http://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.9.0.tgz", "integrity": "sha1-JgAu+/ylmJtyiKwEdQi9JPIXsWk=", "dev": true, "requires": { @@ -1298,7 +1265,7 @@ }, "doctrine": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { @@ -1306,12 +1273,6 @@ "isarray": "^1.0.0" } }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -1322,7 +1283,7 @@ }, "eslint-plugin-node": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz", + "resolved": "http://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz", "integrity": "sha512-Q/Cc2sW1OAISDS+Ji6lZS2KV4b7ueA/WydVWd1BECTQwVvfQy5JAi3glhINoKzoMnfnuRgNP+ZWKrGAbp3QDxw==", "dev": true, "requires": { @@ -1334,13 +1295,13 @@ }, "eslint-plugin-promise": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.7.0.tgz", + "resolved": "http://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.7.0.tgz", "integrity": "sha512-2WO+ZFh7vxUKRfR0cOIMrWgYKdR6S1AlOezw6pC52B6oYpd5WFghN+QHxvrRdZMtbo8h3dfUZ2o1rWb0UPbKtg==", "dev": true }, "eslint-plugin-react": { "version": "7.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.7.0.tgz", + "resolved": "http://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.7.0.tgz", "integrity": "sha512-KC7Snr4YsWZD5flu6A5c0AcIZidzW3Exbqp7OT67OaD2AppJtlBr/GuPrW/vaQM/yfZotEvKAdrxrO+v8vwYJA==", "dev": true, "requires": { @@ -1357,9 +1318,9 @@ "dev": true }, "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -1374,7 +1335,7 @@ }, "espree": { "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "resolved": "http://registry.npmjs.org/espree/-/espree-3.5.4.tgz", "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, "requires": { @@ -1383,9 +1344,9 @@ } }, "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esquery": { @@ -1452,7 +1413,7 @@ }, "external-editor": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { @@ -1482,21 +1443,6 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fbjs": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", - "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", - "dev": true, - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.9" - } - }, "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", @@ -1573,14 +1519,14 @@ } }, "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", "dev": true, "requires": { "circular-json": "^0.3.1", - "del": "^2.0.2", "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", "write": "^0.2.1" } }, @@ -1593,15 +1539,9 @@ "readable-stream": "^2.0.4" } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, "foreground-child": { "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "resolved": "http://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", "dev": true, "requires": { @@ -1833,33 +1773,11 @@ } }, "globals": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", - "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", + "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", "dev": true }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, "got": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", @@ -1890,6 +1808,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -1905,12 +1829,12 @@ } }, "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "function-bind": "^1.0.2" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -1927,6 +1851,12 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -1961,7 +1891,7 @@ }, "http-proxy": { "version": "0.8.7", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-0.8.7.tgz", + "resolved": "http://registry.npmjs.org/http-proxy/-/http-proxy-0.8.7.tgz", "integrity": "sha1-p7xThhgJLNJu0ZHkYlkzuu9t6A4=", "dev": true, "requires": { @@ -1972,7 +1902,7 @@ "dependencies": { "colors": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "resolved": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz", "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", "dev": true } @@ -2028,9 +1958,9 @@ "integrity": "sha512-9AfeLfji44r5TKInjhz3W9DyZI1zR1JAf2hVBMGhddAKPqBsupb89jGfbCTHIGZd6fGZl9WlHdn4AObygyMKwg==" }, "ignore": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", - "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, "ignore-walk": { @@ -2113,12 +2043,6 @@ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -2160,9 +2084,9 @@ } }, "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", "dev": true }, "is-ci": { @@ -2214,21 +2138,6 @@ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, "is-path-inside": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", @@ -2274,10 +2183,13 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } }, "is-typedarray": { "version": "1.0.0", @@ -2294,16 +2206,6 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "dev": true, - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - } - }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -2316,9 +2218,9 @@ "dev": true }, "js-yaml": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", - "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -2678,7 +2580,7 @@ }, "load-json-file": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { @@ -2690,7 +2592,7 @@ "dependencies": { "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } @@ -2722,6 +2624,12 @@ "signal-exit": "^3.0.2" } }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, "lodash._baseindexof": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz", @@ -2776,7 +2684,7 @@ }, "lodash.isempty": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "resolved": "http://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=", "dev": true }, @@ -2807,12 +2715,12 @@ "dev": true }, "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { - "js-tokens": "^3.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" } }, "lowercase-keys": { @@ -2856,9 +2764,9 @@ } }, "marked": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.5.0.tgz", - "integrity": "sha512-UhjmkCWKu1SS/BIePL2a59BMJ7V42EYtTfksodPRXzPEGEph3Inp5dylseqt+KbU9Jglsx8xcMKmlumfJMBXAA==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.5.2.tgz", + "integrity": "sha512-fdZvBa7/vSQIZCi4uuwo2N3q+7jJURpMVCcbaX0S1Mg65WZ5ilXvC67MviJAsdjqqgD+CEq4RKo5AYGgINkVAA==", "dev": true }, "marked-man": { @@ -2872,7 +2780,7 @@ "dependencies": { "marked": { "version": "0.3.19", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "resolved": "http://registry.npmjs.org/marked/-/marked-0.3.19.tgz", "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", "dev": true } @@ -2995,13 +2903,13 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "nano": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/nano/-/nano-7.0.0.tgz", - "integrity": "sha512-zR1jRRfpG/lcFjYnGGxabABLFRtFX1E7YqWIJzvC0dLRJ9NTxodJC4MzVifhriMT9yhulsOf8k2UNOX8fMULAg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/nano/-/nano-7.1.1.tgz", + "integrity": "sha512-c8Pr5/08XnTMt2Uii6Fcj4nKgwL/19Tgh+ZzwnEq73bVToo9WnhpMX2u4a70y1lVM8KFwaWYRy6EbjsdaQ0NCQ==", "dev": true, "requires": { "@types/request": "^2.47.1", - "cloudant-follow": "~0.17.0", + "cloudant-follow": "^0.18.0", "debug": "^2.2.0", "errs": "^0.3.2", "lodash.isempty": "^4.4.0", @@ -3031,16 +2939,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, "node-fetch-npm": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", @@ -3214,7 +3112,7 @@ "dependencies": { "semver": { "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "resolved": "http://registry.npmjs.org/semver/-/semver-4.3.6.tgz", "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", "dev": true } @@ -5919,9 +5817,9 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", "dev": true }, "on-finished": { @@ -5962,6 +5860,14 @@ "dev": true, "requires": { "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } } }, "optionator": { @@ -5976,14 +5882,6 @@ "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "wordwrap": "~1.0.0" - }, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } } }, "os-homedir": { @@ -6186,9 +6084,9 @@ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "path-type": { @@ -6202,7 +6100,7 @@ "dependencies": { "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } @@ -6337,20 +6235,11 @@ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "requires": { - "asap": "~2.0.3" - } - }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -6381,12 +6270,11 @@ } }, "prop-types": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", - "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", "dev": true, "requires": { - "fbjs": "^0.8.16", "loose-envify": "^1.3.1", "object-assign": "^4.1.1" } @@ -6667,7 +6555,7 @@ }, "require-uncached": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { @@ -6684,9 +6572,9 @@ } }, "resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", "dev": true, "requires": { "path-parse": "^1.0.5" @@ -6786,12 +6674,6 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, "sha": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/sha/-/sha-2.0.1.tgz", @@ -6928,9 +6810,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -7011,9 +6893,9 @@ } }, "sprintf-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", - "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "dev": true }, "sshpk": { @@ -7041,14 +6923,14 @@ } }, "stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", "dev": true }, "standard": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/standard/-/standard-11.0.1.tgz", + "resolved": "http://registry.npmjs.org/standard/-/standard-11.0.1.tgz", "integrity": "sha512-nu0jAcHiSc8H+gJCXeiziMVZNDYi8MuqrYJKxTgjP4xKXZMKm311boqQIzDrYI/ktosltxt2CbDjYQs9ANC8IA==", "dev": true, "requires": { @@ -7065,7 +6947,7 @@ }, "standard-engine": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-8.0.1.tgz", + "resolved": "http://registry.npmjs.org/standard-engine/-/standard-engine-8.0.1.tgz", "integrity": "sha512-LA531C3+nljom/XRvdW/hGPXwmilRkaRkENhO3FAGF1Vtq/WtCXzgmnc5S6vUHHsgv534MRy02C1ikMwZXC+tw==", "dev": true, "requires": { @@ -7077,7 +6959,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -7203,14 +7085,6 @@ "lodash": "^4.17.4", "slice-ansi": "1.0.0", "string-width": "^2.1.1" - }, - "dependencies": { - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - } } }, "tacks": { @@ -7338,40 +7212,61 @@ } }, "tap": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/tap/-/tap-12.0.1.tgz", - "integrity": "sha512-iEJytWaZy8risvfRjuV4+ST+Lrrui/MW2ZCWn01ZaMn0NKFej4+PpBy6bXGOg9+cEGNmI7d3Sdka/zTUZUGidA==", + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/tap/-/tap-12.1.1.tgz", + "integrity": "sha512-YPxCIzgrjCjdVt1F71snGLyebbAcbCs5uh74f5GPBkXFbcMgLjuDnopva+vgs9cqVv4mtSYBuxRS1/8C2ed7MQ==", "dev": true, "requires": { "bind-obj-methods": "^2.0.0", - "bluebird": "^3.5.1", + "bluebird": "^3.5.3", + "browser-process-hrtime": "^1.0.0", + "capture-stack-trace": "^1.0.0", "clean-yaml-object": "^0.1.0", "color-support": "^1.1.0", - "coveralls": "^3.0.1", + "coveralls": "^3.0.2", + "domain-browser": "^1.2.0", "foreground-child": "^1.3.3", "fs-exists-cached": "^1.0.0", "function-loop": "^1.0.1", - "glob": "^7.0.0", + "glob": "^7.1.3", "isexe": "^2.0.0", - "js-yaml": "^3.11.0", - "minipass": "^2.3.0", + "js-yaml": "^3.12.0", + "minipass": "^2.3.5", "mkdirp": "^0.5.1", - "nyc": "^11.8.0", - "opener": "^1.4.1", + "nyc": "^11.9.0", + "opener": "^1.5.1", "os-homedir": "^1.0.2", "own-or": "^1.0.0", "own-or-env": "^1.0.1", "rimraf": "^2.6.2", "signal-exit": "^3.0.0", - "source-map-support": "^0.5.6", + "source-map-support": "^0.5.9", "stack-utils": "^1.0.0", "tap-mocha-reporter": "^3.0.7", "tap-parser": "^7.0.0", "tmatch": "^4.0.0", "trivial-deferred": "^1.0.1", - "tsame": "^2.0.0", + "tsame": "^2.0.1", "write-file-atomic": "^2.3.0", "yapool": "^1.0.0" + }, + "dependencies": { + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } } }, "tap-mocha-reporter": { @@ -7533,9 +7428,9 @@ "dev": true }, "tsame": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tsame/-/tsame-2.0.0.tgz", - "integrity": "sha512-dAuzcnOPdqZYojylFQzEes95UDjve3HqKrlTCeLZKSDPMTsn3smzHZqsJj/sWD8wOUkg0RD++B11evyLn2+bIw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tsame/-/tsame-2.0.1.tgz", + "integrity": "sha512-jxyxgKVKa4Bh5dPcO42TJL22lIvfd9LOVJwdovKOnJa4TLLrHxquK+DlGm4rkGmrcur+GRx+x4oW00O2pY/fFw==", "dev": true }, "tunnel-agent": { @@ -7566,12 +7461,6 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, - "ua-parser-js": { - "version": "0.7.18", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz", - "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA==", - "dev": true - }, "uid-number": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", @@ -7737,12 +7626,6 @@ "defaults": "^1.0.3" } }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", - "dev": true - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -7785,9 +7668,9 @@ } }, "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, "worker-farm": { diff --git a/package.json b/package.json index d862808cc8470..8221a24ec5c11 100644 --- a/package.json +++ b/package.json @@ -266,18 +266,18 @@ "write-file-atomic" ], "devDependencies": { - "deep-equal": "~1.0.1", + "deep-equal": "^1.0.1", "get-stream": "^4.1.0", "licensee": "^5.0.0", - "marked": "^0.5.0", - "marked-man": "~0.2.1", + "marked": "^0.5.2", + "marked-man": "^0.2.1", "npm-registry-couchapp": "^2.7.1", - "npm-registry-mock": "~1.1.0", + "npm-registry-mock": "^1.1.0", "require-inject": "^1.4.3", - "sprintf-js": "~1.1.1", + "sprintf-js": "^1.1.2", "standard": "^11.0.1", "tacks": "^1.2.7", - "tap": "^12.0.1" + "tap": "^12.1.1" }, "scripts": { "dumpconf": "env | grep npm | sort | uniq", From 76451570abafe087896f278f598f5b8b05bd1abe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kat=20March=C3=A1n?= Date: Wed, 12 Dec 2018 13:33:22 -0800 Subject: [PATCH 53/97] deps: make prepare run `rebuild` to make sure bins from deps are there --- node_modules/rimraf/package.json | 12 ++++++------ package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/node_modules/rimraf/package.json b/node_modules/rimraf/package.json index a22d103bbb734..cbb049239122e 100644 --- a/node_modules/rimraf/package.json +++ b/node_modules/rimraf/package.json @@ -1,5 +1,5 @@ { - "_from": "rimraf@*", + "_from": "rimraf@^2.6.2", "_id": "rimraf@2.6.2", "_inBundle": false, "_integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", @@ -8,19 +8,19 @@ "_requested": { "type": "range", "registry": true, - "raw": "rimraf@*", + "raw": "rimraf@^2.6.2", "name": "rimraf", "escapedName": "rimraf", - "rawSpec": "*", + "rawSpec": "^2.6.2", "saveSpec": null, - "fetchSpec": "*" + "fetchSpec": "^2.6.2" }, "_requiredBy": [ "#USER", "/", "/cacache", "/copy-concurrently", - "/del", + "/flat-cache", "/fs-vacuum", "/fstream", "/libcipm", @@ -32,7 +32,7 @@ ], "_resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "_shasum": "2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36", - "_spec": "rimraf@*", + "_spec": "rimraf@^2.6.2", "_where": "/Users/zkat/Documents/code/work/npm", "author": { "name": "Isaac Z. Schlueter", diff --git a/package.json b/package.json index 8221a24ec5c11..e46d57c8f87d2 100644 --- a/package.json +++ b/package.json @@ -281,7 +281,7 @@ }, "scripts": { "dumpconf": "env | grep npm | sort | uniq", - "prepare": "node bin/npm-cli.js --no-audit --no-timing prune --prefix=. --no-global && rimraf test/*/*/node_modules && make -j4 doc", + "prepare": "node bin/npm-cli.js rebuild && node bin/npm-cli.js --no-audit --no-timing prune --prefix=. --no-global && rimraf test/*/*/node_modules && make -j4 doc", "preversion": "bash scripts/update-authors.sh && git add AUTHORS && git commit -m \"update AUTHORS\" || true", "licenses": "licensee --production --errors-only", "tap": "tap --reporter=classic --timeout 300", From a06ac852455e4e5cd63e7955d09191086558d46a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kat=20March=C3=A1n?= Date: Wed, 12 Dec 2018 12:56:30 -0800 Subject: [PATCH 54/97] doc: update changelog for npm@6.6.0 --- CHANGELOG.md | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b575dbeef55da..b4b1c9a25de62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,136 @@ +## v6.6.0 (2018-12-12): + +### REFACTORING OUT npm-REGISTRY-CLIENT + +Today is an auspicious day! This release marks the end of a massive internal +refactor to npm that means we finally got rid of the legacy +[`npm-registry-client`](https://npm.im/npm-registry-client) in favor of the +shiny, new, `window.fetch`-like +[`npm-registry-fetch`](https://npm.im/npm-registry-fetch). + +Now, the installer had already done most of this work with the release of +`npm@5`, but it turns out _every other command_ still used the legacy client. +This release updates all of those commands to use the new client, and while +we're at it, adds a few extra goodies: + +* All OTP-requiring commands will now **prompt**. `--otp` is no longer required for `dist-tag`, `access`, et al. +* We're starting to integrate a new config system which will eventually get extracted into a standalone package. +* We now use [`libnpm`](https://npm.im/libnpm) for the API functionality of a lot of our commands! That means you can install a library if you want to write your own tooling around them. +* There's now an `npm org` command for managing users in your org. +* [`pacote`](https://npm.im/pacote) now consumes npm-style configurations, instead of its own naming for various config vars. This will make it easier to load npm configs using `libnpm.config` and hand them directly to `pacote`. + +There's too many commits to list all of them here, so check out the PR if you're +curious about details: + +* [`c5af34c05`](https://github.com/npm/cli/commit/c5af34c05fd569aecd11f18d6d0ddeac3970b253) + [npm-registry-client@REMOVED](https://www.youtube.com/watch\?v\=kPIdRJlzERo) + ([@zkat](https://github.com/zkat)) +* [`4cca9cb90`](https://github.com/npm/cli/commit/4cca9cb9042c0eeb743377e8f1ae1c07733df43f) + [`ad67461dc`](https://github.com/npm/cli/commit/ad67461dc3a73d5ae6569fdbee44c67e1daf86e7) + [`77625f9e2`](https://github.com/npm/cli/commit/77625f9e20d4285b7726b3bf3ebc10cb21c638f0) + [`6e922aefb`](https://github.com/npm/cli/commit/6e922aefbb4634bbd77ed3b143e0765d63afc7f9) + [`584613ea8`](https://github.com/npm/cli/commit/584613ea8ff94b927db4957e5647504b30ca2b1f) + [`64de4ebf0`](https://github.com/npm/cli/commit/64de4ebf019b217179039124c6621e74651e4d27) + [`6cd87d1a9`](https://github.com/npm/cli/commit/6cd87d1a9bb90e795f9891ea4db384435f4a8930) + [`2786834c0`](https://github.com/npm/cli/commit/2786834c0257b8bb1bbb115f1ce7060abaab2e17) + [`514558e09`](https://github.com/npm/cli/commit/514558e094460fd0284a759c13965b685133b3fe) + [`dec07ebe3`](https://github.com/npm/cli/commit/dec07ebe3312245f6421c6e523660be4973ae8c2) + [`084741913`](https://github.com/npm/cli/commit/084741913c4fdb396e589abf3440b4be3aa0b67e) + [`45aff0e02`](https://github.com/npm/cli/commit/45aff0e02251785a85e56eafacf9efaeac6f92ae) + [`846ddcc44`](https://github.com/npm/cli/commit/846ddcc44538f2d9a51ac79405010dfe97fdcdeb) + [`8971ba1b9`](https://github.com/npm/cli/commit/8971ba1b953d4f05ff5094f1822b91526282edd8) + [`99156e081`](https://github.com/npm/cli/commit/99156e081a07516d6c970685bc3d858f89dc4f9c) + [`ab2155306`](https://github.com/npm/cli/commit/ab215530674d7f6123c9572d0ad4ca9e9b5fb184) + [`b37a66542`](https://github.com/npm/cli/commit/b37a66542ca2879069b2acd338b1904de71b7f40) + [`d2af0777a`](https://github.com/npm/cli/commit/d2af0777ac179ff5009dbbf0354a4a84f151b60f) + [`e0b4c6880`](https://github.com/npm/cli/commit/e0b4c6880504fa2e8491c2fbd098efcb2e496849) + [`ff72350b4`](https://github.com/npm/cli/commit/ff72350b4c56d65e4a92671d86a33080bf3c2ea5) + [`6ed943303`](https://github.com/npm/cli/commit/6ed943303ce7a267ddb26aa25caa035f832895dd) + [`90a069e7d`](https://github.com/npm/cli/commit/90a069e7d4646682211f4cabe289c306ee1d5397) + [`b24ed5fdc`](https://github.com/npm/cli/commit/b24ed5fdc3a4395628465ae5273bad54eea274c8) + [`ec9fcc14f`](https://github.com/npm/cli/commit/ec9fcc14f4e0e2f3967e2fd6ad8b8433076393cb) + [`8a56fa39e`](https://github.com/npm/cli/commit/8a56fa39e61136da45565447fe201a57f04ad4cd) + [`41d19e18f`](https://github.com/npm/cli/commit/41d19e18f769c6f0acfdffbdb01d12bf332908ce) + [`125ff9551`](https://github.com/npm/cli/commit/125ff9551595dda9dab2edaef10f4c73ae8e1433) + [`1c3b226ff`](https://github.com/npm/cli/commit/1c3b226ff37159c426e855e83c8f6c361603901d) + [`3c0a7b06b`](https://github.com/npm/cli/commit/3c0a7b06b6473fe068fc8ae8466c07a177975b87) + [`08fcb3f0f`](https://github.com/npm/cli/commit/08fcb3f0f26e025702b35253ed70a527ab69977f) + [`c8135d97a`](https://github.com/npm/cli/commit/c8135d97a424b38363dc4530c45e4583471e9849) + [`ae936f22c`](https://github.com/npm/cli/commit/ae936f22ce80614287f2769e9aaa9a155f03cc15) + [#2](https://github.com/npm/cli/pull/2) + Move rest of commands to `npm-registry-fetch` and use [`figgy-pudding`](https://npm.im/figgy-pudding) for configs. + ([@zkat](https://github.com/zkat)) + +### NEW FEATURES + +* [`02c837e01`](https://github.com/npm/cli/commit/02c837e01a71a26f37cbd5a09be89df8a9ce01da) + [#106](https://github.com/npm/cli/pull/106) + Make `npm dist-tags` the same as `npm dist-tag ls`. + ([@isaacs](https://github.com/isaacs)) +* [`1065a7809`](https://github.com/npm/cli/commit/1065a7809161fd4dc23e96b642019fc842fdacf2) + [#65](https://github.com/npm/cli/pull/65) + Add support for `IBM i`. + ([@dmabupt](https://github.com/dmabupt)) + +### BUGFIXES + +* [`890a74458`](https://github.com/npm/cli/commit/890a74458dd4a55e2d85f3eba9dbf125affa4206) + [npm.community#3278](https://npm.community/t/https://npm.community/t/3278) + Fix support for passing git binary path config with `--git`. + ([@larsgw](https://github.com/larsgw)) +* [`90e55a143`](https://github.com/npm/cli/commit/90e55a143ed1de8678d65c17bc3c2b103a15ddac) + [npm.community#2713](https://npm.community/t/npx-envinfo-preset-jest-fails-on-windows-with-a-stack-trace/2713) + Check for `npm.config`'s existence in `error-handler.js` to prevent weird + errors when failures happen before config object is loaded. + ([@BeniCheni](https://github.com/BeniCheni)) + +### DOCS + +* [`31a7274b7`](https://github.com/npm/cli/commit/31a7274b70de18b24e7bee51daa22cc7cbb6141c) + [#71](https://github.com/npm/cli/pull/71) + Fix typo in npm-token documentation. + ([@GeorgeTaveras1231](https://github.com/GeorgeTaveras1231)) + +### DEPENDENCIES + + +* [`9cefcdc1d`](https://github.com/npm/cli/commit/9cefcdc1d2289b56f9164d14d7e499e115cfeaee) + `npm-registry-fetch@3.8.0` + ([@zkat](https://github.com/zkat)) +* [`1c769c9b3`](https://github.com/npm/cli/commit/1c769c9b3e431d324c1a5b6dd10e1fddb5cb88c7) + `pacote@9.1.0` + ([@zkat](https://github.com/zkat)) +* [`f3bc5539b`](https://github.com/npm/cli/commit/f3bc5539b30446500abcc3873781b2c717f8e22c) + `figgy-pudding@3.5.1` + ([@zkat](https://github.com/zkat)) +* [`bf7199d3c`](https://github.com/npm/cli/commit/bf7199d3cbf50545da1ebd30d28f0a6ed5444a00) + `npm-profile@4.0.1` + ([@zkat](https://github.com/zkat)) +* [`118c50496`](https://github.com/npm/cli/commit/118c50496c01231cab3821ae623be6df89cb0a32) + `semver@5.5.1` + ([@isaacs](https://github.com/isaacs)) +* [`eab4df925`](https://github.com/npm/cli/commit/eab4df9250e9169c694b3f6c287d2932bf5e08fb) + `libcipm@3.0.2` + ([@zkat](https://github.com/zkat)) +* [`b86e51573`](https://github.com/npm/cli/commit/b86e515734faf433dc6c457c36c1de52795aa870) + `libnpm@1.4.0` + ([@zkat](https://github.com/zkat)) +* [`56fffbff2`](https://github.com/npm/cli/commit/56fffbff27fe2fae8bef27d946755789ef0d89bd) + `get-stream@4.1.0` + ([@zkat](https://github.com/zkat)) +* [`df972e948`](https://github.com/npm/cli/commit/df972e94868050b5aa42ac18b527fd929e1de9e4) + npm-profile@REMOVED + ([@zkat](https://github.com/zkat)) +* [`32c73bf0e`](https://github.com/npm/cli/commit/32c73bf0e3f0441d0c7c940292235d4b93aa87e2) + `libnpm@2.0.1` + ([@zkat](https://github.com/zkat)) +* [`569491b80`](https://github.com/npm/cli/commit/569491b8042f939dc13986b6adb2a0a260f95b63) + `licensee@5.0.0` + ([@zkat](https://github.com/zkat)) +* [`a3ba0ccf1`](https://github.com/npm/cli/commit/a3ba0ccf1fa86aec56b1ad49883abf28c1f56b3c) + move rimraf to prod deps + ([@zkat](https://github.com/zkat)) + ## v6.5.0 (2018-11-28): ### NEW FEATURES From dd3aa1cbe9bbd5abe3ff8c9cee3a9472b9465389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Harper?= Date: Wed, 12 Dec 2018 16:47:25 -0500 Subject: [PATCH 55/97] update AUTHORS --- AUTHORS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/AUTHORS b/AUTHORS index f66afe80f01a1..aad5087f038c0 100644 --- a/AUTHORS +++ b/AUTHORS @@ -612,3 +612,7 @@ Joe Bottigliero Nikolai Vavilov Kelvin Jin 乱序 +Audrey Eschright +Xu Meng +George +Beni von Cheni From 56440dd192a43c76639e55c15ecec84c313b906e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Harper?= Date: Wed, 12 Dec 2018 16:47:25 -0500 Subject: [PATCH 56/97] 6.6.0-next.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4250112660ee1..836772c4f15b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "npm", - "version": "6.5.0", + "version": "6.6.0-next.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index e46d57c8f87d2..f2fdbe0c155db 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "6.5.0", + "version": "6.6.0-next.0", "name": "npm", "description": "a package manager for JavaScript", "keywords": [ From fb3bbb72d448ac37a465b31233b21381917422f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kat=20March=C3=A1n?= Date: Tue, 18 Dec 2018 14:36:47 -0800 Subject: [PATCH 57/97] npm-audit-report@1.3.2 Ref: https://github.com/npm/npm-audit-report/pull/34 Credit: @melkikh --- node_modules/npm-audit-report/CHANGELOG.md | 12 +++++++++ node_modules/npm-audit-report/package.json | 22 ++++++++-------- .../npm-audit-report/reporters/detail.js | 4 +-- .../npm-audit-report/reporters/parseable.js | 25 +++++++++++-------- package-lock.json | 6 ++--- package.json | 2 +- 6 files changed, 43 insertions(+), 28 deletions(-) diff --git a/node_modules/npm-audit-report/CHANGELOG.md b/node_modules/npm-audit-report/CHANGELOG.md index 4cf6a1acda0a3..941a18741b600 100644 --- a/node_modules/npm-audit-report/CHANGELOG.md +++ b/node_modules/npm-audit-report/CHANGELOG.md @@ -2,6 +2,18 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [1.3.2](https://github.com/npm/npm-audit-report/compare/v1.3.1...v1.3.2) (2018-12-18) + + +### Bug Fixes + +* **parseable:** add support for critical vulns and more resolves on update/install action ([#28](https://github.com/npm/npm-audit-report/issues/28)) ([5e27893](https://github.com/npm/npm-audit-report/commit/5e27893)) +* **security:** audit fix ([ff9faf3](https://github.com/npm/npm-audit-report/commit/ff9faf3)) +* **urls:** Replace hardcoded URL to advisory with a URL from audit response ([#34](https://github.com/npm/npm-audit-report/issues/34)) ([e2fe95b](https://github.com/npm/npm-audit-report/commit/e2fe95b)) + + + ## [1.3.1](https://github.com/npm/npm-audit-report/compare/v1.3.0...v1.3.1) (2018-07-10) diff --git a/node_modules/npm-audit-report/package.json b/node_modules/npm-audit-report/package.json index 0f76601e27020..905c0ce33da3d 100644 --- a/node_modules/npm-audit-report/package.json +++ b/node_modules/npm-audit-report/package.json @@ -1,27 +1,27 @@ { - "_from": "npm-audit-report@^1.2.1", - "_id": "npm-audit-report@1.3.1", + "_from": "npm-audit-report@1.3.2", + "_id": "npm-audit-report@1.3.2", "_inBundle": false, - "_integrity": "sha512-SjTF8ZP4rOu3JiFrTMi4M1CmVo2tni2sP4TzhyCMHwnMGf6XkdGLZKt9cdZ12esKf0mbQqFyU9LtY0SoeahL7g==", + "_integrity": "sha512-abeqS5ONyXNaZJPGAf6TOUMNdSe1Y6cpc9MLBRn+CuUoYbfdca6AxOyXVlfIv9OgKX+cacblbG5w7A6ccwoTPw==", "_location": "/npm-audit-report", "_phantomChildren": {}, "_requested": { - "type": "range", + "type": "version", "registry": true, - "raw": "npm-audit-report@^1.2.1", + "raw": "npm-audit-report@1.3.2", "name": "npm-audit-report", "escapedName": "npm-audit-report", - "rawSpec": "^1.2.1", + "rawSpec": "1.3.2", "saveSpec": null, - "fetchSpec": "^1.2.1" + "fetchSpec": "1.3.2" }, "_requiredBy": [ "#USER", "/" ], - "_resolved": "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-1.3.1.tgz", - "_shasum": "e79ea1fcb5ffaf3031102b389d5222c2b0459632", - "_spec": "npm-audit-report@^1.2.1", + "_resolved": "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-1.3.2.tgz", + "_shasum": "303bc78cd9e4c226415076a4f7e528c89fc77018", + "_spec": "npm-audit-report@1.3.2", "_where": "/Users/zkat/Documents/code/work/npm", "author": { "name": "Adam Baldwin" @@ -76,5 +76,5 @@ "update-coc": "weallbehave -o . && git add CODE_OF_CONDUCT.md && git commit -m 'docs(coc): updated CODE_OF_CONDUCT.md'", "update-contrib": "weallcontribute -o . && git add CONTRIBUTING.md && git commit -m 'docs(contributing): updated CONTRIBUTING.md'" }, - "version": "1.3.1" + "version": "1.3.2" } diff --git a/node_modules/npm-audit-report/reporters/detail.js b/node_modules/npm-audit-report/reporters/detail.js index 2cbb8fea50b25..f6e822eb7ae6f 100644 --- a/node_modules/npm-audit-report/reporters/detail.js +++ b/node_modules/npm-audit-report/reporters/detail.js @@ -117,7 +117,7 @@ const report = function (data, options) { {'Package': advisory.module_name}, {'Dependency of': `${resolution.path.split('>')[0]} ${resolution.dev ? '[dev]' : ''}`}, {'Path': `${resolution.path.split('>').join(Utils.color(' > ', 'grey', config.withColor))}`}, - {'More info': `https://nodesecurity.io/advisories/${advisory.id}`} + {'More info': advisory.url || `https://www.npmjs.com/advisories/${advisory.id}`} ) log(table.toString() + '\n\n') @@ -160,7 +160,7 @@ const report = function (data, options) { {'Patched in': patchedIn}, {'Dependency of': `${resolution.path.split('>')[0]} ${resolution.dev ? '[dev]' : ''}`}, {'Path': `${resolution.path.split('>').join(Utils.color(' > ', 'grey', config.withColor))}`}, - {'More info': `https://nodesecurity.io/advisories/${advisory.id}`} + {'More info': advisory.url || `https://www.npmjs.com/advisories/${advisory.id}`} ) log(table.toString()) }) diff --git a/node_modules/npm-audit-report/reporters/parseable.js b/node_modules/npm-audit-report/reporters/parseable.js index 363359772916c..1d46ef22716cd 100644 --- a/node_modules/npm-audit-report/reporters/parseable.js +++ b/node_modules/npm-audit-report/reporters/parseable.js @@ -11,6 +11,7 @@ const report = function (data, options) { const actions = function (data, config) { let accumulator = { + critical: '', high: '', moderate: '', low: '' @@ -25,16 +26,18 @@ const report = function (data, options) { l.recommendation = recommendation.cmd l.breaking = recommendation.isBreaking ? 'Y' : 'N' - // TODO: Verify: The advisory seems to repeat and be the same for all the 'resolves'. Is it true? - const advisory = data.advisories[action.resolves[0].id] - l.sevLevel = advisory.severity - l.severity = advisory.title - l.package = advisory.module_name - l.moreInfo = `https://nodesecurity.io/advisories/${advisory.id}` - l.path = action.resolves[0].path + action.resolves.forEach((resolution) => { + const advisory = data.advisories[resolution.id] + + l.sevLevel = advisory.severity + l.severity = advisory.title + l.package = advisory.module_name + l.moreInfo = advisory.url || `https://www.npmjs.com/advisories/${advisory.id}` + l.path = resolution.path - accumulator[advisory.severity] += [action.action, l.package, l.sevLevel, l.recommendation, l.severity, l.moreInfo, l.path, l.breaking] - .join('\t') + '\n' + accumulator[advisory.severity] += [action.action, l.package, l.sevLevel, l.recommendation, l.severity, l.moreInfo, l.path, l.breaking] + .join('\t') + '\n' + }) // forEach resolves } if (action.action === 'review') { @@ -44,7 +47,7 @@ const report = function (data, options) { l.sevLevel = advisory.severity l.severity = advisory.title l.package = advisory.module_name - l.moreInfo = `https://nodesecurity.io/advisories/${advisory.id}` + l.moreInfo = advisory.url || `https://www.npmjs.com/advisories/${advisory.id}` l.patchedIn = advisory.patched_versions.replace(' ', '') === '<0.0.0' ? 'No patch available' : advisory.patched_versions l.path = resolution.path @@ -53,7 +56,7 @@ const report = function (data, options) { } // is review }) // forEach actions } - return accumulator['high'] + accumulator['moderate'] + accumulator['low'] + return accumulator['critical'] + accumulator['high'] + accumulator['moderate'] + accumulator['low'] } const exitCode = function (metadata) { diff --git a/package-lock.json b/package-lock.json index 836772c4f15b3..58fe37370bda7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3014,9 +3014,9 @@ } }, "npm-audit-report": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-1.3.1.tgz", - "integrity": "sha512-SjTF8ZP4rOu3JiFrTMi4M1CmVo2tni2sP4TzhyCMHwnMGf6XkdGLZKt9cdZ12esKf0mbQqFyU9LtY0SoeahL7g==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-1.3.2.tgz", + "integrity": "sha512-abeqS5ONyXNaZJPGAf6TOUMNdSe1Y6cpc9MLBRn+CuUoYbfdca6AxOyXVlfIv9OgKX+cacblbG5w7A6ccwoTPw==", "requires": { "cli-table3": "^0.5.0", "console-control-strings": "^1.1.0" diff --git a/package.json b/package.json index f2fdbe0c155db..518032ba3b8e9 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "node-gyp": "^3.8.0", "nopt": "~4.0.1", "normalize-package-data": "~2.4.0", - "npm-audit-report": "^1.3.1", + "npm-audit-report": "^1.3.2", "npm-cache-filename": "~1.0.2", "npm-install-checks": "~3.0.0", "npm-lifecycle": "^2.1.0", From f1edffba90ebd96cf88675d2e18ebc48954ba50e Mon Sep 17 00:00:00 2001 From: Rebecca Turner Date: Wed, 19 Dec 2018 12:17:28 -0800 Subject: [PATCH 58/97] scripts: Modernize maketest Credit: @iarna --- scripts/maketest | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/scripts/maketest b/scripts/maketest index 118eb5fbc7dc9..038ae770e2f9c 100755 --- a/scripts/maketest +++ b/scripts/maketest @@ -24,7 +24,6 @@ function generateFromDir (dir) { return `'use strict' const path = require('path') const test = require('tap').test -const mr = require('npm-registry-mock') const Tacks = require('tacks') const File = Tacks.File const Symlink = Tacks.Symlink @@ -48,7 +47,6 @@ const conf = { }) } -let server const fixture = new Tacks(Dir({ cache: Dir(), global: Dir(), @@ -65,16 +63,12 @@ function cleanup () { fixture.remove(basedir) } -test('setup', function (t) { +test('setup', t => { setup() - mr({port: common.port, throwOnUnmatched: true}, function (err, s) { - if (err) throw err - server = s - t.done() - }) + return common.fakeRegistry.listen() }) -test('example', function (t) { +test('example', t => { common.npm(['install'], conf, function (err, code, stdout, stderr) { if (err) throw err t.is(code, 0, 'command ran ok') @@ -85,8 +79,8 @@ test('example', function (t) { }) }) -test('cleanup', function (t) { - server.close() +test('cleanup', t => { + common.fakeRegistry.close() cleanup() t.done() })\n` From ae263473d92a896b482830d4019a04b5dbd1e9d7 Mon Sep 17 00:00:00 2001 From: Rebecca Turner Date: Wed, 19 Dec 2018 13:55:56 -0800 Subject: [PATCH 59/97] test: maketest: Use promise based example common.npm call Credit: @iarna --- scripts/maketest | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/maketest b/scripts/maketest index 038ae770e2f9c..be986d5700d7a 100755 --- a/scripts/maketest +++ b/scripts/maketest @@ -69,13 +69,11 @@ test('setup', t => { }) test('example', t => { - common.npm(['install'], conf, function (err, code, stdout, stderr) { - if (err) throw err + return common.npm(['install'], conf).then((code, stdout, stderr) => { t.is(code, 0, 'command ran ok') t.comment(stdout.trim()) t.comment(stderr.trim()) // your assertions here - t.done() }) }) From d9970da5ee97a354eab01cbf16f9101693a15d2d Mon Sep 17 00:00:00 2001 From: Rebecca Turner Date: Wed, 19 Dec 2018 14:24:31 -0800 Subject: [PATCH 60/97] scripts: maketest: Use newEnv for env production Credit: @iarna --- scripts/maketest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/maketest b/scripts/maketest index be986d5700d7a..bf0c2c5f655db 100755 --- a/scripts/maketest +++ b/scripts/maketest @@ -38,7 +38,7 @@ const tmpdir = path.join(basedir, 'tmp') const conf = { cwd: testdir, - env: Object.assign({}, process.env, { + env: common.newEnv().extend({ npm_config_cache: cachedir, npm_config_tmp: tmpdir, npm_config_prefix: globaldir, From 134207174652e1eb6d7b0f44fd9858a0b6a0cd6c Mon Sep 17 00:00:00 2001 From: Lars Willighagen Date: Sun, 7 Oct 2018 22:40:16 +0200 Subject: [PATCH 61/97] install: fix checking for optional dep Fixes: https://npm.community/t/2569 Credit: @larsgw Reviewed-By: @iarna --- lib/install/is-only-dev.js | 1 + lib/install/is-only-optional.js | 1 + test/tap/install-dep-classification.js | 167 +++++++++++++++++++++++++ 3 files changed, 169 insertions(+) create mode 100644 test/tap/install-dep-classification.js diff --git a/lib/install/is-only-dev.js b/lib/install/is-only-dev.js index ef41e8ad1a265..2877c61a227d0 100644 --- a/lib/install/is-only-dev.js +++ b/lib/install/is-only-dev.js @@ -28,6 +28,7 @@ function andIsOnlyDev (name, seen) { return isDev && !isProd } else { if (seen.has(req)) return true + seen = new Set(seen) seen.add(req) return isOnlyDev(req, seen) } diff --git a/lib/install/is-only-optional.js b/lib/install/is-only-optional.js index 72d6f065e6745..f1b731578d942 100644 --- a/lib/install/is-only-optional.js +++ b/lib/install/is-only-optional.js @@ -10,6 +10,7 @@ function isOptional (node, seen) { if (seen.has(node) || node.requiredBy.length === 0) { return false } + seen = new Set(seen) seen.add(node) const swOptional = node.fromShrinkwrap && node.package._optional return node.requiredBy.every(function (req) { diff --git a/test/tap/install-dep-classification.js b/test/tap/install-dep-classification.js new file mode 100644 index 0000000000000..153a7f3927ec1 --- /dev/null +++ b/test/tap/install-dep-classification.js @@ -0,0 +1,167 @@ +'use strict' +const path = require('path') +const test = require('tap').test +const Tacks = require('tacks') +const File = Tacks.File +const Dir = Tacks.Dir +const common = require('../common-tap.js') +const fs = require('fs') + +const basedir = path.join(__dirname, path.basename(__filename, '.js')) +const testdir = path.join(basedir, 'testdir') +const cachedir = path.join(basedir, 'cache') +const globaldir = path.join(basedir, 'global') +const tmpdir = path.join(basedir, 'tmp') +const optionaldir = path.join(testdir, 'optional') +const devdir = path.join(testdir, 'dev') + +const env = common.newEnv().extend({ + npm_config_cache: cachedir, + npm_config_tmp: tmpdir, + npm_config_prefix: globaldir, + npm_config_registry: common.registry, + npm_config_loglevel: 'error' +}) + +const fixture = new Tacks(Dir({ + cache: Dir(), + global: Dir(), + tmp: Dir(), + testdir: Dir({ + 'a-1.0.0.tgz': File(Buffer.from( + '1f8b0800000000000003edcfc10e82300c0660ce3ec5d2b38e4eb71d789b' + + '010d41e358187890f0ee56493c71319218937d977feb9aa50daebab886f2' + + 'b0a43cc7ce671b4344abb558ab3f2934223b198b4a598bdcc707a38f9c5b' + + '0fb2668c83eb79946fff597611effc131378772528c0c11e6ed4c7b6f37c' + + '53122572a5a640be265fb514a198a0e43729f3f2f06a9043738779defd7a' + + '89244992e4630fd69e456800080000', + 'hex' + )), + 'b-1.0.0.tgz': File(Buffer.from( + '1f8b08000000000000032b484cce4e4c4fd52f80d07a59c5f9790c540606' + + '06066626260ad8c4c1c0d85c81c1d8d4ccc0d0d0cccc00a80ec830353103' + + 'd2d4760836505a5c925804740aa5e640bca200a78708a856ca4bcc4d55b2' + + '524a52d2512a4b2d2acecccf03f20cf50cf40c946ab906da79a360148c82' + + '51300a680400106986b400080000', + 'hex' + )), + dev: Dir({ + 'package.json': File({ + name: 'dev', + version: '1.0.0', + devDependencies: { + example: '../example-1.0.0.tgz' + } + }) + }), + 'example-1.0.0.tgz': File(Buffer.from( + '1f8b0800000000000003ed8fc10ac2300c8677f62946cedaa5d8f5e0db64' + + '5b1853d795758a38f6ee4607e261370722f4bbfce5cb4f493c9527aa39f3' + + '73aa63e85cb23288688d4997fc136d304df6b945adad45e9c923375a72ed' + + '4596b884817a59e5db7fe65bd277fe0923386a190ec0376afd99610b57ee' + + '43d339715aa14231157b7615bbb2e100871148664a65b47b15d450dfa554' + + 'ccb2f890d3b4f9f57d9148241259e60112d8208a00080000', + 'hex' + )), + optional: Dir({ + 'package.json': File({ + name: 'optional', + version: '1.0.0', + optionalDependencies: { + example: '../example-1.0.0.tgz' + } + }) + }) + }) +})) + +function setup () { + cleanup() + fixture.create(basedir) +} + +function cleanup () { + fixture.remove(basedir) +} + +test('setup', function (t) { + setup() + return common.fakeRegistry.listen() +}) + +test('optional dependency identification', function (t) { + return common.npm(['install', '--no-optional'], {cwd: optionaldir, env}).then(([code, stdout, stderr]) => { + t.is(code, 0, 'no error code') + t.is(stderr, '', 'no error output') + t.notOk(fs.existsSync(path.join(optionaldir, 'node_modules')), 'did not install anything') + t.similar(JSON.parse(fs.readFileSync(path.join(optionaldir, 'package-lock.json'), 'utf8')), { + dependencies: { + a: { + version: 'file:../a-1.0.0.tgz', + optional: true + }, + b: { + version: 'file:../b-1.0.0.tgz', + optional: true + }, + example: { + version: '1.0.0', + optional: true + } + } + }, 'locks dependencies as optional') + }) +}) + +test('development dependency identification', function (t) { + return common.npm(['install', '--only=prod'], {cwd: devdir, env}).then(([code, stdout, stderr]) => { + t.is(code, 0, 'no error code') + t.is(stderr, '', 'no error output') + t.notOk(fs.existsSync(path.join(devdir, 'node_modules')), 'did not install anything') + t.similar(JSON.parse(fs.readFileSync(path.join(devdir, 'package-lock.json'), 'utf8')), { + dependencies: { + a: { + version: 'file:../a-1.0.0.tgz', + dev: true + }, + b: { + version: 'file:../b-1.0.0.tgz', + dev: true + }, + example: { + version: '1.0.0', + dev: true + } + } + }, 'locks dependencies as dev') + }) +}) + +test('default dependency identification', function (t) { + return common.npm(['install'], {cwd: optionaldir, env}).then(([code, stdout, stderr]) => { + t.is(code, 0, 'no error code') + t.is(stderr, '', 'no error output') + t.similar(JSON.parse(fs.readFileSync(path.join(optionaldir, 'package-lock.json'), 'utf8')), { + dependencies: { + a: { + version: 'file:../a-1.0.0.tgz', + optional: true + }, + b: { + version: 'file:../b-1.0.0.tgz', + optional: true + }, + example: { + version: '1.0.0', + optional: true + } + } + }, 'locks dependencies as optional') + }) +}) + +test('cleanup', function (t) { + common.fakeRegistry.close() + cleanup() + t.done() +}) From 2401b7592c6ee114e6db7077ebf8c072b7bfe427 Mon Sep 17 00:00:00 2001 From: Rebecca Turner Date: Wed, 19 Dec 2018 17:33:50 -0800 Subject: [PATCH 62/97] test: Correct docs for fake-registry interface Credit: @iarna --- test/fake-registry.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/fake-registry.md b/test/fake-registry.md index 6cebc0bb81154..604fda41670be 100644 --- a/test/fake-registry.md +++ b/test/fake-registry.md @@ -35,7 +35,7 @@ would be to use its singleton. ``` const common = require('../common-tap.js') -const mr = common.mockRegistry +const mr = common.fakeRegistry ``` If you have need of multiple registries at the same time, you can construct @@ -43,7 +43,7 @@ them by hand: ``` const common = require('../common-tap.js') -const FakeRegistry = common.mockRegistry.FakeRegistry +const FakeRegistry = common.fakeRegistry.FakeRegistry const mr = new FakeRegistry(opts) ``` @@ -150,7 +150,7 @@ If no route can be found then a `404` response will be provided. ## Construction const common = require('../common-tap.js') -const mr = common.mockRegistry.compat +const mr = common.fakeRegistry.compat ### mr(options[, callback]) → Promise(server) From a22e6f5fc3e91350d3c64dcc88eabbe0efbca759 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kat=20March=C3=A1n?= Date: Fri, 21 Dec 2018 12:55:31 -0800 Subject: [PATCH 63/97] profile: update profile to support new npm-profile API (#131) PR-URL: https://github.com/npm/cli/pull/131 Credit: @zkat Reviewed-By: @aeschright --- lib/profile.js | 125 +++++++++++++++++++++++++------------------------ 1 file changed, 65 insertions(+), 60 deletions(-) diff --git a/lib/profile.js b/lib/profile.js index d821973a07763..7ce9cb5cce5df 100644 --- a/lib/profile.js +++ b/lib/profile.js @@ -1,18 +1,23 @@ 'use strict' -const profile = require('libnpm/profile') -const npm = require('./npm.js') + +const BB = require('bluebird') + +const ansistyles = require('ansistyles') +const figgyPudding = require('figgy-pudding') +const inspect = require('util').inspect const log = require('npmlog') +const npm = require('./npm.js') +const npmConfig = require('./config/figgy-config.js') +const otplease = require('./utils/otplease.js') const output = require('./utils/output.js') +const profile = require('libnpm/profile') +const pulseTillDone = require('./utils/pulse-till-done.js') +const qrcodeTerminal = require('qrcode-terminal') +const queryString = require('query-string') const qw = require('qw') -const Table = require('cli-table3') -const ansistyles = require('ansistyles') -const Bluebird = require('bluebird') const readUserInfo = require('./utils/read-user-info.js') -const qrcodeTerminal = require('qrcode-terminal') +const Table = require('cli-table3') const url = require('url') -const queryString = require('query-string') -const pulseTillDone = require('./utils/pulse-till-done.js') -const inspect = require('util').inspect module.exports = profileCmd @@ -48,6 +53,13 @@ function withCb (prom, cb) { prom.then((value) => cb(null, value), cb) } +const ProfileOpts = figgyPudding({ + json: {}, + otp: {}, + parseable: {}, + registry: {} +}) + function profileCmd (args, cb) { if (args.length === 0) return cb(new Error(profileCmd.usage)) log.gauge.show('profile') @@ -75,36 +87,13 @@ function profileCmd (args, cb) { } } -function config () { - const conf = { - json: npm.config.get('json'), - parseable: npm.config.get('parseable'), - registry: npm.config.get('registry'), - otp: npm.config.get('otp') - } - const creds = npm.config.getCredentialsByURI(conf.registry) - if (creds.token) { - conf.auth = {token: creds.token} - } else if (creds.username) { - conf.auth = {basic: {username: creds.username, password: creds.password}} - } else if (creds.auth) { - const auth = Buffer.from(creds.auth, 'base64').toString().split(':', 2) - conf.auth = {basic: {username: auth[0], password: auth[1]}} - } else { - conf.auth = {} - } - - if (conf.otp) conf.auth.otp = conf.otp - return conf -} - const knownProfileKeys = qw` name email ${'two-factor auth'} fullname homepage freenode twitter github created updated` function get (args) { const tfa = 'two-factor auth' - const conf = config() + const conf = ProfileOpts(npmConfig()) return pulseTillDone.withPromise(profile.get(conf)).then((info) => { if (!info.cidr_whitelist) delete info.cidr_whitelist if (conf.json) { @@ -150,7 +139,7 @@ const writableProfileKeys = qw` email password fullname homepage freenode twitter github` function set (args) { - const conf = config() + let conf = ProfileOpts(npmConfig()) const prop = (args[0] || '').toLowerCase().trim() let value = args.length > 1 ? args.slice(1).join(' ') : null if (prop !== 'password' && value === null) { @@ -164,7 +153,7 @@ function set (args) { if (writableProfileKeys.indexOf(prop) === -1) { return Promise.reject(Error(`"${prop}" is not a property we can set. Valid properties are: ` + writableProfileKeys.join(', '))) } - return Bluebird.try(() => { + return BB.try(() => { if (prop === 'password') { return readUserInfo.password('Current password: ').then((current) => { return readPasswords().then((newpassword) => { @@ -193,23 +182,18 @@ function set (args) { const newUser = {} writableProfileKeys.forEach((k) => { newUser[k] = user[k] }) newUser[prop] = value - return profile.set(newUser, conf).catch((err) => { - if (err.code !== 'EOTP') throw err - return readUserInfo.otp().then((otp) => { - conf.auth.otp = otp - return profile.set(newUser, conf) + return otplease(conf, conf => profile.set(newUser, conf)) + .then((result) => { + if (conf.json) { + output(JSON.stringify({[prop]: result[prop]}, null, 2)) + } else if (conf.parseable) { + output(prop + '\t' + result[prop]) + } else if (result[prop] != null) { + output('Set', prop, 'to', result[prop]) + } else { + output('Set', prop) + } }) - }).then((result) => { - if (conf.json) { - output(JSON.stringify({[prop]: result[prop]}, null, 2)) - } else if (conf.parseable) { - output(prop + '\t' + result[prop]) - } else if (result[prop] != null) { - output('Set', prop, 'to', result[prop]) - } else { - output('Set', prop) - } - }) })) }) } @@ -225,7 +209,7 @@ function enable2fa (args) { ' auth-only - Require two-factor authentication only when logging in\n' + ' auth-and-writes - Require two-factor authentication when logging in AND when publishing')) } - const conf = config() + const conf = ProfileOpts(npmConfig()) if (conf.json || conf.parseable) { return Promise.reject(new Error( 'Enabling two-factor authentication is an interactive operation and ' + @@ -238,15 +222,18 @@ function enable2fa (args) { } } - return Bluebird.try(() => { + return BB.try(() => { // if they're using legacy auth currently then we have to update them to a // bearer token before continuing. - if (conf.auth.basic) { + const auth = getAuth(conf) + if (auth.basic) { log.info('profile', 'Updating authentication to bearer token') - return profile.login(conf.auth.basic.username, conf.auth.basic.password, conf).then((result) => { + return profile.createToken( + auth.basic.password, false, [], conf + ).then((result) => { if (!result.token) throw new Error('Your registry ' + conf.registry + 'does not seem to support bearer tokens. Bearer tokens are required for two-factor authentication') npm.config.setCredentialsByURI(conf.registry, {token: result.token}) - return Bluebird.fromNode((cb) => npm.config.save('user', cb)) + return BB.fromNode((cb) => npm.config.save('user', cb)) }) } }).then(() => { @@ -295,18 +282,36 @@ function enable2fa (args) { }) } +function getAuth (conf) { + const creds = npm.config.getCredentialsByURI(conf.registry) + let auth + if (creds.token) { + auth = {token: creds.token} + } else if (creds.username) { + auth = {basic: {username: creds.username, password: creds.password}} + } else if (creds.auth) { + const basic = Buffer.from(creds.auth, 'base64').toString().split(':', 2) + auth = {basic: {username: basic[0], password: basic[1]}} + } else { + auth = {} + } + + if (conf.otp) auth.otp = conf.otp + return auth +} + function disable2fa (args) { - const conf = config() + let conf = ProfileOpts(npmConfig()) return pulseTillDone.withPromise(profile.get(conf)).then((info) => { if (!info.tfa || info.tfa.pending) { output('Two factor authentication not enabled.') return } return readUserInfo.password().then((password) => { - return Bluebird.try(() => { - if (conf.auth.otp) return + return BB.try(() => { + if (conf.otp) return return readUserInfo.otp('Enter one-time password from your authenticator: ').then((otp) => { - conf.auth.otp = otp + conf = conf.concat({otp}) }) }).then(() => { log.info('profile', 'disabling tfa') From 7a2f6b05d27f3bcf47a48230db62e86afa41c9d3 Mon Sep 17 00:00:00 2001 From: Lars Willighagen Date: Fri, 21 Dec 2018 21:56:45 +0100 Subject: [PATCH 64/97] deps: remove tink experiments (#129) Remove tink experiments. As far as I know, these are not intended to be here. Fixes: https://npm.community/t/4172 Credit: @larsgw Reviewed-By: @zkat --- node_modules/.package-map.json.gz | Bin 680807 -> 0 bytes node_modules/pmj.gz | Bin 666601 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 node_modules/.package-map.json.gz delete mode 100644 node_modules/pmj.gz diff --git a/node_modules/.package-map.json.gz b/node_modules/.package-map.json.gz deleted file mode 100644 index 223f2e45022b5061dff4153f5e320ec95fc5a7ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 680807 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

r?G>66Y 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�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�u=j*SLs{>I(Y&=m2=ZL(; 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%0DMmy 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%0DZckg!e14a=zQJ1%poj6u* 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 sHjeniBB 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 diff --git a/node_modules/pmj.gz b/node_modules/pmj.gz deleted file mode 100644 index 9b42c13c0bea18e41ffec2174a3b22711391937f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 666601 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 z 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%0DI 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

2B- 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

q?&PARyo()zeO@>?Fq zTSz5RSw?>5|Jfs@o6^^Zn0A!Lokx?)be@}1K^PvxsOX{+ReAGgRS;l-Sr0i;dq3^) z$DR~f+uc5yA{ zM3gcnpuXtl^lN;^n~Yz;FvsRSW8>#JLPYY`j++{`tDoO;@xsxi`Z##!LRl-!`S}s^ zhk3us_@x@mI%FEy>#%mIQn2e))rM7-@nfS%JDQgTvk2!gL1XJr`ui$gt=YDK&^vfb zZ8~eOi=dAl3{Sd~55~+C;+d8Ko~fu`HIm`q1+AaWz1R_^T0%hSPSn*-!Ev(eBCf?L%KX_)Ek^*+#g zB?pgu=c5euQ&&^+SlskljkR~)FlpYMSJt_U1>~eez8$ScgOhd2B#1`KKr}Kf!qa~% z{5wTAy17D3)}0SWe59oi9-BuRPwtKzwK@Ytln1iB&w>*k{inwD-?yw!*ZYSf{OsDH zhl@Ra=h`VXFhkhuYU`?LF?kheZ=czyPmA?mxZaAf9r>9PsaN1T;RX% z*#G{>^5N9$=kwsdn>)GSd@jd493`jSt0Y0dF{K3Td@{pj+=px2 zgY>Ujwtv1?l)6&2`&O3UY6){J#epwz?o}rzTqiQm?yxDTBi@#)<8;3ee#k*)+3m+5 zvzKBFfN*-kaBAu)cFfWn_u39 z4~*VJI2=lw?!^SXmAo;;ybUs@$EVEdxEhLNT-Ssq{(7-4QN;E z=4dYHisq6#dD&;FR)7jI2psE+@spZ`zhA`Oo{l<;k)?eAxF*^Y10YolX0hUNSsikg z84s08o{$?JAu~08pc#Ld7jbsWU||X-#+(vGy$T{V!CuQ$=sg3*(b9=-?+t^`F5Q6@~LwR><*&WA=wz0j?l!06tfMCQL4{E#KS&TX@$CCu|(3 zwJi7nV|~-SB%CuB!cSz)WIV9l%7NWePgiYC5ioN(n%6wWGvKB%z4rn1w&|>X?e4|V zA&#ehIT<#4D-lmT0xZ-{Slke}N^LB;L}>c=W{u+`PQCmXB>G+ssOW19)sh@xY^tdj z;gOx3@NyNn)IEdTB#qSxp7H_l2=D#Wel3~=7uw~UGco}oPah~ez7_Q@ViVhi^?3?U zb3>UpmBYi&T8@8)!I=EPV~;1|WRw6V9EeaP+6%VdJgiWN3H3LHN!3bP&ts8ZkiPr0 z!uQ4HjiW${C|yG?fvubhsU*H)Q9q9!#q19UFt;eFfH~Rz-ng-gzH8_QylHa>N|M}m zy_wB&fD`*9XrrDf=Xs{63LMT=Wd$4ReXQ-LP%qCr%FnWeJ6e%RG#blM4$aj=EGWk8F-PuBT)E|63; zOJ&EvyR+>Cj(m8u)lP_38$9u73~~Dh&^PzbF0i1rBFa)OI12gn|5n44yTVI z30OCuFrif@@gsEi;D{t?`&VbvFQjkSUPX$=%@#=V1}xD^nj}=Kn>aCHal1y>32rQe z7`%bIQ6DzMzE>@+Bi&>ck1YE!)_ib|x=c1|nLL?S>qw)Uf7hKVr>$#(e6gRel|2b* zXJxN|24h!M>Jz>Yv75->Ia=#{cwZlJlW!#xpOK$s`GOJ9M!yi=7#~Sc!|+PHtx9&7 zBsosV@&>v_wFWcb8mDvi8ROlKt2i!?t_~=vk?aIQY4;KiG6maeMY$Uw$SfcTw!vJ) z9}bNDmJ+p5c?y68ZYaQ7GQk}`I`D9;Q6wDY2EJ}(v08LU^5pbk$lOam5TiR1gDae8 zNd|gk`F?OP188vshpA247NNqHI{-;Qw!aq;>lu96ruUTvjzs9koEq_Hy;FIsWBuIe z#(wrOMem)P7H8XR>n(wNVDT>moS+L{CIhj@vm4z^bCm-sBMzYqTo_l#Vt*E)JFemq zq-LMj^a$EsG9N9R;L~uhNPbbbG9C`RzDLq{xeBRUK==9V_A(70{qZvlS=Vn#3wPMg z1bPGyLEawX>~mUG<7STLBd(f6lauwiVy9ag zAzH_4Ru^_E63Ww|mchFEg!2amO=+o=y>Yx|*D!%b4!MurdA03Sf6u*>D6Fxk>~~e@ zKN+;}UQ)=b#wokgC`n?~&;t`M7>8*qwj!~E#6D(l5DqkU7f%Q86U_Haic#RitGGhP zX#-FIx)YB$TkD39tXU(R&K}}yW#ppgQ70JGUO+qZ%CkKR0U?bU%e~m zBMJ=iry{woh~Cx{0v2+SZXu=LT#8c3FB<=zDe`UxhcW3UkDw9~$a@26rGT~X?RGP2 zo!9WvMrCB$AMx9(&cDVlDNU4#zrrSh0wYNIkbI1!^c-hkMY8k)=;W%_LUv2%?YS%FNY)`L5P%?za#33?9W*#n64kE@Q{Pi_YE1A@#GNO!}g@XRVV%DO{vYkfph-}Eo^)+XzSW*+!!1s_Q~!}qG^ zmlSE?f40JLhyghCZ(~nR(4H5k{5AKxHxRsm`}m>&<@` zdQaiRSiGz45kxnSKaSJHL?==XT70%l#=gk}14XopgPAcE z%TRJmcQWa|5NODfADZa6@G3z_rnewd#o(lZ(fLJ(GBl8KJL)Xfi6yYQndJ0_^j*H< zN(LUeC<<}@QFL8hZWqBIm+|DqEZc(s>^w+8GI#kOo%HuDk$&bPbOvMXw6aXcW=;v%LEBCBngYDC)JMbOm1m%|D1pMy$CA zpYyQTJYBgKXIN4rl>Bk2H+#PU*anKSv}+0#RFq`-Y&+J z=Oy5xm;jN|9dDSE3?8gq-$Fgfw(~#D`qKsBAphJUZPsWW()-mUG3+IrQeF&se=-Qk z#Te^85mkmtUs2u%R$uPK<(xC>4NLoTA6@!Fd&av>*Dxz_H9z_S>Rh5@H?sd(XY=P6 zvKiiET=0tyj^X?1G+moB+c!*P?Tt75RQ$=Fb z`JlT#PCTjT8qwS|EkZDjnwf$yCiI@ao>9k!lENh9 ze8EIcAisa7x0MAGd`3n_PRQsuFVfX)3@5$|0@>`1$u?dG?dL84HY@ulTmK`Y4aUpF zZziAAA!vsNg#w3)W|wH_j&o25n0k@T;>Zi{@=s+vji3G7RGUKGR0O8RgDRNIV8{oF zgeT2;Y{j0m?5>ygbvLlf(SOxwU^pH}B?pd! zPDI$he#LmYoZ;i&ky9n&T}Baj6ACs#kR>tMP8s~2IUpv+X8b)Z0)gRGH)V{Xzj6vrW;Mfbp) zV(kmaufsr{bIVk_mT|(sX+-R%1qPo6hXFhz1S%Ln?1@ha7BQyr8`S%>6qUnj7_|)g z>6jo_Z{n1U^Wu_IAO48|&w_<4oxce=`Hy+*ALGH6>rFggF9|0zbXp_Eov=i~z3Z0& zW!BDE5Wmy-PG1wrf4kRj^INYq^}y1Omm%tQUr`Qq_S^ihInmvMXu~B5xkZHvh`Cov3&gM$gmDHa8T9P(d z2+)ypFBOEG^qhrGOm=dS@yY-eH#UXz+x5O-4gFwu=QQM9>g4<7DdyMW4m4-FpcSm| zPYIr~he5*onteIbFQR&G&oDoTw_2P6^`zYpI-pQ+&y%(JRS+K-OF8 zFFhJWdW5j4?XKWCZF5)exdXSW8so-c^?U&|Ex22X`VZp=C(<03w>UBQn&1Kfz_>~^ zSSlb2GOUf9eu7Q(vae?l$iITTPa%plUrSFx#L$WA-WAHeHWJ=m`pt3*%D!BoYjJF8 z3U>ZKl%Jj9rR81gM&r)X-3$e5%Pz>BHace2g?pGGDc~JW(;+HOe>uy~zKmePIE$)a z-)~AJxni;8^5}I^(u&JWX%MIpk&8lDL&NzG=9le{^{KO!0TXBrx9kAn(^IUX=2CGY zbYhnR*WBxcF%uMs{s~v`>j(hf)1rVxYm(f8hSigt4c)TDWP+~eHh4f}*hxn4&>l|o zg~sp0ZpP}alaIT1wygv^L~=loU5^QjUzK6d#;u~dsY-4cq5U&D?*E#Kv20j_sex!8 zgPZ0&4?d)Q1a54Yg@H+ILKjqpGTnwt^DmAfMBDDC^FV~qFvhE?N`NQLG+m?d;cc>rz-a@9(RWraNZCZDDj|t=< zi&>>0c>VyvCOz0r61e$FGB1-6eU5eesd*^(tOm}I3ewZy&8V2%4ywACichXYl>d{mKp?c~O|vx)km>{&%&X zwt2E^k_y+ha`pMFT+T-ck*+!Fn9}nLcU)_xLrYo8%l7lDeY_U^uM7vRvpsO!t6kt8 z%^cd@z!|ZkcS#RMZ8R3-IlmEO?{(<-59}A5+m*PD=*3!sK)$RiCRzO*5EH*r6TGgV z$9A@&Ymyo9t1V6;WMSrFl_UD=KcxSWD>*4N(2#;P zTy}eRQ&?vF!zd*g7X-vLVUR0i7l9+H>au@Wzib2_YCuQl!%eHlPT8$us|ddB@Ui&! zM=sxL-R7s&dFcN1d8V%EyD|A#L-#XLK3ue5w)~p60st$fr&nc#7qCO?Q^4&{_C8e@ zQU<$KTK<1v;gFoiC~4z&yLd%Oo|ufeH~2itGP#VIE7nQa)7__0;9fMuv5PiirUUtY zvhRsgi4m+Yu(xwBXF#8GR}2vFNcXWBr=x1JcE`SPPs5*l@>AFEFG9U1yB22U1zlfD z?-3^cQb;N!o!g|)y|$kJy`J`JVt(K9I)E*7Qez={oLMeYkbBf@ zoV#H>z_E*Z>u(o@d#p6#yr1g3Zt~^A&^^v{&JBix`51E7o0<%^&)u%b#UY^($en+JfOsuNRtoURJisk>z>DGr@Ed@@uwB=Y#f z*>7A{G*Rt- zpTsRw5Kb^^v8vDxp5Z4IpTO1F{OM)kqCYR;|D&ctqWt+R;o1!|*^_chZ*$-)-N>D~ z;5zyztlDNsI_a@fLtnt?-(K8G>Qsk}W?V9H)LBU};<2AA++{@hPPSWVQ7dA^XaRnD zegB}|-`y?=!>K(=-1aG$86Eeg0XPan(f5O4+fc(VUXhXwtOWj7q~dKLghwnRd*kN{ zro$791~Q7tnL^lzzqT;M?E>0?8EODPgMB5`pIV4Fg(-6nYbLg>w{{VOd`ysm8|b!3 zl#Zt^)LP}nrL=RCK>Ydziun+`xqaV>c12w^!00hRwy7!0VTREo<#E@X$t z9fumF=DvdcdA@z0Hn9PMR*0P+MX<3jqLxIM9M8h}uvVg;5J`K0h^x`Wn4iC5y|cm9 z0279J*bu5A(WArCcv8-T#GgGnLTsJ|f>J%FE(@s97Z~kh4_^O~9)9;#G&sVZY;dYg z(6!Y-XowE4#X!s#jH;RnBa7IPbP@uDuRO}Xf59+!O21CBRYr(NviYH{Jt>rR>JEoU zSy0Z-$OC3MPJF{H6TPyEB7pX?DkUy{;@lF}c+&w3(7=k*6v!cP@L&PfI<&q$W=8Pli&H z>0M?p!MASAJnC@TX0f&O>6ttQOPiDHZ8A%V5>&QXcg5zbU+Dd71>Xa0+{=RlT8Uu& zyzzZBJHcf<@k#?xRUnMRVe9gwq0&na|LO$mMCsh+y*}CV$a`JMJM$6IaR4Cve0r*0 zTIn815#3gG{Bo{KQ%pZ=%vMBCrZH9;SR!$%BF)9Ghk(nODAzF&Hcln_xIwA(-@DE zurtD#-)F0nw$2M776Q<7 zacb(18Q$NM$|vh+2mLzSqc+Wn=E?>KQRBQ`UU>-NV(GM!RLgq9XHq%)y?6zceLIh0 zI>a}A)>KYDN2&C{x4NfC9WZai(&xn{Z91=gIngWo_Tx;_-CXtpT9z7;L@&^s#8L@T&p6DBRWodAg8K5rQ&<{Uc zEflCn`gZ3O=&Eveehf00qj!?)vjNoddDHAjZawYQ$^L;M{@iSv2F@MT?YkPuLv<@y z6tWk;j0w62`0V6*$>okSy3Bib?JvqlT1OAx^5wQgfgRp#bWP&82Y5HFKJ4)6xP~-5 z*LWP0gdfRSG&TNT94+jBTq=kYb&hGDf>a!<`0*@VRRdzXq#5&DZ0!&1f+&o7JPQv4dQ57VU8!`@Wh{ExJO ze*SHzNS<&03{iDqkwwKt;O2;t&{UW*xizt|w9y)}a4TX!lZ%QLUK?9SB)esb(6*|4sYOFelFE&4y=dl^S= z?~2H;Dx2G6eqSa2C%n3%yi&{yfEdd1M?xjCm4fZr-JQTdSQ}%e|woUYw!Kt&CSj z&5#6`(a)6T2L@9oZ;BI1lYq+2%sE_=Emue$9vs0lq#&X9K~703LFn`D@%ram+6T&e zay1!@Zhh zY1*64!E222pL4KDoxHs`FwJc(rFg|I`Xx)9y$ChCR$@ZN+H!AQp=X@pQrPE_c-gm) zH8jkB>Co?bis(wxa5p1&Dn53pOP=5Q?p|%)wVEj~M}0wtW5JJc=kJM}w)mKj@zKZg zo%tEWOd-ZG*w~=(j4R3U-?=HOQ70heR?*A#q&kE}B{+9kCc;OV|S{N@UEUoVKQv`|FL(k_1 zZwE};nOWSh7O9xmG{Jvl`ssDaH|408UZ`)8jVAFW(fLh)vniWcf#l49<_y2QRCzAE zLH&|;lJLFiu}9)v)PV;le7$qa4UtmrcE4Z($do7Su}&VvciiU%|5lDM;amO27570b zP)kEcau(W99CA1b6OP{FW{r9brs_AM0T$m_k% z({IN$;+`%IaC0_jup;OaL$7Jh*<5ZqRVjs zxPJ&gzLtI+6{@&7m3@Y}Q8eOEfm79=LG5B8p>n>$DBf|yM8CGEJyEo9tbV|xWZ$F- zxSRrd-XE?CO3o1lvEX?qHb|&J_kPSKR_49-G(BO|@F;%3go1$>(#Ll6(Zg{Cdr(sqjUmedvP`1G&;r;SSen=D=$(Rg~evCH9lhM0g3DgqHJ36|q_ zJ292sY@Y?Ab$IN*O-?@(BIAV;AYsQKBTaxYA>UJigx@+-lMkp&uGOh`di3+f@ERrz$bw!t1Pgq4!;V=V0HV`7;%Hfwsp%&xBd^}lwXPb=yLq)Bl z`C#;^WM<#*eKOfw=sjLp84q1=G( zJrUM1P65)!<9h-5=ed%|hI)jO^d0EkfW^0HjWf|8m#Zimtq1gvT65`Ym!BT0p>edb z!-WUmyVvOCC-Z!SGSS5Rd13e=A;XEmTdFR( z%Bmk+Lr@q0k(d2|UXke%OIUwJ%OYGy#Lk=aGfn+ob{Zzf9#dfKnV8$yU?f)qa332uW z&^-kidUw>+Z6Mbf$xB)oQN`2LYNuMz-#7C#R)25W|E85Z=W5qb*xrKH3!Tf*Y%Bqu z^Lo#sR%*PVzI1tsyC%N8#H4wKKE?4g^-uPGOTC6s8&wMWi~^U*^6wr|fSBzQVIBY? zT`yp1izI!B!e`9%_iFEYz^q6n#e+l+FYciscdy`BIiO4m+^P^&5$l?C)ivmo&z9uB zIPZ$dg2Z^CZ`)zW1jc2{O^6FiakJ zK)&A$5)#g|cm>@+ex0QK6R-c$*m`X_H{HgY`-q0Csn(}0WFybPn1ec{TwLz?c?_X~ znqK>^KY@NEj+C(rv6MVvPtBoc*=Rw2&Nta+w8Yj)u|u=S8SF54{hZJ759TeNT!TpA zR3cT$8+cwr%U7`r2bZNkIO9mhw&rnSg^W%g@;tURJX3~ zaH+6pVsE>1#*o*6-qjs#Mwu3r0(Z-9`GN_di9bAatklwOD4EP-eX_fJKb7x=XpgXZh`=F6}Wut|}d6&^wETc%g%o5MA&adlEJF=A=CoB}Ivv zp9XvUB{41nXb{P|TFER~kj`x9tS{DDK+u)E1B}85rGwQ&emcFlf6TjKy1ef<>zqU! zxJ$G>XoaGRx;OQ%{k&-Px}Y*&bd?WpLVjOnO4@)Bx@}eykVDW8f`!=a{?39y<3>; zFd5k=$cHEVu^Q*Mu3&d_z>oy)D2cHJ@qlF;Jj{^8H0iH=v6GPE021*Sd*7hra>-~cANq8EO$>d3{NhWiUYJTJmK6+WW!JP{ zNzlP`aYy{y!4GG=r|*-pndKe(ceOVA(Q;yjH-P2}RTrHZutx?UDPt=Dm0^rv&KMU^ zQ7)o6!%L$tF!s-7%x*k0XHh6d{_0aO_|f7sJlW`q)u1VR`fX93{9o`rtGon!>fSR| z{1Or^%nX4q=zAHb%6&qq{WQ|Yat%9Lx=jZc&ro5{FC+U)Eu%yb`Y4`y)G%*uFJC4d z1+eHu1{VmaF`HU4Q7hsTaTBp`xA`drC`N59Bkd87G^~N!PLcAcNW@`qrv0rMat0#L zBp=g2_IVwvn}@fm*hhXH4RX{UNLADXh3}ht;h|LsPC4&~=YbfDD>WM8!Mrj{e-{J) z`fhqjukKpI421>#wZ5NPCzzzuR_04I32eL@#}o~Gp5oURd7Pr1$e$MrA{@w>CU3n6 z^6~T7L{%FNr-*pS#Z?(vT(gF3Wq9l}qd32^z`xNbNrvsV&Rc#cK;Xv-1w!QodyI^8 zo`e&9kMH0N2`2X7w69PGZ}dI zpfCrEWT^{c_a{o~hB|QUc)8UU-!Gjaj@PgE`#D2Pnz-XZ&kJTBf}9;uQjsphujynv zR9WhZ*Mx|cSMm(~G3enBN_UsI!5+(X-it<&NR@IuWb8!ONS*yEKWfJ&B0Ih zd@`@t%aqmLn@8o2OQ1^NgpUCpjpXYBztxVwfRE{grOkeAjHt%aimXYChm|Lp0VQ%? zp7x7wmvgebtb&__)q6x*%(`_(A$1f*Fo&UDAFudno&3Av;G~20MNKPOIv_U4c;p^eg-UXc0mY#hS6D|RnYq*N#UDY<>%Ehi2~TkUAIqM z;PMmn(B}dkmSGyPv9CAVZJ3MZcVCI|bB$xYPr`70q=DNr15_pFZotW`r5c>#05!eWa_oDOc5i!6 zSS?B5+GUyRNxD1vc`h}nd|Dw76G7R z#QJJSI?1)5=mwxCC|lz`cj-3m(e^NjxjST-=N3T;gNAn0l`^SZPm7cl`_TZhCs9 zGJ%0(wv&SC)?6cM&=~hjAX~~``wZE^1NUHEe1?C2A-;b~rL{#|(GobrpAMx9qsNsS z7w)V9w6NWlc`lCX0`kuOhcBNxzL>)LT@Ut$QXqv?GLl8W>wec=Nt7&Z3GStDEeNUB z^V&T~KZ`$6nxy`**ArTa2Wr)<5Nh{cgAlQLT$Kq762o1SG%_d&4Tks<4d@@PdV0%m ziG-_lQ;WK0sFn}{_^eK8XnIJqRumh8=MzjxY#SQWp}&6rV_h%5$qFDP)4qeAy;=5L zjR9o98%#9%8PiG%g{ir&K- z1k-qHIO!##(T|aA?Mg$V)Sl6n1&of>W@M1CYsm}i2{Or3l4S@ZaaT$-vlqboQ-cQ@ zy~@I&CrL&YWy0OXJGykZ^?ZdrjPKzhPzh0SQ4ISJ;G-4%hnRcrR4FpvbEnaS5pwoc zJ_O_C&fs3ryLBa8H#pfgn%viKK;NaE7=ptRwSk6R=88=5J`DFcsG->fP!cROj#-I< za&hn<$d8k-W9jY8hGisiK6BWOjV1DwI^}#M$-dC$RAcudMwWZ{hs&d`dEc6r5XiN( zt+?k7A$~yG(_^IXlod7ttyLprxhDuWGKCNY>4i|&zYMamHqfh>46|9UQ~LRX)wj9L z9YB$0VbzF?hK}0OZ-MtBZTBW^J|^1Y2DSk%4yIhdnbY|89fd8@IWLY_pDTfz^=*M) z1FNFnX39Ms?5NVYzMcYN>Cn3c0U0UiK7V5HY`hDS+iDzWtXlPXhNchSpNi{JKFRp> zKn&_YA=XkMaoln5dU6)2-v%A?6M^hB_&RJRG#%lP&3l?-6t3EH^1H>0axx&u-sl0{h8n;5_vN{_6&i#3VA8P#mhNpw^&u` z4rVjmh!$wA`o(?azW>xw|7<}@Z;m=AK2XO%Xp}l}Sr^A-^OGI0OD-DLb(!h@8XK+n zLisR@@1x$K!ij($IE7#!TD|}g;>gLWQf@gyKxvWsx3UheP<{6P=&&DMr@iu+@iM6M zE5Z$P+((s91CNIxh_gW0d9eo2Gm_EkLjNOapL<=ub7+3HJ*QgY2X`$ts^wAWwvtn$ zw+fjrFkUn(Gg8hXr>}u8KdZ`D@sOBh29Dc$Y#mV{F0ZZv6WH|Avcs{n32Ub==@Gl% z4)H_xAS82R@~z0p1G*seSwVwrs6av;0OPUJ;0VC;%~-Qh$HPT~?Nm=Knxl9- z`>K9s<~`${b{{shFSmIg|9CI5eMAGQAK{D;p)6x?oANCb=_F&Ea7Sxq)n_EJcRoSh z{AiM0CSA>z;YwAVS$YF}F(iS%G~7hkdPPx}VC&LzXfY~I3y0X82E;(3=w-TJAFb{US?*-dIkuKke9g68F9eoyZMY!3Sr~IWqxWZDw^_{~8=O2pl0V@aNv zfuQ>D_dk^fFHYX2l!z_&k$BXr8+_asFHhwrQk2}mdyAjXz^0_(`7g-N*7aOW@*OKh z5<)0j4dlDN`3}a1RjHsNncY=cRxUKQiP|5K|Jyan|J~&0NvNmCW?DDq){u~)QnhE@ z;irl|f~Ino2gTC3v$}B?GVp&V`M=)A{QqDT^Z%1Q%t;&noUDE#nuG5-Ad=3s*Ku`m zEBHHdBBB{#rz_tR3JQ{$q1;b@*gkoikC33LED4IqAeOq86dpJIKoikA`!Ko8qbQr95LEBV>r)P0*l1)o=Ta;OHeZ;FePwSP{#-NZ`1Tp(yUaVt8>+YfN$a zjQ##g5PwfjI2=v7bj2n3qX8@$r22k!@NNM^iAz9Ny{q97+#@ah59mD(Md)t8XXI4Y zaSoOJ7%(zu2K1Fcj{G>Zo}qX&1f^A9w7(EP&vDB~EIMDUgzdeCI?@NGuf>p;kpwN( zdBv!t8piGxUSIi%zZd$hjE_ACPMAE}lB$PHpgg#&8cC+uVfhkSd2>DwQQToQ|H)tf zxBJ20BWkM?Hr;49&%<0mAe=a;ygA&VW~(ZFPJNG_wr~hM{q=U0{xYW*19?(j!c)}H z@GZ5DZef{fxXPUhv3{1s7}2UO9(MZm`~`wd`ZpF^^w2)kz!ff6R^uHqz;>{Ipo)AK z+N>tG1DP`=-WT(VeZzTkqt?oU=&PS_H}*&jvX5=H*ZN3(@J71c$C9Z51u$E1Wc|M| z9~}@sjuQ~WDBwfTLe&y#d3r94Lx~aXaf`j?dM1TK@ZIp?-+1X8&f9TF0e!|7amda$ z;VjQ-E)b{698}r3TKGvG7Mm@^5aZ?h`jt!GIkvdY!tjjN1tbL$p90aOL=2d>*}Ln{ zMWFjo#4()Va?0m-dfP>R6-5=Ou9V9)rfIG)v|i?vIz3fs!q8WMYW+rTz2h<2)#vZu z7n~%BaWNv^Pa0t^!K8H!$S)J8#zTk#tYrOnrdqi`~27XJ5EP8)SYAHE5sJ#ulU_?fGeOok$H``mynd z1J>m@Ql;|=@#~~v-EtdXMddq~K3za@bHTibQ6-)4)ofl)iC*)taVv2h`3occf^ym6 z`jR$jR|232yZY5y8qjs^Z^r=HFZmz3=9hMg{sarHxv){s{o>c4Beu@~J^p~6|~QUctFCfb|=7KNSiy7C`W znZG^jN@oBUW;64kl=divY;YvR_!$>9Z$C%otd@ju3M$0Cj_k+-wHCT8Ucw@8dk1b+up9O4U8iD$SB)_yPDe1sg_Pt3U4BLqHfvyoV&FT^YDavN2F*s$4$XIeSL|?$Z z8`;nab=Grv>lU0Wdno9>bhNmu2HTvwr^9>bJ#8EAr2Frm`;GNR+qmy07xI*T^tg6U z)0@d^jDUL+Sq3(5_VXAPp~HL7-^2ViRKAd<`;}<#*aKkTp)j-(ytfytFTzC_mZ*!O z>2x!mk!?VJxzjK6zoJ}jFLt<7BiWBESUi|(aXr(G9A2piFaeP(O&qu%@$3D*cnwMa z!Nc*1#`NiEDfzCp3mKjj7;DUJHtcAy);=R2jx;vKM!BEo;hO$UO@Y{aRT7ol zX%wh#lI*st1>5o>O=#;IY%4qY zW3Pq2q+9OuL-QXh_dCX%k5O+aju>3-4|jkJ=++GL;Pc73InXd|PvIVU5xL0H7kYe8 zC}}$k_2KFscN=nA41G9iXflx;(+da!TTqS_ZeV(qy_jWu7s5uk3M@9jGV2R?pyH>s z4NiPf`yigKYTuYQ>#_nIu|h8)96u^gv$qcmW!8o3hf`n|b(Z5OEuHR_WDlkY?E?lE zmkKloCo#JIQ-ru-cncf$1_6K`bMCDUR%kYejn}~**)Ce#P{U|UT(!2D-C+06FY@cK zLMYou1{mxpsB^<*A?&Q@Fs2eoma+78Z0&^h)2^y`;*;amq|M&g>%Lm%7WI+sfy`a& z)*5((U7eO}Mo%^?o2yPHNqzt<@*hdxS03DTrrc+#@gDFNPF8;-X=;oZ*qrr(IPN%) zHhCwMIxb(oK>T3zfGjh#TQx0fiR~J)0?DM?Q-FiX?11Y`s+TD?WQD3;b4ZI(pWo6- zAan8&P3dnp;~~XWl{dwS&tXIpP~bMP+|u-UJhB$_T9I4)wsv90gZO}Zohv)-ao8F8 z40fSFA3aNv8aL2y#=#>G`vP7+O@{vVg1v(Naxrc#)WOmjZRLYy{LVGbofs_uzG`rf zXZJ~~Px9xd{Y9^ekcP^27@b>kElzjP5^gYCe!GFN=Rud{^U`dKc$(`yOe2T6a-zHJN*DSA92aKB2>YacQ< zpI}gXxGTM8u;*gZRuPFYP1H7ZLGJ9hyx9_c zf~0MH0T^{yw7*cLaYj=h@B4_^&dEQ4r-Ej6YSIc~#(IYUt($l3Q>o&w=JjH9+Si1W z@4jQ~$T%Gc*$UxLjV1+Y4Crda<^6g)H6+H9n_iCU0#VGTF8d_`D$}>Cc!i|lBE-$$ z?gT}nVGfwx(IyX7-BmlE%_f|0^Cy@5k12}1F144o29aLLp%l*8<6`f5LvK#IHxkZJ z;sii9_{=MxXR*RG`AsKfwzW@;f~rwzL*oNg?KoGhr)__l!aNB3E<4TVI4dXXQ;dJ9 z;3cm2(~SnNXmBozfI3uK*`fK2k-h+ODhIVneT-aeJQ)mlKjF}7WS|*E>qPybOxeA?eeU}uxGv(;;OV)pAoUOkM}&kh}=*md+gp$BTE6<=Nh zz*X#$(K>CN!z|r`ql+4I26d_Wi|{>5eym)<0XBXemfD;gG&rpTmaiPg_dl9jC>P9=;PFmnkrw7U`WW>Hk-PHf1?s!~R z;;g4-*yXWC%xpj~`ECLQoq8EvB^=0;*L^*!;O6{=`TnRCM#zmv;NDWf8-YBoyw+Pg z($ZI-=xtd~TUfyO98i^i!-9XV+@*OY&YR~i<*=1**9JVL?bOKQIgVr*5ROV zDW-2rn%;frox7IYu{78HR?kYn)q}o+l!Su0sx`>WV4Elp7><+VSC~IU`C+imj%A3D z-N^9;$`NXzpLCc9x7`4OpJkjdgewu9m%_upulmuy=QJ9ThzyrRA1!>;7pHxwTmUv8 z7al_%8DZH&`C?K~B7B*;|8qa?3L)r`FE!M36Ftwy0W~Z}3nIMv^m&C1ox(09;T&R08^F2dl?R4K-a>?Dh2utXN2e0SNCgiV+g5G7Xx~%1*hZsv> zZ~}9AAfZQp-rBTeA%_=PHK)}|9^CS zS9haK)9nvpts|mS8vct{df)HsW&Oc^O@gF3eyMcznRouCz6-xyU%K3pkQIi ziwMle$btFc;f`_Q61&CvGL#+FY5l%v{6Dl6@&)f(vzr@Md?L@1CdYthEPsBni#0h=Xi^yKi`o?8>Lt4`Z!22CgeTXk?8dJ1y zN7Pg+%%hTW$VMgc;bk_BNeW}J`Lr=wQ8K_a_me=J#H z5PrJ@nr0Oa1r*MRbVGx>YpbW^Ia{JX$dil8vq_SeoECEZxaJ}YH&!*-e?G~xy+gv` zRo;`$>+*=pI0O!bdUX?bNWz|CAlogw$~6!EUN_%%0-)hE$_!xl1)`jm^?Pz?s%bLe$=OKmxoggIvl0 z{#bguEg8S_#;*5!4B@Jv%|PHF{5AO_ZQ0BgP#F2`dP?GL7_!!2RjbQ?dzKv?cyRR_;_DInaDjT5NKueF zoyA!K)gRBq_d{AhxTlGLn3O0XxT7CU-RtK+2qNeKE$l5G7`nB` zdV9FCfjz{r_t_vIy?@;JksngJM=o?cSraKh+I_X8N&U0{6}LKMHC&a2&OL88-A0{{ zfWB`-BBuG@rlWXnd*R}DIPk_+FvIf_@+Ig9o_s#n&{~T&uz#EKb%J*5gFP0pwHiv7 zhx?{osz@@TPU8i9HL<4HJX2(@q5Q!J)O@3F#lipdqo0pzPX6OTC`+r4@_w06(_k%z zP?%Taf*o?*e@JS)CguB;RX7g!Nev%cpYYKgb_9f?<`XK;j@qH6pMpTVLrD5mgg+5@ zLtrQ9^{X^i9dh-YAoW#z-5~8Xt|AH1l_I<~>&Yaqg;D?X;ad^fz_U9%m*IhF_?=UI z>&dUaDlj66$;HLdS{@7nHFPmY|Lw=yPQ!4XiIzX&`bMAI`J9nSIT}jLfhShj5|^~& zmC?ayoIY%r^DcgC5U!6~E+q8*S{rWiWN)syUi57;;e9NTydkha56*5lrjIS<4~(y| z#3)Dd2+V|ZGn}p^=kbp!Cn%a3`%x^M)h~m-8n4}lo=DrhUB1&KZ;-`(mFB0s4`!sP z2l$8xp9TtYfi;lGCDR8+L3;j5_-(R(O_KBZ5at4@0Uf-8;>9EDYkr*>RpQERJeGo$ z?Klx}xww9erec2!<8>+e3Iq@Rm_yylRL8B1E-Iuegc*)G9BJRhq-b)~$CLKbn7~E{NiX#(U5n>~AHmT-So;FF=S2*|X;>pWw}@XQMDxMv|37D1#TdRg-;)3$T|PMko6{=>Uyuc&v_gOn#sB4s~1wxA*_ zfS2Vt;L1GW1@`LwM)=x6w7EwxMlV9eqsZ!egEl?}qGiZG`&});u#Fao)QsUnsJMMA zw3%ya4S*%Y{L_;A+VZQLq@LHMK_#&EZ&|-Syfj3p9Qv^T`)1W@@rwal#3C&4Yy6QR z5&|yPb(MRJO#tX_x2#1PEspYQAap-$GU5CwxvO%Og{Qf)GU8i+;!@7x`rHvkN7Z&s zZeV`yJ#aZz~`mo@gKz&Y|>%NDV47v!XD^`52Ge;mW zZfWq;xq|da`Fl{w)Q3WA_k&;~V?r}nH!V}$P2*YmvVo)Kvzg7w#&783m_yz=1#UA0Or2F)*nN@X{9ZGD62w$N`L`~xjwKqK^@x> zj1-II{bP%_xdiS{j{LaE-o4*d20*RIWHDI1%)q7yx2LLzStIvT9awVeZTU8{D9?nL5!PSg@pYyF98tE_{;^*(3p1?KB)B zPja5o&cJs&c1BK&NM2@gCL`j3L_-C4^$!z%5zl|WiP9K2AaX5bvM@M+A_KbxkZML1 zI~{R_GoD&DgyjR_Rc-!ug?+miM;P(UPy>}kV9!f|2RKdcoL!#p0?+8Ggi^J2OVPWu zR=+LzB`N)Ng7hV>cw(uh5l19fhFX1C8p^9!JE3HDj;>mp!kZOtZU1=lwI-G;-0%?d zR0hYvD=|T3tZbvJ(mkaC>q2@zZD&j99q@Q3HQw(l5d=_u<%R#W5qsgO##0;{ z6YX$vh+F<5KR&MX^&euPZy+>*4vcKq%9tFM!-3K>dbQz|p=*U8c37+ynQanNr+-}8 z>VHri1tev?$Gl5;XsknodJl!En}J$axo3_wOlOV(SwXdFXa7KatBAsTx^{8z4e>x} zNIHlxPBZz^ALI-s_9W85*kTN?U#3rYzHSjRRC@4POxL~=K$-c(c`F5og*?ahUUGABY|~8tRE+xAu0X!te-_j;#mU^udcWCf}BH%$YXydhLNo zAjza*0=+G|3&_}TXH`$)cw)hVf+BVM*iRUf;H@f3!j_&rHhJ~uKx}c!;gcb-C&p7i zb&#ZjG<(&Fpk8tm`1e!%FeEs#48=R)dDsJXAGZRONYm9wqj+U<06tfd9(N-PtB)<( z@wA{X->pHkTa>lbB z8K>O3!Vie^6~>lwI{I8th0cn``_;crKP%>1tILDPQ>dH8PBL2m5O4GLI|B@{KM6NY}jRlnW;er*6Z6I?_4 z%vu}5860l_$$%{P%d2jqmwWE>^TeA@dVCxhPT!?#&G~`DPqEKUvjfniR>dnqqG`%z@cm%0AK%~yQQw*}FX$!GFl>rnoV1fJ#Q-g^ypA)zk)6@@@O}x*rdJzDS7lG_TLJM+g)rsX=`# z^uUk`8eMd~Ld@aHZ*R7|#dRss@HOBIAiH-wQ)G=!T(=4+9dhMS4Ye<7hfg$3XdjRB zK7f9H+@b`mNKJy~2XmSC4i9>lt3q`b>qJr`vy**o(`>yAK=x}jonHU->qKc|(A~yx zXNa*V`#XANP3_Q}4t7!85;n>uLMNv@x%fCAf3xMS?prs_pxk)Ui(72QyBZ9U>#rWt zz~(bj);!CGyC1G*@bNzPp9sAH1;#=zl6&X9362xTwFqM!t;A4!tSm?3zm5mITewd@ zyT3r+baUhF!LngRB?FR}o0EX|zBnRgD5nVZgqHxGq zxindeTu^~j!SW{6UdumFA#%l9vUX_t;5hzk(i=|sRDx`g$n43~m_7qSnG!g}l@}Xt zG^3rgeUu_xyfOaAr24P*`!*C=;k0X`UZc5^+*f~Qu+NDMM3~=frz+QEhGPn(U{E%N zPmu4g?p(i@1DqbXgSqm3I<|Gw>x;c?1r-kl@gS-_2yXE@enTC*qq&%Pc*E?qHUXK7~=7 zL*j6moREzdO70Hg56BOfV02j6RIVk>%uvS6B&<+0#pJO^^bJ~L=;HPhnm}U9@*g4T z$M?I_5$QnpriS&&>;}%&LrVptEBIVH;tgp=6iJfj?v zl;(le@x8#_G!)6738+b4H~GedbQF{gwoEfR-=J#Q^&YV@Ry<9sN;s=J*vO##63CLG5g9IWO#Lb zly*7t!9AMQED3MFAA2w=AK@(C`D4?jNHv2XXjU{xzAo$vi=3h5o;zOVlT>BUu4$$cKBj#qn%dX% zdZQ;EKEDp6hD)WzeTh$(fD6CA;FbsE%!M=Xkb?fXl|*A zL5uY?Tc@gju#on1DUdNp%edJ&+jli(`?cgwQ0uSMnqVhq~pKX#q3 zS#TkpV|>hkJ*O87g`z#O#ErW`cOgnmMHgB3LM+O+3QPDhqkICuE=#u_4{B zn7nT%mrfsq>@Q2cI-~4ySPdL_#v;gYDnAkYbiGqckA-J1W#S4MS4%2GX8bkImiCY34iNJsjROmhxV`1S-K4WDA3hCFiqI86Tq@>YjE z_QbE$g%irhamIdN4zTNrZ8->qMKbn8snO1gQUMDf5=Piv?g(V@r}3G&7yln%(Ch z-TcqrFNyGVSUk;O*M!B~hJDV|?gl#4B2WTs$X+tXw;)%p>1g{Bc>Ern=i8MyA#F#{ zptSngOi%ROAx_cC$3tqwGVYn)Te>WR3#eF9`xD^X=SamP3+!ULmpg|E?f68xtoMx6 z!J|XvN=}#7-qJDWc4I$4-uI zZhR1-zMB!;Nx;8sHk)O!1n%v;`737jhk#hRm@ zjUp$3Knxs$9`}B*`Hrq>d3z>wem;h6`w*&I{>$OtZ*iHs=PP%UE7F{tF;AKwtJOHC zC5Ok+=EKyf0s;3rk%h!3%C}Cofkiy>YBq+k;`$s*`kFl`qGd#f;c~{&t%!V;m>e5X zzXtgF>k8A`q7=uM;Wd&6gT2^1zGkbgtW>}_eGuckc6kEZd^J0F(3xNEY_D*3Z@l65 zS?jTSJ^G!Yk%C%UoYEdNE7hzOt50KfufmRT^=sz;GGqJ3B}?sqTn&A5SZ4aTXIhd; z{_fWITVt)E#5bNl-^SpP?GXCck1q(a&5&E50KBYnLT}Bob-3<&&1Mt-7$ zaGyR{Y_@lSV&rkXc%@ycC83CqaZB%U31qa8kp&^w#Kh#CX=v~Rk%&LPe|?a*gAH^9 zupu;alL*I%>+MP0PY_700$axU^T%d@jFA`n`KUA$MEw2E6(^uVl$7^_sKD zje1nrp|fNn(uVn_YMy<4UO!$w{<(ttjjoasNJE>(=Ohs90B$*#AV#2gXBy=8Ejm?& z(GA`t#R#AN!TCx5>!6e@WIZaw@JXf4rcwB2XR}x8>ds-msieY7R-}2q-y;7;`YyW# z_AA9PoQAMYil6`8Mel{$!0RhD#vPj*dR~V@r^@liZJzzD!Y@%|R7D(wSz3F-aJ4)} zKoq^<#&g$xnl07T?{h8}kI>zAn#_EnaZ~mU)#G%ng{)#f9>Nhpd}_B&eBtnj%nHo+rPC*n0|P zl*LC=Tu(zR#6=*EgJvMPDxC+EjC{aenFYQ+++)3b{{N`^cnm#u+w@ik)=@`KoEl?! zO5CmtG>1V)Yx0dJE}6!+R4@a&5n z->6%X%Oyzh|A@|zOrg! zycT7lLyp53AthBVG`Fn>K#c11!N}>y^PK+zoc^~1rS;!QDTs=Tw22>MTyzY}*mwsV(OAH#9PzpXY6ZA>NgngsJ8 zp*+Zq?Dvx$a5DWk*ZAej_O5RJ-+i>~&@S3EH`glIYqh-E zx2>X3h`!LhKnSm7$>x}F*D{!ZNz+;3;X`NfBcR_tOCY5z>^zz!niJ+eu(_oJ69HBV zq2Z7ZA}d$;n;3A)^cj%1CZ?<7DIw$e;+&7@UOq2prFQn+VlH6VCQx7}sJKjRb|pWf z@r(NU{kFtDOnuD|tMh0xinbb1OaNOgYbw2aJ!oQ==Vfo(YzmOiVb;H27*t3#H+Eja z)!NKL-i6OZxkfscIx`qDS(Q&bmCgn8aHub~ytRcY7Tb0^jF=iNiy6&20>7r)X7g4> z-2=Xtgq*lRQ1TVz2TpQTy{Hf5AsLF+3-cg4{9|5_=+z-MAYGder!xSp2;uw3Wte|s z^9@U3E>0Xu4@As4kWUfz;ezI7`{g;HuXzNDVs5U$UBD9i&8+uG_p=X-1-xv;CJux3>9 zst2@!`GY~<+^g=`4xgC2Uw!YSo*jG}lrCLUX3$M3-S^I{^{207Rr=2`>Y}d=OL#Bn z*deR48@JxRS36$TxT)lq?hGD{bj-#6>Mfsx0e-RQn=xM7kc+)4$@%K%p;x|;DI9pE zN969!_BAF>ejgWjjh>&`^CvQPkf_J;xpp)L)FBshn@bGO%J3NDQb+A^?*uGXL|GQo z?i1w;z?4YpsUEo6uPX11CXep5W`;6-S1Ue2l8kRG4Y`;_^=IM!ftQ}euf4%^&|0XX zZ5qn$J~0JQr9CK<$lbhg%!xs^v+LJCiT67R`53iWl#w&2;`skYcxA3@h1YY{k?uD1WcgFhktnbzG+^QbXLLqvqvM^x;c zQMX4YMCcW6%7CGLS)#qQ0oXzL#QBkA{<`kUf!^rshSTVUL&9M$^l-`=Fc|c(1)%=?QmH=ME2vwJT6IZUMYC1%vD44&lLRq;Tl{Q zui5w{74jkW2)I@`2o_mL?>B>c_7LD zbnI7ZuS~6+MLJ!;;pQy*pCtU9>b=h}s?gNkrhW9WUtfRQLg?j*Uv6UUksU@C;_Xv zaSvkyB~^plBNSr6WfW<>nR=#oqc^E2`RX+O;C!cPUmmg;EifqT#t51MU{Rq>n`n{- zp*=LvF?7oYy}naYNAJdb%Pgbr+TM=1O=6937vnBu-9bv%-E6)^ad5GaG8<`|-qFwT z@-yo@QX=NQQw96rN8rv=xZ=*4@Ep}fqp^8wUmeb!6|*#??SGB>&SDQ9S2Lm1@PTKv zItZR`(06!V$)158D@k4Y78zj0CY^sG^o_iIa#3pKIzxsQmGcK;gYiSTJrh=o43gY&xI(rjR2|+uZ{WD+Y+NyY}Dy+l>rj1*0NS#FW1f@2u%m zcWoL*M+JMH6;WRd0PP_t@A6~x@=)8^^-+>*j$N03z3JYv!#XB~%=j0Hr(E7_PiUsh zRpu97bRUr-(ih?gj1=d8-?08L_EzD@_Seq_dY`6lU2d) zWQh{r-opFFKORdi#Y^>4=$_cBTF+_s6%DA_SxW~=&!q+`f<71<*Rp?I`hLKB<~9+- zp7B};2t>;LGqN?ECa_n3n=3Ji0CjBCmqQNHzr*)C>3>rBULT|_HCTlq2D9#WM|!kq zzWR$P@uPVH6L-xiYW+m{&f0&TSV7!?=f-Oi0MOJqEh!F^eV%u(qOToey3W|qz7%F7ab`vV{4NH4i1)KFh*~EdUW@D% zQ@2xrXB|GXZUhiJQLS!@HB_CudvdwEH zHo8Kyt&kc1tl2*j_+M8|(T_m6YmxR!hp&RZP-6s_{7jB|Zs;|x@(HBle`|yPg84?B zA5Z3UjoT~5(W1ORsAPh#H@lgdn;5MS*J#%P-V?9y-#p+ zh>^8>x1%3W;)-4C@>bFlLyL{_*PQP>{41{=LbF*yaX zK3)2mqCY(uVCMq2-#ouso;i6etoOt&ZCUlvVGm_3=6QJ(i71Zy?a{d+RCuwdDZWFcT3n_*s3fhAuzatEn-0!wQE<}1fmhS$6`0wuC_v=4|%_7-8%FQUQPqz*pD+AR)7=(0+k~J#g z_VqeVzdrc67Rr#74Ag9Shl=uhdyFGX9 z68H=Gls7+7qZzgD5ZGPj`yAu#6RkXWUb>mG^S{aPN6vh&v2~PB`6iA~na8goUOrY~ z5~MJ+ZfVfc4<8vS`)E1h-L3C7O_uj;Ra7jI?lio9N8?zsmhynrnZ}JXxcKhYsP^r0 z|C1Dx|48V*W>&+$Di=6ZFS-w2sQXT#w~LNcl6yr$o2e1>!0)H*p0iy20r`G}Jez6T z%X4$1C&Hbmu^hm*ax+waRkh6|p|oPHgdiDDcl)&DYwHoxy6%$#=3kFmLqtdcmrgLz z8gk+uS5Qcg%6Kpi9%R2*@dKMxw@TwlJjHCIOW8NZK_14c?fCqMV8hUSDDm9`5QXXG%9 zLFO73p?dr(S;9>I89F}@^e=JfI94SX0^oM16b;;cz+fgkANLm6R3M{lOgTFSFb`i-4+JGCyLrHC(-jc;l%7;Bfk0p4l+aNN#uuVVVbRY zK;h+f+iS5-(Ohgub9ZmBHCfb(enPY{H@>~aK`;VFY@I-<#OOuPfwvUu^%wQ692$_UFC8TUKg&|Oc;)F#?N2QabBHrhhJQvk{2RG4yQO4yzC!{_gx9% z#IKlw5i456q`BH2ADPNSjF0>M`fM?o$TJ@$^eLm+e^9>P3g@oyNmo%ShfeOe!b08F zxOQoqx5&!&Y@S)Qs@dhPks|@j z*Mw-dH<<4x2@JAvPW@Wms{d}(#SsCZ`F7^~BLn$?y)DRur(Jx3pY|Kpx6c(Xwb?J% zfk^LFOQ#btD^+~WvjKh0Mu1`4G(=ajyq*77UB6EKIqAKk(Fu8O7+Y&hA*haBP(@dhweRO z?_+_CA_niTEnTwHL*;QLGjk zT*8KzO)|v`;VybM;=98i#u_1T0e(gLS{Vpux!0B>isSa+>xf`daS}NFbG06>NcD?fLrA<8ho=DNhLl zu+P@SD<4X5GfD%>x$Zv8$pL?P4%a6~eWJW;I7rL2$R?dCnQLhTl@EW{Uqb?*c)LG!62_eMV}eLnC_I^q#HNt`_mN6At~6r#U{{)Lg4LYo6~NPCnz0xfB5w(wqr3z+nY+Djw#Mz*tUM@Kb@IvKmS^42IdlPs*p*fst_c56v;MQ30k+v& zS^_YE6QFQB8WSa_C>QSCot+=m1<>2-QTDPEl%F_1DjGa=w^i@njlx33A7kEwa!+vv zA4LW^APS2mwbBY%hRM4(oUg43YE0NNZj@!H+!OR;pbn`z)}muP>lvy<0P&d^?-_`F zH|On}mGRNYYFF5n$~VRy0ub7Cu;jP$;h1AMcIvAohMF1G{)9S9X6@^6?o9;cqujgP zU4I^X;CeHpVk9ax^R%F|Hr$_I`LWmu?$7l6NvWYfE>0G#cM9>L)3eku@M(o!R-=5X z1XWfVEeY7#>OA=;U3^z6u!jd!kP_mKBe}-q_0~c$JzyIEHq1glUxl4f^82pDV)xgZ zukql0LB8BTY!ku*az^Z)s=^&V^AxgH=XCVy29C0n_VH&t-bNfsQc5UV4;R;Qz45iD zzi2rG@UnS2r|U{Rh?AFg$8zEm;H^-PIgYS8NS6{6@8r6xIF_VYno_L%Y~#$oVBIqa ziRe)N2I6ZNc;#v_0edS)^%<<hi@eSi>njk`_D&7m-CvH9Sq^S&W;9|?U9)xM9sZ2 zlsRzq_6ha<1za{Lb#=`z_~B(yEB256KH2g!3SUbwVBEQ5=P^M4u?%6(NWa(BbmPOwy|il(<~>hv4SS zoJrTlqL6tqN$hNv#C+&qJ^B`#=eUp#IjeW3FuWR&ovWW5yO!nm=R6+SdncEQF1Wd_3?FcCLSo`5)2{?QNSDhkcee zxlL!DjGgv`;^HVlhrU`EQOm62X0O@JcArq+)gju8$R-TiN@vK=5f5TiVe6}3E`-b8 zs`}nhgiB4=d^zkN40`)un#j-8nk47xBWgeUL%F05M6_!q(_zaCt~uRGL?QnOx%>zA zAD8PlW|YMRiV}$QiD_Yn0gq5gwuV1dYeDtm1xfN8$_C z*X^aL&{W6Z-L{{OdIBiTZ=VVcpW*9^KsR{YYTw%t3~s+V_V%@oLsV2qy)5K4ZI7j- zq=Ca?1T*NM8-x|o-85-j?0&+ZWAT58E0j3(Boe+`QTuwO+tW{N8;VPU;dvxws?Wm(XSHROf3!^|+;52VQGTSPv=fL78SNNu!N2(I-x znX~Y-kJ~XGrYO4a-dB`wr0uNGh|d1-G+vbM&^iEMVMgv4a6vDyS5d$p&k8T1Q%BkF zNI%>iymzNplC9>$DSCNg`vpYC`BL*j9@?oL0n;JrMX8M7Hhtp#5T-`-F9AxEWO>_J z{~ql6rjpk)NSSBsby2}`cf3$e0Zsop_!C!ZV$92i!tI*5-P|PIqM!|-=qTcBaRkH> zW;{`XX1J*R>)ww-CY8u=uXgjParv`noQFIVjxQ-4j5>J>gKV97WUEr-o%(Cfj|v-> zrBuV+-~@?roQETt2lHs#GQ2w{lU4($0s`vOG=|y2U!-r64nh_qemUGGSl~?TK^(kr zOjOum?XlxFGA=ORx;!CXX5p(nUk`se!vh-^-{PZBpNa^Bq?hG%9)vu_ zdk(pQK?2X=mDA8s`Rme8Wj3)aNF6w45rm293VzeefwgwTfF;2|O2@8XS&B`Vyx9WT>azD_eYITbh6R2e%@j#ky{y+v5B`aBU7)qI&c(X^4g49v_Gm8z?c#d zYXhp5;Bf`7jY#QM_;=j=ucwZtn6wO7UsuEv3=>c=6Cop+hHUf#5qql`5VkBC|eVjh1_B(@R!3?b%I2ru~K~9Dv+8zu> zPqbF{vk?DZ@*_d{P~n1tY>lc`fIV+VOI;2yc7`TpRu-dpxR~SIfn(|h>7r}7~aIwy7_>vGGlfguC4i>=Ap>RS~3O zYI9xMJv3gNi1%VLIxlsj@a%=Brs@;olYZx0hy8e>hZ%HX!(Gzpff5gPeJFi1SB>#X zTYD9u2h_u-An(d|w6CZ5ihD*EZ%c>+zwqRp$M@s+Xi8pRDO;oNVxUmi@tElPT$BX~Cu}fmy17>|lfP9t1$7t#1o=L#?wn0wUgLbo+zw6Xp44 zXY~Emq7Ae8TIL3xl5FgWS&~wp2YSnuhSNl9ztfL_`b7DOygh^Xe1HO3N=Ml@6)}nB zY^hitfrk#hmXcVs?d3Ja01N$V&6|iG5p4cSf-a|@D42>&iE%ov72X*Eqi!M#y~NHe zd=qm=S~^Y^&LMRx$bZ1v0uj8T0KTa*;5mtEH(VBz+Fj`81JuRZvpN#y`Cs% zK%S;_Ct(Chn<8URh|Cq-b30V?poS1XwwLEH%W)Gn$8-&`K3+o`=*wUUM>7%!3B3}hA; z62^T8O!$0dlGrYfQ=VJGxFB}8by;WAE6Wm^@de_wnK~fO$HXIhe+_@FXvx#Txj3qV zd7k}*#F-;d9xmeF*X;x3y+i)Q*gT)|NyCFrM@g;DP8U5R70cY zbzRxBS05jnZ}PkebER(%*O-BA3EPgRtKllaaS~4Y)(Zlu7a&Ebk*Z7+-FI(;+ z(T@??b;F*J=F$s+qo!@`N8=@ThG!%{DTYdy$-WC8T7GN4pBz_U3Dr%B9B`|{enxRb z(@s@oDoCFIy^OD+S;Q&6{25Y9zP6L_wmQ9LdXR?JP?^{@l9DMPiNL#NUeZ>63xv>p zxMRS_rtsGI-5AZ0irL%gvJeeI@*V+VjB578gVia{hIbCLacW4Q_|G2q)_h*w`c*=Q z)B_7I(F{`d?`?zG59tv+gMa}=89W6qzdB+4al&5vre_R!zB%M+L@n`(JRSz;;g6*> zhRbm()7nh2kSg?oeXPc(KEGc(6q4f+O7ETxJE<6#H4t&37&}h-i8>JS zPssH{^LXjGP3zv?R?J9G>w=Me9g`yIF4C1i5ar_Rrb@%52PFB2F5dd!bJc@Xtq~|V z=XN+LiUj9Gz%msBSfmOZ>UoTYMUG|*^=DuEp$&YLn)GeVNPa_!C>gR44@;Db&#n;V zxoV(Kb8~5*lmy=RQ0Yr%9&e$M9lAw8m`LF!(c&FCO7R|fUmSzgh1hSfu0P$})1Mvs zhi39pG`xu7*dY?ao=xqc4Ue^ zOWZkH;YY&_5XC%xb)+krD|sLO==4`V`Pcm@Z_8(}!&<_Q`gjcF520Ptbu1$lG0)@K zz~~}Jn4xXuKT3V;f*wsZ9NZ7#W-@r)dJmqAqJxcqjLsXIS5097dtwz%@dS@4bb)E1^+=5-7Gm!!O*wRE|Y56yaU?|vlTwY`MwuDQqC$!%_ARzsFh-crP6p(p_8Lr#M0&{6WZh` z=Aw_Hk{>&~4G=y{MIa?n`~(81*ctExPxTX4<0FRFRt0Fdo5aUI~i?C6y=oiUv>3g2=erS$bwz65vYjtZx%Z0Kpx+Oal# zTu=SbM_)bB^RjW?O&(|kh|_0iV6FlF+%c8g42T^L=ku1|iT>hzg1pP()&8A#_g+K_ zP_z=LMYrkcs1MQ=@ycSApkyx5Y$t#|{+zF$xdH4ec267ryrJS0MOnXJ5nkM`aX(C^ za2%O!NJ-vK&}T{9PmTGZ!FFc5Rc4D<2WQ`j19lz}1f3`|$8UXP_vLyv*2Ig*uPASK zy;jP%J+#B^gx;RpTpz_p-0JsdOvgNA+N08t0O6j0aO$TazLt(1&JmEi1n41Y_h(3# z*5Ppu@N>pBoTV;t8McKa_smCb^)HC;E3@nI`_@pR+(v_d3{5rekCKdFyAwE5!Jg-*Hfh1qSU91T$`f``rZoKxGDnxpqd$zOFP5a(-)AJtPX!a zTI1$A=C*oBq^*{6cMa;Id)KG`WQU&B&|pt&C?owj2!3_?e?17$5>&#gI9w!f=nY#I zz)&Ke=RSTt+Xt~-TZRxK2Pun>jMz8ognL2qve7>nrMV1gGuSND6|si<6JDaLz_$B# zvN51JBH;_fD|r&;75L>e-03cOM%K**s2wzMI+3jA%h}<<&8?F3(pcM{1NyHf;zd^{ zFXsW(`K5hFRDB^#9FY@-+XZk~!qki}52OQAO}*pXbChxSiS)8vA?yi_3QqzilhAR~ zJ^Q&s<%rhGUrtT3>FBxl zI5~aL7v6zBj)K?M0GT;AWvGw-u&q(LU_8PG;C8uEmnDlQLfxQg>HPD0{&=YS8(xYe z=x)}@MK0}Viy(djt!1JF>VmKyEM0&yv8yUr@E!fAgZ`P*;e5lM7S$+&**~KN=@M+Y zEMUWIob{U{;&iPpg#6J4$QiYc3M*_CsAa7TDd=7}Qi3A{qn^z=64 zlLBeoca*pAqYeG5cajYjFyuXf{S#QiLls9)gJceK#)OUQ_oD1i)*qk$2S$RSPC=c! zaTJ>s<%wcCq(qIx+k=cTOhPSn6SyQ%P>Ua_2R{%aFb$Yf+@U!nc=Dxb9fA3@OQS32 zP6!RUS!x4!corqQ;HM;cYRxaHlzYWBJAF`^KS>u>ocnPAshJxSjjPM6P=K*QRtqDE zAFXcwhHm2G_}pFsjk(1jFFtMYv@KW5r_l1>b^WLxONkyxbKb4`w$p5baORyf>cW?h|oe8#N2}HV~@Q;u=qz zs`^ymR+D#XR;Q0!uq2m{qxx^y6gp6kpSz4Ax!w?@Bbjpt<6np2Vj9wB45rSSF1gDpH_W zC!vy+8;031%|SBH392D;)>Ge$vEHljm5#`4n4S$3qyUeh2Wu z%6J0IJ=L5Hr`RXs%-X8jaUzF(WJkQyJg7+k9*}sg4Q4oYA-rzY0fCp87f0GjSn&2B z^*|-K=;M(7fhxlgPem#M559|bfzI0WE;D;Ml~K65!gXS6PBFkSC8qRaD6bYKp4$vh zP8eMeH>0uvzP~5g&UaNxZ$3Q>k8ZK`(BRMd_Nk4xV`#C>f+}s&(Vd2R4y}P)8B#B5 zhqe(+@Z6@~FaSkBy1)4}20Zr1$9>~_Akp0OD5n^ZVkewu%!jbdBcOsCLlCumGZ>zB zMNZHf;zN)hxfs}nPnO_N`b!I7ym%NDH(X4+=Xs$>WR; zvs2&7GNC&FCYiT= z6@YIIb~F$CXOUi1#)Yi|&%#ijCtyo#=Qa_iQ5f`i8x~gQpB~s$BSF+LAD-6VlXpxN z@tiPuU81KoIO#s=cv92_MW!WAghJV5E*jCQCw=7ny_0S*@U?3Bkj6Fipw1$%RJd)C z=QTvH{TL?|-NRg~Y!>-qoj=e?)CS@^0A-l%C8DxoEg6PLEdJq~09ky7!18Ipse~^$ zFn@#k9u>y&ejTh+98v{(E6&DxMA&a*XkE{%J-(b6lJVS80(&fXbqwcZn;4{VW`*7asF*Dvhem>oqxO7Sun7^%Ji{ z4#r3+dX|%UDiB4@!-TGnwYnI#8$mQuD|a%_&4o3Y z%4~qQ&KH5+Qyn_lO7!~-LO)5h^JU@z_c7n(+RteGb40J?e}kt~D356a zm`xrcZ#V7fz{0lVZpFE|UynpXQfWcuk6M6fZ<_RJH8K5j_W@0Z(@U%ue7)hPC#0}q z)eb0E27WMOSq(^4m&Dx;Sm=)r_C}kKfa)dhHwqq`0Kn9uYgzU_&XG&rA7XlyhS1Fk zytT6h|9hccUl}_W@G_LVy9;3|mr^M+Xl?-;>v>d3m2=bFPG(38-p7US8{bFqxL_vv zbilT_6pVYz(NcZsXSq}rShX&vhue6TT`jYy{JmIj>mQ(f;4WEugAE3;Ig_ldOyS=4 z6K4U6nF)rs-C=z5EpYlG*xyviCzNj$xAd$?^)r^BW~e$hn-WI8l*FfNbh>Dlbn>tj z`Dl3e3+%0~Hk2&+9+D?xC+8?oPI8WSihHwcYt}4AadWMLY`Iy93IBk3N%MAM+Db&p z2AlS*RB)<(g{C<5^fhd8G3iW)T>eNv|1|w zGJp*O@FD+;mfkh=T=tHi6Jo6aQ8vb6Pzc}zZzq1Mhl;(Zi-M+3eF0+hRYTv0#od2B zB29NMiycC@MZQTOsE-Zb(=IXWMQ%tvL&fU!kudZlamiJv$jb^<@rCC2UyZ+5eemRU zHEd0Y>)ZzHhwItch->pityv^Ge>Z~ z9jwK`I((ex4bGq5I?RIPROS**2WR!8gz|5wSl9&DqKhEL(|$WW?5oi5o@Yoq)7}z% z#2rRutSXo79uhu)e#oZQ(l$69BD<`Pk1NQPpm@2;Z0E$gzuFj4Z3sVurSm~x-3QDM z3F{PQE8%RV<5}nis81rxZ6%=2tW}Kskc3HSM}h_(0OfO*-s?h{Tj;0{^?o}nJTOw> zrdx)MvgT&b`Yp#Mq!Zo#>64S7^MUft+<}IXfaXoSv+9nRVPD(DHFwvr7qi?|=0M=O zdGdGd@zHwmCytq|2}zmZ;bhvp%DCg^J*;AlSfv!THY;cfEs!>;qdF1%9MRw89uoph zicNJyk-en;F%F$+KhTx$ckb-pSrUj4SFfq7@8%y^f0s0T*V){J<&`5%pXPasKh9P+ zl>&otYf8xM*sH|tdOp<07r9>FR*9Yp!fQHY8d4iCYyB*s3 z9JsC9p1NJAz}2W_{0qd7ZDWV1NFZy?^A!zi+1hW>Oi*1yRFJA z)c5l_esClV&|YBQ7%lpk90pf>9)g^e)>qT7XJVU>C< zwW@RZ9I#k-iks8Pthyci$Ul3hrkSmJUhEuemc%&Ai0v`yS!cp%qO`aduL7Wlm4$_* zLg616uWz387^KIbVfGqPZ3CjYxSmO@p*b>b7h*GQtDC`sz=V%I@FyM=ZCUja)%^3L zP$Pz%`T+4B(|yR*pgZgaoPmhA`R+|5?slxITRz>ub<(d=?ra9QZUU4k-ZO$fuFei;JI8v)7l=1P zl!UC;N{2^p$v2 z)S)oKkzqfVr;}kq#98L_13ROiw$i@d4D*QDO(Mu5S-dWTnUyLfJhU#PrEv)(AQQVw zxnhHJ>4h(2dXuFbdkaI;2KUW7$jOL%%yQ!T=R+9P84{YTsxUm58!`JdmRFJj0ya{B z(~_%n)mig7SB3cWxhA5%s7|frn4|Qfxo6Gr;jH~k^#u-0}Xjoq4;nG-lLK%jnf z9QYf;7a;LVFNB{`wFr%L)vYMQHG=|S{Irh#1Gq@-cbT8T4blwl@_$o zV919JRJQ~JrHK=`i@rQPQKzphRwAYkaem@#nNo*rhq0ui#vowqxZeXSCc0>2$@1!_oLRxEovYzhzEo&=;jkt=KPsc4VAr4|1=mFvI8E>(V zjQyWkX|mH807kvd5^RCnfH&2Y&*0=DhmcE(dcN~U&UmE9F&{WTaQp~-uNuqAv>|mV zo{k>fWdz_~I2Ik;^{k}?s=D#+gUCna_}{YAaAz^Sjd;MbSK57Cm8P2&2UYfi$OE1f z0)Z*oh4B`f2fstT)5^F_bpt$X1*{%syIgqOAOr6qdpI=vVpm;#t(#|9U$n)Gj^r*0 zr|%1#XgX~75`3+hvwA^5tDr>831Cs*YeB2rdDEMWU}#VKv-iCd_^jX+C$b3efbHUL zjJqgS2tko?N5~X|KpVJo0@{`pJA$7W@7dXjfSpIkunmFZOaw}j?Uup8FTZE&gIfgD zP+rlu@Uxxy|AxWGJP^Z;0^B)wP0u}Q)I`pAia&Mt3npDl(q-e+C^f4gx=)e5rxW0U zoOvDUHO%0rm_nciGB8Y-1ekYjpj-2+fIS<7P3rOJiNJE48KfnZ8_la`JC86biAOHE|2&uhM+SiSI~u%U!n< zN0K_r4NS8>FvA8?tScwjN9mi?+v0mtzX6ixXkz9VPWcYCQ(3V(fyJJ z0}Dq2xlHy&`+W`YbEVK2(HDtSeEm)az(xjLG!pR&5YMPRQI+IWgz{w|`(FN?`}h7d zj0`-nP?b^}_ml!=bh=z-<9TpW`5>r{Dj6)0&yVpJ)7dY8pKob&i!i`TDRHzJl}8x$ z$9CI{ULVf1SwQ0rR;&Aj^p*L$-SN+9dSWW0BHS8VX0B#A+-21+>dw~D{;Hl>#GxMh z5h6F=BGXUzf6Pr!zBb2G)_M?+N8BhSO*Eo1%SX+WZbR$iZp?pNBCsBHcpTq zV*Gc6`0c)YL%2vZiiOpV(loK6fSFpw;?JAl12i{yZcIs3c}VkWd^D>6*V_S2W}2B- z@}qTXk4*#kd|ZZ3YoA_NFe4{Pe<1kDS;C}=KRADWwaI;p&j0JY9>2IFUiSeA#0<`d zBq&0G_6+rh7Z)8OR{W089vf^s|!7IT9Cn%lqMuJKZ21LkhGOLtM@NV+#q@5g4d zZcUvkr8=AFHu}aTM*l%V(fxY;e`_6~4ww3JxAlv+rTt~-MNzGlW{qxPBZ_**@Lt8{ z;?@wtN5kFnM+N;K^b-Ev_xYuv`c(_=3X_Y~`D{nQQoEo$?ta-rfr+9Wsg%A8_ZFx1 z;A{KdZ!qU*&j3Ri^c_+k=n=xk&E+g$0jWrMzy=ULLme>^9Q>pFK7H+`XPZ}yOeoc5 zS%}gOE$L30cI};0phFXLSp(4&#&eBeci{`f4=GL+2S!$3MXKE;ZG5mZcM|lemZ$Z! zgbpoVWf|V#Isa&)_?)D%eDUsl8{HX|Hv5xUem8!`UXik#OifUgpAv@}(V$OyHC*umar|{z{=XY1X?|Q8zCle@ln`aej`+D;*CbmkN zMRl~L>AUTiOI|^_Onfw-_^U73OF<>UmX0U}lpF1-P)P9s2WOv$Rb;V+q;V@4h?M6d zzp&{?$^Vz$Qtx@9BIBY-TDwLNP8rWXk9(*J@nYE6UTa*|N7o6wgc&D&G=-Yz*9~3t zdW3a}=(6bN4F^25FQSAIMG3kEg2?#6)AOwzsCqh~A0SNAzl;nzO^hGO%oGt5iOT?e z2a>K5k--hsL5oPnNWAH{CZ{jPky za?@@P#P^eg%XI?>U7lvj&`@~uEJqJ7({`m>M^;8sod2Vh?v)-!ih9XsS$btiscsL1 zySt7&6b$H%bbL8v02phAp(^Wxzvow)^M605{GP;aQIP6DNFOmNXEBzb30?XJ+@vsoj(?xR3(=lJ#kx3%${1UPbZ8;H{q-tEU2_xanFbgL<~w6e_VL~NGR`=%p;wFD$h_z zC>#SG@=dtx&zNZQNKI~xZs#bv8H&tI^-MF!WZqb>4`(lqHAS!L z0%Ez*J^NxzeRozJn;r>=+Uj6$2^CRS+5cW?9e17)pc*)1-G4=avE)e_=C#|-W zhI+d57J#I2_)@!Dj|ALoZF$=VkLWDYx01%JxiStwjZSC{66gAXXa<;doU58$3=xgH zW7Kn#b4Up;Z~6cASA>^NUA?Bs^UI2P?x+8GdakRyoaS-=XWKW`^v`b0Prn5|{o~(1 z{Nvx!{&UWcU&H#9rq=%>Y^U-+{^$SwA5B>P8d3Qtaq)lr$6xJPr#Y-^D}MgZ`KiIb zNLBy(m*35tsHLovkB_rw#5n!JD&MjncZM~jen%e!TvpaI(nKLPgy?jQHY0GTIzvHw zX;fdF|5_El@`2ka{j#dmZq-tTgvi1RfLaVj<7A_CMhsM6VZDbrzQ}57R!ijX*fYL| zf9(%{P1B#}v1>t^CPrMW35L<+mQbXLsQI`JrRQs+G$0Sx+;w059aj9xziZNeHpv&K z8E~JmkgxPSa4char#HAjVgYEDfr;5mh4vB=_*H8h##hVvqUrC}1OD>|+kyTuFsUId zQ@Fup7u#jzLt^kwaw7=L3dpP+CUE{YBTCra_0V;f_Fo*A)qiQ$Mfihppkni)9i>?XTC5u z^_KX*IDcu+(`x)Td+&eOkbba%B0PBlI%j-d`M_KbW+dOATAb_0b$5e}Sz}+jvNa|C zdJg}zfiIf=Y6IuLvjNOdyloda`&@GoDY+p5!&Eq(;UNFd+ra0SK5gLhmw%i;ZQy@B zMeP2fN&c1a@q6ax;$QtU%q^cr@gJwQOVWQeU9$X|*pH?4*Bt-4*!~s8f3cl^p8h|y z9^)Bl7REBpDHO5Y&7^Y*JyS+iXaQFg`XPh9I!&jA`CYtfG9;}q|7^nXo^;z69I+sr zX?q|>ced5UKpx4(9qf#rk(sZ9*NAk(N<2)JtjWy3*+?D54&BbKa$IhxSCnaP}Q&^98t|@L* zO?DrlQ|jEm3i7n+SJDyDhHl;&l|t+kVoEYx2o`-*1^G1P$bIBzIyef)JK6jCS6nqe zy|8CwRi|w_P5+!9^A~SB6!bD{Cj$i9EUyW>TR?pq?Hm?lT(Prx!i~Zw?!EMh^!7-S z4J#wl>W$0cSxa-*uP?UqXiJi5&yTiRfYx}JB_|X5^Z^n*7u)v|Nl{xAvwqyhQS2H< zA%;W=Y)Ya;$xPg*$KZ~-Mr-xC{7n-m3s*+9m@oDM^{p_a+$7!BwbgjC!;{v=QP}`s zHd=J7;CK<&q2@e&U8)~u{dJ*2f45LYs1O+8?%W2$;|1_4-i`3w)AIg1BLB}V)IVSO zT&911{0H=Xk&fxGlwutBF03Slf5+Tt zo5>=7z?P&!PpqGLI#i0zYB7uzg8&pKa%;^{GYc*0xyT%W@&>w*7yfEQXYlVG*%>z( zUZmwqCwml3Iz}aK0CVCwG6C3F?M^8M!qdE?!I!bUcmLQEG$Si3#2xIhRXCf*+-`4) zyYWfsOPV8JViuburv6=R^BYEAUM}lTjL}0l97((3Cj`A$yg4Mi12UG+XUyh$`UT0k zu8A!C6XjPQ(6>t~(_K!iO}Jzh(w^Qe@lw)vnoA#~ax7A<0(ZnDaI`O{FKQP4eO38( zr`OqxEFA;DHSv*}0I8ucii!94y_Y23NBkDm-K7#b^EQ@B#BYM0o^IF3ng%ip zkfkAH>jFwv{E740&(k#%UV@T+X`(qWxKvF#^MOkD+mV$nPJ0(uO|>;XatwSG=BKHTlX{H~Jvw@g3OpI%ed1`oNEVd$noLw_B4y(&6-3ux(Jigs$~ zlhP?m;+4)=bU=`&bR^k@<$^=&FEP z>)E;$37!L^&h-8#(A%W5#;tplXO}o*{fe0mJ64DvQ0rJ*dGD&XO-r`e6(sy4*_&&IzaaBkarCY?Muw76Ql_obd?w84@nB%ztEbWC< z!Gdi6Ox)DPKUG=+{=9nwB}rbpjaIXs;MBnceKKh~sjh zGtlJ1eaHIbvYX+kW9eC9m*xS!3iUmkNuiuX(-&&7Z3I#>I}=IuQ85XVUenV?c%EvT zvac?`lgUI7^rd%$<5Bl9>ik7p{#=wH{mcjF0rIMzEQv5<$ufaP7>{zL61;sS>>gvT5%2y zw=q2VoxvbB*h)UM+<1+!wE{3cHS_(*=&xcq|D36xtM-J5sL2u3p*udV1;3nw$wQVqXj}!|%1teo1^r>f zB}aWq^|NCoa^5kQLbd>m(k&-LrbV*rL@Lpv>v|pLb@QlDiCp*h3-WKI$2_LZOS$C? zS7cnU9+2K^mdeke|6to0ocQSMXq^ym4v6uW1mccQpdZekLtt?mN1RRUVGqVyzP*cz z%A=3al+*bFQyLT1mt?8V%2$~085MRF=+ZXQ#?DOlmCm(B?3RJL!rP_$tLIvM=bRMM ze0KT*^3I<*1g<)5)V+lP^YB5)7p79BLP-@$7YgNNbX3);S= z$T$1>{^XjHPG0pYXfn?Io&`i8#OyBe502Km06w;--xS#C%;)4+S-xR}wArtOKP6`p z)KUB{j+>gFW=T#`vKm3pyl>$GcqVquzhb=G@jXeZvu6NmW~K*$Q2L{S!(2u8T2&t= z2r?@Of^E2z$>#>f{>W9=Xgmc#0ymUkEm`1!pIvx3*B2z3sq1ZzkyZK^*`lkhQ-xbqDD596ziCc+~!&c;E z=+K1EQUgR+4w>uLCFAR=-qCvcs+bqY0KmuuD>@E1-#3~s6>wHtxN&28R;4^yY3`O9 zhq5U(zkQ$xe~~x6>|7_eWfwGj`n<+n#O=b8BpTR;8&<-AaOZ-dHz{@5OMOPZ0KL0B zY<@6wg2=d5V=Swvgu5~kzbfHnSbbP>O-x8FvcI@!_XX#jM{KUnyER!)ziJjOPBxZ1 zJC9k6=pC=yUDRnvB+sW>2J8D5oWG$qlh(U>G_KzqIx5h}sR+;queF^P9EFdG!j|~z z@z8|+i$M$TxgNY`V)=urB6jk>!2C>c6^CxJ zi5qmDci;j*58~-(>)jBMHETxm)yKOdipt7ZsIORmF#)}$&xRMH0zjB@y9+^F)GkVa zwPX5S;w$61(`LltY0jNo_2ldD-pOkAk;MofW-n%W^LRbTk3wR$hj183r61MZ@|jAw zC^dGUzTo`8@WS^s83vUx5#}jUIoP{_p*e3yGh-X%AEpD}}7{ zX!p^q4PM79=OQEX@$}zbb^hId$!MZVgAKNj3owCH0LkZA%C1R%G}pRMnB`h@?8QEc zPurB<*%HclaQnipoAV9b(0qAV!Z}Ao|x~> zwU1NhhUVlwoU|&0O~Q5Qa=AIi*y^_^{c2CI3>`9rC&Vc>CuSLxxd0LK>HY?~uUAaw z(ejNcj5WOPNFaaN1%6`3sM#b8%Hn7c{<+P=Hx|$ z@f<(yJtv2ZHqy8CeCyAho{xsD*PlkDymp_zs+Z>8t7)}H^hkTV@BkGqS!PVX7YT5; zuI{BS9-Gpep96Zm!by;1m)j$VZytLbm-!lBa4~4n#WJtn$?00BL-Yjrg##icp?%x^si7zGD6#(`mbrL^rBY_E9Va8d>34iE6z%(7P3S!T#| z!N>)OK5DOsnGlHxrpFxNY4=4zW1hb4M2E)87$%tB3eWc|ic1JpXeyYW1EH|v&Z3<} zINfh1KEEJ+Uth^x1crj=xup1&4R_aW8mHsybnz0J?oR;Z3^*s4yZEUm^_9NM&s~_x zA*7u*`r6UC(}Ss6)evB~t)Di*D4o$vH2~mq(zPF2K%a$jn};It#1-dNZM&t=0T;`j zXV+P*JV;263lWJ{nSAQ_$H}_8RVsjwo9s2^$)Jf}l_Umx1+%gOO23#E>_(W7zG%m% z@2kJJM9ohs1&xd~ z;heF2$ojL62`+NAq8YpAXW=W#YbQ}H!ZfnD$~PqI$v)QlQhCO^P1jsE%rJi?Y}SQ9 zC2nkgp3dfbf66=y)iShus;>d4oC*@;f|f&8Keh&9VM)93!vgCsP|eQ+NWfl*@wxdb$GHvoj3!Be9pCa><%(0IYib(vpkB@(>}M1=iz7n)NY`ZA2JLP z(?OJ1ZPdjBhr^5F43Bb8TY6V3+t_tPd-|l^SFG<>i1ITYc?KOr-j@vOmxMu{Co<7&r+wJ-(djOjkBRD55M4NXf4l_ql!8yl# z2+vR)1%dXw2i}}0UqF8B(&muu^}Z`P!;OrBC2m$C&}DS4fTxGR9Rgr`W;2Y2^?CXR z^;*U*Ge`}cEuDHgCa~enjFdB8QZe%2U$7I&S@7EV53ayJjmLiL+p-!ro;0+S5wBEM z!+L~SJm*HLHlD9rr?0TzDQu^1so=ki>!-$gMokPz*0CZ;+@kHwoSpr)3^v2NyRsyk zaPrvr?8{ipeqM~)Kc=QKv4pod^y~hy*z=fNymM*|fkc6}=@*G!=JS{<Hwr@vkr{HjG)4?)IeUaro zVK$f%#v<;J?>7~k8b~6z?Ae&5?9Sw-Fml8Mi)G1eq3(RZ{6Nc9UpiYF5sqR|%MM^R zyCm}2T<;7IUg)(%71z+NW_kwV&&3t|Sexm4N*v(l8pj_&L#t^)hi+9NB1Y9q8w?;G zc7h%Z%HYIbbo|pAn_^a)}r`rs`}*5#;qar?xA$ z`|WvEiWsGsND0MNh#ThC*DLn>Fpa}${*m|=!r1!|okUx+Gy59ZoW4#CE$F)<4s-yI zAjPleDkLqP`2hOgF+yw2)8;6-Q^!SE_r8uK$M^M4A{>?DgN#yrRv}$yO)>x9c+be< z_3rN2#L&aCd(M-IpW3sp!CZ?z{c`oXfL0XZia!pKZCeuZA=FzT9+ykhy&0j2GOY;O z6AT_iKEF#aS`4RClO1#?aLi)h*WX7*{O^7{?>i6Sl5*gT87DjsyyeWNw}ZHArsU(> z)~9GN5tRr~K*`}JD%cQ+iAO83AK z-FJ=|nkBTm|A)1&*lrzI+I=7o#5A;+EXx*aa+a9EV(ICxvz-lba_;2()2!t$)urm9 zE*LmHR^` z*P6*stM$;l>650e>ANxc*bnqQQ9fKR{%m+PZ}=y)n4Vsh5nO=|sWG41pW=;GC|vrx zQ5xPKuwY2eW0bVMnaLyPvbj{`N*117(ARhznW~<3ydYpZOuNL`~34xs^@(h0B z%vz=+{gfHC9sec8(i?KTcl(IDZckFQt{TQ>k`Yz+WcHWbbzsl zFC(a&DTE1oYYTzgE+8F{A^Pdmp#L)JS1rVQB{ugkW@6iVV;51-Lk0O{15OJ^>47A9@i;v)ZJf2u0nOkDaj;Qp z?q9H9&$sVwz}rc<6k_K^5u`7Scu68uj%VR~7%NdvuylCm7jvgJF#*=a$B>wEu5p448$uHG&>aZs@`UmFnv7o5`NDsgJDi zlYL=e>Jom|H+-IM9^M>pOgA44vW;q?J4sw@BoANOE4gdqUA&J}s@e^ZFBsnu|BB}I zed`=i=yC{ni0oSiLV|Zfv2=!h05{6wAMNTcoEgf$ToU(iD88NxY9qjXq)6{E zVpB>h?deHH76O?z?2YU^5x&Tw4xUEP`UmL8hrQVmv`Vm#MKn*>!{iStK*NItqM7Se z3%JOc97kc9UoPW6Q2Gx`yQKa!?)x%`Ob*(LE1VctxL{X~brqsdQ;%huhYHimLU>=0 z;&0|jX5cvL$=jWm#xe5{k0Gy+L!N|Do+ppec*IIbZhx5OzXE%eAv>0fmtUj!@h=5jNcRN z3V*@#wV_$lA9+lf3$aPcCEoma*tdiAP{`yeeo_VZ-!J)7R)Fm}#JxvRCb|e~!;b-` z^)qhetk6BK6@|pdMZIzx?^pkthxcrmc)lQWQF!M8f<)Ni=8;UzR-`Y6X$ZcIhXirg zPpHs$|8n1X?>~{9nZYk<7NWaWSB9Y6x%FOLW=f_-o~nS{y6!DME%p4mHE|L?1xih( z_dA0Mo?$cds6lC)#m3U7XA<+5HYZnmx|b3qsBE+Dipf_$@cYLKz6a7c*9UiMC4%+x z#`BO2gUWc~l?J3LUl@nO)a2=cNH0D7qZ6zVr4`D1jhXYvyIsj!^AXXpe}efLd#YYq z=^jZD*{eGKL)Wz_rtdXoE375c7%L4VkvLV6_eJk^Is^v7Gar2n9#?rYU}o&g7eUF# zGw3g0`l|%+YHJeu60>XHtQDq~zaiCbyzFAlxG7iVB&JW9gO z2xA`3Mkj5Z8-Of$Le`q(3c~A(M|PL_b$czPe15yMXn%fb0h#b(;ll~E9#B?P9Mx%O z)IYUnnUYA}jm%+`RcDr~9Q;es%a3|1O^+zev&cI%0-49%`PmkK^ZWBwN7n`(c{N*2tUfH*AG)duo*$Z%4f&^h?!+x5EWs8;W zf(n5lc-;d7%<5*yx7Y64|D;2b2z3{}*_OlF?It(cbP^q~&8?KL4k)J(`JLz&VMf5}=-Om>aA2ps97@bYG0_)e`ps^vw@f z3kB@qzTG(mys2EskA4Pm^iFbpHUO7=-Y#Y&x9;V&zxo41{JwH9^{o)m%utQwp|T4W z0nNoLV}kBae1uAASzT7k@pu?Muu1OqsPp*Bb4>Nc=t^p0r zH6F(#;YD&5O|PxoA2^qw|8^)pPSiQ3JqlEDwBpCJbW?SZ?UH89?bz5K=oJMcPYAxf$d5o*yD9<}Ob<_Sf6Qel6 zEp~78dIhX@MOA^a>M*}9mP7HY&pz&VT0P87_pr+v{SEVB#n|Ly zEyY(TZLKJG)6#Rad62H?7zR9&JGEB=e(}P-H9ezqw9@X|@i){vcLv{hbWK!k$z>xY zPQl}w&={>vv>PE@t-x(j-Rl<AMF4da+)M#+YDom^_kYnsG=#P>3e z+}stBUsX0Y$^6JT_^4SBH*gOrgK*X`-7<1z#GaAP9~JREVaqWyVr4_ziGq5yb!WgD zHmgiOdGLKwh7d~{!&y8-EcjCC`ICzG^2j&>nL8%T+`LQqwpKf{mU~Cv+&DuRyNp*x z&EVuTBcCbF4-BSG-V`UCCO(zlGwX0jwp>AZcyI*Ikb;DSgPf970@LT+<+abZv=5Z` zo}L|uhzt}rixif@8o5%G8hTOI0gQ}c=x@8v$j*s?pQl}k3OES z!q33>6l5%&jdcpoxDpCd@=5?h4y)6BJ~1N!+^VOnwd)(y7np7a5#Aqr{oGr+#!Omz zMR@Csk@}e%6a8WF-Ic$)1@qc}_@83@tf2nr+WZ=2@&Xp)mmpp+G_At=c?F5sMb762 zZwFM`nOWS>7Ot4rn5VyN`tEhfwsO=c9gNzJ}al!&1uG;T07Cro_<4I=K|zai0hLT{*@CZ}l5D+yhWw zEp-jfS#U#e(BdRiIC__xFVtfgmmMg#V*ujuH`KT6yn<7>Od~iCI@hQ*?Ld$tw|6^N zvyWTEJzbiUZEfISMBpdJd;L5MA=e5=%J~K%c*hMB{aSDHM7acG^$jK^`zB3* z1@q~7e>f^2Sx4l@g6ksaAR#*4doi0BnfqFx@q|%>qxc3B2s*4wA8Ttz7snO!L1ig@ zK@y2iMK2SNfv&h(yZFmzNnO#7PyhPA+NjjCW%1gG`qRUW9S+wr_x)T2?H!P4NdatPgLD5GY!~aFBmK}prdfe?>UY#hfU{zz5SUZKqRW*C z_d8u5VA~z0bw60^W$cR2)hj=B|6La40>bGHFmKJgP3EaFv^k3^Cxh7pL^pIm;?X<` z>lXc?=zF-=lS(3hxy+o{in9oz9#0sJ5`-!l5Fe_9G%+`%8j|6&B=;#j`{%Rg7o6-d zVNE!C)aasxPF zBCKPao=6jq!vgfqb0v`t^$1>DqyGZE8?e}p);JS&a=D43-nys$QC}Ro+U2K*s$V!- z*`dOP!tOQG@+mwYp-eO}zg`%=-H;(<)>PcN-Wp2Or^xE@xI5XdMl9fZnR zJAF2R730qi?lUq=Qk}z)i%U=#rgA`vw+DMdj*W`eihNw$`L3nb}c5n?rUA;$M_5*T*r)w;s{S7ILU>#vIZ_>{+^?TWAkQ{qV0kL~WoyG(rxk72d zNNFAfeDCH-Ben!O5-*7V7>c~R4Rg8blmc<^1FNKKePsi7ijcHPK$ z+;0{l@06m^$CXZ7b(2E%v;V7kmC^oxCFyj1j4XUosJbvOg}|DKhfci$ys8DKW(-)*4u3y^Ck@7}(L+x6VtqK&a#Lvgwc_m0QNMpe zoW)LbPl3AD9W`YSHN@D0!b7)yM8lac+O}6PRv2{{x(JXuhIuu$z=X3mpd5b4k zKTqHl z&$Fc+8#7k(`I_AQa(#a+N6R7xR81N#7%0=~78Mak(h2th_jP(H(MmcUKwgy&TE0G5 z_jHBMZ_Di2!R~~Wz9{6rPF5z%7e__{e^rhd(uXV8U8LRsJ3z$0F1g2bmi}OTOF9;; zX5OGy^%taE85T-&<$QAFF%uXG8`=kTug#In<)eJvg{KK?iZ`dsM6Y+~K5gf#>Fo@) z4HAS5=SQ;g;GQf{iqN?YJ{p()d>wy^UHy@~`YJP$wfXUODecVQhV_qyct^{ZOIP-hU3z z_^2Fs8wx%Kd9137wLGp!SWF<49aqCx&hULxWXFCyptIYVoZo*I^*-tNnE(EMlc0yX zw}UL)XP>yF#VQw?PPsjbj(ay8a1XJhtJi|{48%TRel?}_-M77k#IA19nS2z(B)@z~n6RI2D)1`(T-G(Ao zma79}+rvwu2qKOf!>JnP^c>$pBJX6U*w~}r{P^w>uu9Z|_T|(*=xN?8A%32wq6>`8 z=>b!mD+E`bTe)=gS)@9Cf}G>8Hfgs)Q5~)cIXjub1~B)GaiWZ^zHHJ+K+Yw z%UAFV&buuMjAH4F?f$@w4lsdp`R8py3}3D{ifxom%6k^PjXdh2!n(y8sLQnP(pOY zZ59(RtZk(|7$rrC+&>NW_(Nh`JRyE0YicF4WI=MH zwAO#dyc?$L`{J3-O2mP?M%#l{D5^;8R9Sc}T6gxz;hW3A)w1U7`SJMV?G!}ScR!{G zo%2B|V9GymIs^>^rHO1hi>I8PQ9PBgT;jL=fbG|c<&X1xIM+Yw?PH{feQ~N;PnC?i z0yZv_SJ5;`FJ=gr^zOzocBiR=9^_vZfA@(pYd>3l=NrfZWNm(>N7dPSLdGhTo$ijQ z#t!kIw+wg<_WO_Vak4K6z`9Sxov+g@L#u(OZU-KamP|^dFXBc#_!exZ^5yK8bv_8hVeS ze$}IVst}m;4ZtG zy(mxlFZiBSUKf1o-ZNGF5)duK48A95dl{!nI3d)Ijr6hHf{vE#>EPlSEX?_3WPhk- zln6o_MXX2kyY2Myb<&U%8eyb=1>qVssU;IHMT`-)h<-WE_gjFV)YdZ69`SI)>bPkY zDUXOm9QbG2+nOO~K=MrTF@4HDk7IQ6@KzQ3$Zw-gj@kpRikhJCeRHlnxC%a&^ImWs zh_Sd)qb?q=_2>Wjy|MAfchhTnbJiMSDAez7b%?c=KS|hD=1VjQY`p8o6b*cy;Fydg=wrFfyWVFM(sRAZ;8*de zpN`rN8zXO}tm}15(f^XhAbqa|*|U2n%x#v()@5V|%p7x7wmvgebtb&sS)q6x*%$jjVKy?&FAcw$S8*ezaPF|>3 zIB6k$IYYiOFx*s*f9d!(UJtq9dZ zDR^_Myu4Z_Q2;u*>-LHB9ex5I+FU@xGE5^n_Vs2u4RgJC-M`HEzF(`}CtY?S$QH zsRpLlNAB)xYiXFI-P=HV_L3w}?Xb)ZlR_&$&*eobpH|34MF2eacJ1tQC7(t(NB^GV zYZk^OEFDQ6TU6p5Tm&O5v7XwIR&pySx&i2Ob>z`75j*%g!N>0Nx9NnYxOgF)w(-#P z0^LSC(cS^9H+iaOd4v~aM>-O+=3Xnlf7;!&_;vii-G}1|F3b2yJS(TU2#e@k;$ytr zwO(z|(wvs=_8a2e^z=$~KMfqSVG61la}BG0qlcM5wv@N_8N34r?n0XQ4F7&ZeEpP4 zYl^sXNuUgWI+PBC95-%Uxbx*i3!A;nb8%ExfVcKva{1Kp#T3-Yyx(EJeOf@!7xgHLTOmM!`)B$A{tI zXP}TPcqg$W z%V0+0Zj^Y>UI6b;4KASfDhma!BrnM#Cb8 zmoWGxMhcLWqL&La6H>2H6-J z;8skAnylL?{rn;7+uY{XNs(q@y$~4<9<`y_zWZWr_jcPnR5Zm6XnkB9?s5TTR^yo= z0vV)rUM#UbR{}R{+XB4?Rz*L}lzTeZQKfNxJ^94aA)x`DGE&ey9%Jxq36TMuY5 z(Q)Sq9LxrF@xbZ9TZUxO3uSKKyN5A1#ICC#kN9PiBANwLtaagy9J8oD3=ER-+x01X z@iqU=)9B40U83SnQcU5>P3r>BbMsmK2$6Q59N62udIJSq2|<6cUmX3O;3X1yySwZe z1T+7IayW8Er$s(EmF@e>)-~~ zXZM#5`_^^ZD~}m3{W`zF+%U&|RC)C2@z4cv76>yhRv&yuGFn||zi!&+!o9B&nx9SA zs+Rb{-HMHBc?7gqa%!|zA@c>oi)Lj;%39>~HSpzoRrx9&60^*w!(NZABP!V8)m318 zlYUxuD7H3X?bIbbV&@AH-*gX5GB%TMMNS^z6{gP$;%7qz5bAK!A1gg#I)wORr&q81 z^s65E3qsQ)jMHuNJt&1DDyvc8^aJJ}6?jT`TUsq${&*;l!ixMvcuMH|l-|vJnjm9F zn~gdi4&rZEJ+(-V;O*?G+L@X6jCEnc3mu6NyMiP7L6Xea0CfQ}u)NC1URMp)}cYvdITUj&ubB5Gn4!oH8^YltBEq7eYPQoJOCGK&0?6diPf5s?;Et0$|s9>H}3TdshT>Y*;u!x{>Ve(Js&dWqTlinD#V1g#u{qqp_CIIi^- z+XxNBZ3_-45qF}EC3#{#`PHA_e^(y7IJwtSBDUOv<58<@=m-}#Pvs_3l-$C5gP+f* zO-Y0EZ;$#ZZJ6eh)2ver&%b~V;7Rm=zsURYmg{mwoR~p^K%P)}sb-(4GlYFOy zdU|Yk!)EM;1a+0FT_c2^D*Eu7%32;2OXJq+#9hEZe<=B%*JS=5?8y8-S&*5u@%PE< z7||Sj&z&OaOuHRd7k0siFh)c(%uYAHClmxAGhGR>Ut*uU%|}R(RF(wg&cKGcmJ}X0 z{Xi4ZI(sIPg4!D3_37y|qpt?5wnJZnw?2J0Z_;Za`2w$rW? zTmqtL-2A(cb5}YT;Beja7%GpZq-p`DjqH|n$;@%D4`@$t!C-Y;d0rRXjrXU?@ z&rgeEMQY&CkBx^dpf1OeDy>h5A14iKhSQu@L=J)U=>m$I1LQ@FDCrzl^Zkk?TFpbc zUE&)28%Fv8<+?-lHEq(aJlUzn&%ClK|&KrgXKr#`*g=m>)4i5(M?`ggu==nAx+fDWH#Ofmkd?PCDV*Zm*5=7)!C!MGM1EY*u~!y$8fG%!ig*m0jX zZ;H$aTa7$BiCZp_|FYvN2oBt0mYOD5_Pk+Rc;7X~gCpURdB#5H8%;6~j1j^@d?hWi zp_}_Rf87HJ2N=WxsgPE+JV8pa3mo35eIYNX8{8zM5j35~+3f}K7TC5Y)m@1F!qpEs zlAk7On)d3!LW&ZZ8E1gfcFyAv5Olg-=SpFgs{(U@hzJ`&lgnXod5Uk^`x%E24 z*C)>@(2;FWYMW>DrV&CSPVK2k(?2pNo%eo>#jy#Uvw+kmGy94yvOS@3F)idd6b(8ZJQL6;yE z%roYk;PL*;F8#RBe7Pn(V-@DQX~v1U-0X8Z+;(1HPBH*mn*j@qs!^V;zx==N8_Ixf zYnE$#y(Y?Sm!-an-I^?j^m6x=B8$is*F8o_JpYv($dll!eMTwPz3W`EXz9?WsSpPb z-*VJ$EJ_*8!+@5)}0TS;Wrn)xbhwnd{o+Zy;2n@_n(27#P?Ep!13QrZEtUe5WLl= zjJWwnb7#b75W3co2cy1_gRwRbt6Hkl@ZwuQ(ufy4KQgl!P~ zDpx3eO-gvX;HoN+!=>3rP)Z5b7p??*U#-|GE+Lv+4I_1%I4(2=7XHEbYRQP!y7Xtp z1=L9umXQyamh~Cou9`}10V6>xzG8ROZhvFQH}_nIfP)0FTc>4vfpUrEF9W1T!UImR z6XTc}L*fkk&{5-;Au7f{qrARK>y_c9g1#ywI$oYmn^_b`@^BGC^v@e+t}8z8oLg`H zD_nUVs;j;YF1|HuVrVxq-ws_IVq4!8xVb+@AisCu+}Pqp@RID*tLJ|}zWPjMkp^`e z3sXj0J=P$l0QiIuo|z#HD)j*mrKWOe^*FsaGtymGzt3Q{j-1TIXiY2@1$m06`~pHi z#W$9z!1N@zx1dG3EVsT!p#H;>AKI0abYLqpY!VPfH)4GtYs5^mx&)^bVKZ#>u}l#e zLvDuXAF!`RHn0MXbsgTYeatY2g6>P}5_i>L-skS=@E%%Eo4PY;-uvf%6TQ*Y!~M<$ zJf$5yehJgmzOxrbz}<-~eUrcU^B5F?#k=5dVtyJbU&vB;BiaysoET^*^h*hZ?bYau zU=fBT>Y`}EZ2cM8`s6=n`eFW8l*{ea40dWH`;i5T2XiZKXS$Jt8x@`ICy^`f_$fT% z*ZY0(8j}7^hGUFIwdrUnIaJ$)49*IKHur7T&1f*zJ|iENG&aRXIiK`!P5-8*0Cc`7 ziAFPutdONN3RE{qX4}<*X}F*^u=f%V8xEI{m#X_dwLfxX_25-Y7MO>Iay3xrApjW@ z(t0}E%2xi^YoRacmizqB{D;c@iZSP7)EkN=`q%K`44@9$%`guhpPZWm3DOn|_Q;LM zMV9{I$Jd0?Wrx5%Se+v@L90cPhouI0CX!=%0f5uymt%$Ns8(e!VHw{qVI$lG79Aj& z^#t5kacpgUj4x^rz|&Rjo4ajX*Aqvq;Oi2OAC;%s+lK`+Lb$ynDElA_306Gby~6+J(;Y0Uo|pG^5ew9e^~my@*vcha-XHfeL!0<8NE%?)EF_) zebx%%2yq^1@=ho1y)@hs~N$Or^K} zi}B5HJ?>X%NKd!%63#$VDq&sv+ktLnu6SNwX9>aevs}8^YYE>6OTW#&ZS)IV^ms(z zUX>uXK45H*U=VW%mHwjV{)FsR%vufwe+t=q$)Vxhr|o3L%jL`fJr|Rv3QNrWj+l2% zkUKLjZBwE#P};^9fL;eh`vX@RYrG3&xR0o5VIBrx1owQpI1* z>&0lbuL&n#eaG06aoQKM6~vz!P4d(Dq^S{?_p6OHB+8SUR*vcdQp~3=`yl};)Amig zfzogl;%0Dmf})WiKi#{dO&+Sct7bmmn_#x*Pbv8?QxtnmYOie#z`c@#DU`9t)!g%j z-mG?SB%Gnd=>*!)nO8n(F@iMtNhf8du}_SGs8MNx;{#F6I9H9QZGW1=+zR)4&b!&t>6Lhe|6uIG<6{697)-z*eb`5h)uS{rpfLHB#?i8=!&{ zczfLUW>s$z2{=!&dGk+>VwTLMyR37NrJH|rQFEUGO{#t)e9e*{D_3wQ6Tb~heV;7E$JPN&*{6!* zU?0sd-9v^?-mSm?vix=M_B~T|5MvKEaWQJB+XJA@MMUGN8_jIPF1|Nm4}@9Bh<%N^ zssBse@wl$USxd{H%i{|%vp&J(`~6hVshiPN!T~&a+t;%SY}Rj>ua8~2W& zH-mMy3|$1xMvkvw4pR&L)f8US0f-rLAOAR*NM9;H+fDMb%f(UIMeO@7* zXJ8EB(NOzmi=X=SL;0PpT~6E;7wVqOJXcp)Gu^kATyiHAAqlzi!0o)5g#7QKp!d61 zUDtBa0+c0CD1o@#myn}BZ|z|M=qU|0vT*ZmTO z+rN_y`S&DoUtf3-ppLTHo$7JMf;?p8NA-*iTBRTGARc?;%z8fiIZ0uBP5n2L z`s+pVvfJi!S2?&~VJXT8EXK%=`Qh#kapIDj$@waj?bTs^78?JT-3s|k^sUiN4JX@( zvr*Sk4(5AtF8dg{+y^}+Rvf18UXr|u=GRw0^!I*tshF=#uu^a%_GJfdjfL^Oa7H9G zq_N>{t|Nb4<$%h90Q z_yTyZ0lht9fJ@^u?OV}#E3eh1AQOQrmMJ!?90_r3V|*2ToPWQO6klbHq8G2R_IAk( z?37{a>|hBp?ohuhh7XDqVNVkV8lsPDMzi-T+N$!I@i^` zYI6y3fT@J_;__*MxjJdy8{;w|D2y9@MQ=F)UR9q4O5rpf9}k8^={Bb!<=vhx&Pn;{ zXZ_GTFiX-s+|rxn260z(OoE-Xvq>0|ahDSlxjZ9LK;MdjR>0rR>sLh*xOUNwIO8VL z4B$2n0d$qpUXSsW-rXOY)i~k+osJ>>G~YkOtk#h?P^nE0lwz1L9x!?$uVXSJ9AL!x zfZL8%ZFdUUuGY(Bg+chO1~kno0t(IqE7J`P-dsyN6wg_cn@$~kR31%|#MC%b%d5;q zl^9MlxPLy0-3pMjdzEK%d0p;t8HcC+a(+e=0;FKJ9H>^yEov=-pLX*t69D0lsWQr0 z5|t#{&QR%`h4HM~eNjtgdlJre!p7X`cwoPxy!!jPtH&C$jb^I_^Qazoy5~{+@w~L2 z2tg$l#V6(D;Vc4_0sJz(-I@&F=f*CA5JQ9}UGkDYX&WE8gqC6`Gl0vTJY%|(HlcFr z13nu6q2s+83=ouE2I-s3k`ZZnSxOuQJ&eFDi;Bu1_ysV6^N`U``Td3R*6{PdjQ)9) zZbJnNv6|xFN2PdoYGUd)+cJj9I*B zPKN4xAV{&N8t-xamtWZg{STw^b^*z`j(o5MeIZw9XZy1vS}1UK{*)IERx!vcj>IJ}$~u1z~& zTBxN6<1IB#1u|v_;x$uQ@X1RfsGGSt@`b$$!k_&D?ODr$X=E1lY;l9 zRVxQZ*K2AS6lvXPbb+ErUx-)wH0wm2tLx44&I}_@_%AW|oE7j@Lo8;6w0Tu8`(kXW zR#Q#5uJEqG+?{h&wdH)>a$N7+o5V_E9a|Tj?wEGN6liD^<8ew+Ga(6Wj zI<~xBZx-sj82X-uL=592=_nuTR=9)!2j0+1MtA_BSb~n^sfWFU=2EnQ^-0Rt3)(F@ zx6g8GHs_oA5Y{VDMan(uuA)RN2G$g-XUHrbs;`Ma&A0Kb1o*K(+SaQn`Iv)HmS!L2 z{XC+^oikbT!af5RY**|4wNm4GDc?(0;W*qzE!5XO5hDS1B;3YynF2vX}h=LyQ|_oRC!yJ z$yT?A5nZ(%)FaZTPX#r@SCGsV!#@p@V*gV3ZL)n;lGC9}Q-Rc{8;FB4;88W6;}feX ze7O$$TyUxtCo-WH_)D6K?TwB2T=W$P?zepkZ)T=BZguaXLct;I?ii0f?Yo$g4gUOU zX>UJ<#DA4Xv@~N98yqAB>P5i|TNej#@ORDvPVNE7VK_dP$jVLfmkZInX8OMk+p^B` zjL00`;;H#KnNlp;rrOu0Uonby;B$j2VC^$mzvx~XBIg`>(f>VJwV2|3hfQ*p zX80+8REUHp7wfvp-G?SP-P~?oiZq&?%P&Fben>JA;-R?91y?28SU45&&C|s_JG<-i zdlceS$0`s$>1X<=G)_hOkNabixure- zM);~0?xgB0l+=Wv3#~a3o+5%**7-O;12z$ni@rxL&O+?Ui-Pw7>Qma_+ZF;D1W1P~ zS7Lr+_dsIZ@-Ci_1*C_wzXg?ger;&&epuMZ8qfsRP0LmcN-xtZdS@L&pO;=TS zS69*9b56llsr}&t-Ay^LO>J~Gf{+54I@K`%%zuv7ry*}zX>%B>y3`*EU;%Pz4!ld! z`?^ODn#aoCSkrZ?fb&(LK5nviuXmLJ@Nz3uIa-43gl)Zy%P09VFvew|A_AJ>$!(UV zUx~az|MTO=&yPd00K`d#y3mcPzAy63ow*&hgu&zsePjag##0J=GU`tk-Xug;MIv-J zkB1~sylb*?@Yzkhhae}EsB$G&km*37u}1jjhY5d)=ihIl+${o-g_gE?7#u*EgZ&$j zU#vRyIueHqk)BtC7bEFeZT{y9|8g;ow9<*A2f9eWUR0t0@b0B|bY;0oB4_FfN;eLh zqi1EQ|Fh(;r1Z}P(pQ8Q$d#Ta0-50)y@aqbRJh!Dv0`_gsXMDC+BM;<|9JDWCRS_0 z3K09y2G1jEIYU*fY7<=RuF8OQF|%e@k+@>`?QcQWzlwJ{>U_Ib6j9N{d_r_t=3@OO z^2k=g=iYJB=)p~*nO??^r-S|Px}7Z2N8Bx3L8BQ>xw$w7WcId`&55D-zRhpX4)Ovl zjq;)J)BjdT!KIu>>16ua$wlyNW#8MEqoW)jbgTg-8=!;dqi{>`|3^ZJGdSxA6n z>f%Dnx9g3Fg*GUxi$}CU5;3Etwbwz2tK7dh!DlF5R{O%B7cuN>83a&s5v4!ch`n^x z(=ko0k?{mICY*3qjgKpR{fAiS3kXA^1E;!;_Q-a}6F}vfJlpWvGA}nt?yyw96|PN= zo%wNPtN%rD6i~F~oQggfps5Lw`Z<=yZUP!p7p^6C=Q{flQ8m=qZt)MqTSXL~^QBAs zU`Pl0g5-k?6AV|*{Z36_=8iHGJz9(t&C~eh&d*PT9G&lCkupuFMNna13DL;`a;A1F zM{b$c!?eUd5Hgnk&W*>Pdlc_W4TRfgv#~&fW{6SfF`O|Pd`&;K* zJk4qR|GTIEd^J0tI%hM^3T-@#R|7Ed%lN^I^T^(|bj%x9 z6vulYktiy=bCKEJx)aE`aOc!la=&8HjDj-Fetb`OWYJ4il*KJG1$_4G&wIRGDv%se)$ zi0h9}w2ycFTB2`t^;|tJndT$jaFEBxH}Pr3IlKTttZ!6a z7tw!KynI;6k{(bMzi-@zmw_R}XN>hpT6yGB!SkNckp995ogT;kt&MSh`7F|d9nCjQ zgc~InI7T68YjN}+dcT(zmC5v<~oZng2+{>y*qI3eM_GU_kQcn zPPs};wavR$TgQPZFXg9j!4yc-BE?S5Lw+pSI_`LLNl&h?H2W>t3 zTU@*fG3HJn)>Y*5rwd#}r)3lsmg}hI1b4^eE)C@p3LB(k@Ns@PzB)j{_KgPs%B+^Y zc1fsqF#TSS;Ry9Za8f&loBR6?Q`X1Q7++qbzz;6Ip2xDF3rMYRBIHG36PJ=RoP89! zwL~f%$YFV^^taR;--P=DoXUdM(rCSf|8xKS z+5ll^#0BjOXStK!-~|InMO3w&o^=~DpUY63M$z{2{o}xJe3!1ZCxd{ma$nkZ2cTJ_ z%Q!;jeYRm9Ff$bugsw}9{b2DQWAKZpZ$sNB^psrGXTs+g(vGdCoieFM%X%N8XLIdP zg2?T=2L5NnOO4uL7R)&rqJp{iG_MnIU8#B)3bYo@)j?&QNWSTW%54gC#*zywBxkBUTguemBxf8itaW_ePt%1s;77@Lm?n&>6 zkzvTo$K$*Ypx+<2Xb~^dqjU+QsVaL<1cMW<(cQ^8klZTVY+KsASWW{_{M}8*=YRdV zP}&sq*GIf@p+sFC%i!Cp8-?CmT+D}LG#-?_< z>Cuq*;SwNs*uEy(QWnK<4&%j+KHlg46QLKN$eNj1@y}u~!fEFD4rwh9C$sb(tEvb2 zr{e+74iPff?i=V$H#c1ko{wuf8<5Oiy$n3}w>{y8iau^hOF~}1nany}{^O&5@$F^M zdRij8BpwQ0t!&<*W>lhduws=aXhj2+5?^iT1a* zIHf@v231@70(pOR=ZC!-5zHX$94_|xqiycJIlJ?Eqtn464YJ;%h)tKrha}+me&QCu z%TWh1R|)>*OjufVp{4A?(jJ9PI=S{s!qSnc>8=Ih?7{Bp_b_!5a8p$hysM1Q(Jjm;5S?aM^M8?BK5xmfa zSVQspf%2kU9Ru}}Kk`CyG=cx4rJAYTi6SrAP_nsQtw)Oa`TPIz+*WRGN^S8Sec=WXcA}ELgc%@(!M0Ykdly>xdQtMK zEW(d$GRM>7l~rQhFLQ1{_D+Ukfq~cszN0vi73PKUw3e}HAvRrp&i~_4`?BWe4#KYL z9gXx>XIVh87mnMAMn{RAfI9;jDh*4Dvr3(s;BVspL(B6Vda5eo`(US1gBYg zwee2Yd83io#PVVML#IcqI{lv^KfeeMouuPDYiUH<=$x3(U#`MWt! z&`^UBD zsgwSrC z6xC9pYD#Tfe`&D=Lw(bKAPY{I{#;EnvzN&ShWh7p_UFBU*@|xfPXw~!U9s}|{OxGD zmg%){)#QnoYP@kLqOjclgLu#8C%)qJYaBB7+al6cn0V}RSChKwbYGgm1PXC`Y8bAT zK9+qa+n1l`^;SVOyZ-v5X2%jHaE%!Na| zMh%jcrldRkdWubea=XN`Xu(4cu#WR-34jm&+2^SIa(57J?7RjBQwaqiOn@##3Z(gqMnK8P0LYu_Opkj6qQji6pq6-Yo zmd#sz?f4p77!EVz|K_RtrZ|9Zr&+q=)8iz?+nJwNpMExTm;59_xR((N0(bK~x6e)H z1L6_2;~#dNpILCGy!~NJkvrul2ZfR?apYCNp|g}^6GGl-PuXlSSy2AJsJw5GGv4Sk zdaul@bBUJejEenZF*aGD-IG<(YOl08gpWh>(G)xb@;~n1lFh#J3L-fucNs;5n{*xu zh(IbpFX3aRUodrB4RfAwNhm^n_tMTpjwSgt;QdHpcvjQC z&1U8@6uv582f&I)F>=rLuhd)c+0a^#P0=ifFFvgJg-4;8gVbGjLkUi2AwM-Ki;%({ ziKZBqQSA_b>}uUG%iz|pNW6YX*SjLnC+Ps8jmvl91i0E_B*+CsQ^m??&V$d?6qpb1 zOn;d1dimdkD^VuXBF8wu_e2f6-GWpg9W71#LMJ8|nMe)vnd`?>%IPux;Y@m=Usbj; z8fjjEyc?GfB9q1^Qoq*|KZb%Au=jJ4lQ69>9}ftgMhtJ&HH?k6lnwc0XENrS7)QG4 zK0T|Mp#($AC5U>t`8uk|Rrlq{8_1H_0r4R0(yp%s1ISEb4%s-B5KXLC0J;!kDl$+& zO&^Epe?eaAFk{QYTAu}}GWH`4BYS{-Uv8^Gx~LNbyEO=s2{_FA#~JYa-m-*XNMj>3 zvjJHd9zuuvB?;?-90^&bRUW{$Tjis}Ig-{-gr5s-#IcKj@d}{-(NY#2eUop1O+Q+S zI-!N_<<8_^2Zas4em`f@&uMYBqwONi_Bw1+p?56k(X&KLu%!msl(JE&;rYW26>$G= zb{;QR;-tKNfEImeuJ`eZ9vdWRm&!1dyIiF`*9UV~6z~nY&AIyp@HQN|ycdys8_(4y zU{d?IB3;o3R_+nWt_zi5DogK}n8&jG2gvJpsZ@8^F}ig6wrh)TXt22yuEW-iRIdu? zUJ%OJtn3(-?!%1_BGgwiqB8}Ar{K4e@ zy0bpR*}d?FyGLWDI==TC#~?R)ZVCEgFuc<6PO4w6#mA)$6PoAB|7*tj#wAN{fLagz zeRu5KI2V_!P{Pe`&g|V;Vnw_M;lw^7qu3zy+m9azs>@MpqyeI;3sUb)s1$86Uh8(%Fv#kqkAPV{U z`{#hX9BiNu02^YvM6PsHu$4IA=;NZTmvNp&p%(ad1Lqc(?d$xvq~E&N6LP-=S>V~< z1r<+?d2l~&rPVw%e&`&POfJL3>X*R9ulUEy$ImOcZ*-NkL|K>daUCU+AHcN~GQ^6s z;K-xWWs^hKIMWhsN=}IJADrLxzjj(HVm_b?j2LzLxZgGLzVXE~b#=$Eu{x!Rij!P| z|K1}1hx9JH1@;RqaKZ)Qy_`7y+(qxD#v&S=exw~=T4veAQm3ow$8DbNrNXaJ=$FWD)FJzBJs>UDPK>ZFJ3v14tHG)H$Mc*&0nYz?fx7hXq!eT=r0TPV zN_(5UrkbUV^ErB~syCouTZ9KfMYeNN7&uBkvF^{A|5_xgY&LNTHkV`#5J(J742&bp zw53`{-mx$k=7Yp?l)G)~C(NJc4{Z1TfPKyGP&kC044M_7)a9UT%F!0acARAc&S8x;-FM1Z80!8@S(H#5zx0`iIkj&J>xznQ^uVK zzI04rB*9uEF9Z~V$RgarRgMI0{0hiR6Vo;6m{I9;@(v?8SJ%@~>z#XcxDyz+85Fr0 zD$iqE;M7+%{!(AR-j>*gv2QqX@r<^h8Rrhl8Q|(wL+9t92W{+hJ#B4Uj1lrR&HC31 zgBqom)+Q>1-q=Mf`tXrycw%C?H-Rx%)a5AB`E=t9kN#oHOIxU8sq41G1Jjdvwv)+3 z;OBB%UD2uOb0qePRFW(NWj{fF;Uw4flWrh}VriFNng-bujcG=bXNPzPnZ`D}&H^sC z7(RbohWR%(Z&(_4^3qr_5V;gUF-LgA2kq4jt7AZ)>j;$P(q4eGgk|oFS+9}qrx1AD z;CUqSQ$I`{+TQ6SEtca1Y9KW7Y17OWIDm zH7Eai=k25t^#Euk`xk@W+^f&n1|OKe;bCyl*A8X}t;?638%$ftx2>}q^BQVJo&Ph9 zy5wiW5}$8O>QVL4J=Wem*BenagsqjQ?ud-LvQM||*;`%*3;bcxn=wIqr)GE2vg6s$ zL(hDn(gg5KkH|TgTs$QYaeK`0l3c&C=Wk@}AlW<~*QH}HpoxW4SbcK1)>gn-rzUCl zb0=Y`CabEPcV8$!0LDzw4}B-}e$hqmVTuo0fnRwqx$Oi?>!uEEn*v+^+3gTEQ zc0KXvVcs9^SjXHd1v1SAg!(x+Z=CMkQkMRp6qYuq#A<@8Gk7QGJ~NS4*i~C*KE8$^ zTOfn^55y}!8fbvbRG%xRl^T35*67-v>GrlQA%ZSF)*^7J;BIIT(Pv11r*-%9GP&Ci zOGc#UAZqT$>8sI635vt_D&m+>RhVG81N@+U;rvQ6k1w0HqbyUf1cROgBp#-l8IQ$X zyV4zNpwmL216yy_hsyOIpjV3c=%$BS-<*|<*-aB_htm=uYM9RUe#&|qr{T4>mkU~c zrQr96YjAU;t`v3{?aofm@)Cd4d23SjJfrO9b0stiv**Ig_2l#70GVrM zQar~QNVZ))_nF#j`%+CZlh5G5db9bNgx{&&`vRkH7kzV?5H&XZ`L`{Ep031+m79Qy zf#;5wccrDWwE2bc$~S*&u=zgjx4COpIBf$bDxlMRr@{>#qL5m18?A@M167v%*N(T^ z?%oX*;M`fkuvSpfFL1lZQY!hJrYx*&7H0PdMjfS|oyI55J5Bp+sB$vHptM;J(3Sv) zj$Ot^vpkC3;STLXH?PohoU$f)HRdg|JWSsWHpIVY&I9gJ!iStQNSmf#Ol*=yCkLsD z2jemu`ZZsEXMIO1#NIag#v9@TIEyr)`BNcXANu{mVAI+@JDf8w7kSLM{~GnqVh`@P zozZ%15Cx+TQV?3q8J-rZ=OAOD=u_V!1FX4}_fLf0$lFIBr5B;IRA|!6=zZQjYN}~6S+rLPKf{Au>LURofKb#p8fU=EE3E>XTef;(JKkCG;@2) zq7%2Sk<^?_balYs8|IzV-njHmUDR3?Ql-QOdGpNjoT@-6YwTE@r5XR_<)6I`%PRx)wd(#gVcs~<_cpos zEfVd-vxoxhbF>Vl!yB}wRW+Q$)DCb^f@dqPnBS(nH5B8s{ohK`1ohU=_h3^!NLy@i zi*MGsPmuKBb+9{lvLe=(@V@Ymr;1ODN;BWgKyLL*FI>(G8qt%tR34Haa|6^QvvV$S zDgJfo{ebr$wq-h*E|};$BRK#Gd_asihPGG^y2`b~Vbsr|&!Ie^!S*d39lf^N8Jv4YS;iKpt0ODr4Q!Vkv-`umZb3X$7(~hvNi>bHwXet6qB}zCU z6_Vj8gQ{fy{@jVJ?sjpVm>WL#>|Y7|@#UhKd!(H&$>o_2p9TF*PZ2^13pMG5p}z=q zNFts1pEmekm^bSDbhNKa+Tygp$m(X$*$CsTdmrztoGcJ^$BcXjOH7d*_r;diB060y z9!i;5=j}K@kMMn$6K4z9y&q5#$MB|ND`w;v`L2DN^UlM+z}mGUf(u-?%Yv#&kif-R zRqTC!$hvRz8NenFJj7>fs3ME9;MdaAV{$tk^F*sW#_lEns>+H zaYI_hJ=HP=Ix8c_`%MsrGgPk{68OLs-W}?nXuovqP9=0qIqOA-o(zA0vZ2XjObX1I zr#o(geFp^ydc$Y(nJsYY^7+wWRi$53bm$t?EA6-JxpavaI%7CXH`E zFAJT}NGi1cNL^iK$yaFAs!5L&Z?{Hr49<2j05=`hftYapf_iIK7I+1S#^89leq?zX zKQg71eOv2cidfU7hiV0o5dal$=$k$7-P6o8PJ!)L+&r5doAJH0)?>3E2aBX!|u8{7qf__8ORB`5NhxLge ztRp&w{(9G4_H_PCirF6$x}TZV3UTcO$NI?(!4rMnXp}vfNUiud61!Z3pgVCsRR5UN z`V-{+2zj#ewpXV+%Z#Ky(vNBY+uAQs^I6s2M+IdxXCWoUy87#vB|lq_m@&%_JoE)W>TetwTmGC!-`+nthz;c9OP9lR>mfzJ;xz)IHh4(oK(qF z@)6|(Ar0#j(|+dW4?6tczDsO&=5!3V*hNZT(RI}oCNE>?GM!XqX$hUn15{+uk)ghV z^Y(Jk24rBdJ!NdL2R5H2zSaqPF zhtjm~od4Al2|t~2P5gnQdgEOeB~YP@A=b}AIA3QDAV!+rP6yeGCF!O7w-G=600)&L z%`6Gy{ASy&yhHJcWw%CdaZ?2Hb*pkEMeDm-4^;vg6aBd$rJbY}H3=s^N| z-~tKg(#B_8noVXjV;`~kfNFXWN3H$`=S^+EjU6O8!Vn^Dg+A4()*~$pxFWY) z>ied4cQui~a>>YceSvv5N#c-I@S5lLR{yzCmnI~Dmg`Z9MgfWg&(6q57|`cxgt*)TIGZagyGG5|D7|5Uz906dz(W-NybW#Y zF2>@vQ=>kc@VQ{r`i_(u?p_9y|INiWJoMQ(ZnQHyWDp9(U}le#s*R7L(vR}Oi8p!< zs9In7p?eM4>s+9cgd=+VaTQxIl$2?YS=`O)dl&VxIw2WJvg2IG>Q(yk@_$GQ*CtY}66(|huTX%(m|dZBhH8U zSC?MZ7VH?iqGO3nF*M_*?vKJlz)xLC9byL~R&B|=APUmWPqcrae$|nf5LjQk>z#$S z2x!jijGgcs<~RMYO*27aiwXJ3t&avdc!hcibgJ+vBnQKzkeAhk9o|RgVyakayKiHx z%#Xdi-7YycpTFk#FNy`{zS#*!;giM6?&iKvoHd0tdC0f3N@f*(l!-)X&nnmff7gBwFjFh{H zXHj}3Y8n|fQNpn6naUg~p^me4=V7Rqpu7h;?O%*vL?L=M4o{rI-7ZsP4|$K$dvwX} zu7A4)vW~K?3zSzs0Z#uI^Q*jsFxs2Dt?otGib*qQSog}&6Xt7kXG-V<4yms!1YDEh zXS4phoB_7FYhD2`Nsyql8+RL}#-x9_hhU}-GY z!bd6wP#I|65TeMSM&!-msY~U=Jja#Y3(n8h1hqzNeyp@(>B1EZQ=p0ICcPy4<7g(R zmH{N>QljS|{?(k9F{{%3uIk;*b#(D=Z7~3$_YPLVR^2`O5kETp*%Cwd3B7!Vy2z%> z&*|LT2r4FJa60?p^ymScwUpa~to0(eM4ht|;q=Upw~Z7&m*;Ov4gG%difB30NC+K) zqd%gM(U^I$s;f@YRefO;30qoIq(0NdyHbHW7|@MU5dZO@mbAjz7D|}`TLJLS&CK;# z*jbghZCWaK-`@O;hZsugi3PD$ig(C+VCP(y&cspXkh6G)XVxtEP?fw-zvA&S<4}s$ zV%af#!X(Ulc)5o2rGx-cwGZ#`eWeEp>eOynNqzym6zZuUkWL4gN`?}h+H|$RQw-10 zno}NaT7)O8yGAjY?AmuAeuhERaEFU{wtDE-Xps+8+=4kfIc_pvE!ud_I;lMBs4PCW zxHr9nYoUuU#0Gi>Yo)(5b{C)3TmN9f6L~6e7fOZ`d06d|OTo_)Bim9fhs5%%THj{r? zRIw#?j*yM;%ux0qH0u}C`wO^Y(3%=APsAP+Nh|k8e;!@+n#9j77_iR5RYs8FDq3tH z{fqK4S;99pJxjh&-W4Ip7%<^#FKjBP zEtEW+Hbe4DZYmV~?$F3I+7x!&=gc9P(3`%_U%%X=j-&? zi|G{IxIE7W|Y|nZWWN2C#B@`zMGrVRSf)-4g%T&sW71<=%ppg-0Z%6d;7pH zCBi@&tAS6o+69?uV0_{5C2k_)L<4Bbm3|4|99fsZA0U^w`dO_>kD@;(cmBZ?scRnT zMQoYXCacqPuhK%q8fYTtZ#NDu-n@FPL!V7Ic_VG-rMv8HMsN{j?aaS88TW^NPalQuy6;&$?Md z@1$m;h_|K*kS3UQMM;JelJ?uZUxiF+nG>Gv=Jg_!*PinXb+~zx-C)+z`v~3liy@Si^0n`Br4H*W*TP0~RsQY5Sf zc7!Ft#td>7rG2F14r}*~aFNFhi>)t`@@bNO+Vk`9r?Xrzy=3#`-LPkc(`2-L;~|fPC6Zx%Xt1? zv9D{42m`#Ma$w4siLJf*Yz<Y*>Kchk z3Gra&`S1)<9n-CZ{K%q!>+sBJ=tKK<>9;bQoM)toJo^^Kne9vAy;mb=>By5|HEbRW zDyS_!HedS_`UUih;svSJK5l3*)L8s)O*u08f zTyXieqoR3FsNoD@Z9oz+qGUWQKNkm;w|?+wXj4Ov`!~v)U`3COo41!rCS$h;OBP7O zuNDiYJ3DYJTyIyaxv(YHbYC|k-}NRkT{;FTCXlSed()_ro5x# z>Way~hv}6%7?yxFMGPKD9wIt`>>T&OB9EJx2x(;&+)go%nm+{I92uww$#b*x(BiNR|y~n2k|mU8hKMl`2!s zVZDIjT1$)adqMp2KoB}E)ulq|)_5p}vXbX{JRmK(O01Yv(au>dn>#o~iYoZx+1uWw zY0RpEU2b8IJ!b*;L7iupwP^qjGbll}?1Ad|VbFr`k9RLUpX-YHMNmDal~Ml8u=s2~ zM7O;b&vMnzV{sN6L@5(F83kI9mM) zK@LtJ+a8P_f$S{&S0Vnt@FkH3 zu40A)HaRTr6?4@}B)S%S);-X)4nOB|HNUX9W)9nf0f^W}8$*^y|V zO=WpkYyksIzAB5~gg+2Gx3;L-H!EvvnsCI^Y~v$VSi%*6d*qCkn;{l`FmIpp?@hTw z@7R*_O&Fz>f_8zGPof!SSE?|h%M2zr()9y6T*m$Dz~*-*^?S^$Ex(o)an%KYPV&vU z>sPFNw7mVS+Nq4R!+`QI<3xU&@>0CtqWzHI+ro@S3op;f*a_%0~kw4Sq4S z{yx=r>zTH;Ize}+hYv~Jw0E?hr}&zGB&T4@P`|%nDtKkml+1-WK_yF4W?8*EGAMg9 zH+{zEFWdXuSTUV)f*-9TNLL*4B>ABqeB&F$n1|XY!{*zmlJORm?PJVmC@NT+w|yJsM{TI2GlOiwqUH6&5$bS1t+{d^`3M z;QnGZBkc{y)mF|Fj3D{_R`3Tzl^PNF9eN3&?Go2tAD&++=>=fjXjx?783a=*gM@&! zwV11{UCP{tc;g>ocLUk&nrq((FR5XGhg!PbR5ZUqe_l^v>ei3KU;<9W!ECo)BM&ru zqYTfV3GL0>O^aocMi7*0(CL}fp{fT2juA(MRf1k=+BB)d;^@yqbm95 z-cKoK>jB&j4-M*N{Q`Ms$RBw}6f-fsi{P_R(ksO6;%BE~yM1@^Te0QbkS1Y7o%A0O zdA)exB^MMpbLi$X9A}d9-kK#GQkB*0KJUpVR=Uj-PkJ&PyuiGbu*wem2&qSqmkJq7}8Yev$>zPRnP(vR1Y-) zd?kf9;&=05J(xtep0Js^qqOK#Ai?WaPi=z1oE>;S6AsA?DU^KXxHs~7eeD+oA2J^- z{q$neYEZX#!r7E9d^Q0Cj`L&&Vt<&hK8vtd-t?TOk*iCe9=I*D=(d?>pWNn~Ibg@> zmNiyJL`-Rv!nT;-@%;JOp;TO-(s~auowVY;v&b6ivbVO*UO?1?65==+C+0xu&z9>K z@_6N$rVW2@EB?Wa%S_OHlh88l%?eAQsD`<_rE~Dj2h!pz7H>TG=W3&M`vH_^_j+=af@}-LLP`oaAkq= zL))sKL49LEkH-cM>qEL)JlVAVCem?y2r-az#oZBgOPYZ|LrL3{lYb0(S+qxJ4U4N5 z!7BqGyGBHj7fMa)-X^_;x-g*@YUvlqE4zIb0_xBdwvB>zfjT=q83J^`Hfb|x z*0aJDX-}8DlsWoy!Tm;XFHyWs;&(CE&tO&Yj&d~5iVlNcdn%&qgM(0bLaDV{(4mM zE5rK$QW$(VMBPw8 zgEP5lP&YN~>^soGw~eT(B5Yc4DY}0`^QHlyI*-(I0c75BM8HusJ1Ig?88`4e5#S|X zJ?t>;nc%Nr{bJBNfe_N~O@mK_L7Qb@dysYuj7-JC+O2Wv#Hyx|m93LphOf_4zwqem zCvKY8vwu|wP6Lwc*&0|&NIo;BcAWsZBjI9Ni<;^&_Z#Hh7QYE<(c60&EkW5%p%!1q zXQ4hQEb8CNMS;@khUYs4^vU;l{jLq*utc5RMP$Y0F^=Vv!Q)B(F&3_&NxD#&XeJN<1z%q8_>`d^f{Z@qRVwmr1N z?TBBWX|9ixBWaEL+0*fx%K1zdQ6Sul+gbmfh_6q_4)+M@T>*@Uc6tOdlx5hEkVNwH z{cP)Va*NthQG5RDZuK9CpDVNL$$Gsrvf9Rjgbw%Wv2QmzzE67RWQwqAqKXzvu*(+s z4+j79rY@@c^~j!L!;zIfite>37x9=R-Q!CCZpBup+rvKNC0Kb7+#L5GvfJ1LOssu&~{oMCS z7I6-0Wm}$-Vi&!YUpHdkq!a3r7FDy~c8V?g8LsoTkPHDQP=f~!}h8FshV&kg!7iFnyH>C1k=bivK3 zQQep+i$v9wKkpJa%u!|~*oJmscF}9{{PZ&EzL8$i6)K$YxbziZv?znLJS5m{+!E*u zJ{7=)HO&Q#;aX8_>}!;p`6VpNbvA`I<$83w=9vmz7+1Cz5j)+})xeS7KdafsVWJCt zZ3VBV0VCD;RJ~ovI3Fa>u{kLI1AlfLw{^jJj)s)jzuh1q;_gm55<7i$Lr~ zP|j*lAM}K8zn&2NChOomQbTY4KW*=|ojKNqDO>>yN8E|ufF2SW?XjdlpewnACnEz#YQ7u0u=A$}W3!Y zYT?E3VA`cI2*<^t)d2dCq{yB5TPfvU3C+$Pv=L6qnV08&93XlY#>^1vl96sus!`R# zDe`-(n?KM^oV`%kOQ5m06cXj9E`r;_I3b(Y;cb;~oDyCYl?({-{n6OFKtGh}0Z@{~ zhJ2|9NxHI2k3FtN8sEjDN-if<2p&mbr@#ijUkLobKH;F4P~LB{y3u|IyT@QshS&sB z23$~3%JAEW_KM|9c2&HCd?#KA9VE3Bm@wq?U6YDv4hoFIC^?ROt`qZSBV|Z49!~}E z-Z5TC6Bc-+CxaT$hfhUxnlBNWpRf^KMwIDkQ-x1}rR`lGo{KM|d7YODeU$udyj}pq z&{!xWc6DRib#l+}GkWwZT`pMe{*Ls*z@Q1z$tiDY(N+`WZ*t#Vq3a->Z4*3e zJD2P$T99GXW9s$}@^Y{!C>-H~0?t!axARji@{OsWYT$4sNJ>MvXDPdE>`8S$KwfDW zJk|vT+=r^d<1oR0kW%XpN9I$eWMMR*v}kwIA7&)GA2ajXcuKfW1fFk`=mbMY*ZYHZ6K~bcz_LPW zEJQ-n-M;TdKM)PqTJICvE#IG7Y{kt=e2BkZ8C;W;gBl-XZOqE;*mx z^T|IE6DXkEu@!KBM&ZLv6!7v=oNPBkgaEAwu)6qHYm^LaBRlkcEZ>?rtDf>W`)*bh zcYqk2t4Kn{MYku*yX}*8;$2yA9}VC%xyH59PT>L`ObHlC|nvoX7^U zAQ=t$F368u4Rf4h5{=w@cikUD9NO)6b zyVZz*_U}V|z?lIc+N(I%V^lcTw}>; z_G-T@GqwW|(p&D1MdTbPQ{g7q|HNuPbmEVzzOS~dYP^*kpep)#yl&p z0OB|J(L9KsMfx^nLfm@DEDiN(0=CTc{D}ldX)x1mSa?%>MqpEoMoGuLM_PX-@0cp` zxnSzLBu{Pd@_jOi>{j1sDlZ8#mdfTDUVl=qsySJDj*VX9V)S;D{$`Xq~5MYs-i zT4Rjq$26{&{sM_<9W6>RbT$+9ilaL%|^!-K64}1{J-19u7Ut2zKGf)Ejth_sv=&_?xV$y&t_ZhiKS@V^iI4dJORH*&dd&`&hs=**{lx1~ zKq*?v7stC^bRbEZhYd52wK`jFkiaZjYj>(B?1jpM^b^hxMI~uS)|?Kwp>z*4*lB|_ zHVriGPZCNP#0J2mi^0!L6TMex{!9U4KD{~Xm2lTOv;I(}k}<{7V`^ADn99$Nc*ku_ zd>h{&f8%v*u2Xh-mF%-!0!cd8~apNMm?$5Bs7C7grc8tUN|cfD;ftR z6dD>fQfeD-2(xJgF^4X6Kb~{eBWmB?T8+`)t;jdRi4L#Y6ZI%p+6Hk2U9QyXxon}J zpjcRS+e_;tiIz1zUD`Xs4@3<_QxGdgr`ety!F`gxY1XSg~wn-(XblBFP%fM?^JPZxYe z-y7b&fxWz|jTJ||#}sJo)SN^bs1`)01-|1tv*B=BP#6{Ls?ADH#5>HlGH)+solI6- zsA*4nm3k^x?@VI=aV{I~MAe&lvqBL#I_UeTzQ)r2kQ*vYZo+9RrgnMboLwGVEu39P z+I_LrPlIwl8ojc<4d``pbm96aO9)|dtiATEE(sWfsI%6Q)1fpS0m#+3_D_HEoJ{86feYZ)Z3wU*YSN@y|RY%3@VO$$Q{wi zKX`{jOyoGt8&W)@b%ckgsVo$hjZXUe6UskOvG5sTBxgxZr`-o1E+aMKPF1LG4@>VrKU7m2c^iR;%rC1K5*o^ow5V2B*8|1it&I`g#>n%qbUH}9dx!a< zV4cQYEuNixJW1UE_gUfutpe0nXO)vMrVt9=(WpTNK>Jvw*LR_uAA9;kzx#(nL{={O zrenDnZ*T5w`UO6rogDPfn4E&Vca&G=4lGV2tZ34m*LT#8``W!RMX<)bd@TZPjwGR* zr*JnO@2wYq;+WZ*m{K_r$)@d6S$D#|$5m>OtCC~R=0wfSh?Gs~=uU<{M)Zf;V^U%% zxv7pMahE(i#-X#_2eyj+E}X(UPXP%Um^ICWLGh0Dr=sDz$rm=Ft^#F;tSCC-adNt; zlsH^ib5iBUUMGF#bm)&ya(%yBF>=2+G4{!c#P#MWtNnCQ`+fndCFRPcxp{li+Slo9 zM$?BtuR$VKvL)ldGlfDiY+(_oaH(MCzJOdW=7oQdtBge#7&poHRsWGDB|pjFqr@1H zEW=o7ZwWs8)8p2MZS0UY5jIJ@wGYsi&+nV!J2{Drwz?ZI5A31>1~FSU2&1duAI9kv z1#QrR-7ZzoYSk+73F5~)%bIl_hdR`>uFZ_D@JZgl{af-r5BK8Mu3cLl=r&#aRr?P0 z)qkdz&Bk$jHEXjdkMpXb@P-TEYG`+h#F~7$Zm2o9e&~I|`7X^|O(kdYybD|MF&^5DFi7q1oNx5nOr6hao&W@+yzKeXb(T;5x5F3ugO>E09vuXLs~ zsxA-yNt%8$Xo-8G@x2Eqz?JyCeW3RK=MpQPdq5bvYI7kgr~<% zPdIAoBlPl^?n9wR-QhOK1cjqB(pZ5OA1L3C+ZR@;sK!|26P_TY)?Lk>yEGab?*`xA zM;n#z^yQ3|G(&v?`5H}R!FH^AP(H)Jbut;H@HPutHwnIKm*)xoV7wiuq7Ndz;Qgv8JCV0xv+tBgyW09Uy? zmn%Ma=U)0WrWaYtv3GDRZ-~&oLxPG1$E;>Scsis}pJA!FRuxV}b0c3rl;t}~0f|^S zAQ%~=FeYz5*XkxeW3Gv;&$?F|1@39RZ12}*cn{Worh0L&F>L`=H`)fV3q&fmosqPr zl00fk4lg|;EJ%NXSWETZalWUB5fk$Jv`V^FAdn(vQj*3MF0PH;%G010RStv(4v6&k zjst%nd;zksyu`?J3#-SSx7Rt{)KEirZpgb$v&xtXWarF^gZ!?$(<@5kB#Y{Grq)6( z77fL)LHd^AkTMC9a5k4`B`JPdxjEYVXE-@BG#OMByVMGuV&Ybr9)D3uCF!%puP8|w=# z2UqD3t4ElIUZ{HU{W4^&1ZJ+uz~u|H`%WInGUQ;y<=r@Zr^9JY$rAB>2d|6!a7Y6= z=PG`-7wWNFvFvQ^;^YI5Pow`ujPGv&Fbld0!#H08M8VA@j&(Na;%!TSZ1m`vjFKyM zTv=c}ye}|cZwFcB+EESHp9L$WkY$FoYq)tfWi7pj5Muer2k1eY)qBR^7s$7Sr;46g zvZP@O+T6>9tC_la9_w%I?b{rw zT^3JYH#pgJ_6*$?Cxh=VM;3C)7&Zzry;u!k-nA_ z5R!Vmbl9cghA_u960^{OxorIh7Y zdb7CWy`{!?KL^gXbQurd;fjF8yW6hSj@e($<=j(K=+AI0rS7#!Te$cx%~zcCj$ZvD z2s(MB=#$zYEFS_hVxhNn6(sj4FZtL@r@Ev*a9-AXgW1mLm+=73^F4YvxIUdI3@~|Y zKj+cFBZ)*UlY2IPrvZL`DKsYRS)sJhyi*adQBjwSWV!<6^VFW{S_a-?^*m60ul}z6 zd%YS)2a#OpN~^7VP6IPGozJuNbewcCNV=yh77rBjV|-&edjt46OJh2u1)WPpVC|$l z;-o(|f3tdXII;E(9(_cw?i1Qq_V0GbKbPsrxr)h1Yi(D1waekI>h7)XTodaV9pq7u ze(X#9JY-_xuN=)!HvGR$gZe`ff{q%mpBiH_+9j@|j1nS15-KX~)_p~r$So3Las!tj zsdq8{Cqn!VU%num6&AzeYR6cXTrt4To!b)5n-l`9FkFI^R_O9j=GA&{RR5nZ4w||e zc2TL1)~hdk9wDdWJak6;jKZQB1r_sw5}>!lS(CnV{=BuxeL0=~_jx_uxFf#X0T{w9 zA%qn;!GQJz_lM#cg_^R^`Gnv}a2ld=1P6x$kzZ^3XLC)IG9Phww_Uoko+iq@c}71j zf9=-Xt8%(?$!=qPA+!2-5{mBa_Wz}Igg%_>^W8Pimo4wlLodsEtu<@n$BitT9VcEY zzL2+ul-?WemOoC=|3xq1-+iCIHB@Je=&o^vT%AsC5-oKAspB4&JsjB>)=^p+21xG+ zMh|^&-}?pTl~s#4fko!xE?PEC)v_yY6=L>pq+bMmZ&uc8&tQV!#*&l=uN zsTKPSBFGNrP$Wsp_Y0-BK7n6Tz*oRbGjOj>emL_j=@WdD`xFuf4}^x+>p5>xug&oD z^4?1CaxixV7D%MuNf;D9P6X6?l>Y7qb3ncJ;f5*H$bwMC|-3I&MII5$49rrdg0xbp(!1z6t^Si6x*LkfK?<HqScT_Vsqbxzs6H z9y76)W$&(MFGU3xD*4`g;#Xg?Zx1R-zVu`{qJw15rJIr-NOTHCL`N4_%9@};fJA$4 z@-v^mKl%UETk5q=ROSLK%j>|3;^``iPj?SjF>xCtek0hB3qi5t>dvNs(Lf=8SrvElF7@W8;QMoB0CyG!3 z_6}rSC8I+S>w}R{oR!DfgPjua(;Haj`+IVN+p{58^_a5g4!t>;z&q((iE{0xJn!3Cv*%q%Is!3yblCIwtXB8pG|sEj*EP&fSo!|g?P>4I z?0k5Z(8=OQs!lb3OrTIrm#+P<;JLd#FzA}O-9*aq76Q7w* zw2!ui`jV7J+mPHO`Q}#IKf`gq$}o3>z|FTg%o5w^ZzM(Q+&IZa0%;U^I;G;siEZh? z*2lfn54~udL^w%0C~O5eU-W8y24Ot5Nhj^#A*~f|_bYjZ$w9lO?+Nc83FW<#d*m}v z6;}+FZk~k<#U`Ei=b31`P=?a3^Q_iTl-u?Dg~?BZ-QIEQW;n60`o*@Rt14P6^YHfD zvE~?~FA!c>?E^qO@$#OnxaDL1ZS(y1ALjo)Q+*9qJ(nFxkKXENcv|g?O3JaGX9_y9 z&XKiXc~vaDr!uU9K8y0zqyD!Ue}0I(JE>EBEY`$}p+s))4obzugK%1v&1XG2Z7Z`x zi?CYX`Z@jY|M*uMH~I6g>tBKD+iBqGNS0XLwsap15G!W%++LUAENu z^y@g6-s9r=L35(U%$G%PIFw> zPCAzT{6zT0&HC#%zk5Q_OIc^{A79J*_t*UWl~0&oll@OhoqrrtA;Qe!6=IsNqn&8e zP6Q8{<5+%i=dOhw!|8VY{iOV@imu83YO+rmymfp!Qybb)Z)+P*7g}84{F{L)61Mat zuT&Y80yMDyZh%$3mcGj9I&IAsA$}5%%PEqr_#siA-gHPfPep68J*2pa|C@~KZI;_9 z|M>d^uVMQpGAt6wWLNN*)>s%T--uod(Eik)CpU8rtz?8a-8uow>R*=2<|tO< zzNqc@FAM#;4=(M>JO%2*GFWqXwRqmTvsY&MWy=5hJ=bIU`PLhb{Ugbc zg>8?=CLC8QJ4HZvJ`j|=bRl@(6Ug+|<~J#$7T@!?$@vs^-=mras3}}|!#<5$b?;nU zDjweG>o*Wz0hG{_Jn5<5K@=lWy1=Q1@MRpxGyF_1^&JiGH1p6M?$ol&^K^AcWxA-j zG%{j%3cY(8{EAJ#EbqtdT;&3%QFY?fUJ&oRa+{G)IzQi94)1KQM~(nZt`A=m3p53HDx4vt5)8GoK)dh$L#*50Q3lRQye>`zA>817A1g zIb&QaXKi}~*PM$lY_DL|MIX8RzFCo^46=ezzIOWED&`I5O~1doB%pwwfsawjHK5)> zAtq{Ox-40WDApLr0V@(RJTqZ4Q~zN6+6Z57)pU`DCqo>N>r=mA6tt#dNpL;(ta-`I z6}4H#zRy-GbsrNu_0Ka=H~zcszJk^A*jy(8@q^kd$fLe`*9bmI5RhMkM&NsGxEt}) z{NlfxoW2=}vS_>Uv$pUB?F|W3`VQo(O3_g&=23PVRS5h%_856EJKk}6D$6ejRbsfO zHhfxRt=>*|OFxJVN&`;88U3_p&4%m~ex8LHcAWaQh!^sAGlY9QHt}C?Om<(7Wh^5! z^L*=bS*f?|hMNNx1|yF1*=(lo(@iiZdL>2y)YsiVeeNOzr6 z!3fV`P1~9RqC*(e;$Koc1$bKHr}g=!Y>^Qo?xSJzHhBu$zX$>sN zv%Q|s5dCcPf1A6n79RVH{5j%C7@VueOpfK&Oehn8xo!^EA)1m?p4R8B#OUkuKiTzC zz1w;$U8lZ)s>{*ZuEJIg$l+90@U)*(rmyL#B21!2{Wl_xU(!Ck!LR@S`l?~S-k8_H}r}a+}${s&j@Iet&m?kX9~{NW`K;m-a*}j?@Jz{ zQ?}@xrBeeX)Ju=8ope8+wmC?nxc6Ya%P2w6w?q_Q9b=>fh6pNFRGSW^v5 z|Bfub&h3W+jo3J#l)bVIQUi#zo3h^C3BU#>9dyo#(bJj2scZhb_wqkel283uHt`1z z+uD8JRK}XZH;>siuw%yS8HL2C&JNEjB*fSKhX(5^_m4dDTj$6x!X#m<5Bx4&i30Tn zpU`IUflv@bucO9iBS5L>Si^S@qwfEJyxnws&-r-;xnorY56@XVCnMd+TeM~qj=4=Lc7C&|e7|=84ZHgHSH79n zzkmGquW$Tk-~D|y{j}@eZ&m&$`|UsDx4PyRCZ2@!1pERmOf}t-NeSBHp64huU1w{K}|mti102acaRVgyF5g2mAvbn>XZiAsiSNK=mYC#79E{t zueBVfnnePdmjtz8=~o9U+4*+$B>FP2jk<`8m7JhI`;VEhIZo} zTe#ma=JM?-4dkpICXhtgtuQ0my%Oyq6FrD?Lh;IN!NokIh0ryLLwumTb?JRcDcivU z@-7)r*OO>ejJa#3~1OYo~?~c2Kdzx=c&094&U$kETSgSX zXmWk{0raxyyybU~@)VFKykBwKyQF631Ya83A?O=2{5o;}XA)2OA1wBSlek?0m;{oEOtu**xwPBpG%JYY9xj=aRp`vJ(DWS|nETz0_jC9$wqHVh%i2TF(52PU z{Bm1X#+9?*B8zSbIQw3iv?LNBh1!rIln%9Q@7xQxr09NfsuMR#pA)R*5+ zL4Lt7_0t}GK{-&bRrkzNik*7KU`c-Ao=PaFrF$k%mU3VD3(1`}-k#ET6!wL$x{F3! zA}xM0DUVl38msFa*futYj{ns1z3X0 zXr8_J8A%vTr3e^q-;xnzA>w1DetuIcC1g#F(DNWejO$HYPSJEhmpf!JlIaw-QK*vn zu+mbXKcxCOu#$z#F_+SH0XVH&Kucw1s_SGrGZSWIhI!pCbgU&o@Vma_H_~Gs^XA)Q z=ozV~^u}L+{9f~Paf-tS-_Fn^CMVD6q;&HjTs&v6aC`v$;C~K@CtL#cHn~SG2;PeA zUDk9Fd&IVy&u4@-xTHR3OLfvd!+foGa;wNxwvn}VZo02*VKj2L3^apm=k8ZW#QH9H zIc$Xd^a_twQQQ&QVFnA|-vnd2KR51C6KL zugkofV~Ys{dy*-@9V60#HU>vb8)8jf;{)I0z&Cp+o#@vBx&CP2q~@dYm#df|j%^RJ&Fw-0|HLd)}jm72I#E z>*wef{rOrDkyBn#^*Us8-u-@!$Vf{0T^1h#YjzQGY|pqUa`Ra%sL!%|!H8MAU&(OF zP84Kf#9baYy#QxL&2p+5p^JUr;svg0-lVoFvGyqG&P(rohKnHOOkl|FH(PUB^#NVrObJ>Ivsrf^Z zg>TO&I4e*%LKi|;vCk)7?1uoeftElCgx-~XmG0R35Mpv;pl{3cIS>zN=pJAxF zemS%V;Lece69mS$7R-uqoNAZl?_m?U^p)Uf{xHUFKHHG_p@G8JiD?oHHA@2&Rx%dw z6$LF5o`_j#fP@jyxo!h0Wmf%;)zjyR`4$)eIF;eIP5@5#jTK7`n)McGf|Q+grN~xR z@N?_XHmw%7cNFOtwc0n!1qLm@VDU5NweB+E-W)|?fo<^d5&@*U5DmRe>&sr6Gx`bW zHRR!ogJUyPC5#&9c}*vSl}p4`i_gOvB1&N6QtnXwIl#J4IIk>!b9LIC$$7?Av+M|} zwcPo6yr!txiKg2noq;Cm4Av@C-#_8}fp}0^@A}aMVRM+6#G>FW!XBd0c1CpELR^-% zEYy#OA@!dWT6(R-5)B(K9_*Q-u=~&hvnbi%yq9~KdvWfa3M5Vj7JJAz7=D8JnSd^h zgKU#G_%!dp8Gs+;GtM@UW(h}vsD2QLI>TMB+q)6 z{62lc`GJ2)>}x8HDr+KbFwq6%;zO}LZ$~rZ8yp_?B`TZq`9f?Q^$F+)?wsXp z01Ml1p)W+JjzA(_=Kh9SZ9StM2#OOjaBXQ}-FSFt?6B zyT|QAHT@@1jqf`esh_OCPuw*%pT$vmI~r7cnt8;>=zd)ePeykuG&4Lu-)#0e$@@K) zzD&_quhUNGVR(I{-3N@c?ngBBL)mxl?y7~F4k-F} z*4rNg`kunc&}>)RBTD@Xe;ntTNza5Fwb!$0Rj?s;@66?X)Ry{;v{Z81Xwo#X{-as_eyKqG1|W4eZk2!OgJt;$X^|24ZLNB z?Ep#wfb5f&LG6spWGFx8gvh&36Eqh2izPY?Ud3_AzO2Z6XD~uR>6@WL#VL|*ZrVAl zmr3B=w~6^1(%1c!-DP07iK39*-fC6vhHnTau}k)1O8nByN8>mF3O1U-E9(v+aZl5g+4ES`a`Wd)SsZCY@jv|)2G zj*r;ad~H}N zhS^#fpJ$H%Gp=j*0`;Ok(RI9$ly$)Nj_l@w^z^=7fz=k|rJS64AfQz|t0N|T9^4O| zeiuwLE?_1v55t^qw+aYOr~naCf;G%p1`pP){aDY72lZiDUqcWM3aJihi$=R3eR!WG zhBe~(%8M}{&L%DeDB~nEelJeaXO!=KevJe-s2ijD=(VT%)aXm?dERZhhS_k-ek-T0 zZxWpasr%ub?bq(H#WmK;*zM`Q2H&Iqo?x~n|AsB4KnI{xo!y8}IQUuk=g~^FeATN2}>YBAN)vCKEtC%BDyzi<_ ze0l!$a`Id#FKt}Dt*FQe#MgED*6DqQDP&^goJbF9l`Ok4y(|#~qS+gpZ7vF;k>jxy*rhNkWv4^5Zwak6j3Qia~4bOsWiNfd6V}Oep19uoe+?l`PEMm^n z7pU(|CR7fs;ge(1&%gw+E;FYT+$F0xbqLQmNC^(IcHu*~5g*FqzI0VuEnlQ8Bj;p> zzSfAD;EpH+iEfN1X6wuq2|JDN^evadZ{zx@?WI+d1A6Uv86y2;J8>s(_m{!t#9-H! zY?HtXpPoV$Px+6;sQY8#IF~9!TflGm$J<_{)N(oH&JZay&ao?dm;}6U#V475*s4@Z!Tc!twO02x;$~hg{?29WoHGHiRSE^1 zGvhW-mx}lRa=xYhu1AANLk!#69tan&Z4x!Pd2qX_8D<_%&zC^cg1e)r9~dv1NORn+ z#qcrIgaC*DCQ$C9qXMEJ!`j5@XV^X&`$mDl?K8;t<}IlfYS(j=GIXv6i9)(oBVn!4 zKOCAO%ygsO{oQqXA8b?Wq9ShE*Fpz{cJ7&{`BrcFEa5=oDLsX3Z zB+F|#do-h*L*C&qY$_zT&`b*WlQk>XJ6G7!D3B8(m!+`9ruPo>18H7;?p$R=1)9Sg zH$wR9Ia5#edgnyw%&sM-1(w0s`3XorHdplH%jxi9DnZ-GTjrM7?KO+IyriX#E2lfp5Z9JDdVV3k2~4T_uMaV?ZfE= ze`+SMKF|hLBhfv^;CkbEaFF&1@Y%SCBO8ARU34#%*&mJO<3xG+mPCvmQ+0Ba1itiy zptmc&hwW+AZYf4{i5APNls25-*DLKv_h`nX8z-q(rZg`wFgq^ApFbfxu>*Qmf-b3FVT z?|HKLp1V6XIlkc6dm&O;n7eamAVP~h<8qx@ASa0lEgXl$bsYtL7wYAitWYTQy&2(& zww(mtGaMOYvA8P;b{jyjxgKmM3EW~4%x{;G{@o4h)$))5rAFR(6{M%bTTWu`ALQMz zm5|uBKF6YoG}M@JA^VYjApL3^^@^ndXNy9wGSs8X{tOJSBAP|rJ-NbKVzDDg7z(pF zMj1@g`_Nu}^X%3H8E@@9&=*QEsH1|2z@Bte>G_pAteWXgl`P$=_U~1DyDj=thJ)7G z9ypTwE^tG$#BMioW~S&}-h*kIP9;Ize0=IJ-D&y&`vJ$daDO@(&KgCsv2Cd2^a&v5 z;a$zK`VI{b%1N!fFtgw9iGSn#kiWqPOOKK=f9j3 z?qdo+aNdF-zs$crSmodyQl3h}_6ZI+qUJVoxti^9DNQwi@2e>b3zw-J-di6?f5?@b z6&h#=!5NL+-GeJEGvQ%Yl8gxg64)@vm2!ZUT( z_SoTL4U^#}`?c=!^X3hDIR7ovTMhq|zp;0{Cdx-cixwxWc_#wUa(+ftPHcePsXj;C z{#5Vt9Yv~WcPb}*2aCs?n$o<@zWYV%MDX}*F1^X$(xQ;7jIq#8LZ9J2eFBoQ!H->Z z8T&dC-zEE+IF%T|i6i$x^>P99H_k!<0Za7|T`)Sm&(7|-KKFF|`QQ4~_51IM`kw4s znT;28eXB0M#H)UNl^J{}Ag|WxRhy-lPzd_w5<>TzEc&0}X}{loekaEq!4^8JnUD?? z%M}Weq|Jj19w-lR?5g^`Zz$Zb(TMk5s;{;wluJ{;aJEM^CWRdCLoUu=XpcJ}zU zLUm&0^l<=33o_f0;^BJfbz?Xwb{-6WXFK1<^@H8^sY9w_ z4}|Aws-7`PP+dVdN6FQ>$8PjIev;W4+{{Nf|Mqa{ubc2c)Ko}hxKI+N`KZmF760ll zQK)nickUu<3eV{Mu|U#U&%7G?1V;aK<5rR9I%YJ}D8xx;CB@99ez{`-BgzTUJ}QUY z5HmZK;NMZ-2h{g_HzQ{_wLjthK1U0qW0!dZj?z^0{b1NO)-dBzUWo=)qVO|P`RyJ3 z1z#uD=a)N7$7l8w$tP4U6x>C^t%V_O7fu~moJ;^{(9aX~s}|y$!IZhdS@6fBcXknl zLR63e9}HR~y-w#Y)>_5quC(V%AZC4nV&1mh(tf9svQB{-q4X3XkGZL;ae?HD7Y|@4 z^l8x_0p!Ltka5lW25lI_BB+zJl zx>298zN>*{f;qzsE_Bk6bm-7)HY?O9@zjM*5tnCys8XqGzyfOe2}XOP59{C3!{1{S z4NlRg8k}nz3|uu58oa}5F%oYpO5U40N|c!==>!A_pLLY~zJl@1tHL@jHW|TF$>qnk zzDTjGlL;InX)s*?Ut!DJNifk|WPK5s-~5p2^SyXptU2v|C83_k)Iz!cjiYlDH>h z`E^`yn}V0&dg?<)Y$|D^Lo>e@9(y-v$3zMHes* zmp{lDO%4`J7p_-5P?HNeOOxuRY11bt^9M>jsRyQgUq_L-LB4Vk0OlfSXMQgLzd5x~h<=QaT1c-(zPdg){&$}*Dec>FY$>IR)3 z`+*T_ueA9h^mqMOGGe89RLj*B{UTBQOSR+rXD#0@<-=R0UCCh>MK#TdzrD9I8S9DwFfiBCpsba#xCsA6E?d|5*F4@fD9!-xGH^$*pF2nQ563dAbG*=el?NV`=8s zt@&st8b>vKyx$p2@U7c_p+g(iPNtdzh6(3o6^LyJGY8FZ}+sg71#D z?)AK{L8X@-{?!TA$jXW2y}|8y;=R7&o%x8F zBmfY8#-FN}QTlsY#q1`jW70A35LvJ$7o=+8Pz`%19p38LX{o=_PJuxc_jN z{k=E?pOQ%u_Omb*(QNh7)_WnuLIAop6jzddU*2<5=GX1DGWPlHva71)~m6?u+ z^qYA?K!fx&raB&a+}&PB%bwccN6H-|I#gTQY}yWlS|7P^&yNF34u=JIlcT6}a!#m^ z&P%_-LDt(Z}DD%D8oOqh^dz++_vX8fN#*?a z;uTc(?IKQ?kl6V7qH^*n&ZIlBH3KtgfO#XAp(rJZzf?Nr^f`3|M6HSKL$c8WJ2))gJc!Fy`bdo2(bKN>pQw|ZBrZbLWyfqLi87+Ckd zjq5GFY?Q<)L}Cc7)!oQ$BZaFIdL5?w!(xN<!mr9GtG(VMhj=Nc~iI1~eK+{g+ zDvgs8VzzuMc^BCQwf*!5=!fmn@l;1e|d(RkN zlB4Ham8@qqM^a!$zfzhX80RK^Q=CYa26SQO&f!vQwLD(<9%TU6zG#wjo%Xy`A-yYD5Ow4H8u z|Ju-J!|@2Q1Xh^7KDvuhccmq-xvromjJr+iAB-RQS&>eXt6QtOIrILV%2u0Opb0dC zV<>~3@EVF`81HckUejkk>0r|)eS2{@x3{&Dk`=pZ*F1CfGQ8N0l8`diReR?O!`UgX zrG1*nmwo%#-f{k$4*jmD$iAXzTm^?2btS>EK-7mh1LuhZjru8T-TDUg4W^$Vln0&+MB6OO^-<_movr)3AL?HIvi`UCYNJFgHlAu}k!L+&;1 z>{}?vu{U_Vr`--C=AJGMaC0_jv|cUGPmK5ac@{>mHG#_a`oW&qwGC5dRv*1{OAR+I zlzYrxo+`SU7J&N?;m6m~j7g!(n^W5-n43gB2^Ba~{TaMmEhJP<283KI+beXl3RTLEta{y!mA@;2Tet8sXIX%uF zPgdW>W;=tSqBik-wScDrfyG^4Y#Q!NP+}wnypbDH1kYf*T>l>Fmku(`2_0bAF*gNI zik-nwK?{p6*CI0POmje8f7p(Bu+Gcam0ydIe(V0bEXoB!G6S@YcHSN~&|2D@$F-Xy zYzko;HloR7AEjf&e<}JI?hTZZ3Q!@R0k-BGQfMXsXE2gfB@5;wm6RT51Fgq&{3^+P zO3(iF?D-8Rzd!IcnmZ$QA4WYqZNberLF(?iuS9HZ=T>A_L|nmGFuo{vx_ew;sF7=GN4F*>iAxO0OuR#-q&_5E(T`PgHM zyik-*l=mHit62lSn!w8GcL(EqTdF3x%Bme)OVU^WUR1+~8pz|CNZ4SYRT-`mVi#@pm8O0#I}OugPiQdl zOw4UoG@bHm1KtqW>}ps~N8qC2c# zH~x91pLf-Z3U#OYcAP?reAJ{cGO^{3=cU42iI&>Ej*iX_sI`4j(|&>c;(GXqsXi!8 zctBE1$Mo!Zv2`~M2bFhP(U{}PWSzQ6k^0sD)xOGT|Nlx7aJ^3~0w{D-+LuybZPdr; zhvH@tu#0|*;V7&Vclt5_m+#E_g}xs3*_@~w!EMeKqUT4j0}!AggfsalV3zCMr58hC zZm$J|e~~2Blh0b+sHGLTT$5N{*Q9-hKIQQ=^~3uZ4>63pxK_|-6u3Mr zKk~>D#B84oivSRrW&tZ(q?kh#zG9|7M|;-;W=)+lB1q-%>K+#)@=A`C1KOm)tqxHY zv5d5@jbKQ>T9W_ZyelRP5|f3wZP(p0B64>!~0zC6zBH~Pj(YBA(th-xkiAjUlk%G8HgM&Z~~b7*-!S&(1wZNBLpx%E=wFf4KcdkkK` z=5zc9^A=C8L9B2pnW@wbJgp&S4(lW1j!n(2-btzPdJR@>DJDH!+R(l*U>+i;_kEd0ghk0D&n`>=Zleayx^y>t0_=}1THR(Dfv zj5_J!8Z_|pY+27HXQ%yoP3}Kk-(Sno^7ss?HiMLBIMUW4>O;pJLa1B(J{9jO1)VvR$fMZgJyk=12g_?@Rb^Su&elA86tQgd6vhj6=xp%hAT@HVo43X4Ql7iYO&(WrbtaDH4ZYdIn2rpWH?euqz9Z*#%$Rn+^W<6}F+`%QxH z>fVjAV9o(~$;wqOHJ$bb44d|TJdgoqDNk<%=NX87!F)EQ4gHU;qU5z|#VaJqD|B@R zf=f)^(eZXx$AI#HYmLPZ_O?4G40#dsuI?B!&M!eFaJT$cESM0Q#N9)uTCMyUOQh}b zbiyp;YR9jE!2dJ${da)NJZ$#v@JZLv(AviGpsOKZpt6NydNcAq#m!{9SKeYVzQkM-FAlJ2qp3#WKLZZ|_T8OX2 zjm5<@o{}$3)MTRIC9r`yE6(+m+3827G8_joqclH@XkoRtOa|z-@kbK2;=&vA5%u| z>7W!SH?3vrfkzGBssC8~(xrC!M@22!wx}0wD3eMy=a_fB%YPv6lKUupe5Wer+{u?L%{z+) zZ`iedOg5la1&N93-Y;ikeCYWX$cHEVu~Fo=u3&d_z>oqWl)~7Oyu-2$9%jg47cBDc zWpi&9JHt}sqmS}GlHN7m$lt-^RP0+&BhCuVp97_L+`(U}2z zIs+7~ZzZ6f&w4QDXBSXWE@n90%i@1v?4LVq-DEzWM4_B`!>3{Jqs3=@ijjdepecLW zZBd@`U-AR1ye{~of6r9$OGtL`c?^6(+p8o~q6bRv_{1EG5%!F9dmLOcL!~{xjO;J9 zj1oy|lZX$fZrviy%)x$QarneV&B{=53NFg7rY;y zMsg|*deX(?{K_o-*{AyJyXiGE+_izvG!_g-6XBf`JS2RpiY0ysY_jXeBOdu8Ba9b& zoU(gRKMxkf1W=sYqVrgCp%4NJsgEbG3hx=I=KqoyTq0OJQGpi)r8!y@OJ5Otz-g%;o4~P?<OQ%-7>G}D62sXmH$e2_czI>94thqvj3wz&8al6A@0 z4g%A~JK32aKG-}xusq5OvMU`a)o{V5{rPRP+7dL$o$&6iFL>-ZNRwFs<}xbdQ$Fv50Q=D9rTE66+hr(8aDeEA5QcRe^9N{N(Gb(Sm= zUiV0IB~h}tC5S5DS`bQY=C!|5ex7`xv}yBW9U`=nchqWFA-qJx1wzF7ZYU2hNOgBj zvskAkG#Ha>Jffdc_4JnC5($QNQ_H3~(;X=U@JW4Sq3I#*TGMO@o^Y6!*e=u`hxYpY zk1ePCCM$rHKK32-?9H<0dI}&N-spk~E!runWYr;A7Fn8lo#Ly1=X+SEpRAI5EF2$2 zV~|67nt+{nqz*O^D;k9j2xiIFa?`~bt?l+Qg=c-7SMb4G9#me85J+AIAl_I zn&-$_;tX0e^B2JTQ-cTUgUZ68CrNr9=R)KXJySW{dNN=S;|I75R8mx26vO@ke6)i9 zxaOYws1=zQID9f;gqppT55Z)K&V*MEZc_`!2B+J`Q2Y7~==*Ia$KbHU%gDg)*+3r2 zK912GG|=nBM0-HjyYibE^4B(|uvgM}tLW zf-F(^DdlnBzAu|fNyMmZD;c;$Nbb<(=`k`9ZH2ACTk4dLcB;FN18X z4fN`Bj@hi&E5rOD>f78E4xmW0uwKZVfsV$~Zh`l;G~(^H`Iu;n8`uSeIGS<^=T7U} z5ei$Bb6Om+In@F;Yuf_923Ezt&6ImO*m13KL-Pp8rAH$R0&+^wd>%g&`4kC~+g&(N zUoZ9F#TDWEQ*l$txJ*3mh)y3U#9AsOPCMZlxU)#ZHfork3RHiAjp>Vwr!W7O(BVK9 zBAqi_6coH7CIOaRhe*sVtV1+qT8m7Yqw7+FcsVTb?^Eqgi9yZ`8U=eLJzW&BGX_wT z$(}nspwVtIj|klXGIBJJUnq0;-aU+a5q@0-c_J>G6f-Q8;hl$U)Rf1=Vd1b$7}uxl zCD-B)PvbX(bcsuoqR*u#x19$*&&}t}Jwm(v;UfO#Hyb1nN(2SV?Zwfb30^XlH`8NJ z5U8n;myukuoPuskRHf-*HrMocf!2Ch+*j`VvyS>_3sQD-)H(HmCILdd(#Y$&I3`=* zcEB!$s9VM|GlP-no%lleFpKS*4ueW31_l5R!9cWp0V2hTlU1eK3WS8RGV^a$6B-8%? z{i;X)hR_b^+3mO43@f3Gt9lYR{XqD84FM^ClU7HUKOV~CsHVOUo)Y>#rFXNRCditx zcB7BGiv}CsJUX;MiEj2)?R1{^oO{}RSik&pn)mUKQJL=(8qmW8=cEYb`I)e3-$IdI z(x(UET-sUn&yqMeUm$OOG{r6tP0g3lpzGeOyb-?YlE7bE?m^mGP1Dz7C4J7))h{aE zhkPyr0jU-yN?pvTtqez@I4=9#&=dX?*s=*Qn}SeR_FtYtQZD6N3C>ZP2Rja)w~u5N z4`i%X?D?FrOK>(swUae#IOS*~7T}ASzfZ5!vT7%^91s?vs0g3alYlLD^BJR*!p4Qm z{M1x*JhS|4d`EfH8$@4bEPLtY)=#ShYn5Czd6^!oz}!%`LhplP6jbhaFDLdtoFCTd z>gqez&5z4DQ2}Rg?%{QVI%p0>XW~gq@r~lfMnRIIYbU z-$)H2ZVnRCBH_jxOY!6k1ohwF|5P5l`0%ckL~ezTB$HO(;3HbRB9q%#Q3{6`EPg%# zo05g6KOjF_*9$Q%cB~R92%&8?kRxsL9gGj_N`k5pM!t_-$)tPgpD{9m`v{yoW0 zO6aG@W?HxNt)(Dcr5n$R;HQc{g0^;+JIykLv${zip5ecg{GXTD{y*4Y`~PHpZQ3P2 zC#&ORd+-AX#L|iJdafyNB_AO;8P5p&F!+H~P>{-XCBi?&K7E^ykfNC^35t0}EOo7D zB58+_A>(!SZ8U?lH6$9~=`&-m2CMYv8_+mMY#!C?Gs=|3=E8#WAt-GhoXz&><>y$w zhfM7v(=ycmA^g&k{LmM-vd1x(ct+LkWz~+Qpn3+cJqj@6iZ(DFjlFr*Yk^tzKArU> z_`I@HV?ByPd%nR8#43+G18-^nh%at=W2P2n>_9F*^;r6206!j`G`EDpb(D+fsIFqy zYu5)-fue00fhiQ+l?g{A+h5yz|L^;M{~xU){yFV-6KnZ;g`frJR`elr(S(R=mqN3) z1No-jmt*9%47=>FF~!+4_WPS4{+^t0IEHeWnoEg$3s?+D55wvZ{Q`y(mx8Vuso@bs z@g@5U^d5&IOg|Dcf>%vaK-Dk>XBjjD#vqZSIF8G3rg=03rBz!le;|I+aVsV)J{eZZ z4qi(i*&Wl?axAJ?f|mNUVsu)MQ-2GMSAOEpfxau_V-ErxlP6nJweTD$cP_6d>Rj%y ze2uN5J)Ool>9L0YlCS^kTIKhM+UkW()4R>{Fc%O=CkbkA4tJ>C>ROvK-(wzII0l~f zdb`SgnbV7bJS8t79=8m9%dDec*mFG^a<4+HpQi~%cB)H+y=I*Lfnd|&eZ9FB+J_pr z!qs3eyh8=p4i0xzkt3nY8)`d{IaiW>F%9e+&YK&x)*i$de#+h0Bh{%PvDx7=#Oj^b zvo)Hka|0-V*?|-5|AG1FfcQa9K#r3@j6nz0OL!@=Q>hfH z$2N@U;B+N#x%<4rx}QLhtlf){(7YSs+{m!_75ov%Uguna0oKd<~ zR*;bBCO6=Np5`-}M$^}B-QQ-xgjAqyA^-`yms=#En*q!NmbW?Rlu=>uF?wk_2Mof! zI&8l_%TIPR3-*jHu%Zqv6B~dqu#%Y!z;pS4gw&Pj78Auuv!=&u@=EsorlezjqfXO! z?J^)-A)`(7xqCWAw6?n0X0AG9ti$aXA^Uaz$G-jL;aae+<%USjVi^Q%Z}%3VXa+yb zdGjB!9pkH2soG#NwDVnlk~XbWp=tCuRPS>W4wtM)6t>AS?f{(+=Ql=IRh*j!;ADv z8K3~)sy6k{x~97Fr>QL7o^_=YKnSy$dr-!Bw8HWikqpe~DEJ0Jw+ar>7Dn-&zZTBx z5Z|9XAEAzJqte{?Ga{Q}DK}M#SKwvLeR#aV4mf&Sm5b+B-*E9`Ty;-WWWJ6wOWqYN z$}dg|Rrj00%SCGh_{_(O=#9}C=cG^S^S2k^hVohnNTShUZy5_+Z<8W6R37%pBk(}bXomwiTEcuw5lpnzd)S;#|qFrnSj zd*3*Nbmu=s@finqkN34_6C8Bjd?06j^N@=t?-9wz)y>pvRe_7(8Hh>zAXNvFIDh%@ z_GSnpTLa{z5ge^~7N0@r+Q2@71uBZ?<(j(9h&#OC@uU~OApV!}+=)maOYH5ee-ZNv zCoBr1Qo-NB47r*t+Qn`|=GTNHzS8I=BiNGba^^$c3B?j-9t$+IBmGS zuEe}^Ub6+SaOHWZzWy<|*l5?((hRED4qY6Ro4zYZYu+cYFnefjZ{kJp(;OJo(?1~J zeWt3+!lp}vN6t6{-lCNN2BZ+3&SMtV>Kz#?P35xs4!k%sF@4{>&tP_rg385sO&u14 zc$%k!5=J2uG3qkVAPax4uT8{=<@A+Le@SWNSNWQwYO0a=oK#e16R85&{{@ z=J*ugxgwq|xgFzwz`h&V&%uqR(q_0QYocpK4duRh=>+VDI-#_=8 z=uNgB?IsuUv~~={CCaj!$zIL^;XSA-uz7Qsr?3ni-h=)S^V?AQQkEiv>>}(AoZ+$5 zFBKSdS8FK4MHrX3kK+e^)1Q%TK>c&3U*>@qlV@=mJ?-YRMi=5!y!#F0VCcj!vrg!`Bt!#_=s|*joeu2F!^%4Xn|86kD%{J*rzSNlTBD z{^07h%k376zP`w>!wR8%pU%K&$3au*E(>8Nt$;C=O!J&&jH$Cz#?Sh?=E*OKSJN(k z6R&8s%q<>b+XK(hrC%H19`;REu{rawS=n4QDou+6V3EHpeP4MHY3FL6rPjN{Tllbs z8^zF5e1^?gE6F1wc(g5gq0$K1_y^*Lpa)cyqy2ihTFF;nXG zk?68Q*RMIG<)qDTX(jNC`^ZHZZa4idC3Ri2CC(QxauHDA_F%cC9g1XPEr>pSA^dF4 zpNSwj;6dZ6{&GL;oO%YkP@qkorAVzCXgB@fk-L2bjW3g-y}e+spub%8TL<;9bV57% zV9$Q<>Ze|e7l2qV@Id6z>r*QfnOuZqwGm76d=b<|qo5on2o%;e#f#%A|%z40Z7 z&zev^Du4YKq8n^$; z{eqMO5tD>pr>HT6=bKNSQG1M(;i4D81KsO{bzBS29d<6kOxNh88<3}~RisVW2dP#I;1<`YKw0?4Tx)G5s|p;b#@UmxnD zM(X`*gLDW$#@*c8RW&3EbSW0{2wBASGZ^6nwCXu%#_{@~KRHwNZ*QObehrL8d>TBh z&@M>35GSua0aB8ktP0j+!r<+`Vcmv;{v+aD%|mt#&$74_;Q4kW*0JrJcGwRE)&su` z5GzgLM?Tk$nU^zl%7Hv(?CVJdH|Gz` z_eZTTMs7R;50(nvNaSwtm%-YRjxl_4uw^alU;*O`Kvn)57W{MNF2kRbqJ92S4m;^) zv>={!k5-;exeREgfn)gA6QFP{AK#WVz5CERXH?v=w8nmGW+mX7QQJXULcv14w8(tM zHc=iif}p5>VLqAi!(g2pOBW%#m6Iz}AoRjK`7n=ew*e$S%LJ(l1{t50(j&gF`q94U zG+L32b(cc#9egxbr@O0M0Jb0(9%B*fVKqR-V$x75{4;g`=YHH3LeQgF8mR3b%slG{ z)Up^Oi16k!rxn)uGlHW$7HR)%@l(HlsGz@T7l6AGLNidg@98RQXZzMsOW{T$ETLB( zG)|jM%Kt73dcS-1b*&aH#8?u8Q)*Uv80dX|n4xwtS0jlHw28;ewj8?B) zNPYG@nB-CNR%UWpcLNJ%rYvtVccmUUbog7B_FpJZsr%8vmEDlBkO#2~Z>6|55%*ZmSl)Wy+ld;N?JI%OD%Fqwvr zRrUe%?DIIi&OGlc2bmyYHS3&WUbM75y#U^8K#h9>a#?a>0w+Fg)wRBqR4Q=g@<{BuKqCU*&Vh>EPk-J> z%I~s9GmGCkd$;5k4&?YcyLgIDJ3K6l6+j|Q-sr*x9#8i>{^v2`?U_cb=p0uQDCVTP zlH<;8ueKoqr=~XRu8>d{d{l^DUcM|a*QD)xV_YtTrDZTz%qU3css;>L3BYuGJQ$Ld z*8*e4djnIR((234`lWebmLxOUGQ;u0q%Zq(iUZooCN0S_<ZZmw2uCXH@a=Vh{@F#1sgn&mYKhbNMinU;YJ&(RLWch}U=>4T4} zqfOI#Wc2mpq zy}p~wz+=Syd1-wShATWy00r;~76q#id70jRO~;>eV;4b4U{aGVMa2W!#>XD1WjJ;o zp~a+5xb9|cqyR(6$J0M_yjO#Pg0jmHW5_HOQ;wf!sKqY{TJ~QF*(77F=o2KfBwq? zg;hBGf*h}HH{x2PWhm?wAb#QD8@?=}%7i=bRJ?6hRQv+@o~~YP<|z3XL!Bg1W4>!f z+mxZevoMB$yenJ9SL!s$b^FSUw!iEL6RzYVdYll$I1(V+)ia4tcU!H8?WxHdR$*&B zlQ;ObD*YD)?@Oyz4vMeW%&}<7F&J!t3ja`i2lB_j1T5vct!zLkVN_DA3J z`jLLjL8vNwh>KyKFw5j@mb$Rdzy;scW_YdCcwWl)l2s&$wn>Zhbx6fnKwJquogN2V z9{p*9=V1y%S%A^(c9H&Y;0=MB;ODQhM04rIcf%~u$Yq7EPq~T})VP$+=@s?@0A4hsE^rSg6 z$9miz=yciJlUx8dymS;k?M8w%pm>~KG(3tvc?%E-{ai>XBM^=0r8n;ESqo^alZ9+! zg%&M^hemkx_kDV$lwTO%d5ND~#iwu!HmqnOD&80Mx}Z)BI}W27xYoAEh zzZKtI75}cv+oC*f>UOu{tF}XWOa%;3(lc^}s6w#$uM)r#eY0lWIx4q^aEA*htLfP(#pe?2pK>bItW?vyV%KfN|5c z?t3=$2`yXv>DAKSeGG~JE{|AcClo%qXa+WmLXcrEw25Jq>n&@gZ&)1bL`9EvLU_({#DrtKcZ`{0CA6zD#9 zeR91&>9jiG3atk5zJ@hj1EQ)vLcS_uQQ`>y3*mbN(G@<$nu83NdYLyui?sm`VO1pF zhE1!WsEcQqzMA*fqT=q&(PoLvz5}+Dh&Nju8at@Zigplliz!eOobzGP{VYOH1^lA_ zXR>Os#o0t`YL;f?DSvc?Mu3O+eeLaI8v=&c&r6xbvwQgzg#MQ#6Db~ww_FHSx>*aS zqJa%uypy|o0l&xbUUz+4n0U~=7Kit3`ThhZ-TbNn$U%|l@G4Oy$K6+f45%R2C#7|3 zD!7~Xhs-VA=?}tpwO~@JyUTI_qEJ%w!7NYe|Lg>zur6@)1aSqnp zP>AcNS{TCQb4Sc~_am|9WLZxSf2-8t@PNKl4t!G^?Hs~rjy`(T)&bmmeyu-*{MeN? z2a&2t!=V5sAQ#4+bEwn4?%{ai@M6%{WPMbCaO3G$C42u~s|-NbGFRnr@lz1r2APmS z`Fdyc>zxisct##hvoym>W)=2zj&DCd4#@;iJHFSsrdM^l$TKUjJ7V&8gUhvv@u8BV zl{2WJNJ@ys%7H=#fIEg#*a!iXVTd+Bm+-WSjke=}(;dAi(&q|cm zBmtT4P8NqicSvRtuLQEISto8!5lAkc<`w0{Ptudr) zxUro4ABZ0wQ6ywbpA7yzxu33Rc9#*7VT*a#=?9cLlgxx;hqIyqPJfT{Jw?c#vR%v* zrU@<~oLe_iv@?L3>7CBdGQAAQN#aJ7isVn(7(ePLeqJ>Q>7K#H0^cvX7zQrG>XT00 za`aXQX5-kIJkg$M@^CWP!K*i zKaVl~+%USD0cpaW+g%`xz*woacS&Pnyc(esGxypfJrkM;;QK2fF#KFDy3DS-@{COh zoxH$Go79Xc@Vhwdvu_Yp(M?Tz4UDIQG<_Z7eQ|4}#TAv|H4M^o)n6ECCYqzV0`RI~ z_n~hW9~Z&9rKIkspKo#}_QL)D+T@?CnE>|orVGkRe>$%^YQ*jp^JTeT1}E1LWJGA! zF~aNgnu{~0KTJCAPAf(b0}x9zowjUfbY%}htb_D+eWUgp9?lpfpU$s*!kC6{UQrr# z%){r>XM7GMHhR0UUek+*y4R;a&|(tUSC~dW24n$5W(rbB zo`d)cq3z$EH)Ymypp4;6XKmAu37BUEcJrU87AbX2LC$B&q1S!d>Kt( zCvOBlG+qr&fUmMv0HNYW=}xlS7AOjr>{7nw7k-UA`tD{*2PCb9)8^7+au#;E zs1%=62*DNbBW;2IJ>P0e^OMv?2^>o3A zc^S@Ork;%!vb6Nmxp-g1nAyHqSE0v&S0oR?WfGM$+tUq*^vA-}(g zKfwP-*LAEpj`P|F@nc{`uF8i07!y>NS;Gn?UK7( zNV8h|+9jacLG@=n1ryW{4?yi`cIltTm9%~>jp^-0%5`L;yD$|wl|yP>ijWruO;kwE zAovJWws<0)@M(Ff^lzy-eF*nGFfx6#mR@2HdjrYgvA=d5nBj(Q(7<}Ep!j)uQ55uB z{h#}v*9LGq#cxQTJL{A12JbO|WJp#!@T%MBMJNJsoRXJ{$EX)lWOLq`x3^JW?wq)3Ah$vS0h>U+LtEmm^^yBj_wjV|?0}8C% zZS0=)FoEDCHR#4d4=kx6F<_cCY!8^Yz1i{>*QG+D*Mu)GxzLGhnLkYe+v-c@k*kQ@ z5Esxpe4=UM_Um!pFQA_vw`d_JQoN#94Zo02+mao8Y$^YF= zr`Lb|zEIi(^tUnESz;`!UO+I;z8yEOyZQ+3NE_u7kylU;wfuEH{$|Tt-M4Nxi}I7n zESbbkc0C+oKUg2|^J?E?Z7uSA5Q1p6!(Z=n|BBEXP-rdmqWFUNn663c`3_;Nqmx>C zk5<)4{L}G(f`bS2z54_7p_`j*2FFD;l@4%fZ(a%teR;&}P*Gnl+wl#eel@7I&Y>P`-+r z>($ko&ewzjsVk`3(ih0*t2;mF)exr#{$Me&&&IZS_U7U)TS+B@MHocAhar=!<1b0T z>GQXn=ax3+HsM6FEvLpF(+spG z5a9O{l0tIJiN8Y9kMDP3(TzGjt@MSTs;=r)BR~&(cIZPvH+;0$Pd?Wa-L*#K=8}nk$ z#L?Nz(jM0h$4KLD=}*qoyEtr}G%cAJ`Hk@tUudUXYEmOOg%?#yiJOtQ1M6B(`6|*L zCW_#V%EcOrwqGc3%GJ@OUb8XFB}e1Af3#FnwF5}vmJU^$Hp9UMS_OJH@A|9Ee*OGy zqRVGiMGo*>@tpEVQke(N#8aoM0Tnc_2T9vEhJH0Z;^p6P&f(jQ1brx)*+>}afaUFGI2l48J1$7J3ixfQet)ko~ z-(K%GC98@&_?1nTXdd5LCAQ`em z)_mVVm`!~mq2B5Yb5ZP-Wp}*M5&XcfodFM(hQ_&|l0ftLH}U^N%kx3)87kM@${v0p z3r-yGk^`9Z%zX%VVq+=XoX?W7;te7pt7#+F!Y>lxS z5%{|41JjXr5B|mG_S*zIo#)pC`~LOi(w36dum*ETt90LzN^2ETFZOLJ^r3DVDU0S- zIuJa*yO!%_Pc&hni|2B7e?25IM=7db&XAwf1#m&ODUoX&0+PbVn=>qyeaFO(nd z5qDU-?9_D2tF=PZgxuNw)}kwl_@+O?D~6l?Qq2o}6!9+%^`Fz(@An24D=IG>{*V># zju!XVZzs#OOs~CGO%{uZ#u-mM42u0fh|g>ea22cHqkw*vt4LKr>@n+8jq9e zD8THwq1jscwd_0DzI{Khw|c?|#C0HVxKcTMq2Z_5sRo4JdrhcbO<=~U1D4lE{~y8+ zmot?q<4^G(HgH;)lJ0OD5SbU!?PANKcn?0oI?CqtarwnR`x=!W?hantXF-s+i$)>O ze!bQ`-?w92yWCy&tjukJ;ZaVrJ>7qiG0Z;@qXuZ4@ESyb63Xo=42x+gft6d|NgJ=N zTX6azl+r`V{!&PtKM5S`8yqMQQW5S&s!ftf@c!5o`$)t@Ex;&U!A)7Uo`&L zO-OJhTF1Xn5E8m|3ffy{qtN2q?bdtR>XMhx)@CWwEhhDsH*Z(>%m~>$zKtVgP*M94 zkdSpjME5c@d%EoPz2j*;<`IyhUEr3@r(Vt6EdwM7^HO|; zuidgN?Q4_y1u=&0^bfnv_bj-O-Z2_;=*}77AW*!=j=b?0BuH^O!$e7W%5IDCig5o$ z<#U5vutr~yXJy`3sf84(%n&aRUSaJ~d zHim2mJA5so_F&EMOimLl|^4au@ko{%JcW1OciRys|&qM}UUKb}qoG^h}dNewF zC6`yo!W^ZF*zwla3cUqi4Xriqie^Dv{>zFVcodrDk+|DoC=Wp3 zGoVQrnBbpqI7e3*(N6x7-mMa~40ij9#QTSIy~`i^ES(^qF5=# zdRKv*ALi%@)GssMFaMj@N|cEt&rtT_d!h!GF%V}4aLLjeYsi{tfL`Z}V>Rrlq{2gn-R4}8S!!mjT*eUa(d9MWknAPV2^ z7wCphiAX~aa{hIg{x8T|9cJulQ0ogXRmO29L1+(G-UELZ4i5MJ~!wD(7nN=vs>voDcvtOei5O*n-L1+B>*-?=jJPe-0gDW$gK0G8rV0c2gG80 zYWha4%rD8jKo}p}OUt9R7KW z%ibS>CfIzL737RQl-XFFr*}GPbR2ClOr0(f*WM)Zi1ldlq!=VI#L3BLY&h3RcmN)ljr&E&!209VA#9OE1caMZ@7ClW};(9zq2%4QcH_dH-qMshI11AZmm8h?I_>8R{pAExrN$ARCQkJ zomq7b-(Rt!L24#nvQxE+6B#67`o&_iy$ck>1_nGTx6&&@lZ|o9grvIUw3L%2p*F>eoBd6@~Jj=prMvWUfMS8zY*Dk+JyZqs<5 zB!U~jt>9DG3bn_Xg@wz+r>?Q4CEBDMN#yuqk3>A1o&izbpfT}^)7 z=GosW{0f0bUB%;Q#*b`}VB3GKLdZRn$4j-Yzq;_)u|( zki!H=irB^Drb$#@6zRWH>^+6D+7cicZe|f0;qoO(!skHpbv6$O83z}4WtS^v_{R!- z{r|Z8^%#2Ww&|@7Y~qfdcs)Ujj9@Spnxn9zZz>~_NeQ5aZx}M9nIdBRny)Woeki@l zbKdU3b1?A-RAS~+ICs)k`}?(KT2oTCl5=wS07B{4X8%)8zopV$CQa!Ef_c5wttPE` z3Y$gh0YICnmXScRyf^-U=ilu3pl(S4Ak7YH^XGUJSWeonj#^*&YHyeAdD3{yptT*} zR^u0)-YY!s6vl>>R13hpvTAC*Hf5=UkHZ=vEz@GE*cFG430DU~3Zs&Q-MSj3-!as>8^IAQQe(4V|-XxkK=-*NPB<}WH zPf*qX#c?=bR+ol0wpRL^auq>BGsunX_mdlNGW&I|@vkr2ySn*5_tEm>2Hd9kS?l;1 zo*K-)woYtDCtMgo&2pa)(+8F){}Yh!g}=!148$DZLy|VmS2f0X?yE+_@%S>E1)04 z5-J&Y^^E5d&nYVmT;Z6Pi2!SjxZzL$!Yf|}n;i1m^c9e|CZ=nWDJ7E`@J=HZsylGj zdglrb3xH9ZLZO=?@-nqKMt()(U+U}k+YNn@iU4sBgBswS_vG zxNbX)s2(qi9nU6weJ!`m6`h(ALa|q*f?yyh{SNX2C%LWzx&a%CrQLdI9%N56<^_&l z9pV$D8{6vAijtMKbG%-^y3z|vU2OCrU9<$?#r4CV|Uv^O`X&H;I?BT$wLd%Xw} zn!0ahy+^vAgUeW6myH-DsUfXim&IYrHC_wxtcjL9S&kq!HI99E@Egon#jnchW|zRV z2W6_UY8PPRw$sW6@b6E~jw?}rTw2Ng!JrTKY60D^C+hE5@HnY^cVz~x%hrq?Ok2tJ zy|Wwh9%y-;{WXoc_C)WPNty*1JNz<5h#(S^;!tXgrl;F85b&c^@qBn?)bS zJlZF@xT}_)uYMkS9;^j4aeD}zgeID-s&dwSp?m|FQbj-Y1K0ai7roIIk-fRukxC1CEv9gqi%;hU z19n;e-nf6@rRQ+0x7ZF^OI>ztOJjtIEiZM}gDMFNHp8zYCOu?|ecG!oaaJ^ zT5eZuk^0ycfJ_b#=3fx+{Ai#7(sM0TbSpL3l5gR?6{xn{*8oP=9&O=kp;p)9 z8>6mUZLc?^_)5W_57(|uN#05HG}?oiU*#n>)>&(k^|Bz$?z06n@r&nP*V+BT_>m}{ zVe8rF!~rt5)Fe5UHQ;o=d+sZ>*Y>TNWjb5Hf$HG;Nuaj3|pZ6wXY$Q_>0F?7oYy~ZhR;&)>{GRtWC?qi4jXX=dCF2Q}s5kSf` z{d{KPBm^9|%17FzcjRln{LK0eSFpYBRLL3Qco9Sj*Zet`?xX&^(dfLjuMS7x{-ZINebv&c(`gV>HQU<5AycON2rzWEEQUG zJ{XAYiXR$dECI&{ZSQ$Y3v4P#TonCl{=L)Cr@jWcbTI|bQjKr7-9N5T&0gYMxc&3} zjUmHCL#bGnQSA@JJ8L@CVb3RPB9c4LnrtrC1?eHE=!#=}6wz(xR-+=<0>zfUz3JYv z!#bv=$_9WUQod-nCp1&`s)~y!`$nwEG(a4omEq!lH>`h|@=1!XL9c#$xvbKah6LVH z578@durM=wPeXv+woqyS6WJW_@dxIU)ZV!DPMz0U6_AC*JhJAM^tC`&5k zCKd`wj3)92W`3pc@763J(%tZw-dF?m%*9TwK5(H9r#D`0lrMNYnpFnqYt{2>!hCR` zA8mZ|TR1%MR}powg>W4ThchTmtLkfZC65aW#aOywiuuQskA`A;wf}oTn4sR;+40y_ z57Jg!+@sPG`WQ}5P6xY_BPx7*3-25Mc%t}}s5DDyKIB%v_54j(k&v3bwesNXT$)Qw z&WiX#6@BfPn9ce`$U!0F51+oD$I%?rO_(sDVkOO1>dmZn3C>WBwug&bv&$eh7BMzO ze>E8&#QS*^#;unPuT2(1_3hNIvw1!9ZoI&5syo#h?Of>!%E5jM@OL|cy3Xg`KEgSF zkSbnWV?rTljx@+h=AN&e*y_rg>qPAEd(Zxnz#m(0nt6npaEouRboeUhOFe;cCCJsd z=ZF5r*8u@{;(yxU|H6Dw=O>eWUy~N2cv@C>gG#3>#<@-B2XpiTLSQJ?R7^!rEG<8^KjwV$@UK_xUg3}1wQkoH zQR7E^%>`Alk7bl~{=6*V{VrY*p5hiLA|r{ z+iA_Y(=e8BOS?cVlc2NFVsw-|KL}90Y4F3p+^>g2{uS-Fj@_yFjxH8G?-0Q72Phqy zR7RzTxo}j+?pNPIFM!Q!u=C~8&lLUH$zFCo^!x1*)XTjfkA-{OQJ}5rK0e%`YUHA* zjxv>|51_Y&j%x%NSpP^}-4@ALDAlS7j}XhUksO1yUG##P4&y*{uzf*&G%M?MyWow% za&kSUSrUz@Qpmoo^;Z(#lC_6wIZ2J?@w(m>rXHy|mSNLPB7O zfi3JnD7D`(+P)}Xk^YoI@G;|ZqS4wER*Go;MZBv|DnZpp;L zyx#pLG*%XBE>RfK8A3LQjN|)hhQ6~X(_dJh$$eOa%W07^rz({j2gH@{NQZkh4;+@l z7N?61H9+1oml5JGoKJg%8xRHyc~`d})#Dj)1qkebS(p>Ny(9JGIxpQ!xy7Gk_#J)g4{PNeqgieR%JYiyPR*djY~&{LFND? zL6HNhWGdN&usojxH9)t&bMr4c{GYx{>~`vOG`re)Lfw&V(-k@^BIq^)s7ea?rlWm(})^sX<3{X4bV6NOV8DEn&(hm!}hq3Xg)B!aMhF&-V~LNqU?2 zrI6ueC2=$&4Hbu+yD370%0D@n>TyhQq?!CZb$%e|Uy{i4oLaJ^i{G6}Jn+JRUfJk0 zg!Z!Omz)|3(|)r4S4+fycg8ib5kvIGyRXVag>HsezY5`OTi6ReQPd8cL@ySEmvDcK z`0fWds4QWoaS&ytZMX6PMF7L>jof5NAwNlb_nE6RIn;`LL9_`!zP-hPQQ``_CV^0? z)ytp<@yv53?1SJ4f zq7=hwG$o1j$p3-1$n|T-3W{b+M5%WDtA6TI82R-oc zV1*O*p-tS?SlxDR)K?R}N=?JLWH0G6l z7B^NbspUb|`o<02d&u7B0vX3F-ecokY{5WM<|AS-H?5yt*vsk+rv$-FOC70q>C4Oi zAt{gsqet{_jbyTVp&$s8~8Qt8LqUr;~lNX+n6 z-@5ygx$fbm5ts!9uoCr~e%R*)C(zY|{J8AHL4LeLy#+c^xCD|P!)CR{AuLV`i;6sEJc91(irE>MUZ3)LvDv z1Ae#X`=BS|IB`mm5!S^$TN|$fD8=nK3n>rV1CCci5x5W7ou|G~-ZdPQ1#3kQC38ZQ zD7*7+Gw3Jx3yPv=fvL^fG?zOhDFD;{8LyvY9E|-b4Kf%O4XBwjD_N63sn2ZVM{~d1 zlAYeqV8e#JfxGW<`GkUi#gmu2A9nMrrfl67*SJvTP46(g4Azw!k^n`H%g8kSfqFY{ zAVTG7VriJ%@tT5%U6fGtE|94s#pEeiPwoo!5|s5ItNo4fgD6DLL;=7mYKA}bp5h?$U4Hb?xnc<@dfzHm>=aO_{rYgeRFU8p3j;=U3IURJbt-1Pr85ra7cV* z#jiCH{BG8NmNP&%cgw2FmB0y5I*g}{kW*YpLML#uQ3DsVt&OTzy|DVi`BBlpF#T2+ z9t?#>S}-Q!11cVxHv|Ygs3B209C@pph-2BJd&BwOnjqGMF5^Zymd@Y7Ah|RV)g-t0 z7|&*gYWV^OY=ZYJ#J!vIHfB|FJXO6bT}Kz6)*f9T6EbfC14>iVnydQ6bYM0Y8fja#rv3%$fm5Rmu9~D;{q% z4k0Nmk{!dxP27A2w|lVM3g{xL_UWCzuk;{J0_~0##23I@p`P$O;dGFxqzK-rO;__A zNpm!%ImOu~c>ti@J&cI>(EbGCdl*CwbJ&n$s!_j(t9&Bj{#a7LapUD~QO0Z5NyS-* zMgDt>`_MbM=el@>n1`NTwZdN;yNd+1>_<8P2q2H|H3Nk{y*ugSw;R9o3gS231Qcvq zCV+dDW@CmzX3GspKI^SKTa=Y%#c0iiV6la``EAN?{fCbdfW!5P4T8H-(bc@>RdR&vXqjzVJnmjGYMad>nRx99CFN0p9*sFD(Wso}=dabxbze}Q>JTj;b1BQU${C4s zEP^Oiy5<^G3*mE2-3T2;_|$|I%i;cD(A$9BWO1g}G(FD%*84daswMLvqFrm1j#^Rj z?TM*ijr=X-@(Wrg%zGhzawDB5 zu6ZUmv86YgsDRgAr3J7xPx_W z1TEuU)k#12Bk>LE`{$*pyy>1L`fWcQ&2*t|L3`Ke>lwX91Y)k^)&!3oMz8I6$KFQk zIAl$SbYLN|tUZ>BQU)GPVAP_+Zje^U^t1Hoqr!Rpnv4HKT%p3LJCTarintg?w`Y*K zE|gRRCFb+G2+u2wduqV-!|^>r@6i#k+tI{Dp@FA=mR5U4lHC#N!sMPjx1g*FNN{;L z6Ss1IS@g3`gX7wzH10Z5+Ro`Xo4=#%vU+ZWj?J8{o|oIXU zAX}Xx1?rDIKPqfEj#dwX#Y+n7d4?z32Wzx#6$#$SX7vE-7YPYy8bw{{57LLEgOn$5 zPz}s}`QeQmC6_t2+`%kQoU(qzjmDljbu&<*d{i;W&n2K!VX;oa zpB4MQ#_-^Qb!2v#Q+j4jVU*gw6g+!1bk>dl469+X zh*v>v_0i?t1IQQ94~iFrTKkxxT_IPf$gAht{2kY=oO(zYNg;if5ak0N(;Wihzhd() zdU3<#@<2rM8Iywmq3wgfBUnkftNdCVWY+qRv7t;2IiG(}J_IXzblSb6P*NE!M~2AZ zhTAL#Ob%vXnQOh@t>(rQXw!Y&jQrG_NOkEP7+G4M<)RMDEub3(<+Wa2GwRk?6GeJw z#nu&_{TZfr>foz%*%H{`F7YTL1IR2<|ClA6)$^?>0OFoHIYl>&c!b+u7$4dhhINb5 z(Ms}HF9?BFzE~Z9QZSX2r!`bF-J>%xHo9=F|8nQ^Q6m(eTzqftOhTnoRH_txy zE={9173?w#9gmE;xFabnE@M-dYmh=Qyr(0gW2Zs!{9oR^^?a@?>Nj5X=vGEJfo8D9 z97VUi=dW_r&mwa+RvZ^Eai7;;7(X0pfG0|rFre*itcZ1g*(X28Q1{skNQ>^QpAAp? zwc=&|PcimC1VfrzL{nfjH?(q!9du52GZ*hu#5<;KCbEqWSDLBmU2*=5{0{`*i5@xR zINiL4GuUB*T~*#5I%Ex}kU}1K=hJDEAijww;)EMWqsoeK)v5tG!JKJ-N4D} z0T@16o@je893Qf?a$kk`|B@dGD?`7Q6y)BhdcANbb2Joo_-S2tNNRgqS42LU#g$gL z-%NTRvbnCBP9QD~X~V1B^^gN&W>;9tgD2a%UQn9Kfs*2Z`S-AY=zcgQSjc*bqSsq2 z4QxdZ`PF36s8`HQE8y^+b7?msNge#2%hmG6;+i^4k8s6Ao%ueRhj1~(h2x6(<}(xC zK)cFtuGn4-F#f76eiHtGvCP`T>e#Kctts3QfyKrqG`INs<=VpnQtXD9_m5@&J^wzG zJM@kzSl_%Nl#)~KW#i&-xiTA>o8fH%02?epT&cO4z}J^iTsJ{+RMsyqDo|O4o9wC!@Wtuj%gDSuSBwHZ+M&@PZnY zwj|q)hl78)^Y$f2`sZB~fuyMNm3SD#nOkFE&2ZNO*=h zP$PN7m?kOZ)E1_)KagbcV)2oX@d-3fP2>QPn(8lzFZ!L24%@gRhaGm&lLxZNKnR0d z4XuC9_0xK#t-X$s1M07*r0&`$+V@j@%|Bz{v8RaNm#7Nf=_DaCeu)vul9WYOpNV^>L=Iu20mqhu##oZSk?t&uk3o){>J%yZzwt! zq-=dV%<+d>+quB`^-X{dNgAcRG47_dg&T`|O7=TXym6b|WDO(1jq?yyM{Hjhfxuw6 zCAEZ*ovg_wAI+eSW02paFMv17QzLP)Xnasl&VEgH@QH{I=mL?hxh*_{IA?E#M6%Dw z_8Z|R%Ja?5Y2nqP4YU2)<_3{cT=b4Qiq@P5!W7z*zsb}t(8fT0q5MSNoon}{9}Zox`|K5w1~n8|E~@+N*OA7^|S zO&eb5CGlpdC%+bLP3uL}q!WD4;Q z#?~UXvJNSAN3rC_pesRUzh~MXgtyc%T!&gJOBKmV=%3e9sJizPKbRLMWUoxO-9ryF ze4_}2-wE@RM_tu7(-(1}(J~`~gb{kshpZRk6WuYd(|f;al^c;zTNi&}ymfN(C9{Q) zH0$GHU15exVy8TTJh!EBL7Z^wvd&>wo+oeSUl8wP>KA!FClNV%Cj4hbE4~5F#aR{H zYwsr&!5S~+=^>AL-M&CR8S*F25yezYo+9`vl=KRAyXe)a*lyneek-=D8&Jd*R%iWN zMBXnRc<~Ln2rRPuG|QTVe6(h94amxB4xjU6fRV~&<_J%w9&a!oC9HB>eVEWg$V+$- zDtZrdkt90%=+@w>lw$+9g;a7Uf#Hu|AN=actU3;W>w|T&OL-^#C#KTH=Dhx8TY5BmM&WG+jnZ(8JnTNCy(Mj*Ev zP*s+O^vR`Hi8Zu}I3vs|M&YPZb6nu9nV8m>hLH6Agd}3cpb3jj^ zOdBi3L%J{ueqYT$@%;YTp-^0()Ors#ouuMCL1YYdJz865ZXn`8F@6FDK%WTpyXE?U zJYIRFX~RF-iW}K!U2v*zVoIjGMPWz;(NOoWboN^Mmn8p+#Rm_*Q0wCGdy;+ni6#g8Z6^}yW&erM<($mEr1 z@Lm0exqy0MCpC z#Y*62&MCu1c8!oEZloI5y-j#4d7}d@(2_5ZcXs z(w^b(a0}eBLT0Jo3+^X^dx_+90(**?E`U|VIm+3*DmqkJo}2OvYi4J<2w84zoKb%n z@^Shwd5?p{K+Ww9$ET0QI_*WB%~}=Iit9q0w;acd!^h?RyE5s+gek(eXru&% z4DSO-qSwl%O!<;4Rxc z^fc`S=k8$rX3!^r5ZoV4gUz@>nZ?8QAgz2Dsfq@*TVoQysHTw?trOpdug_CI@aXFR zJ1?8y-_?QDE^+#54XiaFUKvxn&lkBPuKB#>HQA%?ACOO5{N_=M-qFiQ0m^m)wb(Yj z3iUx@5Wg%|1xn@;%MS9=$A8A_XKet7!Rz!X!W$+}QIz!ugNX9R#QiW?(s^c%sU&$j zL4Tga{Y1zB|APAtXoVfRq)0Zo3u8AK}f1`YS>$Ov{?V;n^ zPT2jG=K3f;7D^~C>JB7oF0Y@WgT`nAmB`R z3bww)W!M&q+H+rb09rt$zpMX&_`Wi`o~XAcEvs!bNXYQ4#$zw3=sD}1lPdhCi7Jw> zk3+V=zc9G(H+2!+uO|kG3`bV_lv5jP)WL_pf)1gpm&--BGA>sRPH?8bK;CY3JdU$9 z@1ARItB*vt)z)gyq*23XUiFg``u39rdve1#<@ZML57YnqMu3%|7BcdHD&WwYjw*qn zLcR8Vf`Ofr+?bXlrN~9f;_F82hjc<+P@-z~JEuL-A$<-G4|PR+BOVh`Vyncr#|Aj~ z<#|TZUl8x&Nw{ASC@|D)7rZ*_CwggIEO9%Ts%8{+MR4<~Bt@V0_Irc=mqfhin&fRi zpu0!u)QD~@q(vZV!U=~24ojF?F}foinBMf75MEx!-5;d4bcOH$78Sm7nJm&EEDwGh zHfHhE4V&}JjWNv?jIOn!*yz_NH_KaC*85`eZNm1*e9ux9y3wv|uObROlg+^3-WSw# zXHn6GzP5t*(*Tu&pJix_k6~M*biqZ055Ns&XmrWqiPSe}TDk|k!e0k<|3jA|3A(!t zcnI2#jtmla&|W55qEUqRuL^o86Q`2}QHKU%|VD+zVK|zBpS0#Ly z&HN#D6DX%Os1JI~wO>z&ev)CK@zT(Q~xEvZBpTZfQlLgRZom^LFnqJjr3~11; z`;PL_ezf6(@d4H3FQ$4V*9QQW*P)7|*M#IwYsRHb=#Qf80sD8&|AQjI(4?Rt+y$D? ziV~o?4kh*e;7~?S&D{_h z46D2i!s*+z>VbbO$y0lNyGnUf!t-EH`u3O_K;4IMl$WQq#h@s^<|42yjQwEK=25J2!6}bSQAv*=zaEW!8T7+7y$cv6;Z63N zL6S0d>9IY##bGVxRpi5n;O&uT#g`5EIuQ6leZodCp{xs8-ROGbSg&1YODWH0$*%>2vkrm>ip z@hmoVR#h<0Iyorxsvhr^F6S&)e<6J+Fld4V+hw8VZ8d@SP42r4%mxXy3;@**E;?2u zCm%tNsoNLGM`Mvw_?7o^D2-L!O5sN2pN4{{p3Rj2DGiS!iP>diVb%Eq@+rgMvJN2N zcd*J`4ioM>DYf_EOzxB+nHYUhTBL*Z-3VmoPh>ucr-XVU>-DK;;n4%H>4K4?j>!r|odWW+`7?LlKEQHmwChNL;hlmh zc5a&1lY5>N_ZpxEvgTVW1=j2Z{H6Fk%kO`NiIFjtAxad zRUdgj5Kpc(zXIDW?@ukZyfC9X$Y&XYYm#zO<4*Rb!GXo9^$}go)Yao66#n|2{F5+& z0>~X(UC>t*J`|#WmwpagPI47Iq#}UIzh~ws-L#GDkS|}}$edMI+0na`RC#?N20If; zF!yz9GTq{sOqh3cy%S^s|GFLVDf6Hw0eC_()0o_F9#Y6`)d_)UEXpJ6COmlGDI?HH zA^O^+e~`*BWuQpq%Pw}&A+cGT)+%?DQyGP;CovP>2$~6wDLJKIuDs7M8E!Ko0dTe% z?q=m&#J*0lL+q-Q-5%^L?cL%Sp((<~_9q%2+tA`z1zkFnYq(GP<=PYSR7gkl4r`+; zDGHl$$5mhqMErM+`=R$hVY%{+FXbtGvJ{V(4ulLcCk;F{eB2?->$p$!SWv}xb>4e46__bVWi1Ts%gXIFLGjM*`( zvV)Z1;o-Vriq#YMzZ_$3=`EkDbgi=Fw!+(0 zEt55h$VY%8A#_e=-i%>wlw$o)G5Ws8#eA)C8Qju97^K9&>;hwe=+V{9u^H!~7-fFa zIU})M96qP@U0(-(VZ-5GmsL;aXO@+oC17*zqNS*47C^uW7h}FJwV12f4{*LoDzQ)N zgyd(+iHLvlGaT6V#(Hu|-VYkLAQy&oen(C0Vn!A-w$xhlT+fi-Uh~I4oe-%`Py=N-kN;>Ow z(7Xi#G3V^qjwHPRb%4Cz=%?TVz4TZTPzud1*M2qfrK7 z=di=2Im*DThjpq#_zXO!d@;!ix~pkQ6zj>P-64F_s6pSYN}y7ZHE7B%u&ga&Gx*8L zLQW_=S9@VOUvD)t9FJoCFrRM{lD00l1lh>gtJx}C`H1Br=W()xC&v|_Wlhbrb8}>q zlSiyRXY|_quhh8+p-`b*c(o3*{ZW`4SWscKK7i7AGdcq7GA+X1?*i0An!1zJ*u?kM z2ZRIYF6~1=CH-nXfuuV$8fM&v1kYp@MkO32;W}1~E%4!keQBHEEcm5g^f*|h#th|y zJlk&LsnUTd&2$gJVy#_E+%n`s4`{NPf)*6Qxg3$K{H&$AtVC_I=YEaWm-Rm* zPP3Si4=GxT>t3x{p(6wBILvqQjFUWC)cY7*^(T2zKOpvtTk;Nml7piQaZEDB5_khd zP}*~*bz&TQzOm*@Vd>U7+QIjNcNbt^?$w%%%*G}*7YD4d3~tW)tDMu0vLZKvOmdnp zM1aDk-MU`g!Mvn-t2QA!dq!EL8N^4n$|A|INrjo|?ggdBlKv2gCu%n4i`Q8_`_jkK z61@1WkVv-Z++wmp-{ZmG!haHKLGDw%jp`AB@3&{yK{JMSEZ3vlBinO6`zy+alt z+i>~19+@;>&Gu2%6_Y)=?;rfr<|0_d!mT#o$SqlF5Uph#P0W`!*goz|tgU42N@_kAE3f0-$o z!MODbS}-dmIAEq8pTa{_9daQNf*EFjqBuJNrw1y1rO>qO)sw&8C&J9~Dtm7P^r8m) zIn^g+v|aKohq!98oY}}Lg`TIii!X;rb*y`~x;`j-Ds=#$u*H)uENxJ?G!vgf#b|y{ z82Ywx$%c-wWd}s|lGss~!e84%sk2=tDgtdO5eh*o4Uo(fy{FTE*X~2{P*^=WK&nwF zXNHQo7HxTMnU>GF7Q?KB79+r7LyF*sUHsaHMUB*QEFfr2nseRf9SjY@{cZ-T$bpe4 zN?(;@(vNKJRrh7}wQESRfvIXZk)r_}$E{3)2XKU%9`q+~9o#OkI`kQWFd+VZh4L4z zShmheu$J`Ru7~6NtZe9%(shv;$n5B>s+CIeq#XIIQULTF&^OuCf}0uhaldUl^|a#P z%^IiJ$WzogrCrJx;h70e!4fpC(fkhPn}l^7RXDSe-3p@f5-1!?)-q<6cyhP5P9_Fo zzyKR5SkAalE`7ZhN*+y>KlAZ%lvjr6(#L}=D#%vqmF95t(HhS8S~2&#;B`5M<4^e%7e(;%Ghr5C^JG1I3e#*!51)V&^w@k)x# z$QITe<05h|8)+aIOwZ(azF&OK=oh)iYns6JX*61v(z>UyDsxFWBOO%?JLnW|v6%&H zhXmi8H2)6kS4qS1Ve3mE+wCyvL{OAWjgXwzAx)yY&Rw(Hs^Hhh4K(uS2fSX-Rs{Fx zLmLT_4XO)NrjsTUH4OSZYHc!X(?A`pO!DgG!KgnG`sySiArWq5puymU35bX>XGnW@ zaF09C(+~Rgyzcghp#$h)edqeOZBkrlKR<`aX1)$jCX)pg+8pb1P@FPTUI!F#SfiOV z&ZYhGz9?RslkDM)SG3I;(b<`>YD8%cz}@aR3J_#ynU>A-fsPiPn6Rq{5Z|6zCWL$* z*)qX-uG#R+)^byzxNP3Lr@;@hF3+M7?rZ(naj&4B?WZkDglU@IAvyTrxa>F>=+WK0 z6S!DhBdObZJ$xvY<4Jvh^NLLq)ggJi*(E?EiRE(n_td5x=<*e`7T5a~Vd@*4%&N1_CZk9CZ%2Ykl(9fhAsAd;o z$4nTqIR>u%s290Aly6G$Aj(#40|g~V_@D%gj7Iz>6rxBR!Fka6*iOO)tQb3i?!n1UN z`1=mR(3IF=Zq}}QNs;qr5v)=At^>d8gCexuAw+}|bPjln#OlI;^>ZDUK5yisl7jW( zRLK>N_^|&8%-Z5CG&ypM5xiG=tDdjRt6O*mRV zcDxo&ZeUj*HjJ~y*um(kUwiBEUvpH;~iC4jX^114D zvgFl7@KKd3_R`>`<=t8PzSWE3nYcKM@=6j`!)|3$SuR-Ffw9gBwm<2`X4irRv>-%Q zy~BCkA_fnOV_`>D-tAVPZ*J^0jxwZ~2!rU_T0*hpd{L4!gTGfC_(j8)nR5zt6P%VX zJH}h7YwVsqaqvKvZr*cZXkyx4UJ_Kfzsqj@6^bESEvx1SE?X#wQTk=S;ClyMF!he! zEf4MFiK;~+Z<%#{N9VhqEw!s+Sy_dIm5OT+9pl)L?R9STTXyW1Ggt_Gu?}{lvfv)! ze9h?2_GNj@+SZsbIjUYrWw=_^9z1g7DZz{bY}m9fa|m=l*yz5rR!O?;VmQjKw%;#gWToGg!)rU7>_CeYIt+8KRnGES0GBR{E~OSb52Cr3 z`>d7Sa*Nj0@d=IBy8wu|@OEX@=o-kN2g@{h!phCQw`NYI;?3HyJY@8USvRUrV4hD0 z3C7E@lq{Az(Z;~G0XXl}s}d%*g$k~y@a&e0Gk%EfI|f%EFB_gLyd>5k4q%I3(RCG? zTZa`r7+}krdF^u6LEo`BDQBm9D$bX7GCDO(x{XHXIEvt?RUVRZGds()i0*3;_H@(% zC+{NSg8IXM{n`{KbTGLq=JMpuAH6Jsx7IFNH}mmmNWcytQ{W7&Kxmbr_l*7TyV7{` z%9x2s-!P!O=*v|a)qb<6HF%_bhU1}_5`9v~^c{JJ^G%N*nksm)ol6S9x54D-5xKXX zotC>TQfeI}xNC&h?BTS4?>EPP*_~zw?cHOwGN|o_(9Rn!%^OZdxM5uT28GcEO$J#@ z>a9X8o9c;R^`zEv zvIzi|7{i#00t;mp?`R|oqiwbLgz+^y+o4gY0z^fmcRL9N9H&2epmFhg`ocI`vjp%X z;%I)BGyf+Ye54T;HOpA3P@WdMbAm`P6ywx9kC!O32{CPJyJ9HF={o;J={cQXMYEos zBYH}fCl}?`hzOS?X*vd~Ln&}fFBKO%m&&#u5GIrGC10bFi+lxbQglX%{K5zJmeUZq z!HqGMk&y2Nl4<8F?sU%{`E{?DxGT;Ch%WpC42z&l@}k{v+il+*7c6q{Xq(t}crTLU zy`;vgotrljtykkwCVh=S^I+f-`A~R=c3EKc>DT}!Z7W`CXMq2T%`+T3hP|V&Y5Bgw zaEMJoVtbl3pa=(Dx1*IY)ZMC}p(MmU;e6qD4-mOfwADCUHnDM*QND&SWOmph!_qa% zEojkLTPsW9whi$8O`*ynmJG(74l!oTdd$eJYHfG3^%S)`Jm<^Q)=3HGmom~KYze{tF*WzLsGCM-D!qK#f zu|M`=aVQ}|3V`Ye@=;vFMI_zI9eH%PZin|lQ z02VUKAfOl-Rq$DxSS%qBwKS+S!fIa1>6vyNuE-yd?4(xa`v z@6$DXFSr|iOQ3(Fmhi3a^GiYXjbOwa>F*;5QY@oQv;|uYr?3DF2|;p<3r`wY$UC7} zyq52M0s~otHxs$?FaZ1+8BI_;YCCz>E^v!JgW}AbLY=)utE>C8~)PG*nWW;dq~b;8!& zyfsyV-LNb;fQ^4IqBt?B3SYdtlY;cMn$Mx-ripQg4*W7(Ljb^b10PZ)zlzOSe8ddN z$)BOTxSC0{-e8f42kc7DXi}O>$*HzsLb^)|I5`sEl zY(z{>#5xB^7__YLexP)z6ZpIZ?9C3gGar(}wp?zr^>MXL-6IB?+8M+bowsx|Sj`-C z+1^X(eTgQLl14;8rQA*HF1Ze0jAWM$lajy?Yhk&a5AU{XY~HSu&tg}%8eY#z!XZYV z-}wHxaw8pFNL^n_BS~U8e&kWLhmEusp+_Xe(6gG&dDJ%R>wqCg&Q71~L)2%K5m zw8)oR_kQL7p|;f5JkdR=A1qG8q^MNQ@&h|E<`_S-^8we1P%>c!IZcFesfR871p z^u1odTWxJE+XK|EW;#*?mP79M3~)5)J$W)F&o@zlXmUdDK*+RsnHeyz$&3cz&-Wi8SMsW3N_p8e6l!b+H$ScA-KtjcQ?W%GHi~_yYC5?{5@1^+;r+7P zr0>GlEjQtKhEFHQ+4%=?wa_Sn3{8=vB#5=nx+e@=-c?%`c30E~Rr1&NFpO0&r|p*L zNQ_Cc5#Gg`%9a7S&?~}Tj_hn!B_xSQ^1Xl0CC&M-=hVN}UjH}l2ZS#>hq+2`>@~7t z372jaM8#ck@+^r(>NmI-u}mVF@B%K1j_x0@_;R24-@s%7^Vcs3OhEqXb%#sx`# z2|pMo+y;`Z040nv>`8qQhhAyTJ*Xo~*`mjjmEl~Qeh5kRrQF;=%36VTo85sL+XKec zTjwAfLnU$Wk)~~x{RlWDE1&6I6$fhci z%0d|sKhLGUsYN4OJBa4zyWU?nIv;hD6ShTq8sf(7g3ES6?5&r;y5v0jzTy3CLwPkM z&u%k|d=CNWKo!B#@9E_*#YDZ12~5^C4Vx?sS4!>&Cf_yeR>vT3088?CU6KrsrNnM? zR)=8hTx7$y3)C00^9)oe{k~ffxRv{|cz%8{{}xj{JFBWfRBILQ6Qi88w$85iChs~7 zToLlMr%1{`_D6lbNYI{W`fis+VYBG9;4~nO?zv0O%jUVtRKmFMc(dsoOA10DM#3 zsCNmVAacE(VZ;htCR$&>#;%cjKP!y01?`DrNT6~PiQ|m7=18(wL&+Hy#D$mdG+xSW zV4Z3Micd;T#TYO=`v31W!gK39>0Dw=8$2`Tl?ZbGcOXk7Dw7!}B!I{POxA zY3{U%TVLZlJ2w64jh{P(_oCJ&4gxzoaW8R0GooV;^4snvJ zI7uW%aO5AU^9f-JkE}&LITT5#I;Ue&XnNLdCWMMpsC6#TiQBCh6W*r1uCG6CB(Lnp zqe#F!j+O(qL^huL-ROx9WXw*>5ro%zewxRFwK%9W`%%1oFg*Pk`dB~6_u7$nm9ige>%G-#&WGYEF%pj-Wp3z&<1KkJE^4@}lb z2=~d1jpsXam27Igb!?CkD{Ze4)M^hjn^W3gA26;9;rXb8r*NPas1o!h`2yg%So^Jo z@}?>_t#jyLiD0C-5i>gfBy3$wj%r@LCHXV3WM8FTy#tS0a`4w<;;EhiK=fkfdRn^M z7F-z%rtNmMYd7U5A|C@kaW7>lTwlo=5SOune#YK^Rp&?GEZ z5G=hRCuw-#F_-jEEb`;ZS=buMpc@_XeoVtyP+PNRciimX)pHd zD-)Yt+B8Ao?ioIyrA^W7OEpTtg;05gw8Dte-q{koyp`a*NY727hWZ8!Z z?oI#i71ieRzCi4*F8oELkC~(}M3m0SDFpSm_|e4wnVvNoikK^k34}mx~-(?LMg%BVh<)bE3`z16t=shXRdqt7xU$1!i&D$eZ(u zPZkI6CUM^@eD2U8IV`d)DCl7$uYeiI_wgcg;hi7>`YfJ-`Ec&&W^r|#zv?D=9fupc zb*jT5a>nJL)eTbB;;eMttw`(zMO=?d8!@5VvG67NI(?qUV4k!28Czi|+al&0m+g}s zXT-*aqb7^7VL^b)y`%s)t@h~ea3)I!YQHx8+~Ito>5HxxlR0FR@|!c6=N{w~wbo24FypWwACWV5bA`~0*8 zS7m$ZS$5FkJ-Cy%Sbpo3^DgQSJ_(utQb278(AckYe~WObh!Fc=Rd5Fqk+ zhf=sm$eVkfepUZ>c)yP{-PluOxHX+wqA6*AAiZ7B?16MAme4U9ojs@t;4#X-=e;T9 z8Q{VMNhT8*@M*W8rHwY z|A$d08F+YlyN>&*Hj>5Zq z=un4MWgFQkkd;M@xdgkVe{EaZ#Xeaj#a3Q`ovpR_Qa)yx?i}ifrtA4u4h}R#qf3Fy zezlG$tko;0eCU$0ySvhZR z=7-r2MI{ZhFr5bb@0cWP*x2T*8s%v8r94BWIl5_6*$|*`*7jj_1T5-^tF*EHg}Zrl z$v8TCSy>IGbyoS!89-+vPN~42taHLrq7!LUSFhCYs+Vg;8<)#qzq&- zJ&s$yj`@}PZOA7AMMl@|u4ay1mkAV>ubfO-A*?t9w^n;VgB`VB9e@tea_6xXn&G2;p*}>Zr#i$mj1)aUs@jo zu@&%BG<81j!e(je_2MWIBmg6rdwe#1b@a#nG;S-ZQSg0z2TbxC9n3tR1`d z3>d6TolfX{-DoKl5<;=TIlT^x5jtX@!1AVf?dmY=jEo3j2TfgFJRJ34Md&(X>}b(F zMxo=2Si31a#446(k!2O5dTx-9PFef4NpA5)8CH zqXw2QalNLLFi=4EBq;$1cT}|VIepK=qn6DN`5n+#D2)MRD5)^cVJIhdjaHquI>?Y= z()*DB!IY`GEgnXjf&3)!Ytr9gtphltog<4~*;crwItxaJod95XjM9fKs;Qg=%u(dl zz4(SolNbMR&FUrR#0@q_O!lP`L&}o3ve4}8;}{)T{+Mr$tPb>n9OCAI!d{4cQB9#2 zzA&EHC>19RYK*ptO@*pz3<8P_(-Oi9a&0(3&-3RZPR{rzk=iWI@|WBvoTam#OH_4F zjk| z{PjB>!)?Gh-M^eza7@1-aQdBw8SpX7uEFBLe!o;2|M9EKmC6j@)uHzX}z=m3lAR z%_?gL`@A3Gf@PRF4@Jh2921!!cXbHZdo(=%%KM!o@%(rMCY_SoA$%$~W_mx2kTNbkEECFWv7ZFkAA?@w>yL*=8Mx?^X5!Tk584K^^1s=$ z{m)2EdE8>uA?hg%I;)1|9sSwjxCO~M;?q`(pu0oSMHW$7kStB6_OotvM$@z0Ma^aEEYRf)J`f~o;a4T&c=dmM%idaVmr51 zRd{&6gJheN*vvEQMO+Fv*c{BsSwvQpL(&yTL~M!Z={z{V(&U~y0yNUgU1aE|4`iA= zcC&DF-zKqs`=%}$B^=u1WH+&S-lf_IfxTq5+ zU#qo}Uh2pY#yr?fYg#&KMNVv`a`iFA&P+nb{Mtjgjz=rrJ2hYD&8*pm(W&P_UxD^J zDU+NHz25-fu=Si<%aRX_;`{}p#_j`TD^h#SS>^@>M0>HP;;NR1x#fV9&Rr2?C@}H< zR?+BAq3i_?p~qoOC~H5i!%=cxAp+64D~WTFbiuSG;=tl3!Bk8q0SAGq`aim_t_Z4a=lp21N)c-wK! zcqj*~O42RNjRwb^e>!rJe=Cdm0jjB9;2@3^n}i91WXkKRaXd^o?dR31*)7Z&)=MbD z87aPLX3Hn}_Fmz1GIeg|=~Q6rORC z?F{s35n)$zEvxGp#Pf5gAx+#!N`07uA5n|<^ph|a$tylmYGJlJ+qhs)Zh4qyX-}FT z3k+!6L_=hAH9O1#Cweb}`T=JQUf^UxVjagc6nB-1QF;>T!Ez0Gkyb&g;A9{x0-$nm zWss=&?e+j}#5S9+s12Ca8hET(oL%Fq1+K0aM^8z6mG#TDQJ+))NpwQzHK(Ia7gfuF zU2TlnJT8;n2?A*)SCWeNVn4!Te-E#>XEb=GOIY19cpqU&ds$|-mIJYeYTkAmrr8My zHZrunU-;x0uV)f1M6-HfKOOAe%~UP{^v8>u62kNGEAg>YXOZo54{3 zbx+|s;N&D+|9!g+_TePj6HbY3)_;4<@V&KXupG5b)0oG)%&m#>a?VxGR=SOVQm33- zR)@IgT%6Yx{0kS4E}1>&o^X})O1t+22%n^o0mV3UTGZ%9g<8PAJ|^oM1HW2(eg*J@ zsL~FY4p4Lik&Hbl%6dbxfy`5TtE9w}K|}fC);jO+iWxo${dxuie8+eXUuZy<2JK9< z^UYABhZ?6s%+rD&oWb44oS1+Ad_8{w?)*=}HvGGJ|BaK@cuX=bhR7W?J6SsV8a@bG z6VE$z8MYKH@4SH9@%>nl`L6>;yr?boT(L;VZ^_0v?W}`MCn0fk$Kf;>VG?$O<%ro< zf81mIqd7O9FjyPk9fugShysrJS%K(G&}KNDr~QW1W^jY2X>RrsrpDjP&pI*#R+}S9 zI`@JxrpmcAvjAasj59YQ`e4T|H3(bgooD~rI~&q*jq5gCWMEQ7V&I$2+{gz(r6rt^ zDhpStvQdHhbm=x)_ei2Z<7uIZg z#@F1x&i%(>Cn0!ze7lbPC=11#nbm*0CiyA}SlRJ5#~tZaL@4tzqr+2C1@f8YfQ=q! z^HP%&Tso9O{8VRQ3_%7l+8S&5{NBLTHS1=O}_3xg{Qw;65c8OtOXX|n-Mb#yp~qii41tF z?Lr94nYxFe-NF8W8TlOaT?%dwZ`V;jWFW8KZqCww$C1#wS+ZMgce9~!M;=@H!LFD> zY(+n};i6)zVT6~?j!$qqNxR=F8SDr8jo>DZn7=8e@gZGB=oZ;fWNl` z^dURDE#od0dfvGjQ7a37bHY|zKK|Dw;6COg0Qb*t*D*i%KLD%$(mvzaajJSBz@{r` zUbME;cy?es**|QAbmprDGUOzI4uv|@MSE{x<%MQ)+E`Ev}E;N3%{@<>9OVZJjR4R;9}rhl%sANbr=ywuIOEBt?bXYsew@Y`wl6ry{+^zS5%-$@$3 zlQe!OY5Y#o_?@Kje?^jpmruXDmbiPfgR3$5i2<{#ysqCS67_$($NY`6i;k$^fVC{) z(IBsR*HfZqzGz~qi)YKjd2c3LnnBc#M8Cg_RVxw;z{skDb07}&S|S%jn5ru?nYrTv zH&tFvdTBP_-^!g|j-%Wxf31SHM&@XjwsLqJ$@Nvgqz?4;{t&;ifX-NHih4=HnIkz{s**o0ovqgYQEIjvKV^d@-@!} zTTk*9+_tgOh6~qn(G(jt@y|1QF48XMYS=%?|6TVYEoeDj?2Wlo9uA`+WNjE)5lzlU z7hj%MKFYYK&0v4;Y%CeHUqv-@-g*_cSQa3&?OQpd*6Rd_ioK%akeb>Hb=Hti`-%?| z`I^D-t*huR_tYuqqsoJnK*Pv#b70}6vr*I^#1{{vUiKJ2pRPF!502tx85U;!<1~gO zd3F=u-~81@_GO7E^+7$S;qw}Wo?cpj+nxvgSQmLx0UE(L%ZloqPY%qA0W&@oQxQh^RQobmv>gl@&@ z!|!@@?CUa0(s6f=Xd6Thu5#X^WsCs&e3T8JPkLjIG3Qvgb_{tu7Q3(m!Sq|Rs&4lV zu7_-sm6)QSdmo6~>(p7k1@8ItA%9CJxwGG2#7(d zHrH#DH?O|E2-CKj{tGS@gRU>?B)nGDxyD}EMCRtL&fCg%r*Yp$y4~MQa{uG;>MFlg zZrO&F`*tlbcwx@_5VzexD}SF+SiiN6x4J!C?|ogS?!I3OybhbDd3JyNyfXOZO4#K^ zn8l&{R#ej*YxnWp!vO6&;+H+Ci7FQ$@85j8y}Cb56l^{oCP8?I@zs)F(0sDc7wA=c zo60+Y+HIZuPP9)=bKy=9+QA1o-1GY{>d?>3 zCLOmJ5d5N`C!Lox4v$M)+TT7J(RaSp~cj99+nV|ceZWV7$E4kZ*Wa8JQFys9zw?%kg*;jFX{z`tWy#7QB z_g2aIUFtHka3-bqsY>tsxSF?z=R8Sn^R2X)9fD~Z^J#lxtET4b0;I!d|>Ol z)3+{Vzdz;pyT=b({QT`{=EbEm*W2UluI+B07=0t)+vHUxN#1{m^u=7g)kA9KA4_wh z+&kW%hU(h1=5fpmhpsO_{{980D~CU1c^c>KK?P43JCkO*IOF+!jlY@pBmniK%)j}Y zV>afO_tUDKoTzunc%rzSf0)n9r!PND!}CNg$90RlZ}1joA39}HnGXx`!qSK3@hRpX zB@EvQ(tKF?X}w$&bX$dQcW!@3-1P_3pOP=Y?(e4Gz3bri1BFki{HT`r{PIHCXQ}_d z>VC_whHC+uX(F({s6c7|z>ejmGZXYs>5KJULV5rTgoopssBG zkkQFL`ImL|NV~~2K5B%Ct-0geKi~99{m92ZiqMXqY3EfRF6b?Q{M5U7J^3Z6d-pOg zdsLHbTx&}|3CB(7Kfs#K+r>Hk@Gd`Id??SC+ctl`+_t#Trm80K`JmrLjxUlQez+LL zUBhRSe`H?t=-YcFah2-#C7##KA zclh@crW?JSiCcM9J?Mz(&BWS?wioa5(UQLZ$##q8AqKd-e24iKIv-;2a9R6Gz*_)u ziNvo|%kGZK$9020za$miCOd^R$?g2;x`K*4%;v`O3 z4WF|v-rNsMo!H@r_}^l*xcjiEAA#fKW!P_C_DtGI#IFUN?ygevW=->q@2dV9nLNqN z`=R{@6K<@&E|d#^NlCt+jQzFBF7IU?9^z7)qxsin`{Z5!1vrmh z=wFtMuYUDk!0gKqKjZ0h^z-Kzm;5J7^Vw7Xe(ui>{STo3Z$g(RvOEgp-y%qVehD^y zq|U$bmS5TU8oB(tYv*h5^4BnZP(JUm&tHf4^X2#p68?UHu8IA%Tqx2S69~4 zCcs~v{V$f+PbvEN?|>OYR)XUzM5B00YorLUp+e@0}V_VfOI$$i`d z_|bXWKi@rk8RfpU@YkKWk3ERLVEbQoB7T$s`R{L{{%B;{8 zpBf(g9ggzfsaXD7O5ktWqJ5H$Z*YH!Nxp~w@6-KTwEq2g=g&W1cMSjiZIXNKjUS|w zeVz%up3l9W-@Wegyqqun`E?8KhspiF9{lgSHSo`O1^;~5(fhY^@;+JdNvxj$dnW3w z3`_Br=5}Dd?^pd4Xq)-TdHp^Ml{b4}Ld4_&=)o!OgmVItu^!OKCMl zR`P+Ob#n!Ys-X`B2aPkcolftEApiq$W9q3ZxLbHgBE zW`$62;z71C)6>EMIot8yaS_Z4v$>rnvym@pQtX6r2pCnX&U=i<83K4hOfEo&C-#o`mkp z%{X`iG&_D*7JRR{avg4#7Tv})xNv6L*oWI*JM;@sKR5YPL5>H;KZ@Y;``g$TWrfo< zZSKkrZ57d1G=O0hjz7qx=)ogF9Q>1jOO7viEk4_C1y;g6vPEpxoHHFac__Z$0$WBW zys(MbzAoVvh)Ug0l+`E7lOTUSye&U(bN_ig;?A1Hz2y@BWRt^ltG|5_d=bCRW~0q0 z!|b5FsCa$9%7=BIF9^RaG%$)LFc0PxUlG6GMUN`MNY?p@F%Y3O&L_i=D>i}WrP7_5adw_n zLO1tllB$2<-cpmc^%mM;nNx(*ZI0y*HW{KVB{G@Z&N;tb!vav^mXxTUQ?YZ;b01s| zNPz^M8#hoHwJY0-W1no8!(fm(4Ui=#hNdPT>Y$@~?mnIGA$bdZbsPd;SPCN8B~G=J zvvZZs!V2A~+*!8{YYIZUxm^8|GWHR-vQGLsaByd49dTLR%yNZ70$nCNky_0FMj2?_ zR{cZ$D<^8(aDud>PZ_%9fnc|8`e;k;IPM7M9&g3)Ax~po1|w_#)F1aIeveD>Qlet{ zoi#Z7Xk)t8X>OS#N#@?L%I%#DZ5#0iS6Hs&P3!3T@7r~(hf=<6`q6vf2k8#ekN!JG zgp|P9K80|axA*W4(ZG}`h7C2xT6~jRD_X`mURXumvigO=N1gLp32M^FLfau`siTtI;-$562F2@of6mP7`(4MkFCK48SpG5( zMgdS_4xD-JFe_qx9WPsU*NfylANYM{Q`t%Ke;Hd5?=jwyWDciruw|z z^4kLawm`ov(2p(9HO={Q$)~NVi$C|%!`0tQ>Gx9ly_9Yz)R$8RfB50)PBux{!veb8 zA-}x(4;A3=)wbE}Fv&cS0j)3C?oca-#?|pPD*-&Ht4gJ3980DCFXZ=(K>my=);qP# zR0~ndqBT!Fps&syvuG+=@yoV!T@{u4k1O#X)A`(O-+4y`0|a#!q;Y#Jn0;X27Ae!w zHt-5a2nZ&#aC(~BXAu?4tV8>GcOZ*!4T{S;TyM|7VH=!<9>ggvZ$Qa!!(|^7iLqZm zlf(G8NZoCN;mc%1V=ndy9vPzXba5R`dFD}St?s~prk^OWB<~_(u#lSqDq__ zt!YWk@bktcpbo6htzT_vSzFhZ1@XMa*b-3C7VvaE`zpz=ce9ai*J5lqT_0AX3XYnx zoxA2aFJg0u=0CWbeHm_AikE+`x3ZCYt;vrYfFEn>_ToQKIAb>RO>0~R^B~!3{a&93 z1f6m7l`eAuPa&}0(~Hek-p8~fpHDLXPfFIhJ`d|CY+89)F7&KR_?{pg9`D)NN$#hVp!UlVrz0=oXo~PZK*wQID|6CkUUWD=J(CI4=UejabR}B zu3>496MWgWPOMqv{in}mY zC&o>vomayLC3fd>Hg6Ji*_70+D3SRrFU2N2FISW-LL)nU&8jUG^bAR5YH~;0%gfHw8NOB2!(TJu(sJ*VZF3OycVd8<)HjqZbt?Rl*##O#9p2a&|;H z`opH(F3P@59&`0vFDjv>Kah*%L;L5yrd2r9o}*A>Kfh9EMw>V4XwbH3pJKO%*K_B;7{m*?!T`Ap!Si_}8VD zqL`})2wp4(GFa{jy~hrnuI+HnrjGE&_C~L;O6NGMhtCpZ@ACPU=G`-}bAo!DuJ1P3 zU_qJbN?RI8GTJ-_<4!2Mog~tYSHLTSJKcdT7H_rNw3n-L=ccW$-BupZOQpe=&Y85e z+txmWGB-AXbQK{OSWjZw14qG@9*}{VAO{>N+ zKdxt=#s6-1Mf2>kI~uz$cnPP-2~52@?p=(+T64&lcEESLrbM#6-N4PE4QqmBZq1oL zOVqtNVQrh$^P$^ewgWqhHc@PD_+^6O%24*(g5WaXRAb6<8mr;S-mFib&iOaXr`@Im zbHZCowl|5#;6&79r0C>@r_b7~T9a^Mo{`Owo7o`6hDyk;dk4qr!$Z85vl0#%63u+A;LWLm!tFQL?`Z%gjCg8bBY1^`@ z#X8wB5P1SN<$=pe2!!~I3o^D^9n~|6x%$Z%=qJnez64(6Lo&4)6;S#X@5s|a#*e(; zX-Ft8QJxWZ+b*wjzk{7R##Z;qjpLi0xMtQC&k-0f!&WUD;O81MWOyI&9t%L+T1)Rk0es5h+yFN?sM}{u~oseR}PVf)jscsyX0t} z)4R{cC;ZjC<)Q>T(V11jbGgCmol4q^!6_w%=o|5e`))5O+5QjsdD?OsOy4bA{yk~= z_oU@FP+qW_4Behgy!qmN(5r+tHve*Vc@3i>bj&it7^R2^;3n`FjV z19Gsw1^fxSqCU1YPIarVDzMzR3?{yEey3%BL)+T9jwWD$e1F3l9dfxg%cch z>V-R>=%u@j+tDmoS~)EqflFrRgzKh&?Nx6|$8oIm^TY^A6AX4Y{~0(6bFLRvwMM3c zjM(bn?puOHc{97A`DstR*rIVay&5WM{w8{arvo|_vBt#GIHWk2a(oP4h|}5CM5&XP zcqcB@s)HJxzP*pAdA8X3vG%-XpCRZdE&^!h=`Fah>2O-O&6oXCC2sVYyEWMicY^qH)GCF-|)|M7#t2(yMo#jgR8FMN$}HSdm*}iKH674n)~2j+oX0x z$dhfxdxR*tZEL*QFSCS&_=1lwB|ca}9%aAGidP1FS!?%FLhzU^*G}W}2R+M2jaW~H z9j&pn$)Itp{fnyw<>uCFO*s%!$mB%t!_a#===1RwkvRhxrbS4BhEmCNU53o*9!$pG z_mBIuBI^~GKJ%k}tMyq4ck>>E+|SjO2M{kmIQr zbvPR*BCoFzE(a$=*5oUggDW7@YGO0fER~x>{5s<6{K#h_7eisDwLA!U&q6j@5(iqH zEV6)Su&*4>BoM5B=L`S_jEtTQs>~nv7R3e(R&FB!6y@ z8P%9^BzpDYgg@)Fn;XeNmc_8p;j+J8BLC93TF+^q{}o=hR?@q3C%CNRxjiQOqf=FG z5K-wqLX^1E%dR*LeSNl!FVL4}*wm^G=#`YZhWqt=N(~6#JmJKI5`&#)C;^6wT&(If zOZ^gEd)CohsMT;92;^C2Q{M?HRJ6ODy31~))p&b-FSmJ-9%}6JV$*!y(A6#JR;%Y& zQ4R+>I$7W~Ddh^KWEPhYrj2JT+ns<4R<3WeB+nLJn!@V^9#!tlUPY1F6rkW4+lr-ISSczfJiw> z6xGC2LiZyxJhS+x$fS=7!i8!tj1tGqtq?duOLZt(_j}Sc1sD@9URIL`Jq@yu%sZ4h zVN{@FF=QXczSR1TzpaIV>`X9hc)SIjaVKn{fRX7pDhNLw{gEpE@a7-LFQn6#9^G$N z68;7n`VBPnOY;5(8u|@1^c!gCH_*`VcLELl2NN6rPB7k;VRh-c;>!Wfi}TWRIK&1J z9p5gqewY1Kf`jH%E1ozKpN2}$N_)H8lO#lDt`AhA-|IUQuaZMYU5owI-CLf>s!CEx z{{l28IA)|_><`#^fZ@A89#N!$Dt9}m%Uw?ur4C&jW7WJLcGxEoUlVYob@b#b4{TGP zm-Gy0Xea>n)G;B875G&;_+HWIoBnTr@uFY#pLR^F3)2wHaNdSye(@kNUvzg;+P?sd z7k%50`ZRjuZ?IkNS|VUnU|Iv?Qf`O4dwQNn=(x~rTZ1NW*NsZuYe#bA+Rtql69O`w zvRs$04>VflCz|ciGs0)atk{uvKZAPLY-&XW;a@>WpU^-S>|6mK6Fx0GV9Yz?aw_k) zI9AJXb^MvRg`Rq3D@t6zw>0qPrr$frpVGiym)&_4I1{P33n@9l0fwnyKw$qHJ;=W{ zz0<(27cXw|8{zRE%#!(y;`_e|#rMf&x~rPkk@UaQI=|C8ztcLu(>lM?I{#bKI{)|o z3`75yyAPj7QIVlAqIr-i5^#l>NKZL^!^ItLAxe@%2!<2eh$BZVOuVmMfQZ9N%oK4w z=Ur1<`gA3*>VRBh%R5N?1ztGRDEWXhqpyUrDel1nw$1?y>6%U4#)Oug3+GCpnLAks zV6q|7bP1ekVaOVd(GoFnybgl->)eK;=nZ*Q9`K3F3^voqhBq?o4bAJ-|0 zUJ)<;2I93taMU!n1@#L7%1U7X>DkP8j_%QAe~6(@MS0t?bFQ7gCSEGUcKa=@SY`pO zj#v>SwfY6!t(2MD*-o=lSJmIpz>YIM%GRPxU*Z-<*u)}V)Dy+Phuz2^%tdQuDvU|h6F+|n+p(SKw26AV6=o9jps)yTw=P)t{5uJVr&Hg_`RVoBp#~42s51VMj>ukM5&s_d3Le6y1nBnWfQQO7 zc0)fKoG%!0!Jg?siM5%OU33Z8*ZTd>$(y7I#20qve1kym1m+AkM+iOf)sFKM7>CB| z9ywps`usW)>;P+!S-Lw{k9Fr!Hk6i?%@CiTnt;ceNZeS9GWM7D7!#0H-9gaJJb#4`Jcq?I9 zAR2VodKksf8%nS^iBRQKpyXu%Q-HHY)pGpFqw$F7+n$S(W;gDv>ztA z0X>(rnDO&&sBb3uKH+bv&JOlYH}GJ<#B;MQ`gO-*D_S11yN=Y>yZ3O$_IS7o!c$1| z1L^%6A&Liov3I|FpB};bg!`yM;5P1 zv_9#)B`Mnl+Ji9BU-~X*XTq~9${s3Rf|D2SO5Jx%PE=_K8N zJW71cwa+X#A$piA`D>x;^!(>1utS}zR4sgSNc8Nq@XA_tLNT98um5tKe7~b)*rv@;1e) zD-|@cV<#z-pM-H_vb-&#i59+J>!l^@X|WtdfdpG)J(X*He}&sU04o&h*#5d^1`PT2 z!s7m@Hm9E*Xtx*a&1ZX_3jltrRb7$rWLtbIM^XWm%rkrR1ns=Ri=Lu%a+e!FUDOB8 z$lV@)c8n4?NKA@%a6yD@RJw!_2N+a2O&+soy-y1j=&K?fXWVN}^VwZl6pmIcVGq!n zavmzP!wQC%L0S~Sb3syd#CDI_vb~^KpG(4TE>JzYzb#?8DqqFoa^MXHNRl0!1sZvn zmAmXFQW>sMs@kTB@?V7DyLPRa8~V0F%nBr%h%2pQ;N)Y7JBvH%VQsm+tkrkhcs!$j zjdA>`6g^TDzxk_tWhq5)?Q*XRqKIE6XB}cB4Gw1J5&2Xl3u_2<-D(^+OB94!3<&9QHV3zkGyG=qRA^yq)7E=Ee)J`k2OHN2bI`k`~WC zN*vQ0g-o^tRGRmmv>!(Bvjm}UhEfbt*6x?sH%LHZND?&)lK|%n9k4ey^qui=cJuJf zZQP&A+Y3QsJ8$guxSo|=F{|a-8}1h9%Jsm;-%zZ85Jptc+m`-ng8a$1&zHkYIuMpu zKSDKi!I{gXZ%B(>+~U%Uy1Ogfd~?n`Odax{E7ft`e%6Nce>Hb>1I zDI<3Yvo>1j2+c^KQ_WEcpSbPObohet_q3XtdfVxEx4{MZ-1JwOT_ij5c77i=IWIRA;ynH&(6!B_@&KHPQ%TA>b+$NoN@=FPR+r9;a2jrBtvHY40(WA1J_ zVD?aU4CGB1HfjA1?^cs|TIKm>sL0*(s&gy_qe%cgmnwV6#|^D7(@DK(=OwI7n=2y2 zDnG39`*GmAt@PukKVFafr-}4?wBYa2g8wT=3;vF0{*Gt}?+BeX^SQ(c?OYLl>x)%$35Cd2;pcGObq6 z5MIN4QAKJ18nLYuS`C^p%QiDo-~lDYxQ z)laTxZ0u&z8zkqF{%Ro~hU$;-ftWlrK^eDs^^X_G<(~%lT*_eO2W~za*XGpR^{cAO ziMY$Ju5POC-B;vpa?_-TUn!->m*<41an4e)SRK#?JT^gxOt|gFcC;6q>^8CK{k0>+ zMWi+1U!3dufO7s>!0knD04QbF8sosAR$0|bo~hvMMct*Vwkyl`!(AAx_WY%G827Qo zFEJL$&`DMW0m;#8UBe(+o7*kwR;yE^_Gb66XGE~#4Q223 zEPQfT|IpF7Otvg@<|N{1T(ex=_v597y*;)sVI>cc15y}jR!5-4g``IFwY3#SXlLcsF0V*#4Cz-T4-JI4nK79&6wP98 za4m6A%PhY8EXk=FmAf#s7Fdje!u39v1vllmA>h7cTSixp<@r=G$i7={3MqKk2=_gC zNjD*+z0P}6BQWfO;eJth@Gcs2^cKgWXWK=YcoB%Tl+EDGz&8rAHVv?PvO@5Vtgqnd ztBRkI*nlB~c;wPUKC@~WJH}xEU8xhx>WsX@z!evRz#m>A1Ad<8a{p-0d3gP3kB)%u zBldh{&=&Wps7YK)UWWtb*(B}xT|Dz^1*GR&f<89 z0VjiGkOxw0HbCcw@pVd-<~VKAM3St=V`40%lc5=o#fqR9d&A(k75D#l0($W)*%3Jy&bszFpKNW`_x=C zL88rS)>@Uw6RB${IXGV`MwIx>?XV}W z0U&$1N|$(N#yK8C?KipjC+EIy_LE)f;4XAur+K}b!uj@B{~ZR7n6AY5j%mVB^DViO zF#{pAM!TZLb-%x!NH)a{pDij2{es-Zv62B`?)jOGG7VF1_<7aoeXBFcsUU8s7kMf) zm3XMWc=VUY>0UqB&(HOb7pV20x?Qggp<))Twn0)HoO|dPF##JzSHJV|oS|1~bip z=oi_)yQg1e9_I=$BsRFE`wd}lxCx8FBpXj&ifkV%2Uk_H74A&xQlea0aRxIIosrE;fFaE{p0O4;1B@z7aQScSyIk1ge|9N?SqX%DD!d( z$w-l4c65Q<_C8Phe2alTe|m4yc};;w60}Az#|alstInLECP%pK^=80X{OBK6L(cB* zu<(^OSobuNz{l>IbC1!FrlKp^>0%em){&Z`%ed>!f{bit@T}k8^3Vsq{&W~`valxy zcJTp_3a5*pX*tbc=!>_-`vzaX+4sTTZ(hD~`Jc0S-(p3+NdkSR&1)DQ|E|}+p<@1Y z3Ti<>kxFz;pIC~i^5e~&$%NpQjmru|^1v9D3(g~j_s%f*FUk%u&u~?lz=)_nZCupVd9KgvD9!8YEhH!2 z#$A{8?E&&WFS$OX%Kafy*5Qa6#0Z@YZ&ZZ#bR{Fst!&KCcU-QdWJ_ybm0SZN2lxa? z2eORSDTG8$aB}_F<4r$ZsB@ERP@*&>OF++Q%{R~M-@tu(*qR&P5;ve7X-I^?VmBTE zTWLAzP{zlJS~ID=k+-PXqfxzx)d8p-zFBZa9%u!vQlpiHUF@}R6K3SnZu^*+RByHX zNOUaVM8nusWdu-A#h}s6J%(I&#=l5I0v4)q+I(!RWufrRbO19Zl#bd|E~AwxV@OjE zOQMS1pX2SGD-2H90aKa1&PZCGRX6Aqmb^$4_lLV&3#iEtQ$B0BcAJFHZCsTxm@b9S zoDz%BkroIE6|dNl+%<)cx9zMqtw!dYelmuy;vA6#pn20ZfHF2pNLnkdVTV1p>|!;F zp#ZPfIpJ3*V$`ROqu1y3EKL(g<6*8Esxy_t8J^{Z`wDQ>RQLOU# z{s;6nSn*)a2iE-?diy~i#At{ zu+jR`$ziQ|t!@$y%djdKNGRam-Wc?#FeFiJ92I2{@Jw0~wErqE=s{IINpYK8`K{SN zhHn~3#|Y=L^MC-fFs#b>Q|JN}@DlNOq?!M`kzbzD5nZNZDtWRr0(#G+MXN$c8f(LL zo-POziASuuOe|tBe+t77YXBB;C>&Y4&9rIF01pa#!N94la{0S@XD4mb`LwsdYJ1_Q zXuA6m&$JB3ZC0Q_!8EnGet&)UG>tGKHS_W7&pjXi`Fqn9an)g97B<;IgUV#q0 zB$e5o5)ZPqbn&J|-o-2uiQWNH$s3s8%eUD$$lxnm55t)C?UX)eC{Zc{VrGIZH0pLs ziwn?{aF%k-iqX>!mj*){g1sn2a(poglBx~He_UTN&Hr4(H8Lk5QKerA5YT3>193_O zeSga;E*aRm;LZ+~Cq3%^Oe_BLm4g5I)v@-jMUGL>9dG%OgL|TIugI|HRGqDjgG8NW zPCrKyQ`aH+e#uWR{I1652F6ZCU+;;l01PadCpVhht~;_z9Y<6STr}r4Uo-Dl`;-K< zR&Idm1nT}S=6$8z9d2{h>P{cJ!k&*pz-!5lu^@i?aJtVQWkOWsZs0|4aYL`f_WPzh6QCuKglujOPJ5-+BHP_?ZucaTnLR zaM*s~JEJUaaXyRhT^a#CKtK9?iJ*J%P(>3Cv^Ww6D%3XWEdG^-W@83uD%a6c2u z)`a*~39Fs*v`*ArRi0x`TAM5DrRs^dsQkd|-AP<_CEYCTtRXLY{42O=Aa-w6RJ4cc z8f|8q9=D=uO(Wa;mSF}ntNBM+HRdz4F;7S%KOWk1_5Byc_j#5NJE?9DR0JG@8{yHp zSWd_Zy|@+m2KlR)1X7QS$EyCy3mQ*h6-vJPCo(Z}(;_0JiOf4=d@kNto7 O82=9f&o4fN-4_4`Txw+i From f63a0d6cf0b7db3dcc80e72e1383c3df723c8119 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kat=20March=C3=A1n?= Date: Mon, 7 Jan 2019 14:56:25 -0800 Subject: [PATCH 65/97] spdx-license-ids@3.0.3 Ref: https://github.com/npm/cli/pull/121 --- node_modules/spdx-license-ids/README.md | 4 +- node_modules/spdx-license-ids/deprecated.json | 11 +- node_modules/spdx-license-ids/index.json | 204 +++++++++--------- node_modules/spdx-license-ids/package.json | 43 ++-- package-lock.json | 6 +- 5 files changed, 140 insertions(+), 128 deletions(-) diff --git a/node_modules/spdx-license-ids/README.md b/node_modules/spdx-license-ids/README.md index 09b080cb20eab..c7b5b5f320845 100644 --- a/node_modules/spdx-license-ids/README.md +++ b/node_modules/spdx-license-ids/README.md @@ -23,7 +23,7 @@ All license IDs except for the currently deprecated ones. ```javascript const ids = require('spdx-license-ids'); -//=> ['0BSD', 'AAL', 'Abstyles', 'Adobe-2006', 'Adobe-Glyph', 'ADSL', 'AFL-1.1', ...] +//=> ['0BSD', 'AAL', 'Abstyles', 'Adobe-2006', 'Adobe-Glyph', 'ADSL', 'AFL-1.1', 'AFL-1.2', ...] ids.includes('BSD-3-Clause'); //=> true ids.includes('CC-BY-1.0'); //=> true @@ -39,7 +39,7 @@ Deprecated license IDs. ```javascript const deprecatedIds = require('spdx-license-ids/deprecated'); -//=> ['AGPL-3.0', 'eCos-2.0', 'GFDL-1.1', 'GFDL-1.2', 'GFDL-1.3', 'GPL-1.0', ...] +//=> ['AGPL-1.0', 'AGPL-3.0', 'eCos-2.0', 'GFDL-1.1', 'GFDL-1.2', 'GFDL-1.3', 'GPL-1.0', ...] deprecatedIds.includes('BSD-3-Clause'); //=> false deprecatedIds.includes('CC-BY-1.0'); //=> false diff --git a/node_modules/spdx-license-ids/deprecated.json b/node_modules/spdx-license-ids/deprecated.json index 2e40ab7618e30..1681f4870d5d9 100644 --- a/node_modules/spdx-license-ids/deprecated.json +++ b/node_modules/spdx-license-ids/deprecated.json @@ -1,23 +1,24 @@ [ + "AGPL-1.0", "AGPL-3.0", - "eCos-2.0", "GFDL-1.1", "GFDL-1.2", "GFDL-1.3", "GPL-1.0", + "GPL-2.0", + "GPL-2.0-with-GCC-exception", "GPL-2.0-with-autoconf-exception", "GPL-2.0-with-bison-exception", "GPL-2.0-with-classpath-exception", "GPL-2.0-with-font-exception", - "GPL-2.0-with-GCC-exception", - "GPL-2.0", - "GPL-3.0-with-autoconf-exception", - "GPL-3.0-with-GCC-exception", "GPL-3.0", + "GPL-3.0-with-GCC-exception", + "GPL-3.0-with-autoconf-exception", "LGPL-2.0", "LGPL-2.1", "LGPL-3.0", "Nunit", "StandardML-NJ", + "eCos-2.0", "wxWindows" ] diff --git a/node_modules/spdx-license-ids/index.json b/node_modules/spdx-license-ids/index.json index d383fccb3a194..ed06199127e0c 100644 --- a/node_modules/spdx-license-ids/index.json +++ b/node_modules/spdx-license-ids/index.json @@ -1,63 +1,61 @@ [ "0BSD", "AAL", - "Abstyles", - "Adobe-2006", - "Adobe-Glyph", "ADSL", "AFL-1.1", "AFL-1.2", "AFL-2.0", "AFL-2.1", "AFL-3.0", - "Afmparse", - "AGPL-1.0", + "AGPL-1.0-only", + "AGPL-1.0-or-later", "AGPL-3.0-only", "AGPL-3.0-or-later", - "Aladdin", "AMDPLPA", "AML", "AMPAS", "ANTLR-PD", - "Apache-1.0", - "Apache-1.1", - "Apache-2.0", "APAFML", "APL-1.0", "APSL-1.0", "APSL-1.1", "APSL-1.2", "APSL-2.0", - "Artistic-1.0-cl8", - "Artistic-1.0-Perl", + "Abstyles", + "Adobe-2006", + "Adobe-Glyph", + "Afmparse", + "Aladdin", + "Apache-1.0", + "Apache-1.1", + "Apache-2.0", "Artistic-1.0", + "Artistic-1.0-Perl", + "Artistic-1.0-cl8", "Artistic-2.0", - "Bahyph", - "Barr", - "Beerware", - "BitTorrent-1.0", - "BitTorrent-1.1", - "Borceux", "BSD-1-Clause", + "BSD-2-Clause", "BSD-2-Clause-FreeBSD", "BSD-2-Clause-NetBSD", "BSD-2-Clause-Patent", - "BSD-2-Clause", + "BSD-3-Clause", "BSD-3-Clause-Attribution", "BSD-3-Clause-Clear", "BSD-3-Clause-LBNL", - "BSD-3-Clause-No-Nuclear-License-2014", "BSD-3-Clause-No-Nuclear-License", + "BSD-3-Clause-No-Nuclear-License-2014", "BSD-3-Clause-No-Nuclear-Warranty", - "BSD-3-Clause", - "BSD-4-Clause-UC", "BSD-4-Clause", + "BSD-4-Clause-UC", "BSD-Protection", "BSD-Source-Code", "BSL-1.0", - "bzip2-1.0.5", - "bzip2-1.0.6", - "Caldera", + "Bahyph", + "Barr", + "Beerware", + "BitTorrent-1.0", + "BitTorrent-1.1", + "Borceux", "CATOSL-1.1", "CC-BY-1.0", "CC-BY-2.0", @@ -100,85 +98,77 @@ "CECILL-2.1", "CECILL-B", "CECILL-C", - "ClArtistic", "CNRI-Jython", - "CNRI-Python-GPL-Compatible", "CNRI-Python", - "Condor-1.1", + "CNRI-Python-GPL-Compatible", "CPAL-1.0", "CPL-1.0", "CPOL-1.02", + "CUA-OPL-1.0", + "Caldera", + "ClArtistic", + "Condor-1.1", "Crossword", "CrystalStacker", - "CUA-OPL-1.0", "Cube", - "curl", "D-FSL-1.0", - "diffmark", "DOC", - "Dotseqn", "DSDP", - "dvipdfm", + "Dotseqn", "ECL-1.0", "ECL-2.0", "EFL-1.0", "EFL-2.0", - "eGenix", - "Entessa", "EPL-1.0", "EPL-2.0", - "ErlPL-1.1", "EUDatagrid", "EUPL-1.0", "EUPL-1.1", "EUPL-1.2", + "Entessa", + "ErlPL-1.1", "Eurosym", - "Fair", - "Frameworx-1.0", - "FreeImage", "FSFAP", "FSFUL", "FSFULLR", "FTL", + "Fair", + "Frameworx-1.0", + "FreeImage", "GFDL-1.1-only", "GFDL-1.1-or-later", "GFDL-1.2-only", "GFDL-1.2-or-later", "GFDL-1.3-only", "GFDL-1.3-or-later", - "Giftware", "GL2PS", - "Glide", - "Glulxe", - "gnuplot", "GPL-1.0-only", "GPL-1.0-or-later", "GPL-2.0-only", "GPL-2.0-or-later", "GPL-3.0-only", "GPL-3.0-or-later", - "gSOAP-1.3b", - "HaskellReport", + "Giftware", + "Glide", + "Glulxe", "HPND", + "HaskellReport", "IBM-pibs", "ICU", "IJG", + "IPA", + "IPL-1.0", + "ISC", "ImageMagick", - "iMatix", "Imlib2", "Info-ZIP", - "Intel-ACPI", "Intel", + "Intel-ACPI", "Interbase-1.0", - "IPA", - "IPL-1.0", - "ISC", - "JasPer-2.0", "JSON", + "JasPer-2.0", "LAL-1.2", "LAL-1.3", - "Latex2e", - "Leptonica", "LGPL-2.0-only", "LGPL-2.0-or-later", "LGPL-2.1-only", @@ -186,11 +176,6 @@ "LGPL-3.0-only", "LGPL-3.0-or-later", "LGPLLR", - "Libpng", - "libtiff", - "LiLiQ-P-1.1", - "LiLiQ-R-1.1", - "LiLiQ-Rplus-1.1", "LPL-1.0", "LPL-1.02", "LPPL-1.0", @@ -198,59 +183,70 @@ "LPPL-1.2", "LPPL-1.3a", "LPPL-1.3c", - "MakeIndex", - "MirOS", - "MIT-advertising", + "Latex2e", + "Leptonica", + "LiLiQ-P-1.1", + "LiLiQ-R-1.1", + "LiLiQ-Rplus-1.1", + "Libpng", + "Linux-OpenIB", + "MIT", + "MIT-0", "MIT-CMU", + "MIT-advertising", "MIT-enna", "MIT-feh", - "MIT", "MITNFA", - "Motosoto", - "mpich2", "MPL-1.0", "MPL-1.1", - "MPL-2.0-no-copyleft-exception", "MPL-2.0", + "MPL-2.0-no-copyleft-exception", "MS-PL", "MS-RL", "MTLL", + "MakeIndex", + "MirOS", + "Motosoto", "Multics", "Mup", "NASA-1.3", - "Naumen", "NBPL-1.0", "NCSA", - "Net-SNMP", - "NetCDF", - "Newsletr", "NGPL", "NLOD-1.0", "NLPL", - "Nokia", "NOSL", - "Noweb", "NPL-1.0", "NPL-1.1", "NPOSL-3.0", "NRL", "NTP", + "Naumen", + "Net-SNMP", + "NetCDF", + "Newsletr", + "Nokia", + "Noweb", "OCCT-PL", "OCLC-2.0", + "ODC-By-1.0", "ODbL-1.0", "OFL-1.0", "OFL-1.1", + "OGL-UK-1.0", + "OGL-UK-2.0", + "OGL-UK-3.0", "OGTSL", "OLDAP-1.1", "OLDAP-1.2", "OLDAP-1.3", "OLDAP-1.4", - "OLDAP-2.0.1", "OLDAP-2.0", + "OLDAP-2.0.1", "OLDAP-2.1", + "OLDAP-2.2", "OLDAP-2.2.1", "OLDAP-2.2.2", - "OLDAP-2.2", "OLDAP-2.3", "OLDAP-2.4", "OLDAP-2.5", @@ -258,7 +254,6 @@ "OLDAP-2.7", "OLDAP-2.8", "OML", - "OpenSSL", "OPL-1.0", "OSET-PL-2.1", "OSL-1.0", @@ -266,79 +261,96 @@ "OSL-2.0", "OSL-2.1", "OSL-3.0", + "OpenSSL", "PDDL-1.0", "PHP-3.0", "PHP-3.01", "Plexus", "PostgreSQL", - "psfrag", - "psutils", "Python-2.0", - "Qhull", "QPL-1.0", - "Rdisc", + "Qhull", "RHeCos-1.1", "RPL-1.1", "RPL-1.5", "RPSL-1.0", "RSA-MD", "RSCPL", + "Rdisc", "Ruby", "SAX-PD", - "Saxpath", "SCEA", - "Sendmail", "SGI-B-1.0", "SGI-B-1.1", "SGI-B-2.0", - "SimPL-2.0", - "SISSL-1.2", "SISSL", - "Sleepycat", + "SISSL-1.2", "SMLNJ", "SMPPL", "SNIA", + "SPL-1.0", + "SWL", + "Saxpath", + "Sendmail", + "Sendmail-8.23", + "SimPL-2.0", + "Sleepycat", "Spencer-86", "Spencer-94", "Spencer-99", - "SPL-1.0", "SugarCRM-1.1.3", - "SWL", "TCL", "TCP-wrappers", "TMate", "TORQUE-1.1", "TOSL", + "TU-Berlin-1.0", + "TU-Berlin-2.0", + "UPL-1.0", "Unicode-DFS-2015", "Unicode-DFS-2016", "Unicode-TOU", "Unlicense", - "UPL-1.0", - "Vim", "VOSTROM", "VSL-1.0", + "Vim", + "W3C", "W3C-19980720", "W3C-20150513", - "W3C", + "WTFPL", "Watcom-1.0", "Wsuipa", - "WTFPL", "X11", - "Xerox", "XFree86-1.1", - "xinetd", - "Xnet", - "xpp", "XSkat", + "Xerox", + "Xnet", "YPL-1.0", "YPL-1.1", + "ZPL-1.1", + "ZPL-2.0", + "ZPL-2.1", "Zed", "Zend-2.0", "Zimbra-1.3", "Zimbra-1.4", - "zlib-acknowledgement", "Zlib", - "ZPL-1.1", - "ZPL-2.0", - "ZPL-2.1" + "bzip2-1.0.5", + "bzip2-1.0.6", + "copyleft-next-0.3.0", + "copyleft-next-0.3.1", + "curl", + "diffmark", + "dvipdfm", + "eGenix", + "gSOAP-1.3b", + "gnuplot", + "iMatix", + "libtiff", + "mpich2", + "psfrag", + "psutils", + "xinetd", + "xpp", + "zlib-acknowledgement" ] diff --git a/node_modules/spdx-license-ids/package.json b/node_modules/spdx-license-ids/package.json index a8b60d5886096..84fd02c3d6022 100644 --- a/node_modules/spdx-license-ids/package.json +++ b/node_modules/spdx-license-ids/package.json @@ -1,28 +1,30 @@ { - "_from": "spdx-license-ids@^3.0.0", - "_id": "spdx-license-ids@3.0.0", + "_from": "spdx-license-ids@3.0.3", + "_id": "spdx-license-ids@3.0.3", "_inBundle": false, - "_integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "_integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", "_location": "/spdx-license-ids", "_phantomChildren": {}, "_requested": { - "type": "range", + "type": "version", "registry": true, - "raw": "spdx-license-ids@^3.0.0", + "raw": "spdx-license-ids@3.0.3", "name": "spdx-license-ids", "escapedName": "spdx-license-ids", - "rawSpec": "^3.0.0", + "rawSpec": "3.0.3", "saveSpec": null, - "fetchSpec": "^3.0.0" + "fetchSpec": "3.0.3" }, "_requiredBy": [ + "#USER", + "/", "/spdx-correct", "/spdx-expression-parse" ], - "_resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "_shasum": "7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87", - "_spec": "spdx-license-ids@^3.0.0", - "_where": "/Users/rebecca/code/npm/node_modules/spdx-correct", + "_resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "_shasum": "81c0ce8f21474756148bbb5f3bfc0f36bf15d76e", + "_spec": "spdx-license-ids@3.0.3", + "_where": "/Users/zkat/Documents/code/work/npm", "author": { "name": "Shinnosuke Watanabe", "url": "https://github.com/shinnn" @@ -34,18 +36,15 @@ "deprecated": false, "description": "A list of SPDX license identifiers", "devDependencies": { - "@shinnn/eslint-config-node": "^5.0.0", - "chalk": "^2.3.0", - "eslint": "^4.16.0", + "@shinnn/eslint-config": "^6.8.7", + "chalk": "^2.4.1", + "eslint": "^5.10.0", "get-spdx-license-ids": "^2.1.0", - "log-symbols": "^2.2.0", - "loud-rejection": "^1.6.0", - "rmfr": "^2.0.0-3", - "tape": "^4.8.0", - "write-file-atomically": "^1.0.0" + "rmfr": "^2.0.0", + "tape": "^4.9.1" }, "eslintConfig": { - "extends": "@shinnn/node" + "extends": "@shinnn" }, "files": [ "deprecated.json", @@ -71,8 +70,8 @@ }, "scripts": { "build": "node build.js", - "pretest": "eslint --fix --format=codeframe .", + "pretest": "eslint .", "test": "node test.js" }, - "version": "3.0.0" + "version": "3.0.3" } diff --git a/package-lock.json b/package-lock.json index 58fe37370bda7..2309b176f9ee2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6871,9 +6871,9 @@ } }, "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==" }, "spdx-ranges": { "version": "2.0.0", From f350e714f66a77f71a7ebe17daeea2ea98179a1a Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Mon, 7 Jan 2019 16:40:51 -0800 Subject: [PATCH 66/97] aproba@2.0.0 --- node_modules/aproba/CHANGELOG.md | 4 + node_modules/aproba/index.js | 66 +++++------ node_modules/aproba/package.json | 44 ++++---- .../node_modules/aproba/LICENSE | 14 +++ .../node_modules/aproba/README.md | 94 ++++++++++++++++ .../node_modules/aproba/index.js | 105 ++++++++++++++++++ .../node_modules/aproba/package.json | 62 +++++++++++ .../gauge/node_modules/aproba/LICENSE | 14 +++ .../gauge/node_modules/aproba/README.md | 94 ++++++++++++++++ .../gauge/node_modules/aproba/index.js | 105 ++++++++++++++++++ .../gauge/node_modules/aproba/package.json | 62 +++++++++++ .../gentle-fs/node_modules/aproba/LICENSE | 14 +++ .../gentle-fs/node_modules/aproba/README.md | 94 ++++++++++++++++ .../gentle-fs/node_modules/aproba/index.js | 105 ++++++++++++++++++ .../node_modules/aproba/package.json | 62 +++++++++++ .../node_modules/aproba/LICENSE | 14 +++ .../node_modules/aproba/README.md | 94 ++++++++++++++++ .../node_modules/aproba/index.js | 105 ++++++++++++++++++ .../node_modules/aproba/package.json | 62 +++++++++++ .../run-queue/node_modules/aproba/LICENSE | 14 +++ .../run-queue/node_modules/aproba/README.md | 94 ++++++++++++++++ .../run-queue/node_modules/aproba/index.js | 105 ++++++++++++++++++ .../node_modules/aproba/package.json | 62 +++++++++++ package-lock.json | 39 ++++++- package.json | 2 +- 25 files changed, 1467 insertions(+), 63 deletions(-) create mode 100644 node_modules/aproba/CHANGELOG.md create mode 100644 node_modules/copy-concurrently/node_modules/aproba/LICENSE create mode 100644 node_modules/copy-concurrently/node_modules/aproba/README.md create mode 100644 node_modules/copy-concurrently/node_modules/aproba/index.js create mode 100644 node_modules/copy-concurrently/node_modules/aproba/package.json create mode 100644 node_modules/gauge/node_modules/aproba/LICENSE create mode 100644 node_modules/gauge/node_modules/aproba/README.md create mode 100644 node_modules/gauge/node_modules/aproba/index.js create mode 100644 node_modules/gauge/node_modules/aproba/package.json create mode 100644 node_modules/gentle-fs/node_modules/aproba/LICENSE create mode 100644 node_modules/gentle-fs/node_modules/aproba/README.md create mode 100644 node_modules/gentle-fs/node_modules/aproba/index.js create mode 100644 node_modules/gentle-fs/node_modules/aproba/package.json create mode 100644 node_modules/move-concurrently/node_modules/aproba/LICENSE create mode 100644 node_modules/move-concurrently/node_modules/aproba/README.md create mode 100644 node_modules/move-concurrently/node_modules/aproba/index.js create mode 100644 node_modules/move-concurrently/node_modules/aproba/package.json create mode 100644 node_modules/run-queue/node_modules/aproba/LICENSE create mode 100644 node_modules/run-queue/node_modules/aproba/README.md create mode 100644 node_modules/run-queue/node_modules/aproba/index.js create mode 100644 node_modules/run-queue/node_modules/aproba/package.json diff --git a/node_modules/aproba/CHANGELOG.md b/node_modules/aproba/CHANGELOG.md new file mode 100644 index 0000000000000..bab30ecb7e625 --- /dev/null +++ b/node_modules/aproba/CHANGELOG.md @@ -0,0 +1,4 @@ +2.0.0 + * Drop support for 0.10 and 0.12. They haven't been in travis but still, + since we _know_ we'll break with them now it's only polite to do a + major bump. diff --git a/node_modules/aproba/index.js b/node_modules/aproba/index.js index 6f3f797c09a75..fd947481ba557 100644 --- a/node_modules/aproba/index.js +++ b/node_modules/aproba/index.js @@ -1,38 +1,39 @@ 'use strict' +module.exports = validate function isArguments (thingy) { return thingy != null && typeof thingy === 'object' && thingy.hasOwnProperty('callee') } -var types = { - '*': {label: 'any', check: function () { return true }}, - A: {label: 'array', check: function (thingy) { return Array.isArray(thingy) || isArguments(thingy) }}, - S: {label: 'string', check: function (thingy) { return typeof thingy === 'string' }}, - N: {label: 'number', check: function (thingy) { return typeof thingy === 'number' }}, - F: {label: 'function', check: function (thingy) { return typeof thingy === 'function' }}, - O: {label: 'object', check: function (thingy) { return typeof thingy === 'object' && thingy != null && !types.A.check(thingy) && !types.E.check(thingy) }}, - B: {label: 'boolean', check: function (thingy) { return typeof thingy === 'boolean' }}, - E: {label: 'error', check: function (thingy) { return thingy instanceof Error }}, - Z: {label: 'null', check: function (thingy) { return thingy == null }} +const types = { + '*': {label: 'any', check: () => true}, + A: {label: 'array', check: _ => Array.isArray(_) || isArguments(_)}, + S: {label: 'string', check: _ => typeof _ === 'string'}, + N: {label: 'number', check: _ => typeof _ === 'number'}, + F: {label: 'function', check: _ => typeof _ === 'function'}, + O: {label: 'object', check: _ => typeof _ === 'object' && _ != null && !types.A.check(_) && !types.E.check(_)}, + B: {label: 'boolean', check: _ => typeof _ === 'boolean'}, + E: {label: 'error', check: _ => _ instanceof Error}, + Z: {label: 'null', check: _ => _ == null} } function addSchema (schema, arity) { - var group = arity[schema.length] = arity[schema.length] || [] + const group = arity[schema.length] = arity[schema.length] || [] if (group.indexOf(schema) === -1) group.push(schema) } -var validate = module.exports = function (rawSchemas, args) { +function validate (rawSchemas, args) { if (arguments.length !== 2) throw wrongNumberOfArgs(['SA'], arguments.length) if (!rawSchemas) throw missingRequiredArg(0, 'rawSchemas') if (!args) throw missingRequiredArg(1, 'args') if (!types.S.check(rawSchemas)) throw invalidType(0, ['string'], rawSchemas) if (!types.A.check(args)) throw invalidType(1, ['array'], args) - var schemas = rawSchemas.split('|') - var arity = {} + const schemas = rawSchemas.split('|') + const arity = {} - schemas.forEach(function (schema) { - for (var ii = 0; ii < schema.length; ++ii) { - var type = schema[ii] + schemas.forEach(schema => { + for (let ii = 0; ii < schema.length; ++ii) { + const type = schema[ii] if (!types[type]) throw unknownType(ii, type) } if (/E.*E/.test(schema)) throw moreThanOneError(schema) @@ -43,20 +44,18 @@ var validate = module.exports = function (rawSchemas, args) { if (schema.length === 1) addSchema('', arity) } }) - var matching = arity[args.length] + let matching = arity[args.length] if (!matching) { throw wrongNumberOfArgs(Object.keys(arity), args.length) } - for (var ii = 0; ii < args.length; ++ii) { - var newMatching = matching.filter(function (schema) { - var type = schema[ii] - var typeCheck = types[type].check + for (let ii = 0; ii < args.length; ++ii) { + let newMatching = matching.filter(schema => { + const type = schema[ii] + const typeCheck = types[type].check return typeCheck(args[ii]) }) if (!newMatching.length) { - var labels = matching.map(function (schema) { - return types[schema[ii]].label - }).filter(function (schema) { return schema != null }) + const labels = matching.map(_ => types[_[ii]].label).filter(_ => _ != null) throw invalidType(ii, labels, args[ii]) } matching = newMatching @@ -72,8 +71,8 @@ function unknownType (num, type) { } function invalidType (num, expectedTypes, value) { - var valueType - Object.keys(types).forEach(function (typeCode) { + let valueType + Object.keys(types).forEach(typeCode => { if (types[typeCode].check(value)) valueType = types[typeCode].label }) return newException('EINVALIDTYPE', 'Argument #' + (num + 1) + ': Expected ' + @@ -85,8 +84,8 @@ function englishList (list) { } function wrongNumberOfArgs (expected, got) { - var english = englishList(expected) - var args = expected.every(function (ex) { return ex.length === 1 }) + const english = englishList(expected) + const args = expected.every(ex => ex.length === 1) ? 'argument' : 'arguments' return newException('EWRONGARGCOUNT', 'Expected ' + english + ' ' + args + ' but got ' + got) @@ -98,8 +97,9 @@ function moreThanOneError (schema) { } function newException (code, msg) { - var e = new Error(msg) - e.code = code - if (Error.captureStackTrace) Error.captureStackTrace(e, validate) - return e + const err = new Error(msg) + err.code = code + /* istanbul ignore else */ + if (Error.captureStackTrace) Error.captureStackTrace(err, validate) + return err } diff --git a/node_modules/aproba/package.json b/node_modules/aproba/package.json index 534c6beb57e4e..42a7798b0e782 100644 --- a/node_modules/aproba/package.json +++ b/node_modules/aproba/package.json @@ -1,38 +1,29 @@ { - "_args": [ - [ - "aproba@1.2.0", - "/Users/rebecca/code/npm" - ] - ], - "_from": "aproba@1.2.0", - "_id": "aproba@1.2.0", + "_from": "aproba@2.0.0", + "_id": "aproba@2.0.0", "_inBundle": false, - "_integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "_integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "_location": "/aproba", "_phantomChildren": {}, "_requested": { "type": "version", "registry": true, - "raw": "aproba@1.2.0", + "raw": "aproba@2.0.0", "name": "aproba", "escapedName": "aproba", - "rawSpec": "1.2.0", + "rawSpec": "2.0.0", "saveSpec": null, - "fetchSpec": "1.2.0" + "fetchSpec": "2.0.0" }, "_requiredBy": [ + "#USER", "/", - "/copy-concurrently", - "/gauge", - "/gentle-fs", - "/move-concurrently", - "/npm-profile", - "/run-queue" + "/npm-profile" ], - "_resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "_spec": "1.2.0", - "_where": "/Users/rebecca/code/npm", + "_resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "_shasum": "52520b8ae5b569215b354efc0caa3fe1e45a8adc", + "_spec": "aproba@2.0.0", + "_where": "/Users/aeschright/code/cli", "author": { "name": "Rebecca Turner", "email": "me@re-becca.org" @@ -40,11 +31,13 @@ "bugs": { "url": "https://github.com/iarna/aproba/issues" }, + "bundleDependencies": false, "dependencies": {}, + "deprecated": false, "description": "A ridiculously light-weight argument validator (now browser friendly)", "devDependencies": { - "standard": "^10.0.3", - "tap": "^10.0.2" + "standard": "^11.0.1", + "tap": "^12.0.1" }, "directories": { "test": "test" @@ -65,7 +58,8 @@ "url": "git+https://github.com/iarna/aproba.git" }, "scripts": { - "test": "standard && tap -j3 test/*.js" + "pretest": "standard", + "test": "tap --100 -J test/*.js" }, - "version": "1.2.0" + "version": "2.0.0" } diff --git a/node_modules/copy-concurrently/node_modules/aproba/LICENSE b/node_modules/copy-concurrently/node_modules/aproba/LICENSE new file mode 100644 index 0000000000000..f4be44d881b2d --- /dev/null +++ b/node_modules/copy-concurrently/node_modules/aproba/LICENSE @@ -0,0 +1,14 @@ +Copyright (c) 2015, Rebecca Turner + +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/node_modules/copy-concurrently/node_modules/aproba/README.md b/node_modules/copy-concurrently/node_modules/aproba/README.md new file mode 100644 index 0000000000000..0bfc594c56a37 --- /dev/null +++ b/node_modules/copy-concurrently/node_modules/aproba/README.md @@ -0,0 +1,94 @@ +aproba +====== + +A ridiculously light-weight function argument validator + +``` +var validate = require("aproba") + +function myfunc(a, b, c) { + // `a` must be a string, `b` a number, `c` a function + validate('SNF', arguments) // [a,b,c] is also valid +} + +myfunc('test', 23, function () {}) // ok +myfunc(123, 23, function () {}) // type error +myfunc('test', 23) // missing arg error +myfunc('test', 23, function () {}, true) // too many args error + +``` + +Valid types are: + +| type | description +| :--: | :---------- +| * | matches any type +| A | `Array.isArray` OR an `arguments` object +| S | typeof == string +| N | typeof == number +| F | typeof == function +| O | typeof == object and not type A and not type E +| B | typeof == boolean +| E | `instanceof Error` OR `null` **(special: see below)** +| Z | == `null` + +Validation failures throw one of three exception types, distinguished by a +`code` property of `EMISSINGARG`, `EINVALIDTYPE` or `ETOOMANYARGS`. + +If you pass in an invalid type then it will throw with a code of +`EUNKNOWNTYPE`. + +If an **error** argument is found and is not null then the remaining +arguments are optional. That is, if you say `ESO` then that's like using a +non-magical `E` in: `E|ESO|ZSO`. + +### But I have optional arguments?! + +You can provide more than one signature by separating them with pipes `|`. +If any signature matches the arguments then they'll be considered valid. + +So for example, say you wanted to write a signature for +`fs.createWriteStream`. The docs for it describe it thusly: + +``` +fs.createWriteStream(path[, options]) +``` + +This would be a signature of `SO|S`. That is, a string and and object, or +just a string. + +Now, if you read the full `fs` docs, you'll see that actually path can ALSO +be a buffer. And options can be a string, that is: +``` +path | +options | +``` + +To reproduce this you have to fully enumerate all of the possible +combinations and that implies a signature of `SO|SS|OO|OS|S|O`. The +awkwardness is a feature: It reminds you of the complexity you're adding to +your API when you do this sort of thing. + + +### Browser support + +This has no dependencies and should work in browsers, though you'll have +noisier stack traces. + +### Why this exists + +I wanted a very simple argument validator. It needed to do two things: + +1. Be more concise and easier to use than assertions + +2. Not encourage an infinite bikeshed of DSLs + +This is why types are specified by a single character and there's no such +thing as an optional argument. + +This is not intended to validate user data. This is specifically about +asserting the interface of your functions. + +If you need greater validation, I encourage you to write them by hand or +look elsewhere. + diff --git a/node_modules/copy-concurrently/node_modules/aproba/index.js b/node_modules/copy-concurrently/node_modules/aproba/index.js new file mode 100644 index 0000000000000..6f3f797c09a75 --- /dev/null +++ b/node_modules/copy-concurrently/node_modules/aproba/index.js @@ -0,0 +1,105 @@ +'use strict' + +function isArguments (thingy) { + return thingy != null && typeof thingy === 'object' && thingy.hasOwnProperty('callee') +} + +var types = { + '*': {label: 'any', check: function () { return true }}, + A: {label: 'array', check: function (thingy) { return Array.isArray(thingy) || isArguments(thingy) }}, + S: {label: 'string', check: function (thingy) { return typeof thingy === 'string' }}, + N: {label: 'number', check: function (thingy) { return typeof thingy === 'number' }}, + F: {label: 'function', check: function (thingy) { return typeof thingy === 'function' }}, + O: {label: 'object', check: function (thingy) { return typeof thingy === 'object' && thingy != null && !types.A.check(thingy) && !types.E.check(thingy) }}, + B: {label: 'boolean', check: function (thingy) { return typeof thingy === 'boolean' }}, + E: {label: 'error', check: function (thingy) { return thingy instanceof Error }}, + Z: {label: 'null', check: function (thingy) { return thingy == null }} +} + +function addSchema (schema, arity) { + var group = arity[schema.length] = arity[schema.length] || [] + if (group.indexOf(schema) === -1) group.push(schema) +} + +var validate = module.exports = function (rawSchemas, args) { + if (arguments.length !== 2) throw wrongNumberOfArgs(['SA'], arguments.length) + if (!rawSchemas) throw missingRequiredArg(0, 'rawSchemas') + if (!args) throw missingRequiredArg(1, 'args') + if (!types.S.check(rawSchemas)) throw invalidType(0, ['string'], rawSchemas) + if (!types.A.check(args)) throw invalidType(1, ['array'], args) + var schemas = rawSchemas.split('|') + var arity = {} + + schemas.forEach(function (schema) { + for (var ii = 0; ii < schema.length; ++ii) { + var type = schema[ii] + if (!types[type]) throw unknownType(ii, type) + } + if (/E.*E/.test(schema)) throw moreThanOneError(schema) + addSchema(schema, arity) + if (/E/.test(schema)) { + addSchema(schema.replace(/E.*$/, 'E'), arity) + addSchema(schema.replace(/E/, 'Z'), arity) + if (schema.length === 1) addSchema('', arity) + } + }) + var matching = arity[args.length] + if (!matching) { + throw wrongNumberOfArgs(Object.keys(arity), args.length) + } + for (var ii = 0; ii < args.length; ++ii) { + var newMatching = matching.filter(function (schema) { + var type = schema[ii] + var typeCheck = types[type].check + return typeCheck(args[ii]) + }) + if (!newMatching.length) { + var labels = matching.map(function (schema) { + return types[schema[ii]].label + }).filter(function (schema) { return schema != null }) + throw invalidType(ii, labels, args[ii]) + } + matching = newMatching + } +} + +function missingRequiredArg (num) { + return newException('EMISSINGARG', 'Missing required argument #' + (num + 1)) +} + +function unknownType (num, type) { + return newException('EUNKNOWNTYPE', 'Unknown type ' + type + ' in argument #' + (num + 1)) +} + +function invalidType (num, expectedTypes, value) { + var valueType + Object.keys(types).forEach(function (typeCode) { + if (types[typeCode].check(value)) valueType = types[typeCode].label + }) + return newException('EINVALIDTYPE', 'Argument #' + (num + 1) + ': Expected ' + + englishList(expectedTypes) + ' but got ' + valueType) +} + +function englishList (list) { + return list.join(', ').replace(/, ([^,]+)$/, ' or $1') +} + +function wrongNumberOfArgs (expected, got) { + var english = englishList(expected) + var args = expected.every(function (ex) { return ex.length === 1 }) + ? 'argument' + : 'arguments' + return newException('EWRONGARGCOUNT', 'Expected ' + english + ' ' + args + ' but got ' + got) +} + +function moreThanOneError (schema) { + return newException('ETOOMANYERRORTYPES', + 'Only one error type per argument signature is allowed, more than one found in "' + schema + '"') +} + +function newException (code, msg) { + var e = new Error(msg) + e.code = code + if (Error.captureStackTrace) Error.captureStackTrace(e, validate) + return e +} diff --git a/node_modules/copy-concurrently/node_modules/aproba/package.json b/node_modules/copy-concurrently/node_modules/aproba/package.json new file mode 100644 index 0000000000000..e16eea157f345 --- /dev/null +++ b/node_modules/copy-concurrently/node_modules/aproba/package.json @@ -0,0 +1,62 @@ +{ + "_from": "aproba@^1.1.1", + "_id": "aproba@1.2.0", + "_inBundle": false, + "_integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "_location": "/copy-concurrently/aproba", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "aproba@^1.1.1", + "name": "aproba", + "escapedName": "aproba", + "rawSpec": "^1.1.1", + "saveSpec": null, + "fetchSpec": "^1.1.1" + }, + "_requiredBy": [ + "/copy-concurrently" + ], + "_resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "_shasum": "6802e6264efd18c790a1b0d517f0f2627bf2c94a", + "_spec": "aproba@^1.1.1", + "_where": "/Users/aeschright/code/cli/node_modules/copy-concurrently", + "author": { + "name": "Rebecca Turner", + "email": "me@re-becca.org" + }, + "bugs": { + "url": "https://github.com/iarna/aproba/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "A ridiculously light-weight argument validator (now browser friendly)", + "devDependencies": { + "standard": "^10.0.3", + "tap": "^10.0.2" + }, + "directories": { + "test": "test" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/iarna/aproba", + "keywords": [ + "argument", + "validate" + ], + "license": "ISC", + "main": "index.js", + "name": "aproba", + "repository": { + "type": "git", + "url": "git+https://github.com/iarna/aproba.git" + }, + "scripts": { + "test": "standard && tap -j3 test/*.js" + }, + "version": "1.2.0" +} diff --git a/node_modules/gauge/node_modules/aproba/LICENSE b/node_modules/gauge/node_modules/aproba/LICENSE new file mode 100644 index 0000000000000..f4be44d881b2d --- /dev/null +++ b/node_modules/gauge/node_modules/aproba/LICENSE @@ -0,0 +1,14 @@ +Copyright (c) 2015, Rebecca Turner + +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/node_modules/gauge/node_modules/aproba/README.md b/node_modules/gauge/node_modules/aproba/README.md new file mode 100644 index 0000000000000..0bfc594c56a37 --- /dev/null +++ b/node_modules/gauge/node_modules/aproba/README.md @@ -0,0 +1,94 @@ +aproba +====== + +A ridiculously light-weight function argument validator + +``` +var validate = require("aproba") + +function myfunc(a, b, c) { + // `a` must be a string, `b` a number, `c` a function + validate('SNF', arguments) // [a,b,c] is also valid +} + +myfunc('test', 23, function () {}) // ok +myfunc(123, 23, function () {}) // type error +myfunc('test', 23) // missing arg error +myfunc('test', 23, function () {}, true) // too many args error + +``` + +Valid types are: + +| type | description +| :--: | :---------- +| * | matches any type +| A | `Array.isArray` OR an `arguments` object +| S | typeof == string +| N | typeof == number +| F | typeof == function +| O | typeof == object and not type A and not type E +| B | typeof == boolean +| E | `instanceof Error` OR `null` **(special: see below)** +| Z | == `null` + +Validation failures throw one of three exception types, distinguished by a +`code` property of `EMISSINGARG`, `EINVALIDTYPE` or `ETOOMANYARGS`. + +If you pass in an invalid type then it will throw with a code of +`EUNKNOWNTYPE`. + +If an **error** argument is found and is not null then the remaining +arguments are optional. That is, if you say `ESO` then that's like using a +non-magical `E` in: `E|ESO|ZSO`. + +### But I have optional arguments?! + +You can provide more than one signature by separating them with pipes `|`. +If any signature matches the arguments then they'll be considered valid. + +So for example, say you wanted to write a signature for +`fs.createWriteStream`. The docs for it describe it thusly: + +``` +fs.createWriteStream(path[, options]) +``` + +This would be a signature of `SO|S`. That is, a string and and object, or +just a string. + +Now, if you read the full `fs` docs, you'll see that actually path can ALSO +be a buffer. And options can be a string, that is: +``` +path | +options | +``` + +To reproduce this you have to fully enumerate all of the possible +combinations and that implies a signature of `SO|SS|OO|OS|S|O`. The +awkwardness is a feature: It reminds you of the complexity you're adding to +your API when you do this sort of thing. + + +### Browser support + +This has no dependencies and should work in browsers, though you'll have +noisier stack traces. + +### Why this exists + +I wanted a very simple argument validator. It needed to do two things: + +1. Be more concise and easier to use than assertions + +2. Not encourage an infinite bikeshed of DSLs + +This is why types are specified by a single character and there's no such +thing as an optional argument. + +This is not intended to validate user data. This is specifically about +asserting the interface of your functions. + +If you need greater validation, I encourage you to write them by hand or +look elsewhere. + diff --git a/node_modules/gauge/node_modules/aproba/index.js b/node_modules/gauge/node_modules/aproba/index.js new file mode 100644 index 0000000000000..6f3f797c09a75 --- /dev/null +++ b/node_modules/gauge/node_modules/aproba/index.js @@ -0,0 +1,105 @@ +'use strict' + +function isArguments (thingy) { + return thingy != null && typeof thingy === 'object' && thingy.hasOwnProperty('callee') +} + +var types = { + '*': {label: 'any', check: function () { return true }}, + A: {label: 'array', check: function (thingy) { return Array.isArray(thingy) || isArguments(thingy) }}, + S: {label: 'string', check: function (thingy) { return typeof thingy === 'string' }}, + N: {label: 'number', check: function (thingy) { return typeof thingy === 'number' }}, + F: {label: 'function', check: function (thingy) { return typeof thingy === 'function' }}, + O: {label: 'object', check: function (thingy) { return typeof thingy === 'object' && thingy != null && !types.A.check(thingy) && !types.E.check(thingy) }}, + B: {label: 'boolean', check: function (thingy) { return typeof thingy === 'boolean' }}, + E: {label: 'error', check: function (thingy) { return thingy instanceof Error }}, + Z: {label: 'null', check: function (thingy) { return thingy == null }} +} + +function addSchema (schema, arity) { + var group = arity[schema.length] = arity[schema.length] || [] + if (group.indexOf(schema) === -1) group.push(schema) +} + +var validate = module.exports = function (rawSchemas, args) { + if (arguments.length !== 2) throw wrongNumberOfArgs(['SA'], arguments.length) + if (!rawSchemas) throw missingRequiredArg(0, 'rawSchemas') + if (!args) throw missingRequiredArg(1, 'args') + if (!types.S.check(rawSchemas)) throw invalidType(0, ['string'], rawSchemas) + if (!types.A.check(args)) throw invalidType(1, ['array'], args) + var schemas = rawSchemas.split('|') + var arity = {} + + schemas.forEach(function (schema) { + for (var ii = 0; ii < schema.length; ++ii) { + var type = schema[ii] + if (!types[type]) throw unknownType(ii, type) + } + if (/E.*E/.test(schema)) throw moreThanOneError(schema) + addSchema(schema, arity) + if (/E/.test(schema)) { + addSchema(schema.replace(/E.*$/, 'E'), arity) + addSchema(schema.replace(/E/, 'Z'), arity) + if (schema.length === 1) addSchema('', arity) + } + }) + var matching = arity[args.length] + if (!matching) { + throw wrongNumberOfArgs(Object.keys(arity), args.length) + } + for (var ii = 0; ii < args.length; ++ii) { + var newMatching = matching.filter(function (schema) { + var type = schema[ii] + var typeCheck = types[type].check + return typeCheck(args[ii]) + }) + if (!newMatching.length) { + var labels = matching.map(function (schema) { + return types[schema[ii]].label + }).filter(function (schema) { return schema != null }) + throw invalidType(ii, labels, args[ii]) + } + matching = newMatching + } +} + +function missingRequiredArg (num) { + return newException('EMISSINGARG', 'Missing required argument #' + (num + 1)) +} + +function unknownType (num, type) { + return newException('EUNKNOWNTYPE', 'Unknown type ' + type + ' in argument #' + (num + 1)) +} + +function invalidType (num, expectedTypes, value) { + var valueType + Object.keys(types).forEach(function (typeCode) { + if (types[typeCode].check(value)) valueType = types[typeCode].label + }) + return newException('EINVALIDTYPE', 'Argument #' + (num + 1) + ': Expected ' + + englishList(expectedTypes) + ' but got ' + valueType) +} + +function englishList (list) { + return list.join(', ').replace(/, ([^,]+)$/, ' or $1') +} + +function wrongNumberOfArgs (expected, got) { + var english = englishList(expected) + var args = expected.every(function (ex) { return ex.length === 1 }) + ? 'argument' + : 'arguments' + return newException('EWRONGARGCOUNT', 'Expected ' + english + ' ' + args + ' but got ' + got) +} + +function moreThanOneError (schema) { + return newException('ETOOMANYERRORTYPES', + 'Only one error type per argument signature is allowed, more than one found in "' + schema + '"') +} + +function newException (code, msg) { + var e = new Error(msg) + e.code = code + if (Error.captureStackTrace) Error.captureStackTrace(e, validate) + return e +} diff --git a/node_modules/gauge/node_modules/aproba/package.json b/node_modules/gauge/node_modules/aproba/package.json new file mode 100644 index 0000000000000..f654576f8eda8 --- /dev/null +++ b/node_modules/gauge/node_modules/aproba/package.json @@ -0,0 +1,62 @@ +{ + "_from": "aproba@^1.0.3", + "_id": "aproba@1.2.0", + "_inBundle": false, + "_integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "_location": "/gauge/aproba", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "aproba@^1.0.3", + "name": "aproba", + "escapedName": "aproba", + "rawSpec": "^1.0.3", + "saveSpec": null, + "fetchSpec": "^1.0.3" + }, + "_requiredBy": [ + "/gauge" + ], + "_resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "_shasum": "6802e6264efd18c790a1b0d517f0f2627bf2c94a", + "_spec": "aproba@^1.0.3", + "_where": "/Users/aeschright/code/cli/node_modules/gauge", + "author": { + "name": "Rebecca Turner", + "email": "me@re-becca.org" + }, + "bugs": { + "url": "https://github.com/iarna/aproba/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "A ridiculously light-weight argument validator (now browser friendly)", + "devDependencies": { + "standard": "^10.0.3", + "tap": "^10.0.2" + }, + "directories": { + "test": "test" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/iarna/aproba", + "keywords": [ + "argument", + "validate" + ], + "license": "ISC", + "main": "index.js", + "name": "aproba", + "repository": { + "type": "git", + "url": "git+https://github.com/iarna/aproba.git" + }, + "scripts": { + "test": "standard && tap -j3 test/*.js" + }, + "version": "1.2.0" +} diff --git a/node_modules/gentle-fs/node_modules/aproba/LICENSE b/node_modules/gentle-fs/node_modules/aproba/LICENSE new file mode 100644 index 0000000000000..f4be44d881b2d --- /dev/null +++ b/node_modules/gentle-fs/node_modules/aproba/LICENSE @@ -0,0 +1,14 @@ +Copyright (c) 2015, Rebecca Turner + +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/node_modules/gentle-fs/node_modules/aproba/README.md b/node_modules/gentle-fs/node_modules/aproba/README.md new file mode 100644 index 0000000000000..0bfc594c56a37 --- /dev/null +++ b/node_modules/gentle-fs/node_modules/aproba/README.md @@ -0,0 +1,94 @@ +aproba +====== + +A ridiculously light-weight function argument validator + +``` +var validate = require("aproba") + +function myfunc(a, b, c) { + // `a` must be a string, `b` a number, `c` a function + validate('SNF', arguments) // [a,b,c] is also valid +} + +myfunc('test', 23, function () {}) // ok +myfunc(123, 23, function () {}) // type error +myfunc('test', 23) // missing arg error +myfunc('test', 23, function () {}, true) // too many args error + +``` + +Valid types are: + +| type | description +| :--: | :---------- +| * | matches any type +| A | `Array.isArray` OR an `arguments` object +| S | typeof == string +| N | typeof == number +| F | typeof == function +| O | typeof == object and not type A and not type E +| B | typeof == boolean +| E | `instanceof Error` OR `null` **(special: see below)** +| Z | == `null` + +Validation failures throw one of three exception types, distinguished by a +`code` property of `EMISSINGARG`, `EINVALIDTYPE` or `ETOOMANYARGS`. + +If you pass in an invalid type then it will throw with a code of +`EUNKNOWNTYPE`. + +If an **error** argument is found and is not null then the remaining +arguments are optional. That is, if you say `ESO` then that's like using a +non-magical `E` in: `E|ESO|ZSO`. + +### But I have optional arguments?! + +You can provide more than one signature by separating them with pipes `|`. +If any signature matches the arguments then they'll be considered valid. + +So for example, say you wanted to write a signature for +`fs.createWriteStream`. The docs for it describe it thusly: + +``` +fs.createWriteStream(path[, options]) +``` + +This would be a signature of `SO|S`. That is, a string and and object, or +just a string. + +Now, if you read the full `fs` docs, you'll see that actually path can ALSO +be a buffer. And options can be a string, that is: +``` +path | +options | +``` + +To reproduce this you have to fully enumerate all of the possible +combinations and that implies a signature of `SO|SS|OO|OS|S|O`. The +awkwardness is a feature: It reminds you of the complexity you're adding to +your API when you do this sort of thing. + + +### Browser support + +This has no dependencies and should work in browsers, though you'll have +noisier stack traces. + +### Why this exists + +I wanted a very simple argument validator. It needed to do two things: + +1. Be more concise and easier to use than assertions + +2. Not encourage an infinite bikeshed of DSLs + +This is why types are specified by a single character and there's no such +thing as an optional argument. + +This is not intended to validate user data. This is specifically about +asserting the interface of your functions. + +If you need greater validation, I encourage you to write them by hand or +look elsewhere. + diff --git a/node_modules/gentle-fs/node_modules/aproba/index.js b/node_modules/gentle-fs/node_modules/aproba/index.js new file mode 100644 index 0000000000000..6f3f797c09a75 --- /dev/null +++ b/node_modules/gentle-fs/node_modules/aproba/index.js @@ -0,0 +1,105 @@ +'use strict' + +function isArguments (thingy) { + return thingy != null && typeof thingy === 'object' && thingy.hasOwnProperty('callee') +} + +var types = { + '*': {label: 'any', check: function () { return true }}, + A: {label: 'array', check: function (thingy) { return Array.isArray(thingy) || isArguments(thingy) }}, + S: {label: 'string', check: function (thingy) { return typeof thingy === 'string' }}, + N: {label: 'number', check: function (thingy) { return typeof thingy === 'number' }}, + F: {label: 'function', check: function (thingy) { return typeof thingy === 'function' }}, + O: {label: 'object', check: function (thingy) { return typeof thingy === 'object' && thingy != null && !types.A.check(thingy) && !types.E.check(thingy) }}, + B: {label: 'boolean', check: function (thingy) { return typeof thingy === 'boolean' }}, + E: {label: 'error', check: function (thingy) { return thingy instanceof Error }}, + Z: {label: 'null', check: function (thingy) { return thingy == null }} +} + +function addSchema (schema, arity) { + var group = arity[schema.length] = arity[schema.length] || [] + if (group.indexOf(schema) === -1) group.push(schema) +} + +var validate = module.exports = function (rawSchemas, args) { + if (arguments.length !== 2) throw wrongNumberOfArgs(['SA'], arguments.length) + if (!rawSchemas) throw missingRequiredArg(0, 'rawSchemas') + if (!args) throw missingRequiredArg(1, 'args') + if (!types.S.check(rawSchemas)) throw invalidType(0, ['string'], rawSchemas) + if (!types.A.check(args)) throw invalidType(1, ['array'], args) + var schemas = rawSchemas.split('|') + var arity = {} + + schemas.forEach(function (schema) { + for (var ii = 0; ii < schema.length; ++ii) { + var type = schema[ii] + if (!types[type]) throw unknownType(ii, type) + } + if (/E.*E/.test(schema)) throw moreThanOneError(schema) + addSchema(schema, arity) + if (/E/.test(schema)) { + addSchema(schema.replace(/E.*$/, 'E'), arity) + addSchema(schema.replace(/E/, 'Z'), arity) + if (schema.length === 1) addSchema('', arity) + } + }) + var matching = arity[args.length] + if (!matching) { + throw wrongNumberOfArgs(Object.keys(arity), args.length) + } + for (var ii = 0; ii < args.length; ++ii) { + var newMatching = matching.filter(function (schema) { + var type = schema[ii] + var typeCheck = types[type].check + return typeCheck(args[ii]) + }) + if (!newMatching.length) { + var labels = matching.map(function (schema) { + return types[schema[ii]].label + }).filter(function (schema) { return schema != null }) + throw invalidType(ii, labels, args[ii]) + } + matching = newMatching + } +} + +function missingRequiredArg (num) { + return newException('EMISSINGARG', 'Missing required argument #' + (num + 1)) +} + +function unknownType (num, type) { + return newException('EUNKNOWNTYPE', 'Unknown type ' + type + ' in argument #' + (num + 1)) +} + +function invalidType (num, expectedTypes, value) { + var valueType + Object.keys(types).forEach(function (typeCode) { + if (types[typeCode].check(value)) valueType = types[typeCode].label + }) + return newException('EINVALIDTYPE', 'Argument #' + (num + 1) + ': Expected ' + + englishList(expectedTypes) + ' but got ' + valueType) +} + +function englishList (list) { + return list.join(', ').replace(/, ([^,]+)$/, ' or $1') +} + +function wrongNumberOfArgs (expected, got) { + var english = englishList(expected) + var args = expected.every(function (ex) { return ex.length === 1 }) + ? 'argument' + : 'arguments' + return newException('EWRONGARGCOUNT', 'Expected ' + english + ' ' + args + ' but got ' + got) +} + +function moreThanOneError (schema) { + return newException('ETOOMANYERRORTYPES', + 'Only one error type per argument signature is allowed, more than one found in "' + schema + '"') +} + +function newException (code, msg) { + var e = new Error(msg) + e.code = code + if (Error.captureStackTrace) Error.captureStackTrace(e, validate) + return e +} diff --git a/node_modules/gentle-fs/node_modules/aproba/package.json b/node_modules/gentle-fs/node_modules/aproba/package.json new file mode 100644 index 0000000000000..34b51a0df22ae --- /dev/null +++ b/node_modules/gentle-fs/node_modules/aproba/package.json @@ -0,0 +1,62 @@ +{ + "_from": "aproba@^1.1.2", + "_id": "aproba@1.2.0", + "_inBundle": false, + "_integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "_location": "/gentle-fs/aproba", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "aproba@^1.1.2", + "name": "aproba", + "escapedName": "aproba", + "rawSpec": "^1.1.2", + "saveSpec": null, + "fetchSpec": "^1.1.2" + }, + "_requiredBy": [ + "/gentle-fs" + ], + "_resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "_shasum": "6802e6264efd18c790a1b0d517f0f2627bf2c94a", + "_spec": "aproba@^1.1.2", + "_where": "/Users/aeschright/code/cli/node_modules/gentle-fs", + "author": { + "name": "Rebecca Turner", + "email": "me@re-becca.org" + }, + "bugs": { + "url": "https://github.com/iarna/aproba/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "A ridiculously light-weight argument validator (now browser friendly)", + "devDependencies": { + "standard": "^10.0.3", + "tap": "^10.0.2" + }, + "directories": { + "test": "test" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/iarna/aproba", + "keywords": [ + "argument", + "validate" + ], + "license": "ISC", + "main": "index.js", + "name": "aproba", + "repository": { + "type": "git", + "url": "git+https://github.com/iarna/aproba.git" + }, + "scripts": { + "test": "standard && tap -j3 test/*.js" + }, + "version": "1.2.0" +} diff --git a/node_modules/move-concurrently/node_modules/aproba/LICENSE b/node_modules/move-concurrently/node_modules/aproba/LICENSE new file mode 100644 index 0000000000000..f4be44d881b2d --- /dev/null +++ b/node_modules/move-concurrently/node_modules/aproba/LICENSE @@ -0,0 +1,14 @@ +Copyright (c) 2015, Rebecca Turner + +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/node_modules/move-concurrently/node_modules/aproba/README.md b/node_modules/move-concurrently/node_modules/aproba/README.md new file mode 100644 index 0000000000000..0bfc594c56a37 --- /dev/null +++ b/node_modules/move-concurrently/node_modules/aproba/README.md @@ -0,0 +1,94 @@ +aproba +====== + +A ridiculously light-weight function argument validator + +``` +var validate = require("aproba") + +function myfunc(a, b, c) { + // `a` must be a string, `b` a number, `c` a function + validate('SNF', arguments) // [a,b,c] is also valid +} + +myfunc('test', 23, function () {}) // ok +myfunc(123, 23, function () {}) // type error +myfunc('test', 23) // missing arg error +myfunc('test', 23, function () {}, true) // too many args error + +``` + +Valid types are: + +| type | description +| :--: | :---------- +| * | matches any type +| A | `Array.isArray` OR an `arguments` object +| S | typeof == string +| N | typeof == number +| F | typeof == function +| O | typeof == object and not type A and not type E +| B | typeof == boolean +| E | `instanceof Error` OR `null` **(special: see below)** +| Z | == `null` + +Validation failures throw one of three exception types, distinguished by a +`code` property of `EMISSINGARG`, `EINVALIDTYPE` or `ETOOMANYARGS`. + +If you pass in an invalid type then it will throw with a code of +`EUNKNOWNTYPE`. + +If an **error** argument is found and is not null then the remaining +arguments are optional. That is, if you say `ESO` then that's like using a +non-magical `E` in: `E|ESO|ZSO`. + +### But I have optional arguments?! + +You can provide more than one signature by separating them with pipes `|`. +If any signature matches the arguments then they'll be considered valid. + +So for example, say you wanted to write a signature for +`fs.createWriteStream`. The docs for it describe it thusly: + +``` +fs.createWriteStream(path[, options]) +``` + +This would be a signature of `SO|S`. That is, a string and and object, or +just a string. + +Now, if you read the full `fs` docs, you'll see that actually path can ALSO +be a buffer. And options can be a string, that is: +``` +path | +options | +``` + +To reproduce this you have to fully enumerate all of the possible +combinations and that implies a signature of `SO|SS|OO|OS|S|O`. The +awkwardness is a feature: It reminds you of the complexity you're adding to +your API when you do this sort of thing. + + +### Browser support + +This has no dependencies and should work in browsers, though you'll have +noisier stack traces. + +### Why this exists + +I wanted a very simple argument validator. It needed to do two things: + +1. Be more concise and easier to use than assertions + +2. Not encourage an infinite bikeshed of DSLs + +This is why types are specified by a single character and there's no such +thing as an optional argument. + +This is not intended to validate user data. This is specifically about +asserting the interface of your functions. + +If you need greater validation, I encourage you to write them by hand or +look elsewhere. + diff --git a/node_modules/move-concurrently/node_modules/aproba/index.js b/node_modules/move-concurrently/node_modules/aproba/index.js new file mode 100644 index 0000000000000..6f3f797c09a75 --- /dev/null +++ b/node_modules/move-concurrently/node_modules/aproba/index.js @@ -0,0 +1,105 @@ +'use strict' + +function isArguments (thingy) { + return thingy != null && typeof thingy === 'object' && thingy.hasOwnProperty('callee') +} + +var types = { + '*': {label: 'any', check: function () { return true }}, + A: {label: 'array', check: function (thingy) { return Array.isArray(thingy) || isArguments(thingy) }}, + S: {label: 'string', check: function (thingy) { return typeof thingy === 'string' }}, + N: {label: 'number', check: function (thingy) { return typeof thingy === 'number' }}, + F: {label: 'function', check: function (thingy) { return typeof thingy === 'function' }}, + O: {label: 'object', check: function (thingy) { return typeof thingy === 'object' && thingy != null && !types.A.check(thingy) && !types.E.check(thingy) }}, + B: {label: 'boolean', check: function (thingy) { return typeof thingy === 'boolean' }}, + E: {label: 'error', check: function (thingy) { return thingy instanceof Error }}, + Z: {label: 'null', check: function (thingy) { return thingy == null }} +} + +function addSchema (schema, arity) { + var group = arity[schema.length] = arity[schema.length] || [] + if (group.indexOf(schema) === -1) group.push(schema) +} + +var validate = module.exports = function (rawSchemas, args) { + if (arguments.length !== 2) throw wrongNumberOfArgs(['SA'], arguments.length) + if (!rawSchemas) throw missingRequiredArg(0, 'rawSchemas') + if (!args) throw missingRequiredArg(1, 'args') + if (!types.S.check(rawSchemas)) throw invalidType(0, ['string'], rawSchemas) + if (!types.A.check(args)) throw invalidType(1, ['array'], args) + var schemas = rawSchemas.split('|') + var arity = {} + + schemas.forEach(function (schema) { + for (var ii = 0; ii < schema.length; ++ii) { + var type = schema[ii] + if (!types[type]) throw unknownType(ii, type) + } + if (/E.*E/.test(schema)) throw moreThanOneError(schema) + addSchema(schema, arity) + if (/E/.test(schema)) { + addSchema(schema.replace(/E.*$/, 'E'), arity) + addSchema(schema.replace(/E/, 'Z'), arity) + if (schema.length === 1) addSchema('', arity) + } + }) + var matching = arity[args.length] + if (!matching) { + throw wrongNumberOfArgs(Object.keys(arity), args.length) + } + for (var ii = 0; ii < args.length; ++ii) { + var newMatching = matching.filter(function (schema) { + var type = schema[ii] + var typeCheck = types[type].check + return typeCheck(args[ii]) + }) + if (!newMatching.length) { + var labels = matching.map(function (schema) { + return types[schema[ii]].label + }).filter(function (schema) { return schema != null }) + throw invalidType(ii, labels, args[ii]) + } + matching = newMatching + } +} + +function missingRequiredArg (num) { + return newException('EMISSINGARG', 'Missing required argument #' + (num + 1)) +} + +function unknownType (num, type) { + return newException('EUNKNOWNTYPE', 'Unknown type ' + type + ' in argument #' + (num + 1)) +} + +function invalidType (num, expectedTypes, value) { + var valueType + Object.keys(types).forEach(function (typeCode) { + if (types[typeCode].check(value)) valueType = types[typeCode].label + }) + return newException('EINVALIDTYPE', 'Argument #' + (num + 1) + ': Expected ' + + englishList(expectedTypes) + ' but got ' + valueType) +} + +function englishList (list) { + return list.join(', ').replace(/, ([^,]+)$/, ' or $1') +} + +function wrongNumberOfArgs (expected, got) { + var english = englishList(expected) + var args = expected.every(function (ex) { return ex.length === 1 }) + ? 'argument' + : 'arguments' + return newException('EWRONGARGCOUNT', 'Expected ' + english + ' ' + args + ' but got ' + got) +} + +function moreThanOneError (schema) { + return newException('ETOOMANYERRORTYPES', + 'Only one error type per argument signature is allowed, more than one found in "' + schema + '"') +} + +function newException (code, msg) { + var e = new Error(msg) + e.code = code + if (Error.captureStackTrace) Error.captureStackTrace(e, validate) + return e +} diff --git a/node_modules/move-concurrently/node_modules/aproba/package.json b/node_modules/move-concurrently/node_modules/aproba/package.json new file mode 100644 index 0000000000000..eba0d3e6ea8f5 --- /dev/null +++ b/node_modules/move-concurrently/node_modules/aproba/package.json @@ -0,0 +1,62 @@ +{ + "_from": "aproba@^1.1.1", + "_id": "aproba@1.2.0", + "_inBundle": false, + "_integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "_location": "/move-concurrently/aproba", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "aproba@^1.1.1", + "name": "aproba", + "escapedName": "aproba", + "rawSpec": "^1.1.1", + "saveSpec": null, + "fetchSpec": "^1.1.1" + }, + "_requiredBy": [ + "/move-concurrently" + ], + "_resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "_shasum": "6802e6264efd18c790a1b0d517f0f2627bf2c94a", + "_spec": "aproba@^1.1.1", + "_where": "/Users/aeschright/code/cli/node_modules/move-concurrently", + "author": { + "name": "Rebecca Turner", + "email": "me@re-becca.org" + }, + "bugs": { + "url": "https://github.com/iarna/aproba/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "A ridiculously light-weight argument validator (now browser friendly)", + "devDependencies": { + "standard": "^10.0.3", + "tap": "^10.0.2" + }, + "directories": { + "test": "test" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/iarna/aproba", + "keywords": [ + "argument", + "validate" + ], + "license": "ISC", + "main": "index.js", + "name": "aproba", + "repository": { + "type": "git", + "url": "git+https://github.com/iarna/aproba.git" + }, + "scripts": { + "test": "standard && tap -j3 test/*.js" + }, + "version": "1.2.0" +} diff --git a/node_modules/run-queue/node_modules/aproba/LICENSE b/node_modules/run-queue/node_modules/aproba/LICENSE new file mode 100644 index 0000000000000..f4be44d881b2d --- /dev/null +++ b/node_modules/run-queue/node_modules/aproba/LICENSE @@ -0,0 +1,14 @@ +Copyright (c) 2015, Rebecca Turner + +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/node_modules/run-queue/node_modules/aproba/README.md b/node_modules/run-queue/node_modules/aproba/README.md new file mode 100644 index 0000000000000..0bfc594c56a37 --- /dev/null +++ b/node_modules/run-queue/node_modules/aproba/README.md @@ -0,0 +1,94 @@ +aproba +====== + +A ridiculously light-weight function argument validator + +``` +var validate = require("aproba") + +function myfunc(a, b, c) { + // `a` must be a string, `b` a number, `c` a function + validate('SNF', arguments) // [a,b,c] is also valid +} + +myfunc('test', 23, function () {}) // ok +myfunc(123, 23, function () {}) // type error +myfunc('test', 23) // missing arg error +myfunc('test', 23, function () {}, true) // too many args error + +``` + +Valid types are: + +| type | description +| :--: | :---------- +| * | matches any type +| A | `Array.isArray` OR an `arguments` object +| S | typeof == string +| N | typeof == number +| F | typeof == function +| O | typeof == object and not type A and not type E +| B | typeof == boolean +| E | `instanceof Error` OR `null` **(special: see below)** +| Z | == `null` + +Validation failures throw one of three exception types, distinguished by a +`code` property of `EMISSINGARG`, `EINVALIDTYPE` or `ETOOMANYARGS`. + +If you pass in an invalid type then it will throw with a code of +`EUNKNOWNTYPE`. + +If an **error** argument is found and is not null then the remaining +arguments are optional. That is, if you say `ESO` then that's like using a +non-magical `E` in: `E|ESO|ZSO`. + +### But I have optional arguments?! + +You can provide more than one signature by separating them with pipes `|`. +If any signature matches the arguments then they'll be considered valid. + +So for example, say you wanted to write a signature for +`fs.createWriteStream`. The docs for it describe it thusly: + +``` +fs.createWriteStream(path[, options]) +``` + +This would be a signature of `SO|S`. That is, a string and and object, or +just a string. + +Now, if you read the full `fs` docs, you'll see that actually path can ALSO +be a buffer. And options can be a string, that is: +``` +path | +options | +``` + +To reproduce this you have to fully enumerate all of the possible +combinations and that implies a signature of `SO|SS|OO|OS|S|O`. The +awkwardness is a feature: It reminds you of the complexity you're adding to +your API when you do this sort of thing. + + +### Browser support + +This has no dependencies and should work in browsers, though you'll have +noisier stack traces. + +### Why this exists + +I wanted a very simple argument validator. It needed to do two things: + +1. Be more concise and easier to use than assertions + +2. Not encourage an infinite bikeshed of DSLs + +This is why types are specified by a single character and there's no such +thing as an optional argument. + +This is not intended to validate user data. This is specifically about +asserting the interface of your functions. + +If you need greater validation, I encourage you to write them by hand or +look elsewhere. + diff --git a/node_modules/run-queue/node_modules/aproba/index.js b/node_modules/run-queue/node_modules/aproba/index.js new file mode 100644 index 0000000000000..6f3f797c09a75 --- /dev/null +++ b/node_modules/run-queue/node_modules/aproba/index.js @@ -0,0 +1,105 @@ +'use strict' + +function isArguments (thingy) { + return thingy != null && typeof thingy === 'object' && thingy.hasOwnProperty('callee') +} + +var types = { + '*': {label: 'any', check: function () { return true }}, + A: {label: 'array', check: function (thingy) { return Array.isArray(thingy) || isArguments(thingy) }}, + S: {label: 'string', check: function (thingy) { return typeof thingy === 'string' }}, + N: {label: 'number', check: function (thingy) { return typeof thingy === 'number' }}, + F: {label: 'function', check: function (thingy) { return typeof thingy === 'function' }}, + O: {label: 'object', check: function (thingy) { return typeof thingy === 'object' && thingy != null && !types.A.check(thingy) && !types.E.check(thingy) }}, + B: {label: 'boolean', check: function (thingy) { return typeof thingy === 'boolean' }}, + E: {label: 'error', check: function (thingy) { return thingy instanceof Error }}, + Z: {label: 'null', check: function (thingy) { return thingy == null }} +} + +function addSchema (schema, arity) { + var group = arity[schema.length] = arity[schema.length] || [] + if (group.indexOf(schema) === -1) group.push(schema) +} + +var validate = module.exports = function (rawSchemas, args) { + if (arguments.length !== 2) throw wrongNumberOfArgs(['SA'], arguments.length) + if (!rawSchemas) throw missingRequiredArg(0, 'rawSchemas') + if (!args) throw missingRequiredArg(1, 'args') + if (!types.S.check(rawSchemas)) throw invalidType(0, ['string'], rawSchemas) + if (!types.A.check(args)) throw invalidType(1, ['array'], args) + var schemas = rawSchemas.split('|') + var arity = {} + + schemas.forEach(function (schema) { + for (var ii = 0; ii < schema.length; ++ii) { + var type = schema[ii] + if (!types[type]) throw unknownType(ii, type) + } + if (/E.*E/.test(schema)) throw moreThanOneError(schema) + addSchema(schema, arity) + if (/E/.test(schema)) { + addSchema(schema.replace(/E.*$/, 'E'), arity) + addSchema(schema.replace(/E/, 'Z'), arity) + if (schema.length === 1) addSchema('', arity) + } + }) + var matching = arity[args.length] + if (!matching) { + throw wrongNumberOfArgs(Object.keys(arity), args.length) + } + for (var ii = 0; ii < args.length; ++ii) { + var newMatching = matching.filter(function (schema) { + var type = schema[ii] + var typeCheck = types[type].check + return typeCheck(args[ii]) + }) + if (!newMatching.length) { + var labels = matching.map(function (schema) { + return types[schema[ii]].label + }).filter(function (schema) { return schema != null }) + throw invalidType(ii, labels, args[ii]) + } + matching = newMatching + } +} + +function missingRequiredArg (num) { + return newException('EMISSINGARG', 'Missing required argument #' + (num + 1)) +} + +function unknownType (num, type) { + return newException('EUNKNOWNTYPE', 'Unknown type ' + type + ' in argument #' + (num + 1)) +} + +function invalidType (num, expectedTypes, value) { + var valueType + Object.keys(types).forEach(function (typeCode) { + if (types[typeCode].check(value)) valueType = types[typeCode].label + }) + return newException('EINVALIDTYPE', 'Argument #' + (num + 1) + ': Expected ' + + englishList(expectedTypes) + ' but got ' + valueType) +} + +function englishList (list) { + return list.join(', ').replace(/, ([^,]+)$/, ' or $1') +} + +function wrongNumberOfArgs (expected, got) { + var english = englishList(expected) + var args = expected.every(function (ex) { return ex.length === 1 }) + ? 'argument' + : 'arguments' + return newException('EWRONGARGCOUNT', 'Expected ' + english + ' ' + args + ' but got ' + got) +} + +function moreThanOneError (schema) { + return newException('ETOOMANYERRORTYPES', + 'Only one error type per argument signature is allowed, more than one found in "' + schema + '"') +} + +function newException (code, msg) { + var e = new Error(msg) + e.code = code + if (Error.captureStackTrace) Error.captureStackTrace(e, validate) + return e +} diff --git a/node_modules/run-queue/node_modules/aproba/package.json b/node_modules/run-queue/node_modules/aproba/package.json new file mode 100644 index 0000000000000..04fb91f559b0d --- /dev/null +++ b/node_modules/run-queue/node_modules/aproba/package.json @@ -0,0 +1,62 @@ +{ + "_from": "aproba@^1.1.1", + "_id": "aproba@1.2.0", + "_inBundle": false, + "_integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "_location": "/run-queue/aproba", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "aproba@^1.1.1", + "name": "aproba", + "escapedName": "aproba", + "rawSpec": "^1.1.1", + "saveSpec": null, + "fetchSpec": "^1.1.1" + }, + "_requiredBy": [ + "/run-queue" + ], + "_resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "_shasum": "6802e6264efd18c790a1b0d517f0f2627bf2c94a", + "_spec": "aproba@^1.1.1", + "_where": "/Users/aeschright/code/cli/node_modules/run-queue", + "author": { + "name": "Rebecca Turner", + "email": "me@re-becca.org" + }, + "bugs": { + "url": "https://github.com/iarna/aproba/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "A ridiculously light-weight argument validator (now browser friendly)", + "devDependencies": { + "standard": "^10.0.3", + "tap": "^10.0.2" + }, + "directories": { + "test": "test" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/iarna/aproba", + "keywords": [ + "argument", + "validate" + ], + "license": "ISC", + "main": "index.js", + "name": "aproba", + "repository": { + "type": "git", + "url": "git+https://github.com/iarna/aproba.git" + }, + "scripts": { + "test": "standard && tap -j3 test/*.js" + }, + "version": "1.2.0" +} diff --git a/package-lock.json b/package-lock.json index 2309b176f9ee2..5c1f6db482510 100644 --- a/package-lock.json +++ b/package-lock.json @@ -151,9 +151,9 @@ "integrity": "sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=" }, "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, "archy": { "version": "1.0.0", @@ -735,6 +735,11 @@ "run-queue": "^1.0.0" }, "dependencies": { + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, "iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", @@ -1685,6 +1690,11 @@ "wide-align": "^1.1.0" }, "dependencies": { + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -1717,6 +1727,11 @@ "slide": "^1.1.6" }, "dependencies": { + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, "iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", @@ -2890,6 +2905,13 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.3" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + } } }, "ms": { @@ -3215,6 +3237,7 @@ "version": "0.1.4", "bundled": true, "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2", "longest": "^1.0.1", @@ -4397,7 +4420,8 @@ "longest": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "loose-envify": { "version": "1.3.1", @@ -6629,6 +6653,13 @@ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "requires": { "aproba": "^1.1.1" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + } } }, "rx-lite": { diff --git a/package.json b/package.json index 518032ba3b8e9..72d00419f526e 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "abbrev": "~1.1.1", "ansicolors": "~0.3.2", "ansistyles": "~0.1.3", - "aproba": "~1.2.0", + "aproba": "^2.0.0", "archy": "~1.0.0", "bin-links": "^1.1.2", "bluebird": "^3.5.3", From a67e4d8b214e58ede037c3854961acb33fd889da Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Mon, 7 Jan 2019 17:32:05 -0800 Subject: [PATCH 67/97] byte-size@5.0.1 --- node_modules/byte-size/README.hbs | 28 ++++ node_modules/byte-size/README.md | 30 +++- node_modules/byte-size/dist/index.js | 152 ++++++++++++++++++ .../byte-size/{index.js => index.mjs} | 15 +- node_modules/byte-size/package.json | 49 +++--- package-lock.json | 6 +- package.json | 2 +- 7 files changed, 249 insertions(+), 33 deletions(-) create mode 100644 node_modules/byte-size/dist/index.js rename node_modules/byte-size/{index.js => index.mjs} (90%) diff --git a/node_modules/byte-size/README.hbs b/node_modules/byte-size/README.hbs index ebf5101b37002..8a57e4a9c784a 100644 --- a/node_modules/byte-size/README.hbs +++ b/node_modules/byte-size/README.hbs @@ -7,6 +7,34 @@ {{>main}} +### Load anywhere + +This library is compatible with Node.js, the Web and any style of module loader. It can be loaded anywhere, natively without transpilation. + +Node.js: + +```js +const byteSize = require('byte-size') +``` + +Within Node.js with ECMAScript Module support enabled: + +```js +import byteSize from 'byte-size' +``` + +Within a modern browser ECMAScript Module: + +```js +import byteSize from './node_modules/byte-size/index.mjs' +``` + +Old browser (adds `window.byteSize`): + +```html + +``` + * * * © 2014-18 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown). diff --git a/node_modules/byte-size/README.md b/node_modules/byte-size/README.md index fdd605d580867..9a36daaf52f48 100644 --- a/node_modules/byte-size/README.md +++ b/node_modules/byte-size/README.md @@ -8,7 +8,7 @@ ## byte-size -Convert a bytes value to a more human-readable format. Choose between [metric or IEC units](https://en.wikipedia.org/wiki/Gigabyte), summarised below. +An isomorphic, load-anywhere function to convert a bytes value into a more human-readable format. Choose between [metric or IEC units](https://en.wikipedia.org/wiki/Gigabyte), summarised below. Value | Metric ----- | ------------- @@ -100,6 +100,34 @@ const byteSize = require('byte-size') '1.5 Kio' ``` +### Load anywhere + +This library is compatible with Node.js, the Web and any style of module loader. It can be loaded anywhere, natively without transpilation. + +Node.js: + +```js +const byteSize = require('byte-size') +``` + +Within Node.js with ECMAScript Module support enabled: + +```js +import byteSize from 'byte-size' +``` + +Within a modern browser ECMAScript Module: + +```js +import byteSize from './node_modules/byte-size/index.mjs' +``` + +Old browser (adds `window.byteSize`): + +```html + +``` + * * * © 2014-18 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown). diff --git a/node_modules/byte-size/dist/index.js b/node_modules/byte-size/dist/index.js new file mode 100644 index 0000000000000..8253a63545b3a --- /dev/null +++ b/node_modules/byte-size/dist/index.js @@ -0,0 +1,152 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.byteSize = factory()); +}(this, function () { 'use strict'; + + /** + * An isomorphic, load-anywhere function to convert a bytes value into a more human-readable format. Choose between [metric or IEC units](https://en.wikipedia.org/wiki/Gigabyte), summarised below. + * + * Value | Metric + * ----- | ------------- + * 1000 | kB kilobyte + * 1000^2 | MB megabyte + * 1000^3 | GB gigabyte + * 1000^4 | TB terabyte + * 1000^5 | PB petabyte + * 1000^6 | EB exabyte + * 1000^7 | ZB zettabyte + * 1000^8 | YB yottabyte + * + * Value | IEC + * ----- | ------------ + * 1024 | KiB kibibyte + * 1024^2 | MiB mebibyte + * 1024^3 | GiB gibibyte + * 1024^4 | TiB tebibyte + * 1024^5 | PiB pebibyte + * 1024^6 | EiB exbibyte + * 1024^7 | ZiB zebibyte + * 1024^8 | YiB yobibyte + * + * Value | Metric (octet) + * ----- | ------------- + * 1000 | ko kilooctet + * 1000^2 | Mo megaoctet + * 1000^3 | Go gigaoctet + * 1000^4 | To teraoctet + * 1000^5 | Po petaoctet + * 1000^6 | Eo exaoctet + * 1000^7 | Zo zettaoctet + * 1000^8 | Yo yottaoctet + * + * Value | IEC (octet) + * ----- | ------------ + * 1024 | Kio kilooctet + * 1024^2 | Mio mebioctet + * 1024^3 | Gio gibioctet + * 1024^4 | Tio tebioctet + * 1024^5 | Pio pebioctet + * 1024^6 | Eio exbioctet + * 1024^7 | Zio zebioctet + * 1024^8 | Yio yobioctet + * + * @module byte-size + * @example + * ```js + * const byteSize = require('byte-size') + * ``` + */ + + class ByteSize { + constructor (bytes, options) { + options = options || {}; + options.units = options.units || 'metric'; + options.precision = typeof options.precision === 'undefined' ? 1 : options.precision; + + const table = [ + { expFrom: 0, expTo: 1, metric: 'B', iec: 'B', metric_octet: 'o', iec_octet: 'o' }, + { expFrom: 1, expTo: 2, metric: 'kB', iec: 'KiB', metric_octet: 'ko', iec_octet: 'Kio' }, + { expFrom: 2, expTo: 3, metric: 'MB', iec: 'MiB', metric_octet: 'Mo', iec_octet: 'Mio' }, + { expFrom: 3, expTo: 4, metric: 'GB', iec: 'GiB', metric_octet: 'Go', iec_octet: 'Gio' }, + { expFrom: 4, expTo: 5, metric: 'TB', iec: 'TiB', metric_octet: 'To', iec_octet: 'Tio' }, + { expFrom: 5, expTo: 6, metric: 'PB', iec: 'PiB', metric_octet: 'Po', iec_octet: 'Pio' }, + { expFrom: 6, expTo: 7, metric: 'EB', iec: 'EiB', metric_octet: 'Eo', iec_octet: 'Eio' }, + { expFrom: 7, expTo: 8, metric: 'ZB', iec: 'ZiB', metric_octet: 'Zo', iec_octet: 'Zio' }, + { expFrom: 8, expTo: 9, metric: 'YB', iec: 'YiB', metric_octet: 'Yo', iec_octet: 'Yio' } + ]; + + const base = options.units === 'metric' || options.units === 'metric_octet' ? 1000 : 1024; + const prefix = bytes < 0 ? '-' : ''; + bytes = Math.abs(bytes); + + for (let i = 0; i < table.length; i++) { + const lower = Math.pow(base, table[i].expFrom); + const upper = Math.pow(base, table[i].expTo); + if (bytes >= lower && bytes < upper) { + const units = table[i][options.units]; + if (i === 0) { + this.value = prefix + bytes; + this.unit = units; + return + } else { + this.value = prefix + (bytes / lower).toFixed(options.precision); + this.unit = units; + return + } + } + } + + this.value = prefix + bytes; + this.unit = ''; + } + + toString () { + return `${this.value} ${this.unit}`.trim() + } + } + + /** + * @param {number} - the bytes value to convert. + * @param [options] {object} - optional config. + * @param [options.precision=1] {number} - number of decimal places. + * @param [options.units=metric] {string} - select `'metric'`, `'iec'`, `'metric_octet'` or `'iec_octet'` units. + * @returns {{ value: string, unit: string}} + * @alias module:byte-size + * @example + * ```js + * > const byteSize = require('byte-size') + * + * > byteSize(1580) + * { value: '1.6', unit: 'kB' } + * + * > byteSize(1580, { units: 'iec' }) + * { value: '1.5', unit: 'KiB' } + * + * > byteSize(1580, { units: 'iec', precision: 3 }) + * { value: '1.543', unit: 'KiB' } + * + * > byteSize(1580, { units: 'iec', precision: 0 }) + * { value: '2', unit: 'KiB' } + * + * > byteSize(1580, { units: 'metric_octet' }) + * { value: '1.6', unit: 'ko' } + * + * > byteSize(1580, { units: 'iec_octet' }) + * { value: '1.5', unit: 'Kio' } + * + * > byteSize(1580, { units: 'iec_octet' }).toString() + * '1.5 Kio' + * + * > const { value, unit } = byteSize(1580, { units: 'iec_octet' }) + * > `${value} ${unit}` + * '1.5 Kio' + * ``` + */ + function byteSize (bytes, options) { + return new ByteSize(bytes, options) + } + + return byteSize; + +})); diff --git a/node_modules/byte-size/index.js b/node_modules/byte-size/index.mjs similarity index 90% rename from node_modules/byte-size/index.js rename to node_modules/byte-size/index.mjs index ec1a0293892e6..2de3e205b087c 100644 --- a/node_modules/byte-size/index.js +++ b/node_modules/byte-size/index.mjs @@ -1,7 +1,5 @@ -'use strict' - /** - * Convert a bytes value to a more human-readable format. Choose between [metric or IEC units](https://en.wikipedia.org/wiki/Gigabyte), summarised below. + * An isomorphic, load-anywhere function to convert a bytes value into a more human-readable format. Choose between [metric or IEC units](https://en.wikipedia.org/wiki/Gigabyte), summarised below. * * Value | Metric * ----- | ------------- @@ -53,7 +51,6 @@ * const byteSize = require('byte-size') * ``` */ -module.exports = byteSize class ByteSize { constructor (bytes, options) { @@ -74,6 +71,8 @@ class ByteSize { ] const base = options.units === 'metric' || options.units === 'metric_octet' ? 1000 : 1024 + const prefix = bytes < 0 ? '-' : ''; + bytes = Math.abs(bytes); for (let i = 0; i < table.length; i++) { const lower = Math.pow(base, table[i].expFrom) @@ -81,18 +80,18 @@ class ByteSize { if (bytes >= lower && bytes < upper) { const units = table[i][options.units] if (i === 0) { - this.value = String(bytes) + this.value = prefix + bytes this.unit = units return } else { - this.value = (bytes / lower).toFixed(options.precision) + this.value = prefix + (bytes / lower).toFixed(options.precision) this.unit = units return } } } - this.value = String(bytes) + this.value = prefix + bytes this.unit = '' } @@ -141,3 +140,5 @@ class ByteSize { function byteSize (bytes, options) { return new ByteSize(bytes, options) } + +export default byteSize diff --git a/node_modules/byte-size/package.json b/node_modules/byte-size/package.json index f69fc683f38cc..57e46ba988d9b 100644 --- a/node_modules/byte-size/package.json +++ b/node_modules/byte-size/package.json @@ -1,32 +1,28 @@ { - "_args": [ - [ - "byte-size@4.0.3", - "/Users/rebecca/code/npm" - ] - ], - "_from": "byte-size@4.0.3", - "_id": "byte-size@4.0.3", + "_from": "byte-size@5.0.1", + "_id": "byte-size@5.0.1", "_inBundle": false, - "_integrity": "sha512-JGC3EV2bCzJH/ENSh3afyJrH4vwxbHTuO5ljLoI5+2iJOcEpMgP8T782jH9b5qGxf2mSUIp1lfGnfKNrRHpvVg==", + "_integrity": "sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==", "_location": "/byte-size", "_phantomChildren": {}, "_requested": { "type": "version", "registry": true, - "raw": "byte-size@4.0.3", + "raw": "byte-size@5.0.1", "name": "byte-size", "escapedName": "byte-size", - "rawSpec": "4.0.3", + "rawSpec": "5.0.1", "saveSpec": null, - "fetchSpec": "4.0.3" + "fetchSpec": "5.0.1" }, "_requiredBy": [ + "#USER", "/" ], - "_resolved": "https://registry.npmjs.org/byte-size/-/byte-size-4.0.3.tgz", - "_spec": "4.0.3", - "_where": "/Users/rebecca/code/npm", + "_resolved": "https://registry.npmjs.org/byte-size/-/byte-size-5.0.1.tgz", + "_shasum": "4b651039a5ecd96767e71a3d7ed380e48bed4191", + "_spec": "byte-size@5.0.1", + "_where": "/Users/aeschright/code/cli", "author": { "name": "Lloyd Brookes", "email": "75pound@gmail.com" @@ -34,6 +30,7 @@ "bugs": { "url": "https://github.com/75lb/byte-size/issues" }, + "bundleDependencies": false, "contributors": [ { "name": "Raul Perez", @@ -41,14 +38,20 @@ "url": "http://repejota.com" } ], + "deprecated": false, "description": "Convert a bytes (and octets) value to a more human-readable format. Choose between metric or IEC units.", "devDependencies": { - "coveralls": "^3.0.1", + "coveralls": "^3.0.2", "jsdoc-to-markdown": "^4.0.1", - "test-runner": "^0.5.0" + "rollup": "^0.68.1", + "test-runner": "^0.5.1" + }, + "engines": { + "node": ">=6.0.0" }, "files": [ - "index.js" + "index.mjs", + "dist/index.js" ], "homepage": "https://github.com/75lb/byte-size#readme", "keywords": [ @@ -62,6 +65,7 @@ "IEC" ], "license": "MIT", + "main": "dist/index.js", "name": "byte-size", "repository": { "type": "git", @@ -69,8 +73,11 @@ }, "scripts": { "cover": "istanbul cover ./node_modules/.bin/test-runner test.js && cat coverage/lcov.info | ./node_modules/.bin/coveralls", - "docs": "jsdoc2md -t README.hbs index.js > README.md; echo", - "test": "test-runner test.js" + "dist": "rollup -c dist/index.config.js", + "docs": "jsdoc2md -t README.hbs dist/index.js > README.md; echo", + "test": "npm run test:js && npm run test:mjs", + "test:js": "rollup -c dist/test.config.js && node dist/test.js", + "test:mjs": "node --experimental-modules test/test.mjs" }, - "version": "4.0.3" + "version": "5.0.1" } diff --git a/package-lock.json b/package-lock.json index 5c1f6db482510..314384136ff26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -374,9 +374,9 @@ "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" }, "byte-size": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-4.0.3.tgz", - "integrity": "sha512-JGC3EV2bCzJH/ENSh3afyJrH4vwxbHTuO5ljLoI5+2iJOcEpMgP8T782jH9b5qGxf2mSUIp1lfGnfKNrRHpvVg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-5.0.1.tgz", + "integrity": "sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==" }, "cacache": { "version": "11.2.0", diff --git a/package.json b/package.json index 72d00419f526e..cbfc405f1f517 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "archy": "~1.0.0", "bin-links": "^1.1.2", "bluebird": "^3.5.3", - "byte-size": "^4.0.3", + "byte-size": "^5.0.1", "cacache": "^11.2.0", "call-limit": "~1.1.0", "chownr": "~1.0.1", From 8bea4efa34857c4e547904b3630dd442def241de Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Mon, 7 Jan 2019 17:39:55 -0800 Subject: [PATCH 68/97] cacache@11.3.2 --- node_modules/cacache/CHANGELOG.md | 30 ++ node_modules/cacache/get.js | 51 ++- node_modules/cacache/lib/entry-index.js | 107 +++-- node_modules/cacache/lib/util/fix-owner.js | 46 +++ node_modules/cacache/locales/en.js | 3 + node_modules/cacache/locales/es.js | 3 + .../cacache/node_modules/chownr/LICENSE | 15 + .../cacache/node_modules/chownr/README.md | 3 + .../cacache/node_modules/chownr/chownr.js | 88 ++++ .../cacache/node_modules/chownr/package.json | 59 +++ .../cacache/node_modules/lru-cache/LICENSE | 15 + .../cacache/node_modules/lru-cache/README.md | 166 ++++++++ .../cacache/node_modules/lru-cache/index.js | 334 ++++++++++++++++ .../node_modules/lru-cache/package.json | 67 ++++ .../node_modules/unique-filename/LICENSE | 5 + .../node_modules/unique-filename/README.md | 33 ++ .../coverage/__root__/index.html | 73 ++++ .../coverage/__root__/index.js.html | 69 ++++ .../unique-filename/coverage/base.css | 182 +++++++++ .../unique-filename/coverage/index.html | 73 ++++ .../unique-filename/coverage/prettify.css | 1 + .../unique-filename/coverage/prettify.js | 1 + .../coverage/sort-arrow-sprite.png | Bin 0 -> 209 bytes .../unique-filename/coverage/sorter.js | 156 ++++++++ .../node_modules/unique-filename/index.js | 8 + .../node_modules/unique-filename/package.json | 56 +++ .../unique-filename/test/index.js | 23 ++ .../cacache/node_modules/yallist/LICENSE | 15 + .../cacache/node_modules/yallist/README.md | 204 ++++++++++ .../cacache/node_modules/yallist/iterator.js | 8 + .../cacache/node_modules/yallist/package.json | 62 +++ .../cacache/node_modules/yallist/yallist.js | 376 ++++++++++++++++++ node_modules/cacache/package.json | 44 +- package-lock.json | 50 ++- package.json | 2 +- 35 files changed, 2369 insertions(+), 59 deletions(-) create mode 100644 node_modules/cacache/node_modules/chownr/LICENSE create mode 100644 node_modules/cacache/node_modules/chownr/README.md create mode 100644 node_modules/cacache/node_modules/chownr/chownr.js create mode 100644 node_modules/cacache/node_modules/chownr/package.json create mode 100644 node_modules/cacache/node_modules/lru-cache/LICENSE create mode 100644 node_modules/cacache/node_modules/lru-cache/README.md create mode 100644 node_modules/cacache/node_modules/lru-cache/index.js create mode 100644 node_modules/cacache/node_modules/lru-cache/package.json create mode 100644 node_modules/cacache/node_modules/unique-filename/LICENSE create mode 100644 node_modules/cacache/node_modules/unique-filename/README.md create mode 100644 node_modules/cacache/node_modules/unique-filename/coverage/__root__/index.html create mode 100644 node_modules/cacache/node_modules/unique-filename/coverage/__root__/index.js.html create mode 100644 node_modules/cacache/node_modules/unique-filename/coverage/base.css create mode 100644 node_modules/cacache/node_modules/unique-filename/coverage/index.html create mode 100644 node_modules/cacache/node_modules/unique-filename/coverage/prettify.css create mode 100644 node_modules/cacache/node_modules/unique-filename/coverage/prettify.js create mode 100644 node_modules/cacache/node_modules/unique-filename/coverage/sort-arrow-sprite.png create mode 100644 node_modules/cacache/node_modules/unique-filename/coverage/sorter.js create mode 100644 node_modules/cacache/node_modules/unique-filename/index.js create mode 100644 node_modules/cacache/node_modules/unique-filename/package.json create mode 100644 node_modules/cacache/node_modules/unique-filename/test/index.js create mode 100644 node_modules/cacache/node_modules/yallist/LICENSE create mode 100644 node_modules/cacache/node_modules/yallist/README.md create mode 100644 node_modules/cacache/node_modules/yallist/iterator.js create mode 100644 node_modules/cacache/node_modules/yallist/package.json create mode 100644 node_modules/cacache/node_modules/yallist/yallist.js diff --git a/node_modules/cacache/CHANGELOG.md b/node_modules/cacache/CHANGELOG.md index ec9174f80d76c..847174be70f4d 100644 --- a/node_modules/cacache/CHANGELOG.md +++ b/node_modules/cacache/CHANGELOG.md @@ -2,6 +2,36 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [11.3.2](https://github.com/zkat/cacache/compare/v11.3.1...v11.3.2) (2018-12-21) + + +### Bug Fixes + +* **get:** make sure to handle errors in the .then ([b10bcd0](https://github.com/zkat/cacache/commit/b10bcd0)) + + + + +## [11.3.1](https://github.com/zkat/cacache/compare/v11.3.0...v11.3.1) (2018-11-05) + + +### Bug Fixes + +* **get:** export hasContent.sync properly ([d76c920](https://github.com/zkat/cacache/commit/d76c920)) + + + + +# [11.3.0](https://github.com/zkat/cacache/compare/v11.2.0...v11.3.0) (2018-11-05) + + +### Features + +* **get:** add sync API for reading ([db1e094](https://github.com/zkat/cacache/commit/db1e094)) + + + # [11.2.0](https://github.com/zkat/cacache/compare/v11.1.0...v11.2.0) (2018-08-08) diff --git a/node_modules/cacache/get.js b/node_modules/cacache/get.js index 7bafe128e4bf3..008cb83a9ed87 100644 --- a/node_modules/cacache/get.js +++ b/node_modules/cacache/get.js @@ -63,6 +63,55 @@ function getData (byDigest, cache, key, opts) { }) } +module.exports.sync = function get (cache, key, opts) { + return getDataSync(false, cache, key, opts) +} +module.exports.sync.byDigest = function getByDigest (cache, digest, opts) { + return getDataSync(true, cache, digest, opts) +} +function getDataSync (byDigest, cache, key, opts) { + opts = GetOpts(opts) + const memoized = ( + byDigest + ? memo.get.byDigest(cache, key, opts) + : memo.get(cache, key, opts) + ) + if (memoized && opts.memoize !== false) { + return byDigest ? memoized : { + metadata: memoized.entry.metadata, + data: memoized.data, + integrity: memoized.entry.integrity, + size: memoized.entry.size + } + } + const entry = !byDigest && index.find.sync(cache, key, opts) + if (!entry && !byDigest) { + throw new index.NotFoundError(cache, key) + } + const data = read.sync( + cache, + byDigest ? key : entry.integrity, + { + integrity: opts.integrity, + size: opts.size + } + ) + const res = byDigest + ? data + : { + metadata: entry.metadata, + data: data, + size: entry.size, + integrity: entry.integrity + } + if (opts.memoize && byDigest) { + memo.put.byDigest(cache, key, res, opts) + } else if (opts.memoize) { + memo.put(cache, entry, res.data, opts) + } + return res +} + module.exports.stream = getStream function getStream (cache, key, opts) { opts = GetOpts(opts) @@ -113,7 +162,7 @@ function getStream (cache, key, opts) { memoStream, stream ) - }, err => stream.emit('error', err)) + }).catch(err => stream.emit('error', err)) return stream } diff --git a/node_modules/cacache/lib/entry-index.js b/node_modules/cacache/lib/entry-index.js index 43fa7b95b1d0f..29a688eea26ab 100644 --- a/node_modules/cacache/lib/entry-index.js +++ b/node_modules/cacache/lib/entry-index.js @@ -75,10 +75,36 @@ function insert (cache, key, integrity, opts) { }) } +module.exports.insert.sync = insertSync +function insertSync (cache, key, integrity, opts) { + opts = IndexOpts(opts) + const bucket = bucketPath(cache, key) + const entry = { + key, + integrity: integrity && ssri.stringify(integrity), + time: Date.now(), + size: opts.size, + metadata: opts.metadata + } + fixOwner.mkdirfix.sync(path.dirname(bucket), opts.uid, opts.gid) + const stringified = JSON.stringify(entry) + fs.appendFileSync( + bucket, `\n${hashEntry(stringified)}\t${stringified}` + ) + try { + fixOwner.chownr.sync(bucket, opts.uid, opts.gid) + } catch (err) { + if (err.code !== 'ENOENT') { + throw err + } + } + return formatEntry(cache, entry) +} + module.exports.find = find function find (cache, key) { const bucket = bucketPath(cache, key) - return bucketEntries(cache, bucket).then(entries => { + return bucketEntries(bucket).then(entries => { return entries.reduce((latest, next) => { if (next && next.key === key) { return formatEntry(cache, next) @@ -95,11 +121,36 @@ function find (cache, key) { }) } +module.exports.find.sync = findSync +function findSync (cache, key) { + const bucket = bucketPath(cache, key) + try { + return bucketEntriesSync(bucket).reduce((latest, next) => { + if (next && next.key === key) { + return formatEntry(cache, next) + } else { + return latest + } + }, null) + } catch (err) { + if (err.code === 'ENOENT') { + return null + } else { + throw err + } + } +} + module.exports.delete = del function del (cache, key, opts) { return insert(cache, key, null, opts) } +module.exports.delete.sync = delSync +function delSync (cache, key, opts) { + return insertSync(cache, key, null, opts) +} + module.exports.lsStream = lsStream function lsStream (cache) { const indexDir = bucketDir(cache) @@ -116,7 +167,6 @@ function lsStream (cache) { // "/cachename///*" return readdirOrEmpty(subbucketPath).map(entry => { const getKeyToEntry = bucketEntries( - cache, path.join(subbucketPath, entry) ).reduce((acc, entry) => { acc.set(entry.key, entry) @@ -152,32 +202,39 @@ function ls (cache) { }) } -function bucketEntries (cache, bucket, filter) { +function bucketEntries (bucket, filter) { return readFileAsync( bucket, 'utf8' - ).then(data => { - let entries = [] - data.split('\n').forEach(entry => { - if (!entry) { return } - const pieces = entry.split('\t') - if (!pieces[1] || hashEntry(pieces[1]) !== pieces[0]) { - // Hash is no good! Corruption or malice? Doesn't matter! - // EJECT EJECT - return - } - let obj - try { - obj = JSON.parse(pieces[1]) - } catch (e) { - // Entry is corrupted! - return - } - if (obj) { - entries.push(obj) - } - }) - return entries + ).then(data => _bucketEntries(data, filter)) +} + +function bucketEntriesSync (bucket, filter) { + const data = fs.readFileSync(bucket, 'utf8') + return _bucketEntries(data, filter) +} + +function _bucketEntries (data, filter) { + let entries = [] + data.split('\n').forEach(entry => { + if (!entry) { return } + const pieces = entry.split('\t') + if (!pieces[1] || hashEntry(pieces[1]) !== pieces[0]) { + // Hash is no good! Corruption or malice? Doesn't matter! + // EJECT EJECT + return + } + let obj + try { + obj = JSON.parse(pieces[1]) + } catch (e) { + // Entry is corrupted! + return + } + if (obj) { + entries.push(obj) + } }) + return entries } module.exports._bucketDir = bucketDir diff --git a/node_modules/cacache/lib/util/fix-owner.js b/node_modules/cacache/lib/util/fix-owner.js index 7000bff04807a..0c8f9f87537b0 100644 --- a/node_modules/cacache/lib/util/fix-owner.js +++ b/node_modules/cacache/lib/util/fix-owner.js @@ -31,6 +31,34 @@ function fixOwner (filepath, uid, gid) { ) } +module.exports.chownr.sync = fixOwnerSync +function fixOwnerSync (filepath, uid, gid) { + if (!process.getuid) { + // This platform doesn't need ownership fixing + return + } + if (typeof uid !== 'number' && typeof gid !== 'number') { + // There's no permissions override. Nothing to do here. + return + } + if ((typeof uid === 'number' && process.getuid() === uid) && + (typeof gid === 'number' && process.getgid() === gid)) { + // No need to override if it's already what we used. + return + } + try { + chownr.sync( + filepath, + typeof uid === 'number' ? uid : process.getuid(), + typeof gid === 'number' ? gid : process.getgid() + ) + } catch (err) { + if (err.code === 'ENOENT') { + return null + } + } +} + module.exports.mkdirfix = mkdirfix function mkdirfix (p, uid, gid, cb) { return mkdirp(p).then(made => { @@ -42,3 +70,21 @@ function mkdirfix (p, uid, gid, cb) { return fixOwner(p, uid, gid).then(() => null) }) } + +module.exports.mkdirfix.sync = mkdirfixSync +function mkdirfixSync (p, uid, gid) { + try { + const made = mkdirp.sync(p) + if (made) { + fixOwnerSync(made, uid, gid) + return made + } + } catch (err) { + if (err.code === 'EEXIST') { + fixOwnerSync(p, uid, gid) + return null + } else { + throw err + } + } +} diff --git a/node_modules/cacache/locales/en.js b/node_modules/cacache/locales/en.js index 22025cf0e895e..1715fdb53cd3f 100644 --- a/node_modules/cacache/locales/en.js +++ b/node_modules/cacache/locales/en.js @@ -18,12 +18,15 @@ x.ls.stream = cache => ls.stream(cache) x.get = (cache, key, opts) => get(cache, key, opts) x.get.byDigest = (cache, hash, opts) => get.byDigest(cache, hash, opts) +x.get.sync = (cache, key, opts) => get.sync(cache, key, opts) +x.get.sync.byDigest = (cache, key, opts) => get.sync.byDigest(cache, key, opts) x.get.stream = (cache, key, opts) => get.stream(cache, key, opts) x.get.stream.byDigest = (cache, hash, opts) => get.stream.byDigest(cache, hash, opts) x.get.copy = (cache, key, dest, opts) => get.copy(cache, key, dest, opts) x.get.copy.byDigest = (cache, hash, dest, opts) => get.copy.byDigest(cache, hash, dest, opts) x.get.info = (cache, key) => get.info(cache, key) x.get.hasContent = (cache, hash) => get.hasContent(cache, hash) +x.get.hasContent.sync = (cache, hash) => get.hasContent.sync(cache, hash) x.put = (cache, key, data, opts) => put(cache, key, data, opts) x.put.stream = (cache, key, opts) => put.stream(cache, key, opts) diff --git a/node_modules/cacache/locales/es.js b/node_modules/cacache/locales/es.js index 9a27de6585a23..ac4e4cfe7d2f4 100644 --- a/node_modules/cacache/locales/es.js +++ b/node_modules/cacache/locales/es.js @@ -18,12 +18,15 @@ x.ls.flujo = cache => ls.stream(cache) x.saca = (cache, clave, ops) => get(cache, clave, ops) x.saca.porHacheo = (cache, hacheo, ops) => get.byDigest(cache, hacheo, ops) +x.saca.sinc = (cache, clave, ops) => get.sync(cache, clave, ops) +x.saca.sinc.porHacheo = (cache, hacheo, ops) => get.sync.byDigest(cache, hacheo, ops) x.saca.flujo = (cache, clave, ops) => get.stream(cache, clave, ops) x.saca.flujo.porHacheo = (cache, hacheo, ops) => get.stream.byDigest(cache, hacheo, ops) x.sava.copia = (cache, clave, destino, opts) => get.copy(cache, clave, destino, opts) x.sava.copia.porHacheo = (cache, hacheo, destino, opts) => get.copy.byDigest(cache, hacheo, destino, opts) x.saca.info = (cache, clave) => get.info(cache, clave) x.saca.tieneDatos = (cache, hacheo) => get.hasContent(cache, hacheo) +x.saca.tieneDatos.sinc = (cache, hacheo) => get.hasContent.sync(cache, hacheo) x.mete = (cache, clave, datos, ops) => put(cache, clave, datos, ops) x.mete.flujo = (cache, clave, ops) => put.stream(cache, clave, ops) diff --git a/node_modules/cacache/node_modules/chownr/LICENSE b/node_modules/cacache/node_modules/chownr/LICENSE new file mode 100644 index 0000000000000..19129e315fe59 --- /dev/null +++ b/node_modules/cacache/node_modules/chownr/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/node_modules/cacache/node_modules/chownr/README.md b/node_modules/cacache/node_modules/chownr/README.md new file mode 100644 index 0000000000000..70e9a54a32b8e --- /dev/null +++ b/node_modules/cacache/node_modules/chownr/README.md @@ -0,0 +1,3 @@ +Like `chown -R`. + +Takes the same arguments as `fs.chown()` diff --git a/node_modules/cacache/node_modules/chownr/chownr.js b/node_modules/cacache/node_modules/chownr/chownr.js new file mode 100644 index 0000000000000..7e63928827e2c --- /dev/null +++ b/node_modules/cacache/node_modules/chownr/chownr.js @@ -0,0 +1,88 @@ +'use strict' +const fs = require('fs') +const path = require('path') + +/* istanbul ignore next */ +const LCHOWN = fs.lchown ? 'lchown' : 'chown' +/* istanbul ignore next */ +const LCHOWNSYNC = fs.lchownSync ? 'lchownSync' : 'chownSync' + +// fs.readdir could only accept an options object as of node v6 +const nodeVersion = process.version +let readdir = (path, options, cb) => fs.readdir(path, options, cb) +let readdirSync = (path, options) => fs.readdirSync(path, options) +/* istanbul ignore next */ +if (/^v4\./.test(nodeVersion)) + readdir = (path, options, cb) => fs.readdir(path, cb) + +const chownrKid = (p, child, uid, gid, cb) => { + if (typeof child === 'string') + return fs.lstat(path.resolve(p, child), (er, stats) => { + if (er) + return cb(er) + stats.name = child + chownrKid(p, stats, uid, gid, cb) + }) + + if (child.isDirectory()) { + chownr(path.resolve(p, child.name), uid, gid, er => { + if (er) + return cb(er) + fs[LCHOWN](path.resolve(p, child.name), uid, gid, cb) + }) + } else + fs[LCHOWN](path.resolve(p, child.name), uid, gid, cb) +} + + +const chownr = (p, uid, gid, cb) => { + readdir(p, { withFileTypes: true }, (er, children) => { + // any error other than ENOTDIR or ENOTSUP means it's not readable, + // or doesn't exist. give up. + if (er && er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP') + return cb(er) + if (er || !children.length) return fs[LCHOWN](p, uid, gid, cb) + + let len = children.length + let errState = null + const then = er => { + if (errState) return + if (er) return cb(errState = er) + if (-- len === 0) return fs[LCHOWN](p, uid, gid, cb) + } + + children.forEach(child => chownrKid(p, child, uid, gid, then)) + }) +} + +const chownrKidSync = (p, child, uid, gid) => { + if (typeof child === 'string') { + const stats = fs.lstatSync(path.resolve(p, child)) + stats.name = child + child = stats + } + + if (child.isDirectory()) + chownrSync(path.resolve(p, child.name), uid, gid) + + fs[LCHOWNSYNC](path.resolve(p, child.name), uid, gid) +} + +const chownrSync = (p, uid, gid) => { + let children + try { + children = readdirSync(p, { withFileTypes: true }) + } catch (er) { + if (er && er.code === 'ENOTDIR' && er.code !== 'ENOTSUP') + return fs[LCHOWNSYNC](p, uid, gid) + throw er + } + + if (children.length) + children.forEach(child => chownrKidSync(p, child, uid, gid)) + + return fs[LCHOWNSYNC](p, uid, gid) +} + +module.exports = chownr +chownr.sync = chownrSync diff --git a/node_modules/cacache/node_modules/chownr/package.json b/node_modules/cacache/node_modules/chownr/package.json new file mode 100644 index 0000000000000..4871f94bf391d --- /dev/null +++ b/node_modules/cacache/node_modules/chownr/package.json @@ -0,0 +1,59 @@ +{ + "_from": "chownr@^1.1.1", + "_id": "chownr@1.1.1", + "_inBundle": false, + "_integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "_location": "/cacache/chownr", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "chownr@^1.1.1", + "name": "chownr", + "escapedName": "chownr", + "rawSpec": "^1.1.1", + "saveSpec": null, + "fetchSpec": "^1.1.1" + }, + "_requiredBy": [ + "/cacache" + ], + "_resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "_shasum": "54726b8b8fff4df053c42187e801fb4412df1494", + "_spec": "chownr@^1.1.1", + "_where": "/Users/aeschright/code/cli/node_modules/cacache", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/isaacs/chownr/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "like `chown -R`", + "devDependencies": { + "mkdirp": "0.3", + "rimraf": "", + "tap": "^12.0.1" + }, + "files": [ + "chownr.js" + ], + "homepage": "https://github.com/isaacs/chownr#readme", + "license": "ISC", + "main": "chownr.js", + "name": "chownr", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/chownr.git" + }, + "scripts": { + "postpublish": "git push origin --all; git push origin --tags", + "postversion": "npm publish", + "preversion": "npm test", + "test": "tap test/*.js --cov" + }, + "version": "1.1.1" +} diff --git a/node_modules/cacache/node_modules/lru-cache/LICENSE b/node_modules/cacache/node_modules/lru-cache/LICENSE new file mode 100644 index 0000000000000..19129e315fe59 --- /dev/null +++ b/node_modules/cacache/node_modules/lru-cache/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/node_modules/cacache/node_modules/lru-cache/README.md b/node_modules/cacache/node_modules/lru-cache/README.md new file mode 100644 index 0000000000000..435dfebb7e27d --- /dev/null +++ b/node_modules/cacache/node_modules/lru-cache/README.md @@ -0,0 +1,166 @@ +# lru cache + +A cache object that deletes the least-recently-used items. + +[![Build Status](https://travis-ci.org/isaacs/node-lru-cache.svg?branch=master)](https://travis-ci.org/isaacs/node-lru-cache) [![Coverage Status](https://coveralls.io/repos/isaacs/node-lru-cache/badge.svg?service=github)](https://coveralls.io/github/isaacs/node-lru-cache) + +## Installation: + +```javascript +npm install lru-cache --save +``` + +## Usage: + +```javascript +var LRU = require("lru-cache") + , options = { max: 500 + , length: function (n, key) { return n * 2 + key.length } + , dispose: function (key, n) { n.close() } + , maxAge: 1000 * 60 * 60 } + , cache = new LRU(options) + , otherCache = new LRU(50) // sets just the max size + +cache.set("key", "value") +cache.get("key") // "value" + +// non-string keys ARE fully supported +// but note that it must be THE SAME object, not +// just a JSON-equivalent object. +var someObject = { a: 1 } +cache.set(someObject, 'a value') +// Object keys are not toString()-ed +cache.set('[object Object]', 'a different value') +assert.equal(cache.get(someObject), 'a value') +// A similar object with same keys/values won't work, +// because it's a different object identity +assert.equal(cache.get({ a: 1 }), undefined) + +cache.reset() // empty the cache +``` + +If you put more stuff in it, then items will fall out. + +If you try to put an oversized thing in it, then it'll fall out right +away. + +## Options + +* `max` The maximum size of the cache, checked by applying the length + function to all values in the cache. Not setting this is kind of + silly, since that's the whole purpose of this lib, but it defaults + to `Infinity`. Setting it to a non-number or negative number will + throw a `TypeError`. Setting it to 0 makes it be `Infinity`. +* `maxAge` Maximum age in ms. Items are not pro-actively pruned out + as they age, but if you try to get an item that is too old, it'll + drop it and return undefined instead of giving it to you. + Setting this to a negative value will make everything seem old! + Setting it to a non-number will throw a `TypeError`. +* `length` Function that is used to calculate the length of stored + items. If you're storing strings or buffers, then you probably want + to do something like `function(n, key){return n.length}`. The default is + `function(){return 1}`, which is fine if you want to store `max` + like-sized things. The item is passed as the first argument, and + the key is passed as the second argumnet. +* `dispose` Function that is called on items when they are dropped + from the cache. This can be handy if you want to close file + descriptors or do other cleanup tasks when items are no longer + accessible. Called with `key, value`. It's called *before* + actually removing the item from the internal cache, so if you want + to immediately put it back in, you'll have to do that in a + `nextTick` or `setTimeout` callback or it won't do anything. +* `stale` By default, if you set a `maxAge`, it'll only actually pull + stale items out of the cache when you `get(key)`. (That is, it's + not pre-emptively doing a `setTimeout` or anything.) If you set + `stale:true`, it'll return the stale value before deleting it. If + you don't set this, then it'll return `undefined` when you try to + get a stale entry, as if it had already been deleted. +* `noDisposeOnSet` By default, if you set a `dispose()` method, then + it'll be called whenever a `set()` operation overwrites an existing + key. If you set this option, `dispose()` will only be called when a + key falls out of the cache, not when it is overwritten. +* `updateAgeOnGet` When using time-expiring entries with `maxAge`, + setting this to `true` will make each item's effective time update + to the current time whenever it is retrieved from cache, causing it + to not expire. (It can still fall out of cache based on recency of + use, of course.) + +## API + +* `set(key, value, maxAge)` +* `get(key) => value` + + Both of these will update the "recently used"-ness of the key. + They do what you think. `maxAge` is optional and overrides the + cache `maxAge` option if provided. + + If the key is not found, `get()` will return `undefined`. + + The key and val can be any value. + +* `peek(key)` + + Returns the key value (or `undefined` if not found) without + updating the "recently used"-ness of the key. + + (If you find yourself using this a lot, you *might* be using the + wrong sort of data structure, but there are some use cases where + it's handy.) + +* `del(key)` + + Deletes a key out of the cache. + +* `reset()` + + Clear the cache entirely, throwing away all values. + +* `has(key)` + + Check if a key is in the cache, without updating the recent-ness + or deleting it for being stale. + +* `forEach(function(value,key,cache), [thisp])` + + Just like `Array.prototype.forEach`. Iterates over all the keys + in the cache, in order of recent-ness. (Ie, more recently used + items are iterated over first.) + +* `rforEach(function(value,key,cache), [thisp])` + + The same as `cache.forEach(...)` but items are iterated over in + reverse order. (ie, less recently used items are iterated over + first.) + +* `keys()` + + Return an array of the keys in the cache. + +* `values()` + + Return an array of the values in the cache. + +* `length` + + Return total length of objects in cache taking into account + `length` options function. + +* `itemCount` + + Return total quantity of objects currently in cache. Note, that + `stale` (see options) items are returned as part of this item + count. + +* `dump()` + + Return an array of the cache entries ready for serialization and usage + with 'destinationCache.load(arr)`. + +* `load(cacheEntriesArray)` + + Loads another cache entries array, obtained with `sourceCache.dump()`, + into the cache. The destination cache is reset before loading new entries + +* `prune()` + + Manually iterates over the entire cache proactively pruning old entries diff --git a/node_modules/cacache/node_modules/lru-cache/index.js b/node_modules/cacache/node_modules/lru-cache/index.js new file mode 100644 index 0000000000000..573b6b85b9779 --- /dev/null +++ b/node_modules/cacache/node_modules/lru-cache/index.js @@ -0,0 +1,334 @@ +'use strict' + +// A linked list to keep track of recently-used-ness +const Yallist = require('yallist') + +const MAX = Symbol('max') +const LENGTH = Symbol('length') +const LENGTH_CALCULATOR = Symbol('lengthCalculator') +const ALLOW_STALE = Symbol('allowStale') +const MAX_AGE = Symbol('maxAge') +const DISPOSE = Symbol('dispose') +const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet') +const LRU_LIST = Symbol('lruList') +const CACHE = Symbol('cache') +const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet') + +const naiveLength = () => 1 + +// lruList is a yallist where the head is the youngest +// item, and the tail is the oldest. the list contains the Hit +// objects as the entries. +// Each Hit object has a reference to its Yallist.Node. This +// never changes. +// +// cache is a Map (or PseudoMap) that matches the keys to +// the Yallist.Node object. +class LRUCache { + constructor (options) { + if (typeof options === 'number') + options = { max: options } + + if (!options) + options = {} + + if (options.max && (typeof options.max !== 'number' || options.max < 0)) + throw new TypeError('max must be a non-negative number') + // Kind of weird to have a default max of Infinity, but oh well. + const max = this[MAX] = options.max || Infinity + + const lc = options.length || naiveLength + this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc + this[ALLOW_STALE] = options.stale || false + if (options.maxAge && typeof options.maxAge !== 'number') + throw new TypeError('maxAge must be a number') + this[MAX_AGE] = options.maxAge || 0 + this[DISPOSE] = options.dispose + this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false + this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false + this.reset() + } + + // resize the cache when the max changes. + set max (mL) { + if (typeof mL !== 'number' || mL < 0) + throw new TypeError('max must be a non-negative number') + + this[MAX] = mL || Infinity + trim(this) + } + get max () { + return this[MAX] + } + + set allowStale (allowStale) { + this[ALLOW_STALE] = !!allowStale + } + get allowStale () { + return this[ALLOW_STALE] + } + + set maxAge (mA) { + if (typeof mA !== 'number') + throw new TypeError('maxAge must be a non-negative number') + + this[MAX_AGE] = mA + trim(this) + } + get maxAge () { + return this[MAX_AGE] + } + + // resize the cache when the lengthCalculator changes. + set lengthCalculator (lC) { + if (typeof lC !== 'function') + lC = naiveLength + + if (lC !== this[LENGTH_CALCULATOR]) { + this[LENGTH_CALCULATOR] = lC + this[LENGTH] = 0 + this[LRU_LIST].forEach(hit => { + hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key) + this[LENGTH] += hit.length + }) + } + trim(this) + } + get lengthCalculator () { return this[LENGTH_CALCULATOR] } + + get length () { return this[LENGTH] } + get itemCount () { return this[LRU_LIST].length } + + rforEach (fn, thisp) { + thisp = thisp || this + for (let walker = this[LRU_LIST].tail; walker !== null;) { + const prev = walker.prev + forEachStep(this, fn, walker, thisp) + walker = prev + } + } + + forEach (fn, thisp) { + thisp = thisp || this + for (let walker = this[LRU_LIST].head; walker !== null;) { + const next = walker.next + forEachStep(this, fn, walker, thisp) + walker = next + } + } + + keys () { + return this[LRU_LIST].toArray().map(k => k.key) + } + + values () { + return this[LRU_LIST].toArray().map(k => k.value) + } + + reset () { + if (this[DISPOSE] && + this[LRU_LIST] && + this[LRU_LIST].length) { + this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value)) + } + + this[CACHE] = new Map() // hash of items by key + this[LRU_LIST] = new Yallist() // list of items in order of use recency + this[LENGTH] = 0 // length of items in the list + } + + dump () { + return this[LRU_LIST].map(hit => + isStale(this, hit) ? false : { + k: hit.key, + v: hit.value, + e: hit.now + (hit.maxAge || 0) + }).toArray().filter(h => h) + } + + dumpLru () { + return this[LRU_LIST] + } + + set (key, value, maxAge) { + maxAge = maxAge || this[MAX_AGE] + + if (maxAge && typeof maxAge !== 'number') + throw new TypeError('maxAge must be a number') + + const now = maxAge ? Date.now() : 0 + const len = this[LENGTH_CALCULATOR](value, key) + + if (this[CACHE].has(key)) { + if (len > this[MAX]) { + del(this, this[CACHE].get(key)) + return false + } + + const node = this[CACHE].get(key) + const item = node.value + + // dispose of the old one before overwriting + // split out into 2 ifs for better coverage tracking + if (this[DISPOSE]) { + if (!this[NO_DISPOSE_ON_SET]) + this[DISPOSE](key, item.value) + } + + item.now = now + item.maxAge = maxAge + item.value = value + this[LENGTH] += len - item.length + item.length = len + this.get(key) + trim(this) + return true + } + + const hit = new Entry(key, value, len, now, maxAge) + + // oversized objects fall out of cache automatically. + if (hit.length > this[MAX]) { + if (this[DISPOSE]) + this[DISPOSE](key, value) + + return false + } + + this[LENGTH] += hit.length + this[LRU_LIST].unshift(hit) + this[CACHE].set(key, this[LRU_LIST].head) + trim(this) + return true + } + + has (key) { + if (!this[CACHE].has(key)) return false + const hit = this[CACHE].get(key).value + return !isStale(this, hit) + } + + get (key) { + return get(this, key, true) + } + + peek (key) { + return get(this, key, false) + } + + pop () { + const node = this[LRU_LIST].tail + if (!node) + return null + + del(this, node) + return node.value + } + + del (key) { + del(this, this[CACHE].get(key)) + } + + load (arr) { + // reset the cache + this.reset() + + const now = Date.now() + // A previous serialized cache has the most recent items first + for (let l = arr.length - 1; l >= 0; l--) { + const hit = arr[l] + const expiresAt = hit.e || 0 + if (expiresAt === 0) + // the item was created without expiration in a non aged cache + this.set(hit.k, hit.v) + else { + const maxAge = expiresAt - now + // dont add already expired items + if (maxAge > 0) { + this.set(hit.k, hit.v, maxAge) + } + } + } + } + + prune () { + this[CACHE].forEach((value, key) => get(this, key, false)) + } +} + +const get = (self, key, doUse) => { + const node = self[CACHE].get(key) + if (node) { + const hit = node.value + if (isStale(self, hit)) { + del(self, node) + if (!self[ALLOW_STALE]) + return undefined + } else { + if (doUse) { + if (self[UPDATE_AGE_ON_GET]) + node.value.now = Date.now() + self[LRU_LIST].unshiftNode(node) + } + } + return hit.value + } +} + +const isStale = (self, hit) => { + if (!hit || (!hit.maxAge && !self[MAX_AGE])) + return false + + const diff = Date.now() - hit.now + return hit.maxAge ? diff > hit.maxAge + : self[MAX_AGE] && (diff > self[MAX_AGE]) +} + +const trim = self => { + if (self[LENGTH] > self[MAX]) { + for (let walker = self[LRU_LIST].tail; + self[LENGTH] > self[MAX] && walker !== null;) { + // We know that we're about to delete this one, and also + // what the next least recently used key will be, so just + // go ahead and set it now. + const prev = walker.prev + del(self, walker) + walker = prev + } + } +} + +const del = (self, node) => { + if (node) { + const hit = node.value + if (self[DISPOSE]) + self[DISPOSE](hit.key, hit.value) + + self[LENGTH] -= hit.length + self[CACHE].delete(hit.key) + self[LRU_LIST].removeNode(node) + } +} + +class Entry { + constructor (key, value, length, now, maxAge) { + this.key = key + this.value = value + this.length = length + this.now = now + this.maxAge = maxAge || 0 + } +} + +const forEachStep = (self, fn, node, thisp) => { + let hit = node.value + if (isStale(self, hit)) { + del(self, node) + if (!self[ALLOW_STALE]) + hit = undefined + } + if (hit) + fn.call(thisp, hit.value, hit.key, self) +} + +module.exports = LRUCache diff --git a/node_modules/cacache/node_modules/lru-cache/package.json b/node_modules/cacache/node_modules/lru-cache/package.json new file mode 100644 index 0000000000000..1d41a07afbda4 --- /dev/null +++ b/node_modules/cacache/node_modules/lru-cache/package.json @@ -0,0 +1,67 @@ +{ + "_from": "lru-cache@^5.1.1", + "_id": "lru-cache@5.1.1", + "_inBundle": false, + "_integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "_location": "/cacache/lru-cache", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "lru-cache@^5.1.1", + "name": "lru-cache", + "escapedName": "lru-cache", + "rawSpec": "^5.1.1", + "saveSpec": null, + "fetchSpec": "^5.1.1" + }, + "_requiredBy": [ + "/cacache" + ], + "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "_shasum": "1da27e6710271947695daf6848e847f01d84b920", + "_spec": "lru-cache@^5.1.1", + "_where": "/Users/aeschright/code/cli/node_modules/cacache", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me" + }, + "bugs": { + "url": "https://github.com/isaacs/node-lru-cache/issues" + }, + "bundleDependencies": false, + "dependencies": { + "yallist": "^3.0.2" + }, + "deprecated": false, + "description": "A cache object that deletes the least-recently-used items.", + "devDependencies": { + "benchmark": "^2.1.4", + "tap": "^12.1.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/isaacs/node-lru-cache#readme", + "keywords": [ + "mru", + "lru", + "cache" + ], + "license": "ISC", + "main": "index.js", + "name": "lru-cache", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-lru-cache.git" + }, + "scripts": { + "coveragerport": "tap --coverage-report=html", + "postpublish": "git push origin --all; git push origin --tags", + "postversion": "npm publish", + "preversion": "npm test", + "snap": "TAP_SNAPSHOT=1 tap test/*.js -J", + "test": "tap test/*.js --100 -J" + }, + "version": "5.1.1" +} diff --git a/node_modules/cacache/node_modules/unique-filename/LICENSE b/node_modules/cacache/node_modules/unique-filename/LICENSE new file mode 100644 index 0000000000000..69619c125ea7e --- /dev/null +++ b/node_modules/cacache/node_modules/unique-filename/LICENSE @@ -0,0 +1,5 @@ +Copyright npm, Inc + +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/node_modules/cacache/node_modules/unique-filename/README.md b/node_modules/cacache/node_modules/unique-filename/README.md new file mode 100644 index 0000000000000..74b62b2ab4426 --- /dev/null +++ b/node_modules/cacache/node_modules/unique-filename/README.md @@ -0,0 +1,33 @@ +unique-filename +=============== + +Generate a unique filename for use in temporary directories or caches. + +``` +var uniqueFilename = require('unique-filename') + +// returns something like: /tmp/912ec803b2ce49e4a541068d495ab570 +var randomTmpfile = uniqueFilename(os.tmpdir()) + +// returns something like: /tmp/my-test-912ec803b2ce49e4a541068d495ab570 +var randomPrefixedTmpfile = uniqueFilename(os.tmpdir(), 'my-test') + +var uniqueTmpfile = uniqueFilename('/tmp', 'testing', '/my/thing/to/uniq/on') +``` + +### uniqueFilename(*dir*, *fileprefix*, *uniqstr*) → String + +Returns the full path of a unique filename that looks like: +`dir/prefix-7ddd44c0` +or `dir/7ddd44c0` + +*dir* – The path you want the filename in. `os.tmpdir()` is a good choice for this. + +*fileprefix* – A string to append prior to the unique part of the filename. +The parameter is required if *uniqstr* is also passed in but is otherwise +optional and can be `undefined`/`null`/`''`. If present and not empty +then this string plus a hyphen are prepended to the unique part. + +*uniqstr* – Optional, if not passed the unique part of the resulting +filename will be random. If passed in it will be generated from this string +in a reproducable way. diff --git a/node_modules/cacache/node_modules/unique-filename/coverage/__root__/index.html b/node_modules/cacache/node_modules/unique-filename/coverage/__root__/index.html new file mode 100644 index 0000000000000..cd55391a67a4c --- /dev/null +++ b/node_modules/cacache/node_modules/unique-filename/coverage/__root__/index.html @@ -0,0 +1,73 @@ + + + + Code coverage report for __root__/ + + + + + + +
+

Code coverage report for __root__/

+

+ Statements: 100% (4 / 4)      + Branches: 100% (2 / 2)      + Functions: 100% (1 / 1)      + Lines: 100% (4 / 4)      + Ignored: none      +

+
All files » __root__/
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.js100%(4 / 4)100%(2 / 2)100%(1 / 1)100%(4 / 4)
+
+
+ + + + + + diff --git a/node_modules/cacache/node_modules/unique-filename/coverage/__root__/index.js.html b/node_modules/cacache/node_modules/unique-filename/coverage/__root__/index.js.html new file mode 100644 index 0000000000000..02e5768d3fb64 --- /dev/null +++ b/node_modules/cacache/node_modules/unique-filename/coverage/__root__/index.js.html @@ -0,0 +1,69 @@ + + + + Code coverage report for index.js + + + + + + +
+

Code coverage report for index.js

+

+ Statements: 100% (4 / 4)      + Branches: 100% (2 / 2)      + Functions: 100% (1 / 1)      + Lines: 100% (4 / 4)      + Ignored: none      +

+
All files » __root__/ » index.js
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9  +1 +  +1 +  +1 +6 +  + 
'use strict'
+var path = require('path')
+ 
+var uniqueSlug = require('unique-slug')
+ 
+module.exports = function (filepath, prefix, uniq) {
+  return path.join(filepath, (prefix ? prefix + '-' : '') + uniqueSlug(uniq))
+}
+ 
+ +
+ + + + + + diff --git a/node_modules/cacache/node_modules/unique-filename/coverage/base.css b/node_modules/cacache/node_modules/unique-filename/coverage/base.css new file mode 100644 index 0000000000000..a6a2f3284d022 --- /dev/null +++ b/node_modules/cacache/node_modules/unique-filename/coverage/base.css @@ -0,0 +1,182 @@ +body, html { + margin:0; padding: 0; +} +body { + font-family: Helvetica Neue, Helvetica,Arial; + font-size: 10pt; +} +div.header, div.footer { + background: #eee; + padding: 1em; +} +div.header { + z-index: 100; + position: fixed; + top: 0; + border-bottom: 1px solid #666; + width: 100%; +} +div.footer { + border-top: 1px solid #666; +} +div.body { + margin-top: 10em; +} +div.meta { + font-size: 90%; + text-align: center; +} +h1, h2, h3 { + font-weight: normal; +} +h1 { + font-size: 12pt; +} +h2 { + font-size: 10pt; +} +pre { + font-family: Consolas, Menlo, Monaco, monospace; + margin: 0; + padding: 0; + line-height: 1.3; + font-size: 14px; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} + +div.path { font-size: 110%; } +div.path a:link, div.path a:visited { color: #000; } +table.coverage { border-collapse: collapse; margin:0; padding: 0 } + +table.coverage td { + margin: 0; + padding: 0; + color: #111; + vertical-align: top; +} +table.coverage td.line-count { + width: 50px; + text-align: right; + padding-right: 5px; +} +table.coverage td.line-coverage { + color: #777 !important; + text-align: right; + border-left: 1px solid #666; + border-right: 1px solid #666; +} + +table.coverage td.text { +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 40px; +} +table.coverage td span.cline-neutral { + background: #eee; +} +table.coverage td span.cline-yes { + background: #b5d592; + color: #999; +} +table.coverage td span.cline-no { + background: #fc8c84; +} + +.cstat-yes { color: #111; } +.cstat-no { background: #fc8c84; color: #111; } +.fstat-no { background: #ffc520; color: #111 !important; } +.cbranch-no { background: yellow !important; color: #111; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +.missing-if-branch { + display: inline-block; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: black; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} + +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} + +.entity, .metric { font-weight: bold; } +.metric { display: inline-block; border: 1px solid #333; padding: 0.3em; background: white; } +.metric small { font-size: 80%; font-weight: normal; color: #666; } + +div.coverage-summary table { border-collapse: collapse; margin: 3em; font-size: 110%; } +div.coverage-summary td, div.coverage-summary table th { margin: 0; padding: 0.25em 1em; border-top: 1px solid #666; border-bottom: 1px solid #666; } +div.coverage-summary th { text-align: left; border: 1px solid #666; background: #eee; font-weight: normal; } +div.coverage-summary th.file { border-right: none !important; } +div.coverage-summary th.pic { border-left: none !important; text-align: right; } +div.coverage-summary th.pct { border-right: none !important; } +div.coverage-summary th.abs { border-left: none !important; text-align: right; } +div.coverage-summary td.pct { text-align: right; border-left: 1px solid #666; } +div.coverage-summary td.abs { text-align: right; font-size: 90%; color: #444; border-right: 1px solid #666; } +div.coverage-summary td.file { border-left: 1px solid #666; white-space: nowrap; } +div.coverage-summary td.pic { min-width: 120px !important; } +div.coverage-summary a:link { text-decoration: none; color: #000; } +div.coverage-summary a:visited { text-decoration: none; color: #777; } +div.coverage-summary a:hover { text-decoration: underline; } +div.coverage-summary tfoot td { border-top: 1px solid #666; } + +div.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +div.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +div.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} + +.high { background: #b5d592 !important; } +.medium { background: #ffe87c !important; } +.low { background: #fc8c84 !important; } + +span.cover-fill, span.cover-empty { + display:inline-block; + border:1px solid #444; + background: white; + height: 12px; +} +span.cover-fill { + background: #ccc; + border-right: 1px solid #444; +} +span.cover-empty { + background: white; + border-left: none; +} +span.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } diff --git a/node_modules/cacache/node_modules/unique-filename/coverage/index.html b/node_modules/cacache/node_modules/unique-filename/coverage/index.html new file mode 100644 index 0000000000000..b10d186cc3978 --- /dev/null +++ b/node_modules/cacache/node_modules/unique-filename/coverage/index.html @@ -0,0 +1,73 @@ + + + + Code coverage report for All files + + + + + + +
+

Code coverage report for All files

+

+ Statements: 100% (4 / 4)      + Branches: 100% (2 / 2)      + Functions: 100% (1 / 1)      + Lines: 100% (4 / 4)      + Ignored: none      +

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
__root__/100%(4 / 4)100%(2 / 2)100%(1 / 1)100%(4 / 4)
+
+
+ + + + + + diff --git a/node_modules/cacache/node_modules/unique-filename/coverage/prettify.css b/node_modules/cacache/node_modules/unique-filename/coverage/prettify.css new file mode 100644 index 0000000000000..b317a7cda31a4 --- /dev/null +++ b/node_modules/cacache/node_modules/unique-filename/coverage/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/node_modules/cacache/node_modules/unique-filename/coverage/prettify.js b/node_modules/cacache/node_modules/unique-filename/coverage/prettify.js new file mode 100644 index 0000000000000..ef51e03866898 --- /dev/null +++ b/node_modules/cacache/node_modules/unique-filename/coverage/prettify.js @@ -0,0 +1 @@ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/node_modules/cacache/node_modules/unique-filename/coverage/sort-arrow-sprite.png b/node_modules/cacache/node_modules/unique-filename/coverage/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..03f704a609c6fd0dbfdac63466a7d7c958b5cbf3 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jii$m5978H@?Fn+^JD|Y9yzj{W`447Gxa{7*dM7nnnD-Lb z6^}Hx2)'; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function (a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function (a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function () { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i =0 ; i < cols.length; i += 1) { + if (cols[i].sortable) { + el = getNthColumn(i).querySelector('.sorter'); + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function () { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(cols); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/node_modules/cacache/node_modules/unique-filename/index.js b/node_modules/cacache/node_modules/unique-filename/index.js new file mode 100644 index 0000000000000..02bf1e273143c --- /dev/null +++ b/node_modules/cacache/node_modules/unique-filename/index.js @@ -0,0 +1,8 @@ +'use strict' +var path = require('path') + +var uniqueSlug = require('unique-slug') + +module.exports = function (filepath, prefix, uniq) { + return path.join(filepath, (prefix ? prefix + '-' : '') + uniqueSlug(uniq)) +} diff --git a/node_modules/cacache/node_modules/unique-filename/package.json b/node_modules/cacache/node_modules/unique-filename/package.json new file mode 100644 index 0000000000000..7f245898c08ab --- /dev/null +++ b/node_modules/cacache/node_modules/unique-filename/package.json @@ -0,0 +1,56 @@ +{ + "_from": "unique-filename@^1.1.1", + "_id": "unique-filename@1.1.1", + "_inBundle": false, + "_integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "_location": "/cacache/unique-filename", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "unique-filename@^1.1.1", + "name": "unique-filename", + "escapedName": "unique-filename", + "rawSpec": "^1.1.1", + "saveSpec": null, + "fetchSpec": "^1.1.1" + }, + "_requiredBy": [ + "/cacache" + ], + "_resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "_shasum": "1d69769369ada0583103a1e6ae87681b56573230", + "_spec": "unique-filename@^1.1.1", + "_where": "/Users/aeschright/code/cli/node_modules/cacache", + "author": { + "name": "Rebecca Turner", + "email": "me@re-becca.org", + "url": "http://re-becca.org/" + }, + "bugs": { + "url": "https://github.com/iarna/unique-filename/issues" + }, + "bundleDependencies": false, + "dependencies": { + "unique-slug": "^2.0.0" + }, + "deprecated": false, + "description": "Generate a unique filename for use in temporary directories or caches.", + "devDependencies": { + "standard": "^5.4.1", + "tap": "^2.3.1" + }, + "homepage": "https://github.com/iarna/unique-filename", + "keywords": [], + "license": "ISC", + "main": "index.js", + "name": "unique-filename", + "repository": { + "type": "git", + "url": "git+https://github.com/iarna/unique-filename.git" + }, + "scripts": { + "test": "standard && tap test" + }, + "version": "1.1.1" +} diff --git a/node_modules/cacache/node_modules/unique-filename/test/index.js b/node_modules/cacache/node_modules/unique-filename/test/index.js new file mode 100644 index 0000000000000..105b4e52e8b40 --- /dev/null +++ b/node_modules/cacache/node_modules/unique-filename/test/index.js @@ -0,0 +1,23 @@ +'sue strict' +var t = require('tap') +var uniqueFilename = require('../index.js') + +t.plan(6) + +var randomTmpfile = uniqueFilename('tmp') +t.like(randomTmpfile, /^tmp.[a-f0-9]{8}$/, 'random tmp file') + +var randomAgain = uniqueFilename('tmp') +t.notEqual(randomAgain, randomTmpfile, 'random tmp files are not the same') + +var randomPrefixedTmpfile = uniqueFilename('tmp', 'my-test') +t.like(randomPrefixedTmpfile, /^tmp.my-test-[a-f0-9]{8}$/, 'random prefixed tmp file') + +var randomPrefixedAgain = uniqueFilename('tmp', 'my-test') +t.notEqual(randomPrefixedAgain, randomPrefixedTmpfile, 'random prefixed tmp files are not the same') + +var uniqueTmpfile = uniqueFilename('tmp', 'testing', '/my/thing/to/uniq/on') +t.like(uniqueTmpfile, /^tmp.testing-7ddd44c0$/, 'unique filename') + +var uniqueAgain = uniqueFilename('tmp', 'testing', '/my/thing/to/uniq/on') +t.is(uniqueTmpfile, uniqueAgain, 'same unique string component produces same filename') diff --git a/node_modules/cacache/node_modules/yallist/LICENSE b/node_modules/cacache/node_modules/yallist/LICENSE new file mode 100644 index 0000000000000..19129e315fe59 --- /dev/null +++ b/node_modules/cacache/node_modules/yallist/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/node_modules/cacache/node_modules/yallist/README.md b/node_modules/cacache/node_modules/yallist/README.md new file mode 100644 index 0000000000000..f586101869668 --- /dev/null +++ b/node_modules/cacache/node_modules/yallist/README.md @@ -0,0 +1,204 @@ +# yallist + +Yet Another Linked List + +There are many doubly-linked list implementations like it, but this +one is mine. + +For when an array would be too big, and a Map can't be iterated in +reverse order. + + +[![Build Status](https://travis-ci.org/isaacs/yallist.svg?branch=master)](https://travis-ci.org/isaacs/yallist) [![Coverage Status](https://coveralls.io/repos/isaacs/yallist/badge.svg?service=github)](https://coveralls.io/github/isaacs/yallist) + +## basic usage + +```javascript +var yallist = require('yallist') +var myList = yallist.create([1, 2, 3]) +myList.push('foo') +myList.unshift('bar') +// of course pop() and shift() are there, too +console.log(myList.toArray()) // ['bar', 1, 2, 3, 'foo'] +myList.forEach(function (k) { + // walk the list head to tail +}) +myList.forEachReverse(function (k, index, list) { + // walk the list tail to head +}) +var myDoubledList = myList.map(function (k) { + return k + k +}) +// now myDoubledList contains ['barbar', 2, 4, 6, 'foofoo'] +// mapReverse is also a thing +var myDoubledListReverse = myList.mapReverse(function (k) { + return k + k +}) // ['foofoo', 6, 4, 2, 'barbar'] + +var reduced = myList.reduce(function (set, entry) { + set += entry + return set +}, 'start') +console.log(reduced) // 'startfoo123bar' +``` + +## api + +The whole API is considered "public". + +Functions with the same name as an Array method work more or less the +same way. + +There's reverse versions of most things because that's the point. + +### Yallist + +Default export, the class that holds and manages a list. + +Call it with either a forEach-able (like an array) or a set of +arguments, to initialize the list. + +The Array-ish methods all act like you'd expect. No magic length, +though, so if you change that it won't automatically prune or add +empty spots. + +### Yallist.create(..) + +Alias for Yallist function. Some people like factories. + +#### yallist.head + +The first node in the list + +#### yallist.tail + +The last node in the list + +#### yallist.length + +The number of nodes in the list. (Change this at your peril. It is +not magic like Array length.) + +#### yallist.toArray() + +Convert the list to an array. + +#### yallist.forEach(fn, [thisp]) + +Call a function on each item in the list. + +#### yallist.forEachReverse(fn, [thisp]) + +Call a function on each item in the list, in reverse order. + +#### yallist.get(n) + +Get the data at position `n` in the list. If you use this a lot, +probably better off just using an Array. + +#### yallist.getReverse(n) + +Get the data at position `n`, counting from the tail. + +#### yallist.map(fn, thisp) + +Create a new Yallist with the result of calling the function on each +item. + +#### yallist.mapReverse(fn, thisp) + +Same as `map`, but in reverse. + +#### yallist.pop() + +Get the data from the list tail, and remove the tail from the list. + +#### yallist.push(item, ...) + +Insert one or more items to the tail of the list. + +#### yallist.reduce(fn, initialValue) + +Like Array.reduce. + +#### yallist.reduceReverse + +Like Array.reduce, but in reverse. + +#### yallist.reverse + +Reverse the list in place. + +#### yallist.shift() + +Get the data from the list head, and remove the head from the list. + +#### yallist.slice([from], [to]) + +Just like Array.slice, but returns a new Yallist. + +#### yallist.sliceReverse([from], [to]) + +Just like yallist.slice, but the result is returned in reverse. + +#### yallist.toArray() + +Create an array representation of the list. + +#### yallist.toArrayReverse() + +Create a reversed array representation of the list. + +#### yallist.unshift(item, ...) + +Insert one or more items to the head of the list. + +#### yallist.unshiftNode(node) + +Move a Node object to the front of the list. (That is, pull it out of +wherever it lives, and make it the new head.) + +If the node belongs to a different list, then that list will remove it +first. + +#### yallist.pushNode(node) + +Move a Node object to the end of the list. (That is, pull it out of +wherever it lives, and make it the new tail.) + +If the node belongs to a list already, then that list will remove it +first. + +#### yallist.removeNode(node) + +Remove a node from the list, preserving referential integrity of head +and tail and other nodes. + +Will throw an error if you try to have a list remove a node that +doesn't belong to it. + +### Yallist.Node + +The class that holds the data and is actually the list. + +Call with `var n = new Node(value, previousNode, nextNode)` + +Note that if you do direct operations on Nodes themselves, it's very +easy to get into weird states where the list is broken. Be careful :) + +#### node.next + +The next node in the list. + +#### node.prev + +The previous node in the list. + +#### node.value + +The data the node contains. + +#### node.list + +The list to which this node belongs. (Null if it does not belong to +any list.) diff --git a/node_modules/cacache/node_modules/yallist/iterator.js b/node_modules/cacache/node_modules/yallist/iterator.js new file mode 100644 index 0000000000000..d41c97a19f984 --- /dev/null +++ b/node_modules/cacache/node_modules/yallist/iterator.js @@ -0,0 +1,8 @@ +'use strict' +module.exports = function (Yallist) { + Yallist.prototype[Symbol.iterator] = function* () { + for (let walker = this.head; walker; walker = walker.next) { + yield walker.value + } + } +} diff --git a/node_modules/cacache/node_modules/yallist/package.json b/node_modules/cacache/node_modules/yallist/package.json new file mode 100644 index 0000000000000..91ea442aa86f1 --- /dev/null +++ b/node_modules/cacache/node_modules/yallist/package.json @@ -0,0 +1,62 @@ +{ + "_from": "yallist@^3.0.2", + "_id": "yallist@3.0.3", + "_inBundle": false, + "_integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "_location": "/cacache/yallist", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "yallist@^3.0.2", + "name": "yallist", + "escapedName": "yallist", + "rawSpec": "^3.0.2", + "saveSpec": null, + "fetchSpec": "^3.0.2" + }, + "_requiredBy": [ + "/cacache/lru-cache" + ], + "_resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "_shasum": "b4b049e314be545e3ce802236d6cd22cd91c3de9", + "_spec": "yallist@^3.0.2", + "_where": "/Users/aeschright/code/cli/node_modules/cacache/node_modules/lru-cache", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/isaacs/yallist/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "Yet Another Linked List", + "devDependencies": { + "tap": "^12.1.0" + }, + "directories": { + "test": "test" + }, + "files": [ + "yallist.js", + "iterator.js" + ], + "homepage": "https://github.com/isaacs/yallist#readme", + "license": "ISC", + "main": "yallist.js", + "name": "yallist", + "repository": { + "type": "git", + "url": "git+https://github.com/isaacs/yallist.git" + }, + "scripts": { + "postpublish": "git push origin --all; git push origin --tags", + "postversion": "npm publish", + "preversion": "npm test", + "test": "tap test/*.js --100" + }, + "version": "3.0.3" +} diff --git a/node_modules/cacache/node_modules/yallist/yallist.js b/node_modules/cacache/node_modules/yallist/yallist.js new file mode 100644 index 0000000000000..b0ab36cf31b7a --- /dev/null +++ b/node_modules/cacache/node_modules/yallist/yallist.js @@ -0,0 +1,376 @@ +'use strict' +module.exports = Yallist + +Yallist.Node = Node +Yallist.create = Yallist + +function Yallist (list) { + var self = this + if (!(self instanceof Yallist)) { + self = new Yallist() + } + + self.tail = null + self.head = null + self.length = 0 + + if (list && typeof list.forEach === 'function') { + list.forEach(function (item) { + self.push(item) + }) + } else if (arguments.length > 0) { + for (var i = 0, l = arguments.length; i < l; i++) { + self.push(arguments[i]) + } + } + + return self +} + +Yallist.prototype.removeNode = function (node) { + if (node.list !== this) { + throw new Error('removing node which does not belong to this list') + } + + var next = node.next + var prev = node.prev + + if (next) { + next.prev = prev + } + + if (prev) { + prev.next = next + } + + if (node === this.head) { + this.head = next + } + if (node === this.tail) { + this.tail = prev + } + + node.list.length-- + node.next = null + node.prev = null + node.list = null +} + +Yallist.prototype.unshiftNode = function (node) { + if (node === this.head) { + return + } + + if (node.list) { + node.list.removeNode(node) + } + + var head = this.head + node.list = this + node.next = head + if (head) { + head.prev = node + } + + this.head = node + if (!this.tail) { + this.tail = node + } + this.length++ +} + +Yallist.prototype.pushNode = function (node) { + if (node === this.tail) { + return + } + + if (node.list) { + node.list.removeNode(node) + } + + var tail = this.tail + node.list = this + node.prev = tail + if (tail) { + tail.next = node + } + + this.tail = node + if (!this.head) { + this.head = node + } + this.length++ +} + +Yallist.prototype.push = function () { + for (var i = 0, l = arguments.length; i < l; i++) { + push(this, arguments[i]) + } + return this.length +} + +Yallist.prototype.unshift = function () { + for (var i = 0, l = arguments.length; i < l; i++) { + unshift(this, arguments[i]) + } + return this.length +} + +Yallist.prototype.pop = function () { + if (!this.tail) { + return undefined + } + + var res = this.tail.value + this.tail = this.tail.prev + if (this.tail) { + this.tail.next = null + } else { + this.head = null + } + this.length-- + return res +} + +Yallist.prototype.shift = function () { + if (!this.head) { + return undefined + } + + var res = this.head.value + this.head = this.head.next + if (this.head) { + this.head.prev = null + } else { + this.tail = null + } + this.length-- + return res +} + +Yallist.prototype.forEach = function (fn, thisp) { + thisp = thisp || this + for (var walker = this.head, i = 0; walker !== null; i++) { + fn.call(thisp, walker.value, i, this) + walker = walker.next + } +} + +Yallist.prototype.forEachReverse = function (fn, thisp) { + thisp = thisp || this + for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { + fn.call(thisp, walker.value, i, this) + walker = walker.prev + } +} + +Yallist.prototype.get = function (n) { + for (var i = 0, walker = this.head; walker !== null && i < n; i++) { + // abort out of the list early if we hit a cycle + walker = walker.next + } + if (i === n && walker !== null) { + return walker.value + } +} + +Yallist.prototype.getReverse = function (n) { + for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { + // abort out of the list early if we hit a cycle + walker = walker.prev + } + if (i === n && walker !== null) { + return walker.value + } +} + +Yallist.prototype.map = function (fn, thisp) { + thisp = thisp || this + var res = new Yallist() + for (var walker = this.head; walker !== null;) { + res.push(fn.call(thisp, walker.value, this)) + walker = walker.next + } + return res +} + +Yallist.prototype.mapReverse = function (fn, thisp) { + thisp = thisp || this + var res = new Yallist() + for (var walker = this.tail; walker !== null;) { + res.push(fn.call(thisp, walker.value, this)) + walker = walker.prev + } + return res +} + +Yallist.prototype.reduce = function (fn, initial) { + var acc + var walker = this.head + if (arguments.length > 1) { + acc = initial + } else if (this.head) { + walker = this.head.next + acc = this.head.value + } else { + throw new TypeError('Reduce of empty list with no initial value') + } + + for (var i = 0; walker !== null; i++) { + acc = fn(acc, walker.value, i) + walker = walker.next + } + + return acc +} + +Yallist.prototype.reduceReverse = function (fn, initial) { + var acc + var walker = this.tail + if (arguments.length > 1) { + acc = initial + } else if (this.tail) { + walker = this.tail.prev + acc = this.tail.value + } else { + throw new TypeError('Reduce of empty list with no initial value') + } + + for (var i = this.length - 1; walker !== null; i--) { + acc = fn(acc, walker.value, i) + walker = walker.prev + } + + return acc +} + +Yallist.prototype.toArray = function () { + var arr = new Array(this.length) + for (var i = 0, walker = this.head; walker !== null; i++) { + arr[i] = walker.value + walker = walker.next + } + return arr +} + +Yallist.prototype.toArrayReverse = function () { + var arr = new Array(this.length) + for (var i = 0, walker = this.tail; walker !== null; i++) { + arr[i] = walker.value + walker = walker.prev + } + return arr +} + +Yallist.prototype.slice = function (from, to) { + to = to || this.length + if (to < 0) { + to += this.length + } + from = from || 0 + if (from < 0) { + from += this.length + } + var ret = new Yallist() + if (to < from || to < 0) { + return ret + } + if (from < 0) { + from = 0 + } + if (to > this.length) { + to = this.length + } + for (var i = 0, walker = this.head; walker !== null && i < from; i++) { + walker = walker.next + } + for (; walker !== null && i < to; i++, walker = walker.next) { + ret.push(walker.value) + } + return ret +} + +Yallist.prototype.sliceReverse = function (from, to) { + to = to || this.length + if (to < 0) { + to += this.length + } + from = from || 0 + if (from < 0) { + from += this.length + } + var ret = new Yallist() + if (to < from || to < 0) { + return ret + } + if (from < 0) { + from = 0 + } + if (to > this.length) { + to = this.length + } + for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { + walker = walker.prev + } + for (; walker !== null && i > from; i--, walker = walker.prev) { + ret.push(walker.value) + } + return ret +} + +Yallist.prototype.reverse = function () { + var head = this.head + var tail = this.tail + for (var walker = head; walker !== null; walker = walker.prev) { + var p = walker.prev + walker.prev = walker.next + walker.next = p + } + this.head = tail + this.tail = head + return this +} + +function push (self, item) { + self.tail = new Node(item, self.tail, null, self) + if (!self.head) { + self.head = self.tail + } + self.length++ +} + +function unshift (self, item) { + self.head = new Node(item, null, self.head, self) + if (!self.tail) { + self.tail = self.head + } + self.length++ +} + +function Node (value, prev, next, list) { + if (!(this instanceof Node)) { + return new Node(value, prev, next, list) + } + + this.list = list + this.value = value + + if (prev) { + prev.next = this + this.prev = prev + } else { + this.prev = null + } + + if (next) { + next.prev = this + this.next = next + } else { + this.next = null + } +} + +try { + // add if support for Symbol.iterator is present + require('./iterator.js')(Yallist) +} catch (er) {} diff --git a/node_modules/cacache/package.json b/node_modules/cacache/package.json index bf13242f80eb5..7b45446dc710b 100644 --- a/node_modules/cacache/package.json +++ b/node_modules/cacache/package.json @@ -1,19 +1,21 @@ { - "_from": "cacache@11.2.0", - "_id": "cacache@11.2.0", + "_from": "cacache@11.3.2", + "_id": "cacache@11.3.2", "_inBundle": false, - "_integrity": "sha512-IFWl6lfK6wSeYCHUXh+N1lY72UDrpyrYQJNIVQf48paDuWbv5RbAtJYf/4gUQFObTCHZwdZ5sI8Iw7nqwP6nlQ==", + "_integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", "_location": "/cacache", - "_phantomChildren": {}, + "_phantomChildren": { + "unique-slug": "2.0.0" + }, "_requested": { "type": "version", "registry": true, - "raw": "cacache@11.2.0", + "raw": "cacache@11.3.2", "name": "cacache", "escapedName": "cacache", - "rawSpec": "11.2.0", + "rawSpec": "11.3.2", "saveSpec": null, - "fetchSpec": "11.2.0" + "fetchSpec": "11.3.2" }, "_requiredBy": [ "#USER", @@ -21,10 +23,10 @@ "/make-fetch-happen", "/pacote" ], - "_resolved": "https://registry.npmjs.org/cacache/-/cacache-11.2.0.tgz", - "_shasum": "617bdc0b02844af56310e411c0878941d5739965", - "_spec": "cacache@11.2.0", - "_where": "/Users/zkat/Documents/code/work/npm", + "_resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "_shasum": "2d81e308e3d258ca38125b676b98b2ac9ce69bfa", + "_spec": "cacache@11.3.2", + "_where": "/Users/aeschright/code/cli", "author": { "name": "Kat Marchán", "email": "kzm@sykosomatic.org" @@ -56,19 +58,19 @@ } ], "dependencies": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "figgy-pudding": "^3.1.0", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.3", + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", "rimraf": "^2.6.2", - "ssri": "^6.0.0", - "unique-filename": "^1.1.0", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", "y18n": "^4.0.0" }, "deprecated": false, @@ -81,7 +83,7 @@ "standard": "^11.0.1", "standard-version": "^4.4.0", "tacks": "^1.2.7", - "tap": "^12.0.1", + "tap": "^12.1.1", "weallbehave": "^1.2.0", "weallcontribute": "^1.0.8" }, @@ -124,5 +126,5 @@ "update-coc": "weallbehave -o . && git add CODE_OF_CONDUCT.md && git commit -m 'docs(coc): updated CODE_OF_CONDUCT.md'", "update-contrib": "weallcontribute -o . && git add CONTRIBUTING.md && git commit -m 'docs(contributing): updated CONTRIBUTING.md'" }, - "version": "11.2.0" + "version": "11.3.2" } diff --git a/package-lock.json b/package-lock.json index 314384136ff26..2c990367d23fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -379,24 +379,52 @@ "integrity": "sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==" }, "cacache": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.2.0.tgz", - "integrity": "sha512-IFWl6lfK6wSeYCHUXh+N1lY72UDrpyrYQJNIVQf48paDuWbv5RbAtJYf/4gUQFObTCHZwdZ5sI8Iw7nqwP6nlQ==", + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "figgy-pudding": "^3.1.0", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.3", + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", "rimraf": "^2.6.2", - "ssri": "^6.0.0", - "unique-filename": "^1.1.0", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", "y18n": "^4.0.0" + }, + "dependencies": { + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + } } }, "call-limit": { diff --git a/package.json b/package.json index cbfc405f1f517..d47eaa2ecea99 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "bin-links": "^1.1.2", "bluebird": "^3.5.3", "byte-size": "^5.0.1", - "cacache": "^11.2.0", + "cacache": "^11.3.2", "call-limit": "~1.1.0", "chownr": "~1.0.1", "ci-info": "^1.6.0", From 9d4776836a4eaa4b19701b4e4f00cd64578bf078 Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Mon, 7 Jan 2019 17:41:49 -0800 Subject: [PATCH 69/97] chownr@1.1.1 --- node_modules/chownr/chownr.js | 112 ++++++++++++++++++++----------- node_modules/chownr/package.json | 43 ++++++------ package-lock.json | 6 +- package.json | 2 +- 4 files changed, 98 insertions(+), 65 deletions(-) diff --git a/node_modules/chownr/chownr.js b/node_modules/chownr/chownr.js index ecd7b452df57d..7e63928827e2c 100644 --- a/node_modules/chownr/chownr.js +++ b/node_modules/chownr/chownr.js @@ -1,52 +1,88 @@ -module.exports = chownr -chownr.sync = chownrSync +'use strict' +const fs = require('fs') +const path = require('path') + +/* istanbul ignore next */ +const LCHOWN = fs.lchown ? 'lchown' : 'chown' +/* istanbul ignore next */ +const LCHOWNSYNC = fs.lchownSync ? 'lchownSync' : 'chownSync' + +// fs.readdir could only accept an options object as of node v6 +const nodeVersion = process.version +let readdir = (path, options, cb) => fs.readdir(path, options, cb) +let readdirSync = (path, options) => fs.readdirSync(path, options) +/* istanbul ignore next */ +if (/^v4\./.test(nodeVersion)) + readdir = (path, options, cb) => fs.readdir(path, cb) + +const chownrKid = (p, child, uid, gid, cb) => { + if (typeof child === 'string') + return fs.lstat(path.resolve(p, child), (er, stats) => { + if (er) + return cb(er) + stats.name = child + chownrKid(p, stats, uid, gid, cb) + }) -var fs = require("fs") -, path = require("path") - -function chownr (p, uid, gid, 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 fs.chown(p, uid, gid, cb) - - var len = children.length - , errState = null - children.forEach(function (child) { - var pathChild = path.resolve(p, child); - fs.lstat(pathChild, function(er, stats) { - if (er) - return cb(er) - if (!stats.isSymbolicLink()) - chownr(pathChild, uid, gid, then) - else - then() - }) + if (child.isDirectory()) { + chownr(path.resolve(p, child.name), uid, gid, er => { + if (er) + return cb(er) + fs[LCHOWN](path.resolve(p, child.name), uid, gid, cb) }) - function then (er) { + } else + fs[LCHOWN](path.resolve(p, child.name), uid, gid, cb) +} + + +const chownr = (p, uid, gid, cb) => { + readdir(p, { withFileTypes: true }, (er, children) => { + // any error other than ENOTDIR or ENOTSUP means it's not readable, + // or doesn't exist. give up. + if (er && er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP') + return cb(er) + if (er || !children.length) return fs[LCHOWN](p, uid, gid, cb) + + let len = children.length + let errState = null + const then = er => { if (errState) return if (er) return cb(errState = er) - if (-- len === 0) return fs.chown(p, uid, gid, cb) + if (-- len === 0) return fs[LCHOWN](p, uid, gid, cb) } + + children.forEach(child => chownrKid(p, child, uid, gid, then)) }) } -function chownrSync (p, uid, gid) { - var children +const chownrKidSync = (p, child, uid, gid) => { + if (typeof child === 'string') { + const stats = fs.lstatSync(path.resolve(p, child)) + stats.name = child + child = stats + } + + if (child.isDirectory()) + chownrSync(path.resolve(p, child.name), uid, gid) + + fs[LCHOWNSYNC](path.resolve(p, child.name), uid, gid) +} + +const chownrSync = (p, uid, gid) => { + let children try { - children = fs.readdirSync(p) + children = readdirSync(p, { withFileTypes: true }) } catch (er) { - if (er && er.code === "ENOTDIR") return fs.chownSync(p, uid, gid) + if (er && er.code === 'ENOTDIR' && er.code !== 'ENOTSUP') + return fs[LCHOWNSYNC](p, uid, gid) throw er } - if (!children.length) return fs.chownSync(p, uid, gid) - children.forEach(function (child) { - var pathChild = path.resolve(p, child) - var stats = fs.lstatSync(pathChild) - if (!stats.isSymbolicLink()) - chownrSync(pathChild, uid, gid) - }) - return fs.chownSync(p, uid, gid) + if (children.length) + children.forEach(child => chownrKidSync(p, child, uid, gid)) + + return fs[LCHOWNSYNC](p, uid, gid) } + +module.exports = chownr +chownr.sync = chownrSync diff --git a/node_modules/chownr/package.json b/node_modules/chownr/package.json index f9a67c82435f9..0004fa0e1eb00 100644 --- a/node_modules/chownr/package.json +++ b/node_modules/chownr/package.json @@ -1,36 +1,28 @@ { - "_args": [ - [ - "chownr@1.0.1", - "/Users/rebecca/code/npm" - ] - ], - "_from": "chownr@1.0.1", - "_id": "chownr@1.0.1", + "_from": "chownr@1.1.1", + "_id": "chownr@1.1.1", "_inBundle": false, - "_integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "_integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "_location": "/chownr", "_phantomChildren": {}, "_requested": { "type": "version", "registry": true, - "raw": "chownr@1.0.1", + "raw": "chownr@1.1.1", "name": "chownr", "escapedName": "chownr", - "rawSpec": "1.0.1", + "rawSpec": "1.1.1", "saveSpec": null, - "fetchSpec": "1.0.1" + "fetchSpec": "1.1.1" }, "_requiredBy": [ - "/", - "/cacache", - "/npm-profile/cacache", - "/npm-registry-fetch/cacache", - "/tar" + "#USER", + "/" ], - "_resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "_spec": "1.0.1", - "_where": "/Users/rebecca/code/npm", + "_resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "_shasum": "54726b8b8fff4df053c42187e801fb4412df1494", + "_spec": "chownr@1.1.1", + "_where": "/Users/aeschright/code/cli", "author": { "name": "Isaac Z. Schlueter", "email": "i@izs.me", @@ -39,11 +31,13 @@ "bugs": { "url": "https://github.com/isaacs/chownr/issues" }, + "bundleDependencies": false, + "deprecated": false, "description": "like `chown -R`", "devDependencies": { "mkdirp": "0.3", "rimraf": "", - "tap": "^1.2.0" + "tap": "^12.0.1" }, "files": [ "chownr.js" @@ -57,7 +51,10 @@ "url": "git://github.com/isaacs/chownr.git" }, "scripts": { - "test": "tap test/*.js" + "postpublish": "git push origin --all; git push origin --tags", + "postversion": "npm publish", + "preversion": "npm test", + "test": "tap test/*.js --cov" }, - "version": "1.0.1" + "version": "1.1.1" } diff --git a/package-lock.json b/package-lock.json index 2c990367d23fd..1fc79c47461f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -485,9 +485,9 @@ "dev": true }, "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" }, "ci-info": { "version": "1.6.0", diff --git a/package.json b/package.json index d47eaa2ecea99..34aa3f849b362 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "byte-size": "^5.0.1", "cacache": "^11.3.2", "call-limit": "~1.1.0", - "chownr": "~1.0.1", + "chownr": "^1.1.1", "ci-info": "^1.6.0", "cli-columns": "^3.1.2", "cli-table3": "^0.5.0", From 70da139e97ed1660c216e2d9b3f9cfb986bfd4a4 Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Mon, 7 Jan 2019 17:42:16 -0800 Subject: [PATCH 70/97] ci-info@2.0.0 --- node_modules/ci-info/CHANGELOG.md | 16 ++ node_modules/ci-info/README.md | 73 ++++----- node_modules/ci-info/index.js | 2 +- node_modules/ci-info/package.json | 29 ++-- node_modules/ci-info/vendors.json | 27 ++-- .../is-ci/node_modules/ci-info/CHANGELOG.md | 62 +++++++ .../is-ci/node_modules/ci-info/LICENSE | 21 +++ .../is-ci/node_modules/ci-info/README.md | 107 ++++++++++++ .../is-ci/node_modules/ci-info/index.js | 66 ++++++++ .../is-ci/node_modules/ci-info/package.json | 65 ++++++++ .../is-ci/node_modules/ci-info/vendors.json | 152 ++++++++++++++++++ package-lock.json | 13 +- package.json | 2 +- 13 files changed, 566 insertions(+), 69 deletions(-) create mode 100644 node_modules/is-ci/node_modules/ci-info/CHANGELOG.md create mode 100644 node_modules/is-ci/node_modules/ci-info/LICENSE create mode 100644 node_modules/is-ci/node_modules/ci-info/README.md create mode 100644 node_modules/is-ci/node_modules/ci-info/index.js create mode 100644 node_modules/is-ci/node_modules/ci-info/package.json create mode 100644 node_modules/is-ci/node_modules/ci-info/vendors.json diff --git a/node_modules/ci-info/CHANGELOG.md b/node_modules/ci-info/CHANGELOG.md index 859a0ad12a53b..66b9cf0b28e48 100644 --- a/node_modules/ci-info/CHANGELOG.md +++ b/node_modules/ci-info/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## v2.0.0 + +Breaking changes: + +* Drop support for Node.js end-of-life versions: 0.10, 0.12, 4, 5, 7, + and 9 +* Team Foundation Server will now be detected as Azure Pipelines. The + constant `ci.TFS` no longer exists - use `ci.AZURE_PIPELINES` instead +* Remove deprecated `ci.TDDIUM` constant - use `ci.SOLANDO` instead + +New features: + +* feat: support Azure Pipelines ([#23](https://github.com/watson/ci-info/pull/23)) +* feat: support Netlify CI ([#26](https://github.com/watson/ci-info/pull/26)) +* feat: support Bitbucket pipelines PR detection ([#27](https://github.com/watson/ci-info/pull/27)) + ## v1.6.0 * feat: add Sail CI support diff --git a/node_modules/ci-info/README.md b/node_modules/ci-info/README.md index c88be8f82d5df..12c4f6217502c 100644 --- a/node_modules/ci-info/README.md +++ b/node_modules/ci-info/README.md @@ -32,41 +32,42 @@ if (ci.isCI) { Officially supported CI servers: -| Name | Constant | -|------|----------| -| [AWS CodeBuild](https://aws.amazon.com/codebuild/) | `ci.CODEBUILD` | -| [AppVeyor](http://www.appveyor.com) | `ci.APPVEYOR` | -| [Bamboo](https://www.atlassian.com/software/bamboo) by Atlassian | `ci.BAMBOO` | -| [Bitbucket Pipelines](https://bitbucket.org/product/features/pipelines) | `ci.BITBUCKET` | -| [Bitrise](https://www.bitrise.io/) | `ci.BITRISE` | -| [Buddy](https://buddy.works/) | `ci.BUDDY` | -| [Buildkite](https://buildkite.com) | `ci.BUILDKITE` | -| [CircleCI](http://circleci.com) | `ci.CIRCLE` | -| [Cirrus CI](https://cirrus-ci.org) | `ci.CIRRUS` | -| [Codeship](https://codeship.com) | `ci.CODESHIP` | -| [Drone](https://drone.io) | `ci.DRONE` | -| [dsari](https://github.com/rfinnie/dsari) | `ci.DSARI` | -| [GitLab CI](https://about.gitlab.com/gitlab-ci/) | `ci.GITLAB` | -| [GoCD](https://www.go.cd/) | `ci.GOCD` | -| [Hudson](http://hudson-ci.org) | `ci.HUDSON` | -| [Jenkins CI](https://jenkins-ci.org) | `ci.JENKINS` | -| [Magnum CI](https://magnum-ci.com) | `ci.MAGNUM` | -| [Sail CI](https://sail.ci/) | `ci.SAIL` | -| [Semaphore](https://semaphoreci.com) | `ci.SEMAPHORE` | -| [Shippable](https://www.shippable.com/) | `ci.SHIPPABLE` | -| [Solano CI](https://www.solanolabs.com/) | `ci.SOLANO` | -| [Strider CD](https://strider-cd.github.io/) | `ci.STRIDER` | -| [TaskCluster](http://docs.taskcluster.net) | `ci.TASKCLUSTER` | -| [Team Foundation Server](https://www.visualstudio.com/en-us/products/tfs-overview-vs.aspx) by Microsoft | `ci.TFS` | -| [TeamCity](https://www.jetbrains.com/teamcity/) by JetBrains | `ci.TEAMCITY` | -| [Travis CI](http://travis-ci.org) | `ci.TRAVIS` | +| Name | Constant | isPR | +|------|----------|------| +| [AWS CodeBuild](https://aws.amazon.com/codebuild/) | `ci.CODEBUILD` | 🚫 | +| [AppVeyor](http://www.appveyor.com) | `ci.APPVEYOR` | ✅ | +| [Azure Pipelines](https://azure.microsoft.com/en-us/services/devops/pipelines/) | `ci.AZURE_PIPELINES` | ✅ | +| [Bamboo](https://www.atlassian.com/software/bamboo) by Atlassian | `ci.BAMBOO` | 🚫 | +| [Bitbucket Pipelines](https://bitbucket.org/product/features/pipelines) | `ci.BITBUCKET` | ✅ | +| [Bitrise](https://www.bitrise.io/) | `ci.BITRISE` | ✅ | +| [Buddy](https://buddy.works/) | `ci.BUDDY` | ✅ | +| [Buildkite](https://buildkite.com) | `ci.BUILDKITE` | ✅ | +| [CircleCI](http://circleci.com) | `ci.CIRCLE` | ✅ | +| [Cirrus CI](https://cirrus-ci.org) | `ci.CIRRUS` | ✅ | +| [Codeship](https://codeship.com) | `ci.CODESHIP` | 🚫 | +| [Drone](https://drone.io) | `ci.DRONE` | ✅ | +| [dsari](https://github.com/rfinnie/dsari) | `ci.DSARI` | 🚫 | +| [GitLab CI](https://about.gitlab.com/gitlab-ci/) | `ci.GITLAB` | 🚫 | +| [GoCD](https://www.go.cd/) | `ci.GOCD` | 🚫 | +| [Hudson](http://hudson-ci.org) | `ci.HUDSON` | 🚫 | +| [Jenkins CI](https://jenkins-ci.org) | `ci.JENKINS` | ✅ | +| [Magnum CI](https://magnum-ci.com) | `ci.MAGNUM` | 🚫 | +| [Netlify CI](https://www.netlify.com/) | `ci.NETLIFY` | ✅ | +| [Sail CI](https://sail.ci/) | `ci.SAIL` | ✅ | +| [Semaphore](https://semaphoreci.com) | `ci.SEMAPHORE` | ✅ | +| [Shippable](https://www.shippable.com/) | `ci.SHIPPABLE` | ✅ | +| [Solano CI](https://www.solanolabs.com/) | `ci.SOLANO` | ✅ | +| [Strider CD](https://strider-cd.github.io/) | `ci.STRIDER` | 🚫 | +| [TaskCluster](http://docs.taskcluster.net) | `ci.TASKCLUSTER` | 🚫 | +| [TeamCity](https://www.jetbrains.com/teamcity/) by JetBrains | `ci.TEAMCITY` | 🚫 | +| [Travis CI](http://travis-ci.org) | `ci.TRAVIS` | ✅ | ## API ### `ci.name` -A string. Will contain the name of the CI server the code is running on. -If not CI server is detected, it will be `null`. +Returns a string containing name of the CI server the code is running on. +If CI server is not detected, it returns `null`. Don't depend on the value of this string not to change for a specific vendor. If you find your self writing `ci.name === 'Travis CI'`, you @@ -74,8 +75,8 @@ most likely want to use `ci.TRAVIS` instead. ### `ci.isCI` -A boolean. Will be `true` if the code is running on a CI server. -Otherwise `false`. +Returns a boolean. Will be `true` if the code is running on a CI server, +otherwise `false`. Some CI servers not listed here might still trigger the `ci.isCI` boolean to be set to `true` if they use certain vendor neutral @@ -84,15 +85,15 @@ vendor specific boolean will be set to `true`. ### `ci.isPR` -A boolean if PR detection is supported for the current CI server. Will -be `true` if a PR is being tested. Otherwise `false`. If PR detection is +Returns a boolean if PR detection is supported for the current CI server. Will +be `true` if a PR is being tested, otherwise `false`. If PR detection is not supported for the current CI server, the value will be `null`. ### `ci.` -A vendor specific boolean constants is exposed for each support CI +A vendor specific boolean constant is exposed for each support CI vendor. A constant will be `true` if the code is determined to run on -the given CI server. Otherwise `false`. +the given CI server, otherwise `false`. Examples of vendor constants are `ci.TRAVIS` or `ci.APPVEYOR`. For a complete list, see the support table above. diff --git a/node_modules/ci-info/index.js b/node_modules/ci-info/index.js index 27794d49b3f21..9928fee9d34c1 100644 --- a/node_modules/ci-info/index.js +++ b/node_modules/ci-info/index.js @@ -4,7 +4,7 @@ var vendors = require('./vendors.json') var env = process.env -// Used for testinging only +// Used for testing only Object.defineProperty(exports, '_vendors', { value: vendors.map(function (v) { return v.constant }) }) diff --git a/node_modules/ci-info/package.json b/node_modules/ci-info/package.json index ac37a5fcc8555..16e90c59a8603 100644 --- a/node_modules/ci-info/package.json +++ b/node_modules/ci-info/package.json @@ -1,29 +1,28 @@ { - "_from": "ci-info@1.6.0", - "_id": "ci-info@1.6.0", + "_from": "ci-info@2.0.0", + "_id": "ci-info@2.0.0", "_inBundle": false, - "_integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "_integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "_location": "/ci-info", "_phantomChildren": {}, "_requested": { "type": "version", "registry": true, - "raw": "ci-info@1.6.0", + "raw": "ci-info@2.0.0", "name": "ci-info", "escapedName": "ci-info", - "rawSpec": "1.6.0", + "rawSpec": "2.0.0", "saveSpec": null, - "fetchSpec": "1.6.0" + "fetchSpec": "2.0.0" }, "_requiredBy": [ "#USER", - "/", - "/is-ci" + "/" ], - "_resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "_shasum": "2ca20dbb9ceb32d4524a683303313f0304b1e497", - "_spec": "ci-info@1.6.0", - "_where": "/Users/zkat/Documents/code/work/npm", + "_resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "_shasum": "67a9e964be31a51e15e5010d58e6f12834002f46", + "_spec": "ci-info@2.0.0", + "_where": "/Users/aeschright/code/cli", "author": { "name": "Thomas Watson Steen", "email": "w@tson.dk", @@ -34,8 +33,8 @@ }, "bundleDependencies": false, "coordinates": [ - 55.778271, - 12.593091 + 55.778231, + 12.593179 ], "dependencies": {}, "deprecated": false, @@ -63,5 +62,5 @@ "scripts": { "test": "standard && node test.js" }, - "version": "1.6.0" + "version": "2.0.0" } diff --git a/node_modules/ci-info/vendors.json b/node_modules/ci-info/vendors.json index a157b78cea4af..266a724ab2464 100644 --- a/node_modules/ci-info/vendors.json +++ b/node_modules/ci-info/vendors.json @@ -5,6 +5,12 @@ "env": "APPVEYOR", "pr": "APPVEYOR_PULL_REQUEST_NUMBER" }, + { + "name": "Azure Pipelines", + "constant": "AZURE_PIPELINES", + "env": "SYSTEM_TEAMFOUNDATIONCOLLECTIONURI", + "pr": "SYSTEM_PULLREQUEST_PULLREQUESTID" + }, { "name": "Bamboo", "constant": "BAMBOO", @@ -13,7 +19,8 @@ { "name": "Bitbucket Pipelines", "constant": "BITBUCKET", - "env": "BITBUCKET_COMMIT" + "env": "BITBUCKET_COMMIT", + "pr": "BITBUCKET_PR_ID" }, { "name": "Bitrise", @@ -92,6 +99,12 @@ "constant": "MAGNUM", "env": "MAGNUM" }, + { + "name": "Netlify CI", + "constant": "NETLIFY", + "env": "NETLIFY_BUILD_BASE", + "pr": { "env": "PULL_REQUEST", "ne": "false" } + }, { "name": "Sail CI", "constant": "SAIL", @@ -126,23 +139,11 @@ "constant": "TASKCLUSTER", "env": ["TASK_ID", "RUN_ID"] }, - { - "name": "Solano CI", - "constant": "TDDIUM", - "env": "TDDIUM", - "pr": "TDDIUM_PR_ID", - "deprecated": true - }, { "name": "TeamCity", "constant": "TEAMCITY", "env": "TEAMCITY_VERSION" }, - { - "name": "Team Foundation Server", - "constant": "TFS", - "env": "TF_BUILD" - }, { "name": "Travis CI", "constant": "TRAVIS", diff --git a/node_modules/is-ci/node_modules/ci-info/CHANGELOG.md b/node_modules/is-ci/node_modules/ci-info/CHANGELOG.md new file mode 100644 index 0000000000000..859a0ad12a53b --- /dev/null +++ b/node_modules/is-ci/node_modules/ci-info/CHANGELOG.md @@ -0,0 +1,62 @@ +# Changelog + +## v1.6.0 + +* feat: add Sail CI support +* feat: add Buddy support +* feat: add Bitrise support +* feat: detect Jenkins PRs +* feat: detect Drone PRs + +## v1.5.1 + +* fix: use full path to vendors.json + +## v1.5.0 + +* feat: add dsari detection ([#15](https://github.com/watson/ci-info/pull/15)) +* feat: add ci.isPR ([#16](https://github.com/watson/ci-info/pull/16)) + +## v1.4.0 + +* feat: add Cirrus CI detection ([#13](https://github.com/watson/ci-info/pull/13)) +* feat: add Shippable CI detection ([#14](https://github.com/watson/ci-info/pull/14)) + +## v1.3.1 + +* chore: reduce npm package size by not including `.github` folder content ([#11](https://github.com/watson/ci-info/pull/11)) + +## v1.3.0 + +* feat: add support for Strider CD +* chore: deprecate vendor constant `TDDIUM` in favor of `SOLANO` +* docs: add missing vendor constant to docs + +## v1.2.0 + +* feat: detect solano-ci ([#9](https://github.com/watson/ci-info/pull/9)) + +## v1.1.3 + +* fix: fix spelling of Hunson in `ci.name` + +## v1.1.2 + +* fix: no more false positive matches for Jenkins + +## v1.1.1 + +* docs: sort lists of CI servers in README.md +* docs: add missing AWS CodeBuild to the docs + +## v1.1.0 + +* feat: add AWS CodeBuild to CI detection ([#2](https://github.com/watson/ci-info/pull/2)) + +## v1.0.1 + +* chore: reduce npm package size by using an `.npmignore` file ([#3](https://github.com/watson/ci-info/pull/3)) + +## v1.0.0 + +* Initial release diff --git a/node_modules/is-ci/node_modules/ci-info/LICENSE b/node_modules/is-ci/node_modules/ci-info/LICENSE new file mode 100644 index 0000000000000..67846832ecc30 --- /dev/null +++ b/node_modules/is-ci/node_modules/ci-info/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016-2018 Thomas Watson Steen + +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/node_modules/is-ci/node_modules/ci-info/README.md b/node_modules/is-ci/node_modules/ci-info/README.md new file mode 100644 index 0000000000000..c88be8f82d5df --- /dev/null +++ b/node_modules/is-ci/node_modules/ci-info/README.md @@ -0,0 +1,107 @@ +# ci-info + +Get details about the current Continuous Integration environment. + +Please [open an +issue](https://github.com/watson/ci-info/issues/new?template=ci-server-not-detected.md) +if your CI server isn't properly detected :) + +[![npm](https://img.shields.io/npm/v/ci-info.svg)](https://www.npmjs.com/package/ci-info) +[![Build status](https://travis-ci.org/watson/ci-info.svg?branch=master)](https://travis-ci.org/watson/ci-info) +[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) + +## Installation + +```bash +npm install ci-info --save +``` + +## Usage + +```js +var ci = require('ci-info') + +if (ci.isCI) { + console.log('The name of the CI server is:', ci.name) +} else { + console.log('This program is not running on a CI server') +} +``` + +## Supported CI tools + +Officially supported CI servers: + +| Name | Constant | +|------|----------| +| [AWS CodeBuild](https://aws.amazon.com/codebuild/) | `ci.CODEBUILD` | +| [AppVeyor](http://www.appveyor.com) | `ci.APPVEYOR` | +| [Bamboo](https://www.atlassian.com/software/bamboo) by Atlassian | `ci.BAMBOO` | +| [Bitbucket Pipelines](https://bitbucket.org/product/features/pipelines) | `ci.BITBUCKET` | +| [Bitrise](https://www.bitrise.io/) | `ci.BITRISE` | +| [Buddy](https://buddy.works/) | `ci.BUDDY` | +| [Buildkite](https://buildkite.com) | `ci.BUILDKITE` | +| [CircleCI](http://circleci.com) | `ci.CIRCLE` | +| [Cirrus CI](https://cirrus-ci.org) | `ci.CIRRUS` | +| [Codeship](https://codeship.com) | `ci.CODESHIP` | +| [Drone](https://drone.io) | `ci.DRONE` | +| [dsari](https://github.com/rfinnie/dsari) | `ci.DSARI` | +| [GitLab CI](https://about.gitlab.com/gitlab-ci/) | `ci.GITLAB` | +| [GoCD](https://www.go.cd/) | `ci.GOCD` | +| [Hudson](http://hudson-ci.org) | `ci.HUDSON` | +| [Jenkins CI](https://jenkins-ci.org) | `ci.JENKINS` | +| [Magnum CI](https://magnum-ci.com) | `ci.MAGNUM` | +| [Sail CI](https://sail.ci/) | `ci.SAIL` | +| [Semaphore](https://semaphoreci.com) | `ci.SEMAPHORE` | +| [Shippable](https://www.shippable.com/) | `ci.SHIPPABLE` | +| [Solano CI](https://www.solanolabs.com/) | `ci.SOLANO` | +| [Strider CD](https://strider-cd.github.io/) | `ci.STRIDER` | +| [TaskCluster](http://docs.taskcluster.net) | `ci.TASKCLUSTER` | +| [Team Foundation Server](https://www.visualstudio.com/en-us/products/tfs-overview-vs.aspx) by Microsoft | `ci.TFS` | +| [TeamCity](https://www.jetbrains.com/teamcity/) by JetBrains | `ci.TEAMCITY` | +| [Travis CI](http://travis-ci.org) | `ci.TRAVIS` | + +## API + +### `ci.name` + +A string. Will contain the name of the CI server the code is running on. +If not CI server is detected, it will be `null`. + +Don't depend on the value of this string not to change for a specific +vendor. If you find your self writing `ci.name === 'Travis CI'`, you +most likely want to use `ci.TRAVIS` instead. + +### `ci.isCI` + +A boolean. Will be `true` if the code is running on a CI server. +Otherwise `false`. + +Some CI servers not listed here might still trigger the `ci.isCI` +boolean to be set to `true` if they use certain vendor neutral +environment variables. In those cases `ci.name` will be `null` and no +vendor specific boolean will be set to `true`. + +### `ci.isPR` + +A boolean if PR detection is supported for the current CI server. Will +be `true` if a PR is being tested. Otherwise `false`. If PR detection is +not supported for the current CI server, the value will be `null`. + +### `ci.` + +A vendor specific boolean constants is exposed for each support CI +vendor. A constant will be `true` if the code is determined to run on +the given CI server. Otherwise `false`. + +Examples of vendor constants are `ci.TRAVIS` or `ci.APPVEYOR`. For a +complete list, see the support table above. + +Deprecated vendor constants that will be removed in the next major +release: + +- `ci.TDDIUM` (Solano CI) This have been renamed `ci.SOLANO` + +## License + +[MIT](LICENSE) diff --git a/node_modules/is-ci/node_modules/ci-info/index.js b/node_modules/is-ci/node_modules/ci-info/index.js new file mode 100644 index 0000000000000..27794d49b3f21 --- /dev/null +++ b/node_modules/is-ci/node_modules/ci-info/index.js @@ -0,0 +1,66 @@ +'use strict' + +var vendors = require('./vendors.json') + +var env = process.env + +// Used for testinging only +Object.defineProperty(exports, '_vendors', { + value: vendors.map(function (v) { return v.constant }) +}) + +exports.name = null +exports.isPR = null + +vendors.forEach(function (vendor) { + var envs = Array.isArray(vendor.env) ? vendor.env : [vendor.env] + var isCI = envs.every(function (obj) { + return checkEnv(obj) + }) + + exports[vendor.constant] = isCI + + if (isCI) { + exports.name = vendor.name + + switch (typeof vendor.pr) { + case 'string': + // "pr": "CIRRUS_PR" + exports.isPR = !!env[vendor.pr] + break + case 'object': + if ('env' in vendor.pr) { + // "pr": { "env": "BUILDKITE_PULL_REQUEST", "ne": "false" } + exports.isPR = vendor.pr.env in env && env[vendor.pr.env] !== vendor.pr.ne + } else if ('any' in vendor.pr) { + // "pr": { "any": ["ghprbPullId", "CHANGE_ID"] } + exports.isPR = vendor.pr.any.some(function (key) { + return !!env[key] + }) + } else { + // "pr": { "DRONE_BUILD_EVENT": "pull_request" } + exports.isPR = checkEnv(vendor.pr) + } + break + default: + // PR detection not supported for this vendor + exports.isPR = null + } + } +}) + +exports.isCI = !!( + env.CI || // Travis CI, CircleCI, Cirrus CI, Gitlab CI, Appveyor, CodeShip, dsari + env.CONTINUOUS_INTEGRATION || // Travis CI, Cirrus CI + env.BUILD_NUMBER || // Jenkins, TeamCity + env.RUN_ID || // TaskCluster, dsari + exports.name || + false +) + +function checkEnv (obj) { + if (typeof obj === 'string') return !!env[obj] + return Object.keys(obj).every(function (k) { + return env[k] === obj[k] + }) +} diff --git a/node_modules/is-ci/node_modules/ci-info/package.json b/node_modules/is-ci/node_modules/ci-info/package.json new file mode 100644 index 0000000000000..3542df9d4100c --- /dev/null +++ b/node_modules/is-ci/node_modules/ci-info/package.json @@ -0,0 +1,65 @@ +{ + "_from": "ci-info@^1.0.0", + "_id": "ci-info@1.6.0", + "_inBundle": false, + "_integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "_location": "/is-ci/ci-info", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "ci-info@^1.0.0", + "name": "ci-info", + "escapedName": "ci-info", + "rawSpec": "^1.0.0", + "saveSpec": null, + "fetchSpec": "^1.0.0" + }, + "_requiredBy": [ + "/is-ci" + ], + "_resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "_shasum": "2ca20dbb9ceb32d4524a683303313f0304b1e497", + "_spec": "ci-info@^1.0.0", + "_where": "/Users/aeschright/code/cli/node_modules/is-ci", + "author": { + "name": "Thomas Watson Steen", + "email": "w@tson.dk", + "url": "https://twitter.com/wa7son" + }, + "bugs": { + "url": "https://github.com/watson/ci-info/issues" + }, + "bundleDependencies": false, + "coordinates": [ + 55.778271, + 12.593091 + ], + "dependencies": {}, + "deprecated": false, + "description": "Get details about the current Continuous Integration environment", + "devDependencies": { + "clear-require": "^1.0.1", + "standard": "^12.0.1", + "tape": "^4.9.1" + }, + "homepage": "https://github.com/watson/ci-info", + "keywords": [ + "ci", + "continuous", + "integration", + "test", + "detect" + ], + "license": "MIT", + "main": "index.js", + "name": "ci-info", + "repository": { + "type": "git", + "url": "git+https://github.com/watson/ci-info.git" + }, + "scripts": { + "test": "standard && node test.js" + }, + "version": "1.6.0" +} diff --git a/node_modules/is-ci/node_modules/ci-info/vendors.json b/node_modules/is-ci/node_modules/ci-info/vendors.json new file mode 100644 index 0000000000000..a157b78cea4af --- /dev/null +++ b/node_modules/is-ci/node_modules/ci-info/vendors.json @@ -0,0 +1,152 @@ +[ + { + "name": "AppVeyor", + "constant": "APPVEYOR", + "env": "APPVEYOR", + "pr": "APPVEYOR_PULL_REQUEST_NUMBER" + }, + { + "name": "Bamboo", + "constant": "BAMBOO", + "env": "bamboo_planKey" + }, + { + "name": "Bitbucket Pipelines", + "constant": "BITBUCKET", + "env": "BITBUCKET_COMMIT" + }, + { + "name": "Bitrise", + "constant": "BITRISE", + "env": "BITRISE_IO", + "pr": "BITRISE_PULL_REQUEST" + }, + { + "name": "Buddy", + "constant": "BUDDY", + "env": "BUDDY_WORKSPACE_ID", + "pr": "BUDDY_EXECUTION_PULL_REQUEST_ID" + }, + { + "name": "Buildkite", + "constant": "BUILDKITE", + "env": "BUILDKITE", + "pr": { "env": "BUILDKITE_PULL_REQUEST", "ne": "false" } + }, + { + "name": "CircleCI", + "constant": "CIRCLE", + "env": "CIRCLECI", + "pr": "CIRCLE_PULL_REQUEST" + }, + { + "name": "Cirrus CI", + "constant": "CIRRUS", + "env": "CIRRUS_CI", + "pr": "CIRRUS_PR" + }, + { + "name": "AWS CodeBuild", + "constant": "CODEBUILD", + "env": "CODEBUILD_BUILD_ARN" + }, + { + "name": "Codeship", + "constant": "CODESHIP", + "env": { "CI_NAME": "codeship" } + }, + { + "name": "Drone", + "constant": "DRONE", + "env": "DRONE", + "pr": { "DRONE_BUILD_EVENT": "pull_request" } + }, + { + "name": "dsari", + "constant": "DSARI", + "env": "DSARI" + }, + { + "name": "GitLab CI", + "constant": "GITLAB", + "env": "GITLAB_CI" + }, + { + "name": "GoCD", + "constant": "GOCD", + "env": "GO_PIPELINE_LABEL" + }, + { + "name": "Hudson", + "constant": "HUDSON", + "env": "HUDSON_URL" + }, + { + "name": "Jenkins", + "constant": "JENKINS", + "env": ["JENKINS_URL", "BUILD_ID"], + "pr": { "any": ["ghprbPullId", "CHANGE_ID"] } + }, + { + "name": "Magnum CI", + "constant": "MAGNUM", + "env": "MAGNUM" + }, + { + "name": "Sail CI", + "constant": "SAIL", + "env": "SAILCI", + "pr": "SAIL_PULL_REQUEST_NUMBER" + }, + { + "name": "Semaphore", + "constant": "SEMAPHORE", + "env": "SEMAPHORE", + "pr": "PULL_REQUEST_NUMBER" + }, + { + "name": "Shippable", + "constant": "SHIPPABLE", + "env": "SHIPPABLE", + "pr": { "IS_PULL_REQUEST": "true" } + }, + { + "name": "Solano CI", + "constant": "SOLANO", + "env": "TDDIUM", + "pr": "TDDIUM_PR_ID" + }, + { + "name": "Strider CD", + "constant": "STRIDER", + "env": "STRIDER" + }, + { + "name": "TaskCluster", + "constant": "TASKCLUSTER", + "env": ["TASK_ID", "RUN_ID"] + }, + { + "name": "Solano CI", + "constant": "TDDIUM", + "env": "TDDIUM", + "pr": "TDDIUM_PR_ID", + "deprecated": true + }, + { + "name": "TeamCity", + "constant": "TEAMCITY", + "env": "TEAMCITY_VERSION" + }, + { + "name": "Team Foundation Server", + "constant": "TFS", + "env": "TF_BUILD" + }, + { + "name": "Travis CI", + "constant": "TRAVIS", + "env": "TRAVIS", + "pr": { "env": "TRAVIS_PULL_REQUEST", "ne": "false" } + } +] diff --git a/package-lock.json b/package-lock.json index 1fc79c47461f3..843d49a5a8586 100644 --- a/package-lock.json +++ b/package-lock.json @@ -490,9 +490,9 @@ "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" }, "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "cidr-regex": { "version": "2.0.9", @@ -2138,6 +2138,13 @@ "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", "requires": { "ci-info": "^1.0.0" + }, + "dependencies": { + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + } } }, "is-cidr": { diff --git a/package.json b/package.json index 34aa3f849b362..b3beced7d6faa 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "cacache": "^11.3.2", "call-limit": "~1.1.0", "chownr": "^1.1.1", - "ci-info": "^1.6.0", + "ci-info": "^2.0.0", "cli-columns": "^3.1.2", "cli-table3": "^0.5.0", "cmd-shim": "~2.0.2", From bcdeddcc3d4dc242f42404223dafe4afdc753b32 Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Tue, 8 Jan 2019 11:23:49 -0800 Subject: [PATCH 71/97] cli-table3@0.5.1 --- node_modules/cli-table3/CHANGELOG.md | 12 +- node_modules/cli-table3/index.d.ts | 95 ++++++++++++ node_modules/cli-table3/package.json | 33 +++-- node_modules/colors/LICENSE | 4 +- node_modules/colors/README.md | 10 +- node_modules/colors/examples/normal-usage.js | 55 +++---- node_modules/colors/examples/safe-string.js | 51 +++---- node_modules/colors/index.d.ts | 136 ++++++++++++++++++ node_modules/colors/lib/colors.js | 132 +++++++++-------- node_modules/colors/lib/custom/trap.js | 71 ++++----- node_modules/colors/lib/custom/zalgo.js | 84 ++++++----- .../colors/lib/extendStringPrototype.js | 91 ++++++------ node_modules/colors/lib/index.js | 7 +- node_modules/colors/lib/maps/america.js | 18 ++- node_modules/colors/lib/maps/rainbow.js | 13 +- node_modules/colors/lib/maps/random.js | 14 +- node_modules/colors/lib/maps/zebra.js | 10 +- node_modules/colors/lib/styles.js | 6 +- node_modules/colors/lib/system/has-flag.js | 35 +++++ .../colors/lib/system/supports-colors.js | 128 ++++++++++++++--- node_modules/colors/package.json | 49 ++++--- node_modules/colors/safe.d.ts | 48 +++++++ node_modules/colors/safe.js | 7 +- node_modules/colors/themes/generic-logging.js | 4 +- package-lock.json | 12 +- package.json | 2 +- 26 files changed, 793 insertions(+), 334 deletions(-) create mode 100644 node_modules/cli-table3/index.d.ts create mode 100644 node_modules/colors/index.d.ts create mode 100644 node_modules/colors/lib/system/has-flag.js create mode 100644 node_modules/colors/safe.d.ts diff --git a/node_modules/cli-table3/CHANGELOG.md b/node_modules/cli-table3/CHANGELOG.md index 62eb485bdf93d..3f6ba35f8393e 100644 --- a/node_modules/cli-table3/CHANGELOG.md +++ b/node_modules/cli-table3/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## v0.5.1 (2018-07-19) + +#### :rocket: Enhancement +* [#21](https://github.com/cli-table/cli-table3/pull/21) Import type definition from `@types/cli-table2` ([@Turbo87](https://github.com/Turbo87)) + +#### Committers: 1 +- Tobias Bieniek ([Turbo87](https://github.com/Turbo87)) + + ## v0.5.0 (2018-06-11) #### :boom: Breaking Change @@ -18,10 +27,9 @@ * [#3](https://github.com/cli-table/cli-table3/pull/3) Add `yarn.lock` file. ([@Turbo87](https://github.com/Turbo87)) * [#1](https://github.com/cli-table/cli-table3/pull/1) Skip broken test. ([@Turbo87](https://github.com/Turbo87)) -#### Committers: 3 +#### Committers: 2 - Daniel Ruf ([DanielRuf](https://github.com/DanielRuf)) - Tobias Bieniek ([Turbo87](https://github.com/Turbo87)) -- [dependabot[bot]](https://github.com/apps/dependabot) ## v0.4.0 (2018-06-10) diff --git a/node_modules/cli-table3/index.d.ts b/node_modules/cli-table3/index.d.ts new file mode 100644 index 0000000000000..bdf17e270ea84 --- /dev/null +++ b/node_modules/cli-table3/index.d.ts @@ -0,0 +1,95 @@ +declare namespace CliTable3 { + type CharName = + "top" | + "top-mid" | + "top-left" | + "top-right" | + "bottom" | + "bottom-mid" | + "bottom-left" | + "bottom-right" | + "left" | + "left-mid" | + "mid" | + "mid-mid" | + "right" | + "right-mid" | + "middle"; + + type HorizontalAlignment = "left" | "center" | "right"; + type VerticalAlignment = "top" | "center" | "bottom"; + + interface TableOptions { + truncate: string; + colWidths: Array; + rowHeights: Array; + colAligns: HorizontalAlignment[]; + rowAligns: VerticalAlignment[]; + head: string[]; + wordWrap: boolean; + } + + interface TableInstanceOptions extends TableOptions { + chars: Record; + style: { + "padding-left": number; + "padding-right": number; + head: string[]; + border: string[]; + compact: boolean; + }; + } + + interface TableConstructorOptions extends Partial { + chars?: Partial>; + style?: Partial; + } + + type CellValue = boolean | number | string | null | undefined; + + interface CellOptions { + content: CellValue; + chars?: Partial>; + truncate?: string; + colSpan?: number; + rowSpan?: number; + hAlign?: HorizontalAlignment; + vAlign?: VerticalAlignment; + style?: { + "padding-left"?: number; + "padding-right"?: number; + head?: string[]; + border?: string[]; + }; + } + + interface GenericTable extends Array { + options: TableInstanceOptions; + readonly width: number; + } + + type Table = HorizontalTable | VerticalTable | CrossTable; + type Cell = CellValue | CellOptions; + + type HorizontalTable = GenericTable; + type HorizontalTableRow = Cell[]; + + type VerticalTable = GenericTable; + interface VerticalTableRow { + [name: string]: Cell; + } + + type CrossTable = GenericTable; + interface CrossTableRow { + [name: string]: Cell[]; + } +} + +interface CliTable3 { + new (options?: CliTable3.TableConstructorOptions): CliTable3.Table; + readonly prototype: CliTable3.Table; +} + +declare const CliTable3: CliTable3; + +export = CliTable3; diff --git a/node_modules/cli-table3/package.json b/node_modules/cli-table3/package.json index d0545c93f7df6..6ee81dc3f1b78 100644 --- a/node_modules/cli-table3/package.json +++ b/node_modules/cli-table3/package.json @@ -1,28 +1,29 @@ { - "_from": "cli-table3", - "_id": "cli-table3@0.5.0", + "_from": "cli-table3@0.5.1", + "_id": "cli-table3@0.5.1", "_inBundle": false, - "_integrity": "sha512-c7YHpUyO1SaKaO7kYtxd5NZ8FjAmSK3LpKkuzdwn+2CwpFxBpdoQLm+OAnnCfoEl7onKhN9PKQi1lsHuAIUqGQ==", + "_integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", "_location": "/cli-table3", "_phantomChildren": {}, "_requested": { - "type": "tag", + "type": "version", "registry": true, - "raw": "cli-table3", + "raw": "cli-table3@0.5.1", "name": "cli-table3", "escapedName": "cli-table3", - "rawSpec": "", + "rawSpec": "0.5.1", "saveSpec": null, - "fetchSpec": "latest" + "fetchSpec": "0.5.1" }, "_requiredBy": [ "#USER", - "/" + "/", + "/npm-audit-report" ], - "_resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.0.tgz", - "_shasum": "adb2f025715f4466e67629783c8d73e9030eb4bd", - "_spec": "cli-table3", - "_where": "/Users/zkat/Documents/code/work/npm", + "_resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "_shasum": "0252372d94dfc40dbd8df06005f48f31f656f202", + "_spec": "cli-table3@0.5.1", + "_where": "/Users/aeschright/code/cli", "author": { "name": "James Talmage" }, @@ -54,8 +55,8 @@ "eslint-plugin-prettier": "^2.6.0", "jest": "^23.1.0", "jest-runner-eslint": "^0.6.0", - "lerna-changelog": "^0.7.0", - "prettier": "1.13.5" + "lerna-changelog": "^0.8.0", + "prettier": "1.13.7" }, "directories": { "test": "test" @@ -65,6 +66,7 @@ }, "files": [ "src/", + "index.d.ts", "index.js" ], "homepage": "https://github.com/cli-table/cli-table3", @@ -124,5 +126,6 @@ "test": "jest --color", "test:watch": "jest --color --watchAll --notify" }, - "version": "0.5.0" + "types": "index.d.ts", + "version": "0.5.1" } diff --git a/node_modules/colors/LICENSE b/node_modules/colors/LICENSE index 3de4e33b48242..17880ff02972b 100644 --- a/node_modules/colors/LICENSE +++ b/node_modules/colors/LICENSE @@ -1,3 +1,5 @@ +MIT License + Original Library - Copyright (c) Marak Squires @@ -20,4 +22,4 @@ 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. \ No newline at end of file +THE SOFTWARE. diff --git a/node_modules/colors/README.md b/node_modules/colors/README.md index 0326aab340af4..4bebb6c92b073 100644 --- a/node_modules/colors/README.md +++ b/node_modules/colors/README.md @@ -1,4 +1,10 @@ -# colors.js [![Build Status](https://travis-ci.org/Marak/colors.js.svg?branch=master)](https://travis-ci.org/Marak/colors.js) +# colors.js +[![Build Status](https://travis-ci.org/Marak/colors.js.svg?branch=master)](https://travis-ci.org/Marak/colors.js) +[![version](https://img.shields.io/npm/v/colors.svg)](https://www.npmjs.org/package/colors) +[![dependencies](https://david-dm.org/Marak/colors.js.svg)](https://david-dm.org/Marak/colors.js) +[![devDependencies](https://david-dm.org/Marak/colors.js/dev-status.svg)](https://david-dm.org/Marak/colors.js#info=devDependencies) + +Please check out the [roadmap](ROADMAP.md) for upcoming features and releases. Please open Issues to provide feedback, and check the `develop` branch for the latest bleeding-edge updates. ## get color and style in your node.js console @@ -163,7 +169,7 @@ console.log(colors.warn("this is a warning")); ``` -You can also combine them: +### Combining Colors ```javascript var colors = require('colors'); diff --git a/node_modules/colors/examples/normal-usage.js b/node_modules/colors/examples/normal-usage.js index 2818741e1f977..cc8d05ff4f23a 100644 --- a/node_modules/colors/examples/normal-usage.js +++ b/node_modules/colors/examples/normal-usage.js @@ -1,34 +1,36 @@ var colors = require('../lib/index'); -console.log("First some yellow text".yellow); +console.log('First some yellow text'.yellow); -console.log("Underline that text".yellow.underline); +console.log('Underline that text'.yellow.underline); -console.log("Make it bold and red".red.bold); +console.log('Make it bold and red'.red.bold); -console.log(("Double Raindows All Day Long").rainbow) +console.log(('Double Raindows All Day Long').rainbow); -console.log("Drop the bass".trap) +console.log('Drop the bass'.trap); -console.log("DROP THE RAINBOW BASS".trap.rainbow) +console.log('DROP THE RAINBOW BASS'.trap.rainbow); +// styles not widely supported +console.log('Chains are also cool.'.bold.italic.underline.red); -console.log('Chains are also cool.'.bold.italic.underline.red); // styles not widely supported - -console.log('So '.green + 'are'.underline + ' ' + 'inverse'.inverse + ' styles! '.yellow.bold); // styles not widely supported -console.log("Zebras are so fun!".zebra); +// styles not widely supported +console.log('So '.green + 'are'.underline + ' ' + 'inverse'.inverse + + ' styles! '.yellow.bold); +console.log('Zebras are so fun!'.zebra); // // Remark: .strikethrough may not work with Mac OS Terminal App // -console.log("This is " + "not".strikethrough + " fun."); +console.log('This is ' + 'not'.strikethrough + ' fun.'); -console.log('Background color attack!'.black.bgWhite) -console.log('Use random styles on everything!'.random) -console.log('America, Heck Yeah!'.america) +console.log('Background color attack!'.black.bgWhite); +console.log('Use random styles on everything!'.random); +console.log('America, Heck Yeah!'.america); -console.log('Setting themes is useful') +console.log('Setting themes is useful'); // // Custom themes @@ -45,30 +47,35 @@ colors.setTheme({ help: 'cyan', warn: 'yellow', debug: 'blue', - error: 'red' + error: 'red', }); // outputs red text -console.log("this is an error".error); +console.log('this is an error'.error); // outputs yellow text -console.log("this is a warning".warn); +console.log('this is a warning'.warn); // outputs grey text -console.log("this is an input".input); +console.log('this is an input'.input); console.log('Generic logging theme as file'.green.bold.underline); // Load a theme from file -colors.setTheme(__dirname + '/../themes/generic-logging.js'); +try { + colors.setTheme(require(__dirname + '/../themes/generic-logging.js')); +} catch (err) { + console.log(err); +} // outputs red text -console.log("this is an error".error); +console.log('this is an error'.error); // outputs yellow text -console.log("this is a warning".warn); +console.log('this is a warning'.warn); // outputs grey text -console.log("this is an input".input); +console.log('this is an input'.input); + +// console.log("Don't summon".zalgo) -//console.log("Don't summon".zalgo) \ No newline at end of file diff --git a/node_modules/colors/examples/safe-string.js b/node_modules/colors/examples/safe-string.js index 111b363a4a7a4..98994873520ff 100644 --- a/node_modules/colors/examples/safe-string.js +++ b/node_modules/colors/examples/safe-string.js @@ -1,41 +1,43 @@ var colors = require('../safe'); -console.log(colors.yellow("First some yellow text")); +console.log(colors.yellow('First some yellow text')); -console.log(colors.yellow.underline("Underline that text")); +console.log(colors.yellow.underline('Underline that text')); -console.log(colors.red.bold("Make it bold and red")); +console.log(colors.red.bold('Make it bold and red')); -console.log(colors.rainbow("Double Raindows All Day Long")) +console.log(colors.rainbow('Double Raindows All Day Long')); -console.log(colors.trap("Drop the bass")) +console.log(colors.trap('Drop the bass')); -console.log(colors.rainbow(colors.trap("DROP THE RAINBOW BASS"))); +console.log(colors.rainbow(colors.trap('DROP THE RAINBOW BASS'))); -console.log(colors.bold.italic.underline.red('Chains are also cool.')); // styles not widely supported +// styles not widely supported +console.log(colors.bold.italic.underline.red('Chains are also cool.')); +// styles not widely supported +console.log(colors.green('So ') + colors.underline('are') + ' ' + + colors.inverse('inverse') + colors.yellow.bold(' styles! ')); -console.log(colors.green('So ') + colors.underline('are') + ' ' + colors.inverse('inverse') + colors.yellow.bold(' styles! ')); // styles not widely supported +console.log(colors.zebra('Zebras are so fun!')); -console.log(colors.zebra("Zebras are so fun!")); - -console.log("This is " + colors.strikethrough("not") + " fun."); +console.log('This is ' + colors.strikethrough('not') + ' fun.'); console.log(colors.black.bgWhite('Background color attack!')); -console.log(colors.random('Use random styles on everything!')) +console.log(colors.random('Use random styles on everything!')); console.log(colors.america('America, Heck Yeah!')); -console.log('Setting themes is useful') +console.log('Setting themes is useful'); // // Custom themes // -//console.log('Generic logging theme as JSON'.green.bold.underline); +// console.log('Generic logging theme as JSON'.green.bold.underline); // Load theme with JSON literal colors.setTheme({ silly: 'rainbow', - input: 'grey', + input: 'blue', verbose: 'cyan', prompt: 'grey', info: 'green', @@ -43,34 +45,33 @@ colors.setTheme({ help: 'cyan', warn: 'yellow', debug: 'blue', - error: 'red' + error: 'red', }); // outputs red text -console.log(colors.error("this is an error")); +console.log(colors.error('this is an error')); // outputs yellow text -console.log(colors.warn("this is a warning")); +console.log(colors.warn('this is a warning')); -// outputs grey text -console.log(colors.input("this is an input")); +// outputs blue text +console.log(colors.input('this is an input')); // console.log('Generic logging theme as file'.green.bold.underline); // Load a theme from file -colors.setTheme(__dirname + '/../themes/generic-logging.js'); +colors.setTheme(require(__dirname + '/../themes/generic-logging.js')); // outputs red text -console.log(colors.error("this is an error")); +console.log(colors.error('this is an error')); // outputs yellow text -console.log(colors.warn("this is a warning")); +console.log(colors.warn('this is a warning')); // outputs grey text -console.log(colors.input("this is an input")); +console.log(colors.input('this is an input')); // console.log(colors.zalgo("Don't summon him")) - diff --git a/node_modules/colors/index.d.ts b/node_modules/colors/index.d.ts new file mode 100644 index 0000000000000..baa70686535a7 --- /dev/null +++ b/node_modules/colors/index.d.ts @@ -0,0 +1,136 @@ +// Type definitions for Colors.js 1.2 +// Project: https://github.com/Marak/colors.js +// Definitions by: Bart van der Schoor , Staffan Eketorp +// Definitions: https://github.com/Marak/colors.js + +export interface Color { + (text: string): string; + + strip: Color; + stripColors: Color; + + black: Color; + red: Color; + green: Color; + yellow: Color; + blue: Color; + magenta: Color; + cyan: Color; + white: Color; + gray: Color; + grey: Color; + + bgBlack: Color; + bgRed: Color; + bgGreen: Color; + bgYellow: Color; + bgBlue: Color; + bgMagenta: Color; + bgCyan: Color; + bgWhite: Color; + + reset: Color; + bold: Color; + dim: Color; + italic: Color; + underline: Color; + inverse: Color; + hidden: Color; + strikethrough: Color; + + rainbow: Color; + zebra: Color; + america: Color; + trap: Color; + random: Color; + zalgo: Color; +} + +export function enable(): void; +export function disable(): void; +export function setTheme(theme: any): void; + +export let enabled: boolean; + +export const strip: Color; +export const stripColors: Color; + +export const black: Color; +export const red: Color; +export const green: Color; +export const yellow: Color; +export const blue: Color; +export const magenta: Color; +export const cyan: Color; +export const white: Color; +export const gray: Color; +export const grey: Color; + +export const bgBlack: Color; +export const bgRed: Color; +export const bgGreen: Color; +export const bgYellow: Color; +export const bgBlue: Color; +export const bgMagenta: Color; +export const bgCyan: Color; +export const bgWhite: Color; + +export const reset: Color; +export const bold: Color; +export const dim: Color; +export const italic: Color; +export const underline: Color; +export const inverse: Color; +export const hidden: Color; +export const strikethrough: Color; + +export const rainbow: Color; +export const zebra: Color; +export const america: Color; +export const trap: Color; +export const random: Color; +export const zalgo: Color; + +declare global { + interface String { + strip: string; + stripColors: string; + + black: string; + red: string; + green: string; + yellow: string; + blue: string; + magenta: string; + cyan: string; + white: string; + gray: string; + grey: string; + + bgBlack: string; + bgRed: string; + bgGreen: string; + bgYellow: string; + bgBlue: string; + bgMagenta: string; + bgCyan: string; + bgWhite: string; + + reset: string; + // @ts-ignore + bold: string; + dim: string; + italic: string; + underline: string; + inverse: string; + hidden: string; + strikethrough: string; + + rainbow: string; + zebra: string; + america: string; + trap: string; + random: string; + zalgo: string; + } +} diff --git a/node_modules/colors/lib/colors.js b/node_modules/colors/lib/colors.js index 790ffd43ef515..7ca90fa903616 100644 --- a/node_modules/colors/lib/colors.js +++ b/node_modules/colors/lib/colors.js @@ -2,7 +2,7 @@ The MIT License (MIT) -Original Library +Original Library - Copyright (c) Marak Squires Additional functionality @@ -33,35 +33,45 @@ module['exports'] = colors; colors.themes = {}; +var util = require('util'); var ansiStyles = colors.styles = require('./styles'); var defineProps = Object.defineProperties; +var newLineRegex = new RegExp(/[\r\n]+/g); -colors.supportsColor = require('./system/supports-colors'); +colors.supportsColor = require('./system/supports-colors').supportsColor; -if (typeof colors.enabled === "undefined") { - colors.enabled = colors.supportsColor; +if (typeof colors.enabled === 'undefined') { + colors.enabled = colors.supportsColor() !== false; } -colors.stripColors = colors.strip = function(str){ - return ("" + str).replace(/\x1B\[\d+m/g, ''); +colors.enable = function() { + colors.enabled = true; }; +colors.disable = function() { + colors.enabled = false; +}; + +colors.stripColors = colors.strip = function(str) { + return ('' + str).replace(/\x1B\[\d+m/g, ''); +}; -var stylize = colors.stylize = function stylize (str, style) { +// eslint-disable-next-line no-unused-vars +var stylize = colors.stylize = function stylize(str, style) { if (!colors.enabled) { return str+''; } return ansiStyles[style].open + str + ansiStyles[style].close; -} +}; var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; -var escapeStringRegexp = function (str) { +var escapeStringRegexp = function(str) { if (typeof str !== 'string') { throw new TypeError('Expected a string'); } - return str.replace(matchOperatorsRe, '\\$&'); -} + return str.replace(matchOperatorsRe, '\\$&'); +}; function build(_styles) { var builder = function builder() { @@ -74,15 +84,16 @@ function build(_styles) { return builder; } -var styles = (function () { +var styles = (function() { var ret = {}; ansiStyles.grey = ansiStyles.gray; - Object.keys(ansiStyles).forEach(function (key) { - ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); + Object.keys(ansiStyles).forEach(function(key) { + ansiStyles[key].closeRe = + new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); ret[key] = { - get: function () { + get: function() { return build(this._styles.concat(key)); - } + }, }; }); return ret; @@ -91,78 +102,81 @@ var styles = (function () { var proto = defineProps(function colors() {}, styles); function applyStyle() { - var args = arguments; - var argsLen = args.length; - var str = argsLen !== 0 && String(arguments[0]); - if (argsLen > 1) { - for (var a = 1; a < argsLen; a++) { - str += ' ' + args[a]; + var args = Array.prototype.slice.call(arguments); + + var str = args.map(function(arg) { + if (arg !== undefined && arg.constructor === String) { + return arg; + } else { + return util.inspect(arg); } - } + }).join(' '); if (!colors.enabled || !str) { return str; } + var newLinesPresent = str.indexOf('\n') != -1; + var nestedStyles = this._styles; var i = nestedStyles.length; while (i--) { var code = ansiStyles[nestedStyles[i]]; str = code.open + str.replace(code.closeRe, code.open) + code.close; + if (newLinesPresent) { + str = str.replace(newLineRegex, function(match) { + return code.close + match + code.open; + }); + } } return str; } -function applyTheme (theme) { +colors.setTheme = function(theme) { + if (typeof theme === 'string') { + console.log('colors.setTheme now only accepts an object, not a string. ' + + 'If you are trying to set a theme from a file, it is now your (the ' + + 'caller\'s) responsibility to require the file. The old syntax ' + + 'looked like colors.setTheme(__dirname + ' + + '\'/../themes/generic-logging.js\'); The new syntax looks like '+ + 'colors.setTheme(require(__dirname + ' + + '\'/../themes/generic-logging.js\'));'); + return; + } for (var style in theme) { - (function(style){ - colors[style] = function(str){ - if (typeof theme[style] === 'object'){ + (function(style) { + colors[style] = function(str) { + if (typeof theme[style] === 'object') { var out = str; - for (var i in theme[style]){ + for (var i in theme[style]) { out = colors[theme[style][i]](out); } return out; } return colors[theme[style]](str); }; - })(style) - } -} - -colors.setTheme = function (theme) { - if (typeof theme === 'string') { - try { - colors.themes[theme] = require(theme); - applyTheme(colors.themes[theme]); - return colors.themes[theme]; - } catch (err) { - console.log(err); - return err; - } - } else { - applyTheme(theme); + })(style); } }; function init() { var ret = {}; - Object.keys(styles).forEach(function (name) { + Object.keys(styles).forEach(function(name) { ret[name] = { - get: function () { + get: function() { return build([name]); - } + }, }; }); return ret; } -var sequencer = function sequencer (map, str) { - var exploded = str.split(""), i = 0; +var sequencer = function sequencer(map, str) { + var exploded = str.split(''); exploded = exploded.map(map); - return exploded.join(""); + return exploded.join(''); }; // custom formatter methods @@ -171,17 +185,17 @@ colors.zalgo = require('./custom/zalgo'); // maps colors.maps = {}; -colors.maps.america = require('./maps/america'); -colors.maps.zebra = require('./maps/zebra'); -colors.maps.rainbow = require('./maps/rainbow'); -colors.maps.random = require('./maps/random') +colors.maps.america = require('./maps/america')(colors); +colors.maps.zebra = require('./maps/zebra')(colors); +colors.maps.rainbow = require('./maps/rainbow')(colors); +colors.maps.random = require('./maps/random')(colors); for (var map in colors.maps) { - (function(map){ - colors[map] = function (str) { + (function(map) { + colors[map] = function(str) { return sequencer(colors.maps[map], str); - } - })(map) + }; + })(map); } -defineProps(colors, init()); \ No newline at end of file +defineProps(colors, init()); diff --git a/node_modules/colors/lib/custom/trap.js b/node_modules/colors/lib/custom/trap.js index 3f0914373817f..fbccf88dede0b 100644 --- a/node_modules/colors/lib/custom/trap.js +++ b/node_modules/colors/lib/custom/trap.js @@ -1,45 +1,46 @@ -module['exports'] = function runTheTrap (text, options) { - var result = ""; - text = text || "Run the trap, drop the bass"; +module['exports'] = function runTheTrap(text, options) { + var result = ''; + text = text || 'Run the trap, drop the bass'; text = text.split(''); var trap = { - a: ["\u0040", "\u0104", "\u023a", "\u0245", "\u0394", "\u039b", "\u0414"], - b: ["\u00df", "\u0181", "\u0243", "\u026e", "\u03b2", "\u0e3f"], - c: ["\u00a9", "\u023b", "\u03fe"], - d: ["\u00d0", "\u018a", "\u0500" , "\u0501" ,"\u0502", "\u0503"], - e: ["\u00cb", "\u0115", "\u018e", "\u0258", "\u03a3", "\u03be", "\u04bc", "\u0a6c"], - f: ["\u04fa"], - g: ["\u0262"], - h: ["\u0126", "\u0195", "\u04a2", "\u04ba", "\u04c7", "\u050a"], - i: ["\u0f0f"], - j: ["\u0134"], - k: ["\u0138", "\u04a0", "\u04c3", "\u051e"], - l: ["\u0139"], - m: ["\u028d", "\u04cd", "\u04ce", "\u0520", "\u0521", "\u0d69"], - n: ["\u00d1", "\u014b", "\u019d", "\u0376", "\u03a0", "\u048a"], - o: ["\u00d8", "\u00f5", "\u00f8", "\u01fe", "\u0298", "\u047a", "\u05dd", "\u06dd", "\u0e4f"], - p: ["\u01f7", "\u048e"], - q: ["\u09cd"], - r: ["\u00ae", "\u01a6", "\u0210", "\u024c", "\u0280", "\u042f"], - s: ["\u00a7", "\u03de", "\u03df", "\u03e8"], - t: ["\u0141", "\u0166", "\u0373"], - u: ["\u01b1", "\u054d"], - v: ["\u05d8"], - w: ["\u0428", "\u0460", "\u047c", "\u0d70"], - x: ["\u04b2", "\u04fe", "\u04fc", "\u04fd"], - y: ["\u00a5", "\u04b0", "\u04cb"], - z: ["\u01b5", "\u0240"] - } - text.forEach(function(c){ + a: ['\u0040', '\u0104', '\u023a', '\u0245', '\u0394', '\u039b', '\u0414'], + b: ['\u00df', '\u0181', '\u0243', '\u026e', '\u03b2', '\u0e3f'], + c: ['\u00a9', '\u023b', '\u03fe'], + d: ['\u00d0', '\u018a', '\u0500', '\u0501', '\u0502', '\u0503'], + e: ['\u00cb', '\u0115', '\u018e', '\u0258', '\u03a3', '\u03be', '\u04bc', + '\u0a6c'], + f: ['\u04fa'], + g: ['\u0262'], + h: ['\u0126', '\u0195', '\u04a2', '\u04ba', '\u04c7', '\u050a'], + i: ['\u0f0f'], + j: ['\u0134'], + k: ['\u0138', '\u04a0', '\u04c3', '\u051e'], + l: ['\u0139'], + m: ['\u028d', '\u04cd', '\u04ce', '\u0520', '\u0521', '\u0d69'], + n: ['\u00d1', '\u014b', '\u019d', '\u0376', '\u03a0', '\u048a'], + o: ['\u00d8', '\u00f5', '\u00f8', '\u01fe', '\u0298', '\u047a', '\u05dd', + '\u06dd', '\u0e4f'], + p: ['\u01f7', '\u048e'], + q: ['\u09cd'], + r: ['\u00ae', '\u01a6', '\u0210', '\u024c', '\u0280', '\u042f'], + s: ['\u00a7', '\u03de', '\u03df', '\u03e8'], + t: ['\u0141', '\u0166', '\u0373'], + u: ['\u01b1', '\u054d'], + v: ['\u05d8'], + w: ['\u0428', '\u0460', '\u047c', '\u0d70'], + x: ['\u04b2', '\u04fe', '\u04fc', '\u04fd'], + y: ['\u00a5', '\u04b0', '\u04cb'], + z: ['\u01b5', '\u0240'], + }; + text.forEach(function(c) { c = c.toLowerCase(); - var chars = trap[c] || [" "]; + var chars = trap[c] || [' ']; var rand = Math.floor(Math.random() * chars.length); - if (typeof trap[c] !== "undefined") { + if (typeof trap[c] !== 'undefined') { result += trap[c][rand]; } else { result += c; } }); return result; - -} +}; diff --git a/node_modules/colors/lib/custom/zalgo.js b/node_modules/colors/lib/custom/zalgo.js index 1538c3b49388c..0ef2b01195635 100644 --- a/node_modules/colors/lib/custom/zalgo.js +++ b/node_modules/colors/lib/custom/zalgo.js @@ -1,8 +1,8 @@ // please no module['exports'] = function zalgo(text, options) { - text = text || " he is here "; + text = text || ' he is here '; var soul = { - "up" : [ + 'up': [ '̍', '̎', '̄', '̅', '̿', '̑', '̆', '̐', '͒', '͗', '͑', '̇', @@ -15,9 +15,9 @@ module['exports'] = function zalgo(text, options) { 'ͦ', 'ͧ', 'ͨ', 'ͩ', 'ͪ', 'ͫ', 'ͬ', 'ͭ', 'ͮ', 'ͯ', '̾', '͛', - '͆', '̚' + '͆', '̚', ], - "down" : [ + 'down': [ '̖', '̗', '̘', '̙', '̜', '̝', '̞', '̟', '̠', '̤', '̥', '̦', @@ -27,70 +27,75 @@ module['exports'] = function zalgo(text, options) { '̺', '̻', '̼', 'ͅ', '͇', '͈', '͉', '͍', '͎', '͓', '͔', '͕', - '͖', '͙', '͚', '̣' + '͖', '͙', '͚', '̣', ], - "mid" : [ + 'mid': [ '̕', '̛', '̀', '́', '͘', '̡', '̢', '̧', '̨', '̴', '̵', '̶', '͜', '͝', '͞', '͟', '͠', '͢', '̸', - '̷', '͡', ' ҉' - ] - }, - all = [].concat(soul.up, soul.down, soul.mid), - zalgo = {}; + '̷', '͡', ' ҉', + ], + }; + var all = [].concat(soul.up, soul.down, soul.mid); function randomNumber(range) { var r = Math.floor(Math.random() * range); return r; } - function is_char(character) { + function isChar(character) { var bool = false; - all.filter(function (i) { + all.filter(function(i) { bool = (i === character); }); return bool; } - + function heComes(text, options) { - var result = '', counts, l; + var result = ''; + var counts; + var l; options = options || {}; - options["up"] = typeof options["up"] !== 'undefined' ? options["up"] : true; - options["mid"] = typeof options["mid"] !== 'undefined' ? options["mid"] : true; - options["down"] = typeof options["down"] !== 'undefined' ? options["down"] : true; - options["size"] = typeof options["size"] !== 'undefined' ? options["size"] : "maxi"; + options['up'] = + typeof options['up'] !== 'undefined' ? options['up'] : true; + options['mid'] = + typeof options['mid'] !== 'undefined' ? options['mid'] : true; + options['down'] = + typeof options['down'] !== 'undefined' ? options['down'] : true; + options['size'] = + typeof options['size'] !== 'undefined' ? options['size'] : 'maxi'; text = text.split(''); for (l in text) { - if (is_char(l)) { + if (isChar(l)) { continue; } result = result + text[l]; - counts = {"up" : 0, "down" : 0, "mid" : 0}; + counts = {'up': 0, 'down': 0, 'mid': 0}; switch (options.size) { - case 'mini': - counts.up = randomNumber(8); - counts.mid = randomNumber(2); - counts.down = randomNumber(8); - break; - case 'maxi': - counts.up = randomNumber(16) + 3; - counts.mid = randomNumber(4) + 1; - counts.down = randomNumber(64) + 3; - break; - default: - counts.up = randomNumber(8) + 1; - counts.mid = randomNumber(6) / 2; - counts.down = randomNumber(8) + 1; - break; + case 'mini': + counts.up = randomNumber(8); + counts.mid = randomNumber(2); + counts.down = randomNumber(8); + break; + case 'maxi': + counts.up = randomNumber(16) + 3; + counts.mid = randomNumber(4) + 1; + counts.down = randomNumber(64) + 3; + break; + default: + counts.up = randomNumber(8) + 1; + counts.mid = randomNumber(6) / 2; + counts.down = randomNumber(8) + 1; + break; } - var arr = ["up", "mid", "down"]; + var arr = ['up', 'mid', 'down']; for (var d in arr) { var index = arr[d]; - for (var i = 0 ; i <= counts[index]; i++) { + for (var i = 0; i <= counts[index]; i++) { if (options[index]) { result = result + soul[index][randomNumber(soul[index].length)]; } @@ -101,4 +106,5 @@ module['exports'] = function zalgo(text, options) { } // don't summon him return heComes(text, options); -} +}; + diff --git a/node_modules/colors/lib/extendStringPrototype.js b/node_modules/colors/lib/extendStringPrototype.js index 67374a1c22d10..46fd386a915a6 100644 --- a/node_modules/colors/lib/extendStringPrototype.js +++ b/node_modules/colors/lib/extendStringPrototype.js @@ -1,51 +1,42 @@ var colors = require('./colors'); -module['exports'] = function () { - +module['exports'] = function() { // // Extends prototype of native string object to allow for "foo".red syntax // - var addProperty = function (color, func) { + var addProperty = function(color, func) { String.prototype.__defineGetter__(color, func); }; - var sequencer = function sequencer (map, str) { - return function () { - var exploded = this.split(""), i = 0; - exploded = exploded.map(map); - return exploded.join(""); - } - }; - - addProperty('strip', function () { + addProperty('strip', function() { return colors.strip(this); }); - addProperty('stripColors', function () { + addProperty('stripColors', function() { return colors.strip(this); }); - addProperty("trap", function(){ + addProperty('trap', function() { return colors.trap(this); }); - addProperty("zalgo", function(){ + addProperty('zalgo', function() { return colors.zalgo(this); }); - addProperty("zebra", function(){ + addProperty('zebra', function() { return colors.zebra(this); }); - addProperty("rainbow", function(){ + addProperty('rainbow', function() { return colors.rainbow(this); }); - addProperty("random", function(){ + addProperty('random', function() { return colors.random(this); }); - addProperty("america", function(){ + addProperty('america', function() { return colors.america(this); }); @@ -53,8 +44,8 @@ module['exports'] = function () { // Iterate through all default styles and colors // var x = Object.keys(colors.styles); - x.forEach(function (style) { - addProperty(style, function () { + x.forEach(function(style) { + addProperty(style, function() { return colors.stylize(this, style); }); }); @@ -65,49 +56,55 @@ module['exports'] = function () { // on String that you should not overwrite. // var stringPrototypeBlacklist = [ - '__defineGetter__', '__defineSetter__', '__lookupGetter__', '__lookupSetter__', 'charAt', 'constructor', - 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf', 'charCodeAt', - 'indexOf', 'lastIndexof', 'length', 'localeCompare', 'match', 'replace', 'search', 'slice', 'split', 'substring', - 'toLocaleLowerCase', 'toLocaleUpperCase', 'toLowerCase', 'toUpperCase', 'trim', 'trimLeft', 'trimRight' + '__defineGetter__', '__defineSetter__', '__lookupGetter__', + '__lookupSetter__', 'charAt', 'constructor', 'hasOwnProperty', + 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', + 'valueOf', 'charCodeAt', 'indexOf', 'lastIndexOf', 'length', + 'localeCompare', 'match', 'repeat', 'replace', 'search', 'slice', + 'split', 'substring', 'toLocaleLowerCase', 'toLocaleUpperCase', + 'toLowerCase', 'toUpperCase', 'trim', 'trimLeft', 'trimRight', ]; - Object.keys(theme).forEach(function (prop) { + Object.keys(theme).forEach(function(prop) { if (stringPrototypeBlacklist.indexOf(prop) !== -1) { - console.log('warn: '.red + ('String.prototype' + prop).magenta + ' is probably something you don\'t want to override. Ignoring style name'); - } - else { + console.log('warn: '.red + ('String.prototype' + prop).magenta + + ' is probably something you don\'t want to override. ' + + 'Ignoring style name'); + } else { if (typeof(theme[prop]) === 'string') { colors[prop] = colors[theme[prop]]; - addProperty(prop, function () { - return colors[theme[prop]](this); + addProperty(prop, function() { + return colors[prop](this); }); - } - else { - addProperty(prop, function () { - var ret = this; + } else { + var themePropApplicator = function(str) { + var ret = str || this; for (var t = 0; t < theme[prop].length; t++) { ret = colors[theme[prop][t]](ret); } return ret; - }); + }; + addProperty(prop, themePropApplicator); + colors[prop] = function(str) { + return themePropApplicator(str); + }; } } }); } - colors.setTheme = function (theme) { + colors.setTheme = function(theme) { if (typeof theme === 'string') { - try { - colors.themes[theme] = require(theme); - applyTheme(colors.themes[theme]); - return colors.themes[theme]; - } catch (err) { - console.log(err); - return err; - } + console.log('colors.setTheme now only accepts an object, not a string. ' + + 'If you are trying to set a theme from a file, it is now your (the ' + + 'caller\'s) responsibility to require the file. The old syntax ' + + 'looked like colors.setTheme(__dirname + ' + + '\'/../themes/generic-logging.js\'); The new syntax looks like '+ + 'colors.setTheme(require(__dirname + ' + + '\'/../themes/generic-logging.js\'));'); + return; } else { applyTheme(theme); } }; - -}; \ No newline at end of file +}; diff --git a/node_modules/colors/lib/index.js b/node_modules/colors/lib/index.js index fd0956d03adb6..9df5ab7df3077 100644 --- a/node_modules/colors/lib/index.js +++ b/node_modules/colors/lib/index.js @@ -1,12 +1,13 @@ var colors = require('./colors'); module['exports'] = colors; -// Remark: By default, colors will add style properties to String.prototype +// Remark: By default, colors will add style properties to String.prototype. // -// If you don't wish to extend String.prototype you can do this instead and native String will not be touched +// If you don't wish to extend String.prototype, you can do this instead and +// native String will not be touched: // // var colors = require('colors/safe); // colors.red("foo") // // -require('./extendStringPrototype')(); \ No newline at end of file +require('./extendStringPrototype')(); diff --git a/node_modules/colors/lib/maps/america.js b/node_modules/colors/lib/maps/america.js index a07d8327ff2f4..dc96903328989 100644 --- a/node_modules/colors/lib/maps/america.js +++ b/node_modules/colors/lib/maps/america.js @@ -1,12 +1,10 @@ -var colors = require('../colors'); - -module['exports'] = (function() { - return function (letter, i, exploded) { - if(letter === " ") return letter; - switch(i%3) { +module['exports'] = function(colors) { + return function(letter, i, exploded) { + if (letter === ' ') return letter; + switch (i%3) { case 0: return colors.red(letter); - case 1: return colors.white(letter) - case 2: return colors.blue(letter) + case 1: return colors.white(letter); + case 2: return colors.blue(letter); } - } -})(); \ No newline at end of file + }; +}; diff --git a/node_modules/colors/lib/maps/rainbow.js b/node_modules/colors/lib/maps/rainbow.js index a7ce24e6c15ba..2b00ac0ac998e 100644 --- a/node_modules/colors/lib/maps/rainbow.js +++ b/node_modules/colors/lib/maps/rainbow.js @@ -1,13 +1,12 @@ -var colors = require('../colors'); - -module['exports'] = (function () { - var rainbowColors = ['red', 'yellow', 'green', 'blue', 'magenta']; //RoY G BiV - return function (letter, i, exploded) { - if (letter === " ") { +module['exports'] = function(colors) { + // RoY G BiV + var rainbowColors = ['red', 'yellow', 'green', 'blue', 'magenta']; + return function(letter, i, exploded) { + if (letter === ' ') { return letter; } else { return colors[rainbowColors[i++ % rainbowColors.length]](letter); } }; -})(); +}; diff --git a/node_modules/colors/lib/maps/random.js b/node_modules/colors/lib/maps/random.js index 5cd101fae2b3d..6f8f2f8e1e416 100644 --- a/node_modules/colors/lib/maps/random.js +++ b/node_modules/colors/lib/maps/random.js @@ -1,8 +1,10 @@ -var colors = require('../colors'); - -module['exports'] = (function () { - var available = ['underline', 'inverse', 'grey', 'yellow', 'red', 'green', 'blue', 'white', 'cyan', 'magenta']; +module['exports'] = function(colors) { + var available = ['underline', 'inverse', 'grey', 'yellow', 'red', 'green', + 'blue', 'white', 'cyan', 'magenta']; return function(letter, i, exploded) { - return letter === " " ? letter : colors[available[Math.round(Math.random() * (available.length - 1))]](letter); + return letter === ' ' ? letter : + colors[ + available[Math.round(Math.random() * (available.length - 2))] + ](letter); }; -})(); \ No newline at end of file +}; diff --git a/node_modules/colors/lib/maps/zebra.js b/node_modules/colors/lib/maps/zebra.js index bf7dcdead0722..fa73623544a82 100644 --- a/node_modules/colors/lib/maps/zebra.js +++ b/node_modules/colors/lib/maps/zebra.js @@ -1,5 +1,5 @@ -var colors = require('../colors'); - -module['exports'] = function (letter, i, exploded) { - return i % 2 === 0 ? letter : colors.inverse(letter); -}; \ No newline at end of file +module['exports'] = function(colors) { + return function(letter, i, exploded) { + return i % 2 === 0 ? letter : colors.inverse(letter); + }; +}; diff --git a/node_modules/colors/lib/styles.js b/node_modules/colors/lib/styles.js index 067d59070c2a2..02db9acf7c7db 100644 --- a/node_modules/colors/lib/styles.js +++ b/node_modules/colors/lib/styles.js @@ -65,13 +65,13 @@ var codes = { blueBG: [44, 49], magentaBG: [45, 49], cyanBG: [46, 49], - whiteBG: [47, 49] + whiteBG: [47, 49], }; -Object.keys(codes).forEach(function (key) { +Object.keys(codes).forEach(function(key) { var val = codes[key]; var style = styles[key] = []; style.open = '\u001b[' + val[0] + 'm'; style.close = '\u001b[' + val[1] + 'm'; -}); \ No newline at end of file +}); diff --git a/node_modules/colors/lib/system/has-flag.js b/node_modules/colors/lib/system/has-flag.js new file mode 100644 index 0000000000000..a347dd4d7a697 --- /dev/null +++ b/node_modules/colors/lib/system/has-flag.js @@ -0,0 +1,35 @@ +/* +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +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. +*/ + +'use strict'; + +module.exports = function(flag, argv) { + argv = argv || process.argv; + + var terminatorPos = argv.indexOf('--'); + var prefix = /^-{1,2}/.test(flag) ? '' : '--'; + var pos = argv.indexOf(prefix + flag); + + return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); +}; diff --git a/node_modules/colors/lib/system/supports-colors.js b/node_modules/colors/lib/system/supports-colors.js index 3e008aa93a6a6..f1f9c8ff3da28 100644 --- a/node_modules/colors/lib/system/supports-colors.js +++ b/node_modules/colors/lib/system/supports-colors.js @@ -23,39 +23,129 @@ THE SOFTWARE. */ -var argv = process.argv; +'use strict'; -module.exports = (function () { - if (argv.indexOf('--no-color') !== -1 || - argv.indexOf('--color=false') !== -1) { +var os = require('os'); +var hasFlag = require('./has-flag.js'); + +var env = process.env; + +var forceColor = void 0; +if (hasFlag('no-color') || hasFlag('no-colors') || hasFlag('color=false')) { + forceColor = false; +} else if (hasFlag('color') || hasFlag('colors') || hasFlag('color=true') + || hasFlag('color=always')) { + forceColor = true; +} +if ('FORCE_COLOR' in env) { + forceColor = env.FORCE_COLOR.length === 0 + || parseInt(env.FORCE_COLOR, 10) !== 0; +} + +function translateLevel(level) { + if (level === 0) { return false; } - if (argv.indexOf('--color') !== -1 || - argv.indexOf('--color=true') !== -1 || - argv.indexOf('--color=always') !== -1) { - return true; + return { + level: level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3, + }; +} + +function supportsColor(stream) { + if (forceColor === false) { + return 0; } - if (process.stdout && !process.stdout.isTTY) { - return false; + if (hasFlag('color=16m') || hasFlag('color=full') + || hasFlag('color=truecolor')) { + return 3; + } + + if (hasFlag('color=256')) { + return 2; + } + + if (stream && !stream.isTTY && forceColor !== true) { + return 0; } + var min = forceColor ? 1 : 0; + if (process.platform === 'win32') { - return true; + // Node.js 7.5.0 is the first version of Node.js to include a patch to + // libuv that enables 256 color output on Windows. Anything earlier and it + // won't work. However, here we target Node.js 8 at minimum as it is an LTS + // release, and Node.js 7 is not. Windows 10 build 10586 is the first + // Windows release that supports 256 colors. Windows 10 build 14931 is the + // first release that supports 16m/TrueColor. + var osRelease = os.release().split('.'); + if (Number(process.versions.node.split('.')[0]) >= 8 + && Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } + + return 1; + } + + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(function(sign) { + return sign in env; + }) || env.CI_NAME === 'codeship') { + return 1; + } + + return min; } - if ('COLORTERM' in process.env) { - return true; + if ('TEAMCITY_VERSION' in env) { + return (/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0 + ); } - if (process.env.TERM === 'dumb') { - return false; + if ('TERM_PROGRAM' in env) { + var version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Hyper': + return 3; + case 'Apple_Terminal': + return 2; + // No default + } + } + + if (/-256(color)?$/i.test(env.TERM)) { + return 2; } - if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) { - return true; + if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; } - return false; -})(); \ No newline at end of file + if ('COLORTERM' in env) { + return 1; + } + + if (env.TERM === 'dumb') { + return min; + } + + return min; +} + +function getSupportLevel(stream) { + var level = supportsColor(stream); + return translateLevel(level); +} + +module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr), +}; diff --git a/node_modules/colors/package.json b/node_modules/colors/package.json index 554cbd22e19dc..712ab466de4eb 100644 --- a/node_modules/colors/package.json +++ b/node_modules/colors/package.json @@ -1,40 +1,46 @@ { - "_args": [ - [ - "colors@1.1.2", - "/Users/rebecca/code/npm" - ] - ], - "_from": "colors@1.1.2", - "_id": "colors@1.1.2", + "_from": "colors@^1.1.2", + "_id": "colors@1.3.3", "_inBundle": false, - "_integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "_integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", "_location": "/colors", - "_optional": true, "_phantomChildren": {}, "_requested": { - "type": "version", + "type": "range", "registry": true, - "raw": "colors@1.1.2", + "raw": "colors@^1.1.2", "name": "colors", "escapedName": "colors", - "rawSpec": "1.1.2", + "rawSpec": "^1.1.2", "saveSpec": null, - "fetchSpec": "1.1.2" + "fetchSpec": "^1.1.2" }, "_requiredBy": [ "/cli-table3" ], - "_resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "_spec": "1.1.2", - "_where": "/Users/rebecca/code/npm", + "_resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "_shasum": "39e005d546afe01e01f9c4ca8fa50f686a01205d", + "_spec": "colors@^1.1.2", + "_where": "/Users/aeschright/code/cli/node_modules/cli-table3", "author": { "name": "Marak Squires" }, "bugs": { "url": "https://github.com/Marak/colors.js/issues" }, + "bundleDependencies": false, + "contributors": [ + { + "name": "DABH", + "url": "https://github.com/DABH" + } + ], + "deprecated": false, "description": "get colors in your node.js console", + "devDependencies": { + "eslint": "^5.2.0", + "eslint-config-google": "^0.11.0" + }, "engines": { "node": ">=0.1.90" }, @@ -43,7 +49,9 @@ "lib", "LICENSE", "safe.js", - "themes" + "themes", + "index.d.ts", + "safe.d.ts" ], "homepage": "https://github.com/Marak/colors.js", "keywords": [ @@ -52,14 +60,15 @@ "colors" ], "license": "MIT", - "main": "lib", + "main": "lib/index.js", "name": "colors", "repository": { "type": "git", "url": "git+ssh://git@github.com/Marak/colors.js.git" }, "scripts": { + "lint": "eslint . --fix", "test": "node tests/basic-test.js && node tests/safe-test.js" }, - "version": "1.1.2" + "version": "1.3.3" } diff --git a/node_modules/colors/safe.d.ts b/node_modules/colors/safe.d.ts new file mode 100644 index 0000000000000..2bafc27984e0e --- /dev/null +++ b/node_modules/colors/safe.d.ts @@ -0,0 +1,48 @@ +// Type definitions for Colors.js 1.2 +// Project: https://github.com/Marak/colors.js +// Definitions by: Bart van der Schoor , Staffan Eketorp +// Definitions: https://github.com/Marak/colors.js + +export const enabled: boolean; +export function enable(): void; +export function disable(): void; +export function setTheme(theme: any): void; + +export function strip(str: string): string; +export function stripColors(str: string): string; + +export function black(str: string): string; +export function red(str: string): string; +export function green(str: string): string; +export function yellow(str: string): string; +export function blue(str: string): string; +export function magenta(str: string): string; +export function cyan(str: string): string; +export function white(str: string): string; +export function gray(str: string): string; +export function grey(str: string): string; + +export function bgBlack(str: string): string; +export function bgRed(str: string): string; +export function bgGreen(str: string): string; +export function bgYellow(str: string): string; +export function bgBlue(str: string): string; +export function bgMagenta(str: string): string; +export function bgCyan(str: string): string; +export function bgWhite(str: string): string; + +export function reset(str: string): string; +export function bold(str: string): string; +export function dim(str: string): string; +export function italic(str: string): string; +export function underline(str: string): string; +export function inverse(str: string): string; +export function hidden(str: string): string; +export function strikethrough(str: string): string; + +export function rainbow(str: string): string; +export function zebra(str: string): string; +export function america(str: string): string; +export function trap(str: string): string; +export function random(str: string): string; +export function zalgo(str: string): string; diff --git a/node_modules/colors/safe.js b/node_modules/colors/safe.js index a6a1f3ab47f06..a013d54246485 100644 --- a/node_modules/colors/safe.js +++ b/node_modules/colors/safe.js @@ -1,9 +1,10 @@ // -// Remark: Requiring this file will use the "safe" colors API which will not touch String.prototype +// Remark: Requiring this file will use the "safe" colors API, +// which will not touch String.prototype. // -// var colors = require('colors/safe); +// var colors = require('colors/safe'); // colors.red("foo") // // var colors = require('./lib/colors'); -module['exports'] = colors; \ No newline at end of file +module['exports'] = colors; diff --git a/node_modules/colors/themes/generic-logging.js b/node_modules/colors/themes/generic-logging.js index 571972c1baa82..63adfe4ac31f9 100644 --- a/node_modules/colors/themes/generic-logging.js +++ b/node_modules/colors/themes/generic-logging.js @@ -8,5 +8,5 @@ module['exports'] = { help: 'cyan', warn: 'yellow', debug: 'blue', - error: 'red' -}; \ No newline at end of file + error: 'red', +}; diff --git a/package-lock.json b/package-lock.json index 843d49a5a8586..1317837f9df62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -538,9 +538,9 @@ } }, "cli-table3": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.0.tgz", - "integrity": "sha512-c7YHpUyO1SaKaO7kYtxd5NZ8FjAmSK3LpKkuzdwn+2CwpFxBpdoQLm+OAnnCfoEl7onKhN9PKQi1lsHuAIUqGQ==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", "requires": { "colors": "^1.1.2", "object-assign": "^4.1.0", @@ -650,9 +650,9 @@ "dev": true }, "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", "optional": true }, "columnify": { diff --git a/package.json b/package.json index b3beced7d6faa..627ead1c49742 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "chownr": "^1.1.1", "ci-info": "^2.0.0", "cli-columns": "^3.1.2", - "cli-table3": "^0.5.0", + "cli-table3": "^0.5.1", "cmd-shim": "~2.0.2", "columnify": "~1.5.4", "config-chain": "^1.1.12", From 63aab82c7bfca4f16987cf4156ddebf8d150747c Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Tue, 8 Jan 2019 11:24:31 -0800 Subject: [PATCH 72/97] is-cidr@3.0.0 --- node_modules/cidr-regex/index.js | 6 ++--- node_modules/cidr-regex/package.json | 39 +++++++++++++--------------- node_modules/is-cidr/README.md | 20 ++++++-------- node_modules/is-cidr/index.js | 13 +++++++--- node_modules/is-cidr/package.json | 37 +++++++++++++------------- package-lock.json | 14 +++++----- package.json | 2 +- 7 files changed, 66 insertions(+), 65 deletions(-) diff --git a/node_modules/cidr-regex/index.js b/node_modules/cidr-regex/index.js index 190cefa7bf7ca..f141ce14ad0dd 100644 --- a/node_modules/cidr-regex/index.js +++ b/node_modules/cidr-regex/index.js @@ -5,9 +5,9 @@ const ipRegex = require("ip-regex"); const v4 = ipRegex.v4().source + "\\/(3[0-2]|[12]?[0-9])"; const v6 = ipRegex.v6().source + "\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])"; -const ip = module.exports = opts => opts && opts.exact ? +const cidr = module.exports = opts => opts && opts.exact ? new RegExp(`(?:^${v4}$)|(?:^${v6}$)`) : new RegExp(`(?:${v4})|(?:${v6})`, "g"); -ip.v4 = opts => opts && opts.exact ? new RegExp(`^${v4}$`) : new RegExp(v4, "g"); -ip.v6 = opts => opts && opts.exact ? new RegExp(`^${v6}$`) : new RegExp(v6, "g"); +cidr.v4 = opts => opts && opts.exact ? new RegExp(`^${v4}$`) : new RegExp(v4, "g"); +cidr.v6 = opts => opts && opts.exact ? new RegExp(`^${v6}$`) : new RegExp(v6, "g"); diff --git a/node_modules/cidr-regex/package.json b/node_modules/cidr-regex/package.json index 3aa8b4032c534..4dd1196c17dc0 100644 --- a/node_modules/cidr-regex/package.json +++ b/node_modules/cidr-regex/package.json @@ -1,32 +1,27 @@ { - "_args": [ - [ - "cidr-regex@2.0.9", - "/Users/rebecca/code/npm" - ] - ], - "_from": "cidr-regex@2.0.9", - "_id": "cidr-regex@2.0.9", + "_from": "cidr-regex@^2.0.10", + "_id": "cidr-regex@2.0.10", "_inBundle": false, - "_integrity": "sha512-F7/fBRUU45FnvSPjXdpIrc++WRSBdCiSTlyq4ZNhLKOlHFNWgtzZ0Fd+zrqI/J1j0wmlx/f5ZQDmD2GcbrNcmw==", + "_integrity": "sha512-sB3ogMQXWvreNPbJUZMRApxuRYd+KoIo4RGQ81VatjmMW6WJPo+IJZ2846FGItr9VzKo5w7DXzijPLGtSd0N3Q==", "_location": "/cidr-regex", "_phantomChildren": {}, "_requested": { - "type": "version", + "type": "range", "registry": true, - "raw": "cidr-regex@2.0.9", + "raw": "cidr-regex@^2.0.10", "name": "cidr-regex", "escapedName": "cidr-regex", - "rawSpec": "2.0.9", + "rawSpec": "^2.0.10", "saveSpec": null, - "fetchSpec": "2.0.9" + "fetchSpec": "^2.0.10" }, "_requiredBy": [ "/is-cidr" ], - "_resolved": "https://registry.npmjs.org/cidr-regex/-/cidr-regex-2.0.9.tgz", - "_spec": "2.0.9", - "_where": "/Users/rebecca/code/npm", + "_resolved": "https://registry.npmjs.org/cidr-regex/-/cidr-regex-2.0.10.tgz", + "_shasum": "af13878bd4ad704de77d6dc800799358b3afa70d", + "_spec": "cidr-regex@^2.0.10", + "_where": "/Users/aeschright/code/cli/node_modules/is-cidr", "author": { "name": "silverwind", "email": "me@silverwind.io" @@ -34,6 +29,7 @@ "bugs": { "url": "https://github.com/silverwind/cidr-regex/issues" }, + "bundleDependencies": false, "contributors": [ { "name": "Felipe Apostol", @@ -44,12 +40,13 @@ "dependencies": { "ip-regex": "^2.1.0" }, + "deprecated": false, "description": "Regular expression for matching IP addresses in CIDR notation", "devDependencies": { - "ava": "^0.25.0", - "eslint": "^4.19.1", - "eslint-config-silverwind": "^1.0.42", - "updates": "^3.0.0" + "eslint": "^5.6.0", + "eslint-config-silverwind": "^2.0.9", + "updates": "^4.3.0", + "ver": "^2.0.1" }, "engines": { "node": ">=4" @@ -77,5 +74,5 @@ "scripts": { "test": "make test" }, - "version": "2.0.9" + "version": "2.0.10" } diff --git a/node_modules/is-cidr/README.md b/node_modules/is-cidr/README.md index cd7c8c9686ee2..1fa3ee9ede782 100644 --- a/node_modules/is-cidr/README.md +++ b/node_modules/is-cidr/README.md @@ -7,7 +7,7 @@ ## Install ``` -$ npm install --save is-cidr +npm i is-cidr ``` @@ -16,14 +16,10 @@ $ npm install --save is-cidr ```js const isCidr = require('is-cidr'); -isCidr('192.168.0.1/24'); -//=> true - -isCidr('1:2:3:4:5:6:7:8/64'); -//=> true - -isCidr.v4('1:2:3:4:5:6:7:8/64'); -//=> false +isCidr('192.168.0.1/24'); //=> 4 +isCidr('1:2:3:4:5:6:7:8/64'); //=> 6 +isCidr('10.0.0.0'); //=> 0 +isCidr.v6('10.0.0.0/24'); //=> false ``` @@ -31,15 +27,15 @@ isCidr.v4('1:2:3:4:5:6:7:8/64'); ### isCidr(input) -Check if `input` is a IPv4 or IPv6 CIDR address. +Check if `input` is a IPv4 or IPv6 CIDR address. Returns either `4`, `6` (indicating the IP version) or `0` if the string is not a CIDR. ### isCidr.v4(input) -Check if `input` is a IPv4 CIDR address. +Check if `input` is a IPv4 CIDR address. Returns a boolean. ### isCidr.v6(input) -Check if `input` is a IPv6 CIDR address. +Check if `input` is a IPv6 CIDR address. Returns a boolean. ## Related diff --git a/node_modules/is-cidr/index.js b/node_modules/is-cidr/index.js index b5a5026439913..3eaf906c3542e 100644 --- a/node_modules/is-cidr/index.js +++ b/node_modules/is-cidr/index.js @@ -1,6 +1,13 @@ "use strict"; const cidrRegex = require("cidr-regex"); +const re4 = cidrRegex.v4({exact: true}); +const re6 = cidrRegex.v6({exact: true}); -const isCidr = module.exports = string => cidrRegex({exact: true}).test(string); -isCidr.v4 = string => cidrRegex.v4({exact: true}).test(string); -isCidr.v6 = string => cidrRegex.v6({exact: true}).test(string); +const isCidr = module.exports = str => { + if (re4.test(str)) return 4; + if (re6.test(str)) return 6; + return 0; +}; + +isCidr.v4 = str => re4.test(str); +isCidr.v6 = str => re6.test(str); diff --git a/node_modules/is-cidr/package.json b/node_modules/is-cidr/package.json index 6f735158abcb9..5737794e8c680 100644 --- a/node_modules/is-cidr/package.json +++ b/node_modules/is-cidr/package.json @@ -1,28 +1,28 @@ { - "_from": "is-cidr@2.0.6", - "_id": "is-cidr@2.0.6", + "_from": "is-cidr@3.0.0", + "_id": "is-cidr@3.0.0", "_inBundle": false, - "_integrity": "sha512-A578p1dV22TgPXn6NCaDAPj6vJvYsBgAzUrAd28a4oldeXJjWqEUuSZOLIW3im51mazOKsoyVp8NU/OItlWacw==", + "_integrity": "sha512-8Xnnbjsb0x462VoYiGlhEi+drY8SFwrHiSYuzc/CEwco55vkehTaxAyIjEdpi3EMvLPPJAJi9FlzP+h+03gp0Q==", "_location": "/is-cidr", "_phantomChildren": {}, "_requested": { "type": "version", "registry": true, - "raw": "is-cidr@2.0.6", + "raw": "is-cidr@3.0.0", "name": "is-cidr", "escapedName": "is-cidr", - "rawSpec": "2.0.6", + "rawSpec": "3.0.0", "saveSpec": null, - "fetchSpec": "2.0.6" + "fetchSpec": "3.0.0" }, "_requiredBy": [ "#USER", "/" ], - "_resolved": "https://registry.npmjs.org/is-cidr/-/is-cidr-2.0.6.tgz", - "_shasum": "4b01c9693d8e18399dacd18a4f3d60ea5871ac60", - "_spec": "is-cidr@2.0.6", - "_where": "/Users/rebecca/code/npm", + "_resolved": "https://registry.npmjs.org/is-cidr/-/is-cidr-3.0.0.tgz", + "_shasum": "1acf35c9e881063cd5f696d48959b30fed3eed56", + "_spec": "is-cidr@3.0.0", + "_where": "/Users/aeschright/code/cli", "author": { "name": "silverwind", "email": "me@silverwind.io" @@ -39,18 +39,18 @@ } ], "dependencies": { - "cidr-regex": "^2.0.8" + "cidr-regex": "^2.0.10" }, "deprecated": false, "description": "Check if a string is an IP address in CIDR notation", "devDependencies": { - "ava": "^0.25.0", - "eslint": "^4.19.1", - "eslint-config-silverwind": "^1.0.42", - "updates": "^3.0.0" + "eslint": "^5.7.0", + "eslint-config-silverwind": "^2.0.9", + "updates": "^4.5.2", + "ver": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" }, "files": [ "index.js" @@ -64,7 +64,8 @@ "prefix", "prefixes", "ip", - "ip address" + "ip address", + "network" ], "license": "BSD-2-Clause", "name": "is-cidr", @@ -75,5 +76,5 @@ "scripts": { "test": "make test" }, - "version": "2.0.6" + "version": "3.0.0" } diff --git a/package-lock.json b/package-lock.json index 1317837f9df62..68bf1df87e424 100644 --- a/package-lock.json +++ b/package-lock.json @@ -495,9 +495,9 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "cidr-regex": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/cidr-regex/-/cidr-regex-2.0.9.tgz", - "integrity": "sha512-F7/fBRUU45FnvSPjXdpIrc++WRSBdCiSTlyq4ZNhLKOlHFNWgtzZ0Fd+zrqI/J1j0wmlx/f5ZQDmD2GcbrNcmw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/cidr-regex/-/cidr-regex-2.0.10.tgz", + "integrity": "sha512-sB3ogMQXWvreNPbJUZMRApxuRYd+KoIo4RGQ81VatjmMW6WJPo+IJZ2846FGItr9VzKo5w7DXzijPLGtSd0N3Q==", "requires": { "ip-regex": "^2.1.0" } @@ -2148,11 +2148,11 @@ } }, "is-cidr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/is-cidr/-/is-cidr-2.0.6.tgz", - "integrity": "sha512-A578p1dV22TgPXn6NCaDAPj6vJvYsBgAzUrAd28a4oldeXJjWqEUuSZOLIW3im51mazOKsoyVp8NU/OItlWacw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-cidr/-/is-cidr-3.0.0.tgz", + "integrity": "sha512-8Xnnbjsb0x462VoYiGlhEi+drY8SFwrHiSYuzc/CEwco55vkehTaxAyIjEdpi3EMvLPPJAJi9FlzP+h+03gp0Q==", "requires": { - "cidr-regex": "^2.0.8" + "cidr-regex": "^2.0.10" } }, "is-date-object": { diff --git a/package.json b/package.json index 627ead1c49742..89684e63d7cd4 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "inherits": "~2.0.3", "ini": "^1.3.5", "init-package-json": "^1.10.3", - "is-cidr": "^2.0.6", + "is-cidr": "^3.0.0", "json-parse-better-errors": "^1.0.2", "lazy-property": "~1.0.0", "libcipm": "^3.0.2", From d522bd90c3b0cb08518f249ae5b90bd609fff165 Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Tue, 8 Jan 2019 11:25:20 -0800 Subject: [PATCH 73/97] JSONStream@1.3.5 --- node_modules/JSONStream/index.js | 4 +++- node_modules/JSONStream/package.json | 27 ++++++++++++----------- node_modules/JSONStream/test/parsejson.js | 6 ++++- node_modules/JSONStream/test/run.js | 13 +++++++++++ package-lock.json | 6 ++--- package.json | 2 +- 6 files changed, 39 insertions(+), 19 deletions(-) create mode 100644 node_modules/JSONStream/test/run.js diff --git a/node_modules/JSONStream/index.js b/node_modules/JSONStream/index.js index c3bf14f968304..f4ed901f96560 100755 --- a/node_modules/JSONStream/index.js +++ b/node_modules/JSONStream/index.js @@ -3,6 +3,8 @@ var Parser = require('jsonparse') , through = require('through') +var bufferFrom = Buffer.from && Buffer.from !== Uint8Array.from + /* the value of this.stack that creationix's jsonparse has is weird. @@ -17,7 +19,7 @@ exports.parse = function (path, map) { var parser = new Parser() var stream = through(function (chunk) { if('string' === typeof chunk) - chunk = new Buffer(chunk) + chunk = bufferFrom ? Buffer.from(chunk) : new Buffer(chunk) parser.write(chunk) }, function (data) { diff --git a/node_modules/JSONStream/package.json b/node_modules/JSONStream/package.json index 23588d31b13a4..91783af0b0ab6 100644 --- a/node_modules/JSONStream/package.json +++ b/node_modules/JSONStream/package.json @@ -1,28 +1,29 @@ { - "_from": "JSONStream@1.3.4", - "_id": "JSONStream@1.3.4", + "_from": "JSONStream@1.3.5", + "_id": "JSONStream@1.3.5", "_inBundle": false, - "_integrity": "sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg==", + "_integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "_location": "/JSONStream", "_phantomChildren": {}, "_requested": { "type": "version", "registry": true, - "raw": "JSONStream@1.3.4", + "raw": "JSONStream@1.3.5", "name": "JSONStream", "escapedName": "JSONStream", - "rawSpec": "1.3.4", + "rawSpec": "1.3.5", "saveSpec": null, - "fetchSpec": "1.3.4" + "fetchSpec": "1.3.5" }, "_requiredBy": [ "#USER", - "/" + "/", + "/npm-registry-fetch" ], - "_resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz", - "_shasum": "615bb2adb0cd34c8f4c447b5f6512fa1d8f16a2e", - "_spec": "JSONStream@1.3.4", - "_where": "/Users/zkat/Documents/code/work/npm", + "_resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "_shasum": "3208c1f08d3a4d99261ab64f92302bc15e111ca0", + "_spec": "JSONStream@1.3.5", + "_where": "/Users/aeschright/code/cli", "author": { "name": "Dominic Tarr", "email": "dominic.tarr@gmail.com", @@ -69,7 +70,7 @@ "url": "git://github.com/dominictarr/JSONStream.git" }, "scripts": { - "test": "set -e; for t in test/*.js; do echo '***' $t '***'; node $t; done" + "test": "node test/run.js" }, - "version": "1.3.4" + "version": "1.3.5" } diff --git a/node_modules/JSONStream/test/parsejson.js b/node_modules/JSONStream/test/parsejson.js index a94333446df2a..e70dabc184624 100644 --- a/node_modules/JSONStream/test/parsejson.js +++ b/node_modules/JSONStream/test/parsejson.js @@ -9,6 +9,9 @@ var r = Math.random() , p = new Parser() , assert = require('assert') , times = 20 + , bufferFrom = Buffer.from && Buffer.from !== Uint8Array.from + , str + while (times --) { assert.equal(JSON.parse(JSON.stringify(r)), r, 'core JSON') @@ -18,7 +21,8 @@ while (times --) { assert.equal(v,r) } console.error('correct', r) - p.write (new Buffer(JSON.stringify([r]))) + str = JSON.stringify([r]) + p.write (bufferFrom ? Buffer.from(str) : new Buffer(str)) diff --git a/node_modules/JSONStream/test/run.js b/node_modules/JSONStream/test/run.js new file mode 100644 index 0000000000000..7d62e7385bd44 --- /dev/null +++ b/node_modules/JSONStream/test/run.js @@ -0,0 +1,13 @@ +var readdirSync = require('fs').readdirSync +var spawnSync = require('child_process').spawnSync +var extname = require('path').extname + +var files = readdirSync(__dirname) +files.forEach(function(file){ + if (extname(file) !== '.js' || file === 'run.js') + return + console.log(`*** ${file} ***`) + var result = spawnSync(process.argv0, [file], { stdio: 'inherit', cwd: __dirname} ) + if (result.status !== 0) + process.exit(result.status) +}) diff --git a/package-lock.json b/package-lock.json index 68bf1df87e424..d748186e1e965 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,9 +44,9 @@ "dev": true }, "JSONStream": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz", - "integrity": "sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "requires": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" diff --git a/package.json b/package.json index 89684e63d7cd4..a81cc736cf5db 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "npx": "./bin/npx-cli.js" }, "dependencies": { - "JSONStream": "^1.3.4", + "JSONStream": "^1.3.5", "abbrev": "~1.1.1", "ansicolors": "~0.3.2", "ansistyles": "~0.1.3", From 2a59bfc7989bd5575d8cbba912977c6d1ba92567 Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Tue, 8 Jan 2019 11:26:21 -0800 Subject: [PATCH 74/97] libnpmhook@5.0.2 --- node_modules/libnpmhook/CHANGELOG.md | 30 ++++ node_modules/libnpmhook/README.md | 254 ++++++++++++++++++++++++++- node_modules/libnpmhook/config.js | 13 -- node_modules/libnpmhook/index.js | 107 +++++++---- node_modules/libnpmhook/package.json | 36 ++-- package-lock.json | 12 +- package.json | 1 + 7 files changed, 379 insertions(+), 74 deletions(-) delete mode 100644 node_modules/libnpmhook/config.js diff --git a/node_modules/libnpmhook/CHANGELOG.md b/node_modules/libnpmhook/CHANGELOG.md index 6fe3e05b5e84e..251d1f996dbba 100644 --- a/node_modules/libnpmhook/CHANGELOG.md +++ b/node_modules/libnpmhook/CHANGELOG.md @@ -2,6 +2,36 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [5.0.2](https://github.com/npm/libnpmhook/compare/v5.0.1...v5.0.2) (2018-08-24) + + + + +## [5.0.1](https://github.com/npm/libnpmhook/compare/v5.0.0...v5.0.1) (2018-08-23) + + +### Bug Fixes + +* **deps:** move JSONStream to prod deps ([bb63594](https://github.com/npm/libnpmhook/commit/bb63594)) + + + + +# [5.0.0](https://github.com/npm/libnpmhook/compare/v4.0.1...v5.0.0) (2018-08-21) + + +### Features + +* **api:** overhauled API ([46b271b](https://github.com/npm/libnpmhook/commit/46b271b)) + + +### BREAKING CHANGES + +* **api:** the API for ls() has changed, and rm() no longer errors on 404 + + + ## [4.0.1](https://github.com/npm/libnpmhook/compare/v4.0.0...v4.0.1) (2018-04-09) diff --git a/node_modules/libnpmhook/README.md b/node_modules/libnpmhook/README.md index 0e2f018f2a038..9a13d055317a5 100644 --- a/node_modules/libnpmhook/README.md +++ b/node_modules/libnpmhook/README.md @@ -1,8 +1,20 @@ -# libnpmhook [![npm version](https://img.shields.io/npm/v/libnpmhook.svg)](https://npm.im/libnpmhook) [![license](https://img.shields.io/npm/l/libnpmhook.svg)](https://npm.im/libnpmhook) [![Travis](https://img.shields.io/travis/npm/libnpmhook.svg)](https://travis-ci.org/npm/libnpmhook) [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/npm/libnpmhook?svg=true)](https://ci.appveyor.com/project/npm/libnpmhook) [![Coverage Status](https://coveralls.io/repos/github/npm/libnpmhook/badge.svg?branch=latest)](https://coveralls.io/github/npm/libnpmhook?branch=latest) +# libnpmhook [![npm version](https://img.shields.io/npm/v/libnpmhook.svg)](https://npm.im/libnpmhook) [![license](https://img.shields.io/npm/l/libnpmhook.svg)](https://npm.im/libnpmhook) [![Travis](https://img.shields.io/travis/npm/libnpmhook.svg)](https://travis-ci.org/npm/libnpmhook) [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/zkat/libnpmhook?svg=true)](https://ci.appveyor.com/project/zkat/libnpmhook) [![Coverage Status](https://coveralls.io/repos/github/npm/libnpmhook/badge.svg?branch=latest)](https://coveralls.io/github/npm/libnpmhook?branch=latest) [`libnpmhook`](https://github.com/npm/libnpmhook) is a Node.js library for programmatically managing the npm registry's server-side hooks. +For a more general introduction to managing hooks, see [the introductory blog +post](https://blog.npmjs.org/post/145260155635/introducing-hooks-get-notifications-of-npm). + +## Example + +```js +const hooks = require('libnpmhook') + +console.log(await hooks.ls('mypkg', {token: 'deadbeef'})) +// array of hook objects on `mypkg`. +``` + ## Install `$ npm install libnpmhook` @@ -10,14 +22,246 @@ programmatically managing the npm registry's server-side hooks. ## Table of Contents * [Example](#example) -* [Features](#features) +* [Install](#install) * [API](#api) + * [hook opts](#opts) + * [`add()`](#add) + * [`rm()`](#rm) + * [`ls()`](#ls) + * [`ls.stream()`](#ls-stream) + * [`update()`](#update) + +### API + +#### `opts` for `libnpmhook` commands + +`libnpmhook` uses [`npm-registry-fetch`](https://npm.im/npm-registry-fetch). +All options are passed through directly to that library, so please refer to [its +own `opts` +documentation](https://www.npmjs.com/package/npm-registry-fetch#fetch-options) +for options that can be passed in. -### Example +A couple of options of note for those in a hurry: + +* `opts.token` - can be passed in and will be used as the authentication token for the registry. For other ways to pass in auth details, see the n-r-f docs. +* `opts.otp` - certain operations will require an OTP token to be passed in. If a `libnpmhook` command fails with `err.code === EOTP`, please retry the request with `{otp: <2fa token>}` +* `opts.Promise` - If you pass this in, the Promises returned by `libnpmhook` commands will use this Promise class instead. For example: `{Promise: require('bluebird')}` + +#### `> hooks.add(name, endpoint, secret, [opts]) -> Promise` + +`name` is the name of the package, org, or user/org scope to watch. The type is +determined by the name syntax: `'@foo/bar'` and `'foo'` are treated as packages, +`@foo` is treated as a scope, and `~user` is treated as an org name or scope. +Each type will attach to different events. + +The `endpoint` should be a fully-qualified http URL for the endpoint the hook +will send its payload to when it fires. `secret` is a shared secret that the +hook will send to that endpoint to verify that it's actually coming from the +registry hook. + +The returned Promise resolves to the full hook object that was created, +including its generated `id`. + +See also: [`POST +/v1/hooks/hook`](https://github.com/npm/registry/blob/master/docs/hooks/endpoints.md#post-v1hookshook) + +##### Example ```javascript +await hooks.add('~zkat', 'https://zkat.tech/api/added', 'supersekrit', { + token: 'myregistrytoken', + otp: '694207' +}) + +=> + +{ id: '16f7xoal', + username: 'zkat', + name: 'zkat', + endpoint: 'https://zkat.tech/api/added', + secret: 'supersekrit', + type: 'owner', + created: '2018-08-21T20:05:25.125Z', + updated: '2018-08-21T20:05:25.125Z', + deleted: false, + delivered: false, + last_delivery: null, + response_code: 0, + status: 'active' } ``` -### Features +#### `> hooks.find(id, [opts]) -> Promise` -### API +Returns the hook identified by `id`. + +The returned Promise resolves to the full hook object that was found, or error +with `err.code` of `'E404'` if it didn't exist. + +See also: [`GET +/v1/hooks/hook/:id`](https://github.com/npm/registry/blob/master/docs/hooks/endpoints.md#get-v1hookshookid) + +##### Example + +```javascript +await hooks.find('16f7xoal', {token: 'myregistrytoken'}) + +=> + +{ id: '16f7xoal', + username: 'zkat', + name: 'zkat', + endpoint: 'https://zkat.tech/api/added', + secret: 'supersekrit', + type: 'owner', + created: '2018-08-21T20:05:25.125Z', + updated: '2018-08-21T20:05:25.125Z', + deleted: false, + delivered: false, + last_delivery: null, + response_code: 0, + status: 'active' } +``` + +#### `> hooks.rm(id, [opts]) -> Promise` + +Removes the hook identified by `id`. + +The returned Promise resolves to the full hook object that was removed, if it +existed, or `null` if no such hook was there (instead of erroring). + +See also: [`DELETE +/v1/hooks/hook/:id`](https://github.com/npm/registry/blob/master/docs/hooks/endpoints.md#delete-v1hookshookid) + +##### Example + +```javascript +await hooks.rm('16f7xoal', { + token: 'myregistrytoken', + otp: '694207' +}) + +=> + +{ id: '16f7xoal', + username: 'zkat', + name: 'zkat', + endpoint: 'https://zkat.tech/api/added', + secret: 'supersekrit', + type: 'owner', + created: '2018-08-21T20:05:25.125Z', + updated: '2018-08-21T20:05:25.125Z', + deleted: true, + delivered: false, + last_delivery: null, + response_code: 0, + status: 'active' } + +// Repeat it... +await hooks.rm('16f7xoal', { + token: 'myregistrytoken', + otp: '694207' +}) + +=> null +``` + +#### `> hooks.update(id, endpoint, secret, [opts]) -> Promise` + +The `id` should be a hook ID from a previously-created hook. + +The `endpoint` should be a fully-qualified http URL for the endpoint the hook +will send its payload to when it fires. `secret` is a shared secret that the +hook will send to that endpoint to verify that it's actually coming from the +registry hook. + +The returned Promise resolves to the full hook object that was updated, if it +existed. Otherwise, it will error with an `'E404'` error code. + +See also: [`PUT +/v1/hooks/hook/:id`](https://github.com/npm/registry/blob/master/docs/hooks/endpoints.md#put-v1hookshookid) + +##### Example + +```javascript +await hooks.update('16fxoal', 'https://zkat.tech/api/other', 'newsekrit', { + token: 'myregistrytoken', + otp: '694207' +}) + +=> + +{ id: '16f7xoal', + username: 'zkat', + name: 'zkat', + endpoint: 'https://zkat.tech/api/other', + secret: 'newsekrit', + type: 'owner', + created: '2018-08-21T20:05:25.125Z', + updated: '2018-08-21T20:14:41.964Z', + deleted: false, + delivered: false, + last_delivery: null, + response_code: 0, + status: 'active' } +``` + +#### `> hooks.ls([opts]) -> Promise` + +Resolves to an array of hook objects associated with the account you're +authenticated as. + +Results can be further filtered with three values that can be passed in through +`opts`: + +* `opts.package` - filter results by package name +* `opts.limit` - maximum number of hooks to return +* `opts.offset` - pagination offset for results (use with `opts.limit`) + +See also: + * [`hooks.ls.stream()`](#ls-stream) + * [`GET +/v1/hooks`](https://github.com/npm/registry/blob/master/docs/hooks/endpoints.md#get-v1hooks) + +##### Example + +```javascript +await hooks.ls({token: 'myregistrytoken'}) + +=> +[ + { id: '16f7xoal', ... }, + { id: 'wnyf98a1', ... }, + ... +] +``` + +#### `> hooks.ls.stream([opts]) -> Stream` + +Returns a stream of hook objects associated with the account you're +authenticated as. The returned stream is a valid `Symbol.asyncIterator` on +`node@>=10`. + +Results can be further filtered with three values that can be passed in through +`opts`: + +* `opts.package` - filter results by package name +* `opts.limit` - maximum number of hooks to return +* `opts.offset` - pagination offset for results (use with `opts.limit`) + +See also: + * [`hooks.ls()`](#ls) + * [`GET +/v1/hooks`](https://github.com/npm/registry/blob/master/docs/hooks/endpoints.md#get-v1hooks) + +##### Example + +```javascript +for await (let hook of hooks.ls.stream({token: 'myregistrytoken'})) { + console.log('found hook:', hook.id) +} + +=> +// outputs: +// found hook: 16f7xoal +// found hook: wnyf98a1 +``` diff --git a/node_modules/libnpmhook/config.js b/node_modules/libnpmhook/config.js deleted file mode 100644 index 864e1ede6af6a..0000000000000 --- a/node_modules/libnpmhook/config.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -const pudding = require('figgy-pudding') - -const NpmHooksConfig = pudding() - -module.exports = config -function config (opts) { - return NpmHooksConfig.apply( - null, - [opts, opts.config].concat([].slice.call(arguments, 1)) - ) -} diff --git a/node_modules/libnpmhook/index.js b/node_modules/libnpmhook/index.js index b59ff842e2545..b489294951dd0 100644 --- a/node_modules/libnpmhook/index.js +++ b/node_modules/libnpmhook/index.js @@ -1,41 +1,80 @@ 'use strict' -const config = require('./config') const fetch = require('npm-registry-fetch') +const figgyPudding = require('figgy-pudding') +const getStream = require('get-stream') +const validate = require('aproba') -module.exports = { - add (name, endpoint, secret, opts) { - let type = 'package' - if (name && name.match(/^@[^/]+$/)) { - type = 'scope' - } - if (name && name[0] === '~') { - type = 'owner' - name = name.substr(1) - } +const HooksConfig = figgyPudding({ + package: {}, + limit: {}, + offset: {}, + Promise: {default: () => Promise} +}) - opts = config({ - method: 'POST', - body: { type, name, endpoint, secret } - }, opts) - return fetch.json('/-/npm/v1/hooks/hook', opts) - }, - - rm (id, opts) { - return fetch.json(`/-/npm/v1/hooks/hook/${encodeURIComponent(id)}`, config({ - method: 'DELETE' - }, opts)) - }, - - ls (pkg, opts) { - return fetch.json('/-/npm/v1/hooks', config({query: pkg && {package: pkg}}, opts)) - .then(json => json.objects) - }, - - update (id, endpoint, secret, opts) { - return fetch.json(`/-/npm/v1/hooks/hook/${encodeURIComponent(id)}`, config({ - method: 'PUT', - body: {endpoint, secret} - }, opts)) +const eu = encodeURIComponent +const cmd = module.exports = {} +cmd.add = (name, endpoint, secret, opts) => { + opts = HooksConfig(opts) + validate('SSSO', [name, endpoint, secret, opts]) + let type = 'package' + if (name.match(/^@[^/]+$/)) { + type = 'scope' } + if (name[0] === '~') { + type = 'owner' + name = name.substr(1) + } + return fetch.json('/-/npm/v1/hooks/hook', opts.concat({ + method: 'POST', + body: { type, name, endpoint, secret } + })) +} + +cmd.rm = (id, opts) => { + opts = HooksConfig(opts) + validate('SO', [id, opts]) + return fetch.json(`/-/npm/v1/hooks/hook/${eu(id)}`, opts.concat({ + method: 'DELETE' + }, opts)).catch(err => { + if (err.code === 'E404') { + return null + } else { + throw err + } + }) +} + +cmd.update = (id, endpoint, secret, opts) => { + opts = HooksConfig(opts) + validate('SSSO', [id, endpoint, secret, opts]) + return fetch.json(`/-/npm/v1/hooks/hook/${eu(id)}`, opts.concat({ + method: 'PUT', + body: {endpoint, secret} + }, opts)) +} + +cmd.find = (id, opts) => { + opts = HooksConfig(opts) + validate('SO', [id, opts]) + return fetch.json(`/-/npm/v1/hooks/hook/${eu(id)}`, opts) +} + +cmd.ls = (opts) => { + return getStream.array(cmd.ls.stream(opts)) +} + +cmd.ls.stream = (opts) => { + opts = HooksConfig(opts) + const {package: pkg, limit, offset} = opts + validate('S|Z', [pkg]) + validate('N|Z', [limit]) + validate('N|Z', [offset]) + return fetch.json.stream('/-/npm/v1/hooks', 'objects.*', opts.concat({ + query: { + package: pkg, + limit, + offset + } + })) } diff --git a/node_modules/libnpmhook/package.json b/node_modules/libnpmhook/package.json index 84839475be2eb..ebcc752a3c350 100644 --- a/node_modules/libnpmhook/package.json +++ b/node_modules/libnpmhook/package.json @@ -1,28 +1,28 @@ { - "_from": "libnpmhook@4.0.1", - "_id": "libnpmhook@4.0.1", + "_from": "libnpmhook@5.0.2", + "_id": "libnpmhook@5.0.2", "_inBundle": false, - "_integrity": "sha512-3qqpfqvBD1712WA6iGe0stkG40WwAeoWcujA6BlC0Be1JArQbqwabnEnZ0CRcD05Tf1fPYJYdCbSfcfedEJCOg==", + "_integrity": "sha512-vLenmdFWhRfnnZiNFPNMog6CK7Ujofy2TWiM2CrpZUjBRIhHkJeDaAbJdYCT6W4lcHtyrJR8yXW8KFyq6UAp1g==", "_location": "/libnpmhook", "_phantomChildren": {}, "_requested": { "type": "version", "registry": true, - "raw": "libnpmhook@4.0.1", + "raw": "libnpmhook@5.0.2", "name": "libnpmhook", "escapedName": "libnpmhook", - "rawSpec": "4.0.1", + "rawSpec": "5.0.2", "saveSpec": null, - "fetchSpec": "4.0.1" + "fetchSpec": "5.0.2" }, "_requiredBy": [ "#USER", "/" ], - "_resolved": "https://registry.npmjs.org/libnpmhook/-/libnpmhook-4.0.1.tgz", - "_shasum": "63641654de772cbeb96a88527a7fd5456ec3c2d7", - "_spec": "libnpmhook@4.0.1", - "_where": "/Users/zkat/Documents/code/work/npm", + "_resolved": "https://registry.npmjs.org/libnpmhook/-/libnpmhook-5.0.2.tgz", + "_shasum": "d12817b0fb893f36f1d5be20017f2aea25825d94", + "_spec": "libnpmhook@5.0.2", + "_where": "/Users/aeschright/code/cli", "author": { "name": "Kat Marchán", "email": "kzm@sykosomatic.org" @@ -32,16 +32,18 @@ }, "bundleDependencies": false, "dependencies": { - "figgy-pudding": "^3.1.0", - "npm-registry-fetch": "^3.0.0" + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^3.8.0" }, "deprecated": false, "description": "programmatic API for managing npm registry hooks", "devDependencies": { - "nock": "^9.2.3", + "nock": "^9.6.1", "standard": "^11.0.1", - "standard-version": "^4.3.0", - "tap": "^11.1.3", + "standard-version": "^4.4.0", + "tap": "^12.0.1", "weallbehave": "^1.2.0", "weallcontribute": "^1.0.8" }, @@ -68,9 +70,9 @@ "prerelease": "npm t", "pretest": "standard", "release": "standard-version -s", - "test": "tap -J --coverage test/*.js", + "test": "tap -J --100 --coverage test/*.js", "update-coc": "weallbehave -o . && git add CODE_OF_CONDUCT.md && git commit -m 'docs(coc): updated CODE_OF_CONDUCT.md'", "update-contrib": "weallcontribute -o . && git add CONTRIBUTING.md && git commit -m 'docs(contributing): updated CONTRIBUTING.md'" }, - "version": "4.0.1" + "version": "5.0.2" } diff --git a/package-lock.json b/package-lock.json index d748186e1e965..7284d1076407b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2519,12 +2519,14 @@ } }, "libnpmhook": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/libnpmhook/-/libnpmhook-4.0.1.tgz", - "integrity": "sha512-3qqpfqvBD1712WA6iGe0stkG40WwAeoWcujA6BlC0Be1JArQbqwabnEnZ0CRcD05Tf1fPYJYdCbSfcfedEJCOg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/libnpmhook/-/libnpmhook-5.0.2.tgz", + "integrity": "sha512-vLenmdFWhRfnnZiNFPNMog6CK7Ujofy2TWiM2CrpZUjBRIhHkJeDaAbJdYCT6W4lcHtyrJR8yXW8KFyq6UAp1g==", "requires": { - "figgy-pudding": "^3.1.0", - "npm-registry-fetch": "^3.0.0" + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^3.8.0" } }, "libnpmorg": { diff --git a/package.json b/package.json index a81cc736cf5db..eb43becb72048 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ "lazy-property": "~1.0.0", "libcipm": "^3.0.2", "libnpm": "^2.0.1", + "libnpmhook": "^5.0.2", "libnpx": "^10.2.0", "lock-verify": "^2.0.2", "lockfile": "^1.0.4", From 66d60e394e5a96330f90e230505758f19a3643ac Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Tue, 8 Jan 2019 11:49:20 -0800 Subject: [PATCH 75/97] marked@0.6.0 --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7284d1076407b..c332bf5572875 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2816,9 +2816,9 @@ } }, "marked": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.5.2.tgz", - "integrity": "sha512-fdZvBa7/vSQIZCi4uuwo2N3q+7jJURpMVCcbaX0S1Mg65WZ5ilXvC67MviJAsdjqqgD+CEq4RKo5AYGgINkVAA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.0.tgz", + "integrity": "sha512-HduzIW2xApSXKXJSpCipSxKyvMbwRRa/TwMbepmlZziKdH8548WSoDP4SxzulEKjlo8BE39l+2fwJZuRKOln6g==", "dev": true }, "marked-man": { diff --git a/package.json b/package.json index eb43becb72048..585e5a262e01a 100644 --- a/package.json +++ b/package.json @@ -270,7 +270,7 @@ "deep-equal": "^1.0.1", "get-stream": "^4.1.0", "licensee": "^5.0.0", - "marked": "^0.5.2", + "marked": "^0.6.0", "marked-man": "^0.2.1", "npm-registry-couchapp": "^2.7.1", "npm-registry-mock": "^1.1.0", From 8213def9aa9b6e702887e4f2ed7654943e1e4154 Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Tue, 8 Jan 2019 11:53:15 -0800 Subject: [PATCH 76/97] npm-packlist@1.2.0 --- node_modules/npm-packlist/index.js | 6 +++++- node_modules/npm-packlist/package.json | 22 +++++++++++----------- package-lock.json | 6 +++--- package.json | 2 +- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/node_modules/npm-packlist/index.js b/node_modules/npm-packlist/index.js index 2cdd37ec3df06..110a344cb04d9 100644 --- a/node_modules/npm-packlist/index.js +++ b/node_modules/npm-packlist/index.js @@ -57,7 +57,11 @@ const npmWalker = Class => class Walker extends Class { opt.includeEmpty = false opt.path = opt.path || process.cwd() - opt.follow = path.basename(opt.path) === 'node_modules' + const dirName = path.basename(opt.path) + const parentName = path.basename(path.dirname(opt.path)) + opt.follow = + dirName === 'node_modules' || + (parentName === 'node_modules' && /^@/.test(dirName)) super(opt) // ignore a bunch of things by default at the root level. diff --git a/node_modules/npm-packlist/package.json b/node_modules/npm-packlist/package.json index f1188c393f2c9..d37a7bd1bb4f6 100644 --- a/node_modules/npm-packlist/package.json +++ b/node_modules/npm-packlist/package.json @@ -1,29 +1,29 @@ { - "_from": "npm-packlist@1.1.12", - "_id": "npm-packlist@1.1.12", + "_from": "npm-packlist@1.2.0", + "_id": "npm-packlist@1.2.0", "_inBundle": false, - "_integrity": "sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g==", + "_integrity": "sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==", "_location": "/npm-packlist", "_phantomChildren": {}, "_requested": { "type": "version", "registry": true, - "raw": "npm-packlist@1.1.12", + "raw": "npm-packlist@1.2.0", "name": "npm-packlist", "escapedName": "npm-packlist", - "rawSpec": "1.1.12", + "rawSpec": "1.2.0", "saveSpec": null, - "fetchSpec": "1.1.12" + "fetchSpec": "1.2.0" }, "_requiredBy": [ "#USER", "/", "/pacote" ], - "_resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.12.tgz", - "_shasum": "22bde2ebc12e72ca482abd67afc51eb49377243a", - "_spec": "npm-packlist@1.1.12", - "_where": "/Users/zkat/Documents/code/work/npm", + "_resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.2.0.tgz", + "_shasum": "55a60e793e272f00862c7089274439a4cc31fc7f", + "_spec": "npm-packlist@1.2.0", + "_where": "/Users/aeschright/code/cli", "author": { "name": "Isaac Z. Schlueter", "email": "i@izs.me", @@ -64,5 +64,5 @@ "preversion": "npm test", "test": "tap test/*.js --100 -J" }, - "version": "1.1.12" + "version": "1.2.0" } diff --git a/package-lock.json b/package-lock.json index c332bf5572875..74c15603f8216 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3131,9 +3131,9 @@ } }, "npm-packlist": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.12.tgz", - "integrity": "sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.2.0.tgz", + "integrity": "sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==", "requires": { "ignore-walk": "^3.0.1", "npm-bundled": "^1.0.1" diff --git a/package.json b/package.json index 585e5a262e01a..386ba3d8b63e0 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "npm-install-checks": "~3.0.0", "npm-lifecycle": "^2.1.0", "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.12", + "npm-packlist": "^1.2.0", "npm-pick-manifest": "^2.1.0", "npm-registry-fetch": "^3.8.0", "npm-user-validate": "~1.0.0", From e4ffc6a2bfb8d0b7047cb6692030484760fc8c91 Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Tue, 8 Jan 2019 13:12:58 -0800 Subject: [PATCH 77/97] unique-filename@1.1.1 --- node_modules/unique-filename/.npmignore | 5 ---- node_modules/unique-filename/LICENSE | 5 ++++ node_modules/unique-filename/package.json | 36 ++++++++++------------- package-lock.json | 6 ++-- package.json | 2 +- 5 files changed, 24 insertions(+), 30 deletions(-) delete mode 100644 node_modules/unique-filename/.npmignore create mode 100644 node_modules/unique-filename/LICENSE diff --git a/node_modules/unique-filename/.npmignore b/node_modules/unique-filename/.npmignore deleted file mode 100644 index 1ab9fa63f542d..0000000000000 --- a/node_modules/unique-filename/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -*~ -.#* -DEADJOE - -node_modules diff --git a/node_modules/unique-filename/LICENSE b/node_modules/unique-filename/LICENSE new file mode 100644 index 0000000000000..69619c125ea7e --- /dev/null +++ b/node_modules/unique-filename/LICENSE @@ -0,0 +1,5 @@ +Copyright npm, Inc + +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/node_modules/unique-filename/package.json b/node_modules/unique-filename/package.json index f0b7074b28790..293cc3489c3b2 100644 --- a/node_modules/unique-filename/package.json +++ b/node_modules/unique-filename/package.json @@ -1,36 +1,28 @@ { - "_args": [ - [ - "unique-filename@1.1.0", - "/Users/rebecca/code/npm" - ] - ], - "_from": "unique-filename@1.1.0", - "_id": "unique-filename@1.1.0", + "_from": "unique-filename@1.1.1", + "_id": "unique-filename@1.1.1", "_inBundle": false, - "_integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "_integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "_location": "/unique-filename", "_phantomChildren": {}, "_requested": { "type": "version", "registry": true, - "raw": "unique-filename@1.1.0", + "raw": "unique-filename@1.1.1", "name": "unique-filename", "escapedName": "unique-filename", - "rawSpec": "1.1.0", + "rawSpec": "1.1.1", "saveSpec": null, - "fetchSpec": "1.1.0" + "fetchSpec": "1.1.1" }, "_requiredBy": [ - "/", - "/cacache", - "/npm-profile/cacache", - "/npm-registry-fetch/cacache", - "/pacote" + "#USER", + "/" ], - "_resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", - "_spec": "1.1.0", - "_where": "/Users/rebecca/code/npm", + "_resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "_shasum": "1d69769369ada0583103a1e6ae87681b56573230", + "_spec": "unique-filename@1.1.1", + "_where": "/Users/aeschright/code/cli", "author": { "name": "Rebecca Turner", "email": "me@re-becca.org", @@ -39,9 +31,11 @@ "bugs": { "url": "https://github.com/iarna/unique-filename/issues" }, + "bundleDependencies": false, "dependencies": { "unique-slug": "^2.0.0" }, + "deprecated": false, "description": "Generate a unique filename for use in temporary directories or caches.", "devDependencies": { "standard": "^5.4.1", @@ -59,5 +53,5 @@ "scripts": { "test": "standard && tap test" }, - "version": "1.1.0" + "version": "1.1.1" } diff --git a/package-lock.json b/package-lock.json index 74c15603f8216..3ff93209382be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7556,9 +7556,9 @@ "dev": true }, "unique-filename": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", - "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "requires": { "unique-slug": "^2.0.0" } diff --git a/package.json b/package.json index 386ba3d8b63e0..d7ae101c3c3b8 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "tiny-relative-date": "^1.3.0", "uid-number": "0.0.6", "umask": "~1.1.0", - "unique-filename": "~1.1.0", + "unique-filename": "^1.1.1", "unpipe": "~1.0.0", "update-notifier": "^2.5.0", "uuid": "^3.3.2", From 09a5c2fabe0d1c00ec8c99f328f6d28a3495eb0b Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Tue, 8 Jan 2019 13:18:44 -0800 Subject: [PATCH 78/97] semver@5.6.0 --- node_modules/semver/README.md | 21 ++- node_modules/semver/bin/semver | 18 ++- node_modules/semver/package.json | 29 ++-- node_modules/semver/semver.js | 236 +++++++++++++++++-------------- package-lock.json | 6 +- package.json | 2 +- 6 files changed, 180 insertions(+), 132 deletions(-) diff --git a/node_modules/semver/README.md b/node_modules/semver/README.md index 9f7161e2cef59..e0edbb7333112 100644 --- a/node_modules/semver/README.md +++ b/node_modules/semver/README.md @@ -29,8 +29,6 @@ As a command-line utility: ``` $ semver -h -SemVer 5.3.0 - A JavaScript implementation of the http://semver.org/ specification Copyright Isaac Z. Schlueter @@ -54,6 +52,9 @@ Options: -l --loose Interpret versions and ranges loosely +-p --include-prerelease + Always include prerelease versions in range matching + -c --coerce Coerce a string into SemVer if possible (does not imply --loose) @@ -289,9 +290,19 @@ part ::= nr | [-0-9A-Za-z]+ ## Functions -All methods and classes take a final `loose` 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. +All methods and classes take a final `options` object argument. All +options in this object are `false` by default. The options supported +are: + +- `loose` Be more forgiving about not-quite-valid semver strings. + (Any resulting output will always be 100% strict compliant, of + course.) For backwards compatibility reasons, if the `options` + argument is a boolean value instead of an object, it is interpreted + to be the `loose` param. +- `includePrerelease` Set to suppress the [default + behavior](https://github.com/npm/node-semver#prerelease-tags) of + excluding prerelease tagged versions from ranges unless they are + explicitly opted into. Strict-mode Comparators and Ranges will be strict about the SemVer strings that they parse. diff --git a/node_modules/semver/bin/semver b/node_modules/semver/bin/semver index dddbcdf118061..9100ed42b8821 100755 --- a/node_modules/semver/bin/semver +++ b/node_modules/semver/bin/semver @@ -12,10 +12,12 @@ var argv = process.argv.slice(2) , inc = null , version = require("../package.json").version , loose = false + , includePrerelease = false , coerce = false , identifier = undefined , semver = require("../semver") , reverse = false + , options = {} main() @@ -35,6 +37,9 @@ function main () { case "-l": case "--loose": loose = true break + case "-p": case "--include-prerelease": + includePrerelease = true + break case "-v": case "--version": versions.push(argv.shift()) break @@ -66,6 +71,8 @@ function main () { } } + var options = { loose: loose, includePrerelease: includePrerelease } + versions = versions.map(function (v) { return coerce ? (semver.coerce(v) || {version: v}).version : v }).filter(function (v) { @@ -77,7 +84,7 @@ function main () { for (var i = 0, l = range.length; i < l ; i ++) { versions = versions.filter(function (v) { - return semver.satisfies(v, range[i], loose) + return semver.satisfies(v, range[i], options) }) if (!versions.length) return fail() } @@ -94,11 +101,11 @@ function fail () { process.exit(1) } function success () { var compare = reverse ? "rcompare" : "compare" versions.sort(function (a, b) { - return semver[compare](a, b, loose) + return semver[compare](a, b, options) }).map(function (v) { - return semver.clean(v, loose) + return semver.clean(v, options) }).map(function (v) { - return inc ? semver.inc(v, inc, loose, identifier) : v + return inc ? semver.inc(v, inc, options, identifier) : v }).forEach(function (v,i,_) { console.log(v) }) } @@ -128,6 +135,9 @@ function help () { ,"-l --loose" ," Interpret versions and ranges loosely" ,"" + ,"-p --include-prerelease" + ," Always include prerelease versions in range matching" + ,"" ,"-c --coerce" ," Coerce a string into SemVer if possible" ," (does not imply --loose)" diff --git a/node_modules/semver/package.json b/node_modules/semver/package.json index 1262827cc6a7b..2d1c04f1b9f2c 100644 --- a/node_modules/semver/package.json +++ b/node_modules/semver/package.json @@ -1,19 +1,19 @@ { - "_from": "semver@5.5.1", - "_id": "semver@5.5.1", + "_from": "semver@5.6.0", + "_id": "semver@5.6.0", "_inBundle": false, - "_integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", + "_integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "_location": "/semver", "_phantomChildren": {}, "_requested": { - "type": "tag", + "type": "version", "registry": true, - "raw": "semver@5.5.1", + "raw": "semver@5.6.0", "name": "semver", "escapedName": "semver", - "rawSpec": "5.5.1", + "rawSpec": "5.6.0", "saveSpec": null, - "fetchSpec": "5.5.1" + "fetchSpec": "5.6.0" }, "_requiredBy": [ "#USER", @@ -21,22 +21,21 @@ "/eslint", "/eslint-plugin-node", "/init-package-json", - "/libcipm/pacote", + "/libnpmpublish", + "/licensee", "/lock-verify", "/normalize-package-data", "/npm-install-checks", "/npm-package-arg", "/npm-pick-manifest", - "/npm-registry-client", "/package-json", - "/pacote", "/read-installed", "/semver-diff" ], - "_resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "_shasum": "7dfdd8814bdb7cabc7be0fb1d734cfb66c940477", - "_spec": "semver@5.5.1", - "_where": "/Users/rebecca/code/npm", + "_resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "_shasum": "7e74256fbaa49c75aa7c7a205cc22799cac80004", + "_spec": "semver@5.6.0", + "_where": "/Users/aeschright/code/cli", "bin": { "semver": "./bin/semver" }, @@ -65,5 +64,5 @@ "scripts": { "test": "tap test/*.js --cov -J" }, - "version": "5.5.1" + "version": "5.6.0" } diff --git a/node_modules/semver/semver.js b/node_modules/semver/semver.js index 9cf9f6e57ce30..0cc57350c2c8e 100644 --- a/node_modules/semver/semver.js +++ b/node_modules/semver/semver.js @@ -245,7 +245,10 @@ for (var i = 0; i < R; i++) { } exports.parse = parse; -function parse(version, loose) { +function parse(version, options) { + if (!options || typeof options !== 'object') + options = { loose: !!options, includePrerelease: false } + if (version instanceof SemVer) return version; @@ -255,35 +258,37 @@ function parse(version, loose) { if (version.length > MAX_LENGTH) return null; - var r = loose ? re[LOOSE] : re[FULL]; + var r = options.loose ? re[LOOSE] : re[FULL]; if (!r.test(version)) return null; try { - return new SemVer(version, loose); + return new SemVer(version, options); } catch (er) { return null; } } exports.valid = valid; -function valid(version, loose) { - var v = parse(version, loose); +function valid(version, options) { + var v = parse(version, options); return v ? v.version : null; } exports.clean = clean; -function clean(version, loose) { - var s = parse(version.trim().replace(/^[=v]+/, ''), loose); +function clean(version, options) { + var s = parse(version.trim().replace(/^[=v]+/, ''), options); return s ? s.version : null; } exports.SemVer = SemVer; -function SemVer(version, loose) { +function SemVer(version, options) { + if (!options || typeof options !== 'object') + options = { loose: !!options, includePrerelease: false } if (version instanceof SemVer) { - if (version.loose === loose) + if (version.loose === options.loose) return version; else version = version.version; @@ -295,11 +300,13 @@ function SemVer(version, loose) { throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') if (!(this instanceof SemVer)) - return new SemVer(version, loose); + return new SemVer(version, options); + + debug('SemVer', version, options); + this.options = options; + this.loose = !!options.loose; - debug('SemVer', version, loose); - this.loose = loose; - var m = version.trim().match(loose ? re[LOOSE] : re[FULL]); + var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL]); if (!m) throw new TypeError('Invalid Version: ' + version); @@ -349,16 +356,16 @@ SemVer.prototype.toString = function() { }; SemVer.prototype.compare = function(other) { - debug('SemVer.compare', this.version, this.loose, other); + debug('SemVer.compare', this.version, this.options, other); if (!(other instanceof SemVer)) - other = new SemVer(other, this.loose); + other = new SemVer(other, this.options); return this.compareMain(other) || this.comparePre(other); }; SemVer.prototype.compareMain = function(other) { if (!(other instanceof SemVer)) - other = new SemVer(other, this.loose); + other = new SemVer(other, this.options); return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || @@ -367,7 +374,7 @@ SemVer.prototype.compareMain = function(other) { SemVer.prototype.comparePre = function(other) { if (!(other instanceof SemVer)) - other = new SemVer(other, this.loose); + other = new SemVer(other, this.options); // NOT having a prerelease is > having one if (this.prerelease.length && !other.prerelease.length) @@ -658,19 +665,23 @@ function cmp(a, op, b, loose) { } exports.Comparator = Comparator; -function Comparator(comp, loose) { +function Comparator(comp, options) { + if (!options || typeof options !== 'object') + options = { loose: !!options, includePrerelease: false } + if (comp instanceof Comparator) { - if (comp.loose === loose) + if (comp.loose === !!options.loose) return comp; else comp = comp.value; } if (!(this instanceof Comparator)) - return new Comparator(comp, loose); + return new Comparator(comp, options); - debug('comparator', comp, loose); - this.loose = loose; + debug('comparator', comp, options); + this.options = options; + this.loose = !!options.loose; this.parse(comp); if (this.semver === ANY) @@ -683,7 +694,7 @@ function Comparator(comp, loose) { var ANY = {}; Comparator.prototype.parse = function(comp) { - var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; + var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; var m = comp.match(r); if (!m) @@ -697,7 +708,7 @@ Comparator.prototype.parse = function(comp) { if (!m[2]) this.semver = ANY; else - this.semver = new SemVer(m[2], this.loose); + this.semver = new SemVer(m[2], this.options.loose); }; Comparator.prototype.toString = function() { @@ -705,30 +716,33 @@ Comparator.prototype.toString = function() { }; Comparator.prototype.test = function(version) { - debug('Comparator.test', version, this.loose); + debug('Comparator.test', version, this.options.loose); if (this.semver === ANY) return true; if (typeof version === 'string') - version = new SemVer(version, this.loose); + version = new SemVer(version, this.options); - return cmp(version, this.operator, this.semver, this.loose); + return cmp(version, this.operator, this.semver, this.options); }; -Comparator.prototype.intersects = function(comp, loose) { +Comparator.prototype.intersects = function(comp, options) { if (!(comp instanceof Comparator)) { throw new TypeError('a Comparator is required'); } + if (!options || typeof options !== 'object') + options = { loose: !!options, includePrerelease: false } + var rangeTmp; if (this.operator === '') { - rangeTmp = new Range(comp.value, loose); - return satisfies(this.value, rangeTmp, loose); + rangeTmp = new Range(comp.value, options); + return satisfies(this.value, rangeTmp, options); } else if (comp.operator === '') { - rangeTmp = new Range(this.value, loose); - return satisfies(comp.semver, rangeTmp, loose); + rangeTmp = new Range(this.value, options); + return satisfies(comp.semver, rangeTmp, options); } var sameDirectionIncreasing = @@ -742,11 +756,11 @@ Comparator.prototype.intersects = function(comp, loose) { (this.operator === '>=' || this.operator === '<=') && (comp.operator === '>=' || comp.operator === '<='); var oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, loose) && + cmp(this.semver, '<', comp.semver, options) && ((this.operator === '>=' || this.operator === '>') && (comp.operator === '<=' || comp.operator === '<')); var oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, loose) && + cmp(this.semver, '>', comp.semver, options) && ((this.operator === '<=' || this.operator === '<') && (comp.operator === '>=' || comp.operator === '>')); @@ -757,23 +771,29 @@ Comparator.prototype.intersects = function(comp, loose) { exports.Range = Range; -function Range(range, loose) { +function Range(range, options) { + if (!options || typeof options !== 'object') + options = { loose: !!options, includePrerelease: false } + if (range instanceof Range) { - if (range.loose === loose) { + if (range.loose === !!options.loose && + range.includePrerelease === !!options.includePrerelease) { return range; } else { - return new Range(range.raw, loose); + return new Range(range.raw, options); } } if (range instanceof Comparator) { - return new Range(range.value, loose); + return new Range(range.value, options); } if (!(this instanceof Range)) - return new Range(range, loose); + return new Range(range, options); - this.loose = loose; + this.options = options; + this.loose = !!options.loose; + this.includePrerelease = !!options.includePrerelease // First, split based on boolean or || this.raw = range; @@ -803,9 +823,8 @@ Range.prototype.toString = function() { }; Range.prototype.parseRange = function(range) { - var loose = this.loose; + var loose = this.options.loose; range = range.trim(); - debug('range', range, loose); // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]; range = range.replace(hr, hyphenReplace); @@ -828,22 +847,22 @@ Range.prototype.parseRange = function(range) { var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; var set = range.split(' ').map(function(comp) { - return parseComparator(comp, loose); - }).join(' ').split(/\s+/); - if (this.loose) { + return parseComparator(comp, this.options); + }, this).join(' ').split(/\s+/); + if (this.options.loose) { // in loose mode, throw out any that are not valid comparators set = set.filter(function(comp) { return !!comp.match(compRe); }); } set = set.map(function(comp) { - return new Comparator(comp, loose); - }); + return new Comparator(comp, this.options); + }, this); return set; }; -Range.prototype.intersects = function(range, loose) { +Range.prototype.intersects = function(range, options) { if (!(range instanceof Range)) { throw new TypeError('a Range is required'); } @@ -852,7 +871,7 @@ Range.prototype.intersects = function(range, loose) { return thisComparators.every(function(thisComparator) { return range.set.some(function(rangeComparators) { return rangeComparators.every(function(rangeComparator) { - return thisComparator.intersects(rangeComparator, loose); + return thisComparator.intersects(rangeComparator, options); }); }); }); @@ -861,8 +880,8 @@ Range.prototype.intersects = function(range, loose) { // Mostly just for testing and legacy API reasons exports.toComparators = toComparators; -function toComparators(range, loose) { - return new Range(range, loose).set.map(function(comp) { +function toComparators(range, options) { + return new Range(range, options).set.map(function(comp) { return comp.map(function(c) { return c.value; }).join(' ').trim().split(' '); @@ -872,15 +891,15 @@ function toComparators(range, loose) { // comprised of xranges, tildes, stars, and gtlt's at this point. // already replaced the hyphen ranges // turn into a set of JUST comparators. -function parseComparator(comp, loose) { - debug('comp', comp); - comp = replaceCarets(comp, loose); +function parseComparator(comp, options) { + debug('comp', comp, options); + comp = replaceCarets(comp, options); debug('caret', comp); - comp = replaceTildes(comp, loose); + comp = replaceTildes(comp, options); debug('tildes', comp); - comp = replaceXRanges(comp, loose); + comp = replaceXRanges(comp, options); debug('xrange', comp); - comp = replaceStars(comp, loose); + comp = replaceStars(comp, options); debug('stars', comp); return comp; } @@ -895,14 +914,16 @@ function isX(id) { // ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 // ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 // ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 -function replaceTildes(comp, loose) { +function replaceTildes(comp, options) { return comp.trim().split(/\s+/).map(function(comp) { - return replaceTilde(comp, loose); + return replaceTilde(comp, options); }).join(' '); } -function replaceTilde(comp, loose) { - var r = loose ? re[TILDELOOSE] : re[TILDE]; +function replaceTilde(comp, options) { + if (!options || typeof options !== 'object') + options = { loose: !!options, includePrerelease: false } + var r = options.loose ? re[TILDELOOSE] : re[TILDE]; return comp.replace(r, function(_, M, m, p, pr) { debug('tilde', comp, _, M, m, p, pr); var ret; @@ -936,15 +957,17 @@ function replaceTilde(comp, loose) { // ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 // ^1.2.3 --> >=1.2.3 <2.0.0 // ^1.2.0 --> >=1.2.0 <2.0.0 -function replaceCarets(comp, loose) { +function replaceCarets(comp, options) { return comp.trim().split(/\s+/).map(function(comp) { - return replaceCaret(comp, loose); + return replaceCaret(comp, options); }).join(' '); } -function replaceCaret(comp, loose) { - debug('caret', comp, loose); - var r = loose ? re[CARETLOOSE] : re[CARET]; +function replaceCaret(comp, options) { + debug('caret', comp, options); + if (!options || typeof options !== 'object') + options = { loose: !!options, includePrerelease: false } + var r = options.loose ? re[CARETLOOSE] : re[CARET]; return comp.replace(r, function(_, M, m, p, pr) { debug('caret', comp, _, M, m, p, pr); var ret; @@ -991,16 +1014,18 @@ function replaceCaret(comp, loose) { }); } -function replaceXRanges(comp, loose) { - debug('replaceXRanges', comp, loose); +function replaceXRanges(comp, options) { + debug('replaceXRanges', comp, options); return comp.split(/\s+/).map(function(comp) { - return replaceXRange(comp, loose); + return replaceXRange(comp, options); }).join(' '); } -function replaceXRange(comp, loose) { +function replaceXRange(comp, options) { comp = comp.trim(); - var r = loose ? re[XRANGELOOSE] : re[XRANGE]; + if (!options || typeof options !== 'object') + options = { loose: !!options, includePrerelease: false } + var r = options.loose ? re[XRANGELOOSE] : re[XRANGE]; return comp.replace(r, function(ret, gtlt, M, m, p, pr) { debug('xRange', comp, ret, gtlt, M, m, p, pr); var xM = isX(M); @@ -1064,8 +1089,8 @@ function replaceXRange(comp, loose) { // Because * is AND-ed with everything else in the comparator, // and '' means "any version", just remove the *s entirely. -function replaceStars(comp, loose) { - debug('replaceStars', comp, loose); +function replaceStars(comp, options) { + debug('replaceStars', comp, options); // Looseness is ignored here. star is always as loose as it gets! return comp.trim().replace(re[STAR], ''); } @@ -1109,22 +1134,25 @@ Range.prototype.test = function(version) { return false; if (typeof version === 'string') - version = new SemVer(version, this.loose); + version = new SemVer(version, this.options); for (var i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version)) + if (testSet(this.set[i], version, this.options)) return true; } return false; }; -function testSet(set, version) { +function testSet(set, version, options) { for (var i = 0; i < set.length; i++) { if (!set[i].test(version)) return false; } - if (version.prerelease.length) { + if (!options) + options = {} + + if (version.prerelease.length && !options.includePrerelease) { // 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. @@ -1152,9 +1180,9 @@ function testSet(set, version) { } exports.satisfies = satisfies; -function satisfies(version, range, loose) { +function satisfies(version, range, options) { try { - range = new Range(range, loose); + range = new Range(range, options); } catch (er) { return false; } @@ -1162,19 +1190,19 @@ function satisfies(version, range, loose) { } exports.maxSatisfying = maxSatisfying; -function maxSatisfying(versions, range, loose) { +function maxSatisfying(versions, range, options) { var max = null; var maxSV = null; try { - var rangeObj = new Range(range, loose); + var rangeObj = new Range(range, options); } catch (er) { return null; } versions.forEach(function (v) { - if (rangeObj.test(v)) { // satisfies(v, range, loose) + if (rangeObj.test(v)) { // satisfies(v, range, options) if (!max || maxSV.compare(v) === -1) { // compare(max, v, true) max = v; - maxSV = new SemVer(max, loose); + maxSV = new SemVer(max, options); } } }) @@ -1182,19 +1210,19 @@ function maxSatisfying(versions, range, loose) { } exports.minSatisfying = minSatisfying; -function minSatisfying(versions, range, loose) { +function minSatisfying(versions, range, options) { var min = null; var minSV = null; try { - var rangeObj = new Range(range, loose); + var rangeObj = new Range(range, options); } catch (er) { return null; } versions.forEach(function (v) { - if (rangeObj.test(v)) { // satisfies(v, range, loose) + if (rangeObj.test(v)) { // satisfies(v, range, options) if (!min || minSV.compare(v) === 1) { // compare(min, v, true) min = v; - minSV = new SemVer(min, loose); + minSV = new SemVer(min, options); } } }) @@ -1202,11 +1230,11 @@ function minSatisfying(versions, range, loose) { } exports.validRange = validRange; -function validRange(range, loose) { +function validRange(range, options) { try { // Return '*' instead of '' so that truthiness works. // This will throw if it's invalid anyway - return new Range(range, loose).range || '*'; + return new Range(range, options).range || '*'; } catch (er) { return null; } @@ -1214,20 +1242,20 @@ function validRange(range, loose) { // Determine if version is less than all the versions possible in the range exports.ltr = ltr; -function ltr(version, range, loose) { - return outside(version, range, '<', loose); +function ltr(version, range, options) { + return outside(version, range, '<', options); } // Determine if version is greater than all the versions possible in the range. exports.gtr = gtr; -function gtr(version, range, loose) { - return outside(version, range, '>', loose); +function gtr(version, range, options) { + return outside(version, range, '>', options); } exports.outside = outside; -function outside(version, range, hilo, loose) { - version = new SemVer(version, loose); - range = new Range(range, loose); +function outside(version, range, hilo, options) { + version = new SemVer(version, options); + range = new Range(range, options); var gtfn, ltefn, ltfn, comp, ecomp; switch (hilo) { @@ -1250,7 +1278,7 @@ function outside(version, range, hilo, loose) { } // If it satisifes the range it is not outside - if (satisfies(version, range, loose)) { + if (satisfies(version, range, options)) { return false; } @@ -1269,9 +1297,9 @@ function outside(version, range, hilo, loose) { } high = high || comparator; low = low || comparator; - if (gtfn(comparator.semver, high.semver, loose)) { + if (gtfn(comparator.semver, high.semver, options)) { high = comparator; - } else if (ltfn(comparator.semver, low.semver, loose)) { + } else if (ltfn(comparator.semver, low.semver, options)) { low = comparator; } }); @@ -1295,15 +1323,15 @@ function outside(version, range, hilo, loose) { } exports.prerelease = prerelease; -function prerelease(version, loose) { - var parsed = parse(version, loose); +function prerelease(version, options) { + var parsed = parse(version, options); return (parsed && parsed.prerelease.length) ? parsed.prerelease : null; } exports.intersects = intersects; -function intersects(r1, r2, loose) { - r1 = new Range(r1, loose) - r2 = new Range(r2, loose) +function intersects(r1, r2, options) { + r1 = new Range(r1, options) + r2 = new Range(r2, options) return r1.intersects(r2) } diff --git a/package-lock.json b/package-lock.json index 3ff93209382be..5fa17e8827377 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6725,9 +6725,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" }, "semver-diff": { "version": "2.1.0", diff --git a/package.json b/package.json index d7ae101c3c3b8..a87a506868fbc 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,7 @@ "retry": "^0.12.0", "rimraf": "^2.6.2", "safe-buffer": "^5.1.2", - "semver": "^5.5.1", + "semver": "^5.6.0", "sha": "~2.0.1", "slide": "~1.1.6", "sorted-object": "~2.0.1", From 740e79e17a78247f73349525043c9388ce94459a Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Tue, 8 Jan 2019 13:19:32 -0800 Subject: [PATCH 79/97] rimraf@2.6.3 --- node_modules/rimraf/package.json | 31 +++++++++++++++++-------------- package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/node_modules/rimraf/package.json b/node_modules/rimraf/package.json index cbb049239122e..a82c85a695444 100644 --- a/node_modules/rimraf/package.json +++ b/node_modules/rimraf/package.json @@ -1,19 +1,19 @@ { - "_from": "rimraf@^2.6.2", - "_id": "rimraf@2.6.2", + "_from": "rimraf@2.6.3", + "_id": "rimraf@2.6.3", "_inBundle": false, - "_integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "_integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "_location": "/rimraf", "_phantomChildren": {}, "_requested": { - "type": "range", + "type": "version", "registry": true, - "raw": "rimraf@^2.6.2", + "raw": "rimraf@2.6.3", "name": "rimraf", "escapedName": "rimraf", - "rawSpec": "^2.6.2", + "rawSpec": "2.6.3", "saveSpec": null, - "fetchSpec": "^2.6.2" + "fetchSpec": "2.6.3" }, "_requiredBy": [ "#USER", @@ -30,10 +30,10 @@ "/pacote", "/tap" ], - "_resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "_shasum": "2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36", - "_spec": "rimraf@^2.6.2", - "_where": "/Users/zkat/Documents/code/work/npm", + "_resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "_shasum": "b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab", + "_spec": "rimraf@2.6.3", + "_where": "/Users/aeschright/code/cli", "author": { "name": "Isaac Z. Schlueter", "email": "i@izs.me", @@ -47,13 +47,13 @@ }, "bundleDependencies": false, "dependencies": { - "glob": "^7.0.5" + "glob": "^7.1.3" }, "deprecated": false, "description": "A deep deletion module for node (like `rm -rf`)", "devDependencies": { "mkdirp": "^0.5.1", - "tap": "^10.1.2" + "tap": "^12.1.1" }, "files": [ "LICENSE", @@ -70,7 +70,10 @@ "url": "git://github.com/isaacs/rimraf.git" }, "scripts": { + "postpublish": "git push origin --all; git push origin --tags", + "postversion": "npm publish", + "preversion": "npm test", "test": "tap test/*.js" }, - "version": "2.6.2" + "version": "2.6.3" } diff --git a/package-lock.json b/package-lock.json index 5fa17e8827377..976fa5a3494f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6662,11 +6662,11 @@ "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "run-async": { diff --git a/package.json b/package.json index a87a506868fbc..c9624db743d58 100644 --- a/package.json +++ b/package.json @@ -118,7 +118,7 @@ "readable-stream": "^2.3.6", "request": "^2.88.0", "retry": "^0.12.0", - "rimraf": "^2.6.2", + "rimraf": "^2.6.3", "safe-buffer": "^5.1.2", "semver": "^5.6.0", "sha": "~2.0.1", From 455476c8d148ca83a4e030e96e93dcf1c7f0ff5f Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Tue, 8 Jan 2019 13:20:50 -0800 Subject: [PATCH 80/97] require-inject@1.4.4 --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 976fa5a3494f3..398874a461afd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6601,9 +6601,9 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-inject": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/require-inject/-/require-inject-1.4.3.tgz", - "integrity": "sha512-AwIeUR1jA8ARt20brFU2DfW62z5e3rzMZC/Q1I1lKoOlxtroSUqjRGKyOL8m+7qmnFGbZvV8lUjtcHgtuLDl6Q==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/require-inject/-/require-inject-1.4.4.tgz", + "integrity": "sha512-5Y5ctRN84+I4iOZO61gm+48tgP/6Hcd3VZydkaEM3MCuOvnHRsTJYQBOc01faI/Z9at5nsCAJVHhlfPA6Pc0Og==", "dev": true, "requires": { "caller": "^1.0.1" diff --git a/package.json b/package.json index c9624db743d58..f548c22a80bbb 100644 --- a/package.json +++ b/package.json @@ -274,7 +274,7 @@ "marked-man": "^0.2.1", "npm-registry-couchapp": "^2.7.1", "npm-registry-mock": "^1.1.0", - "require-inject": "^1.4.3", + "require-inject": "^1.4.4", "sprintf-js": "^1.1.2", "standard": "^11.0.1", "tacks": "^1.2.7", From 3f40251c5868feaacbcdbcb1360877ce76998f5e Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Tue, 8 Jan 2019 13:21:32 -0800 Subject: [PATCH 81/97] npm-pick-manifest@2.2.3 --- node_modules/npm-pick-manifest/CHANGELOG.md | 40 +++++++++++++ node_modules/npm-pick-manifest/README.md | 8 +++ node_modules/npm-pick-manifest/index.js | 62 +++++++++++++++++---- node_modules/npm-pick-manifest/package.json | 40 +++++++------ package-lock.json | 7 ++- package.json | 2 +- 6 files changed, 124 insertions(+), 35 deletions(-) diff --git a/node_modules/npm-pick-manifest/CHANGELOG.md b/node_modules/npm-pick-manifest/CHANGELOG.md index 5f53e8fce591f..2112665f7572e 100644 --- a/node_modules/npm-pick-manifest/CHANGELOG.md +++ b/node_modules/npm-pick-manifest/CHANGELOG.md @@ -2,6 +2,46 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [2.2.3](https://github.com/zkat/npm-pick-manifest/compare/v2.2.2...v2.2.3) (2018-10-31) + + +### Bug Fixes + +* **enjoyBy:** rework semantics for enjoyBy again ([5e89b62](https://github.com/zkat/npm-pick-manifest/commit/5e89b62)) + + + + +## [2.2.2](https://github.com/zkat/npm-pick-manifest/compare/v2.2.1...v2.2.2) (2018-10-31) + + +### Bug Fixes + +* **enjoyBy:** rework semantics for enjoyBy ([5684f45](https://github.com/zkat/npm-pick-manifest/commit/5684f45)) + + + + +## [2.2.1](https://github.com/zkat/npm-pick-manifest/compare/v2.2.0...v2.2.1) (2018-10-30) + + + + +# [2.2.0](https://github.com/zkat/npm-pick-manifest/compare/v2.1.0...v2.2.0) (2018-10-30) + + +### Bug Fixes + +* **audit:** npm audit fix --force ([d5ae6c4](https://github.com/zkat/npm-pick-manifest/commit/d5ae6c4)) + + +### Features + +* **enjoyBy:** add opts.enjoyBy option to filter versions by date ([0b8a790](https://github.com/zkat/npm-pick-manifest/commit/0b8a790)) + + + # [2.1.0](https://github.com/zkat/npm-pick-manifest/compare/v2.0.1...v2.1.0) (2017-10-18) diff --git a/node_modules/npm-pick-manifest/README.md b/node_modules/npm-pick-manifest/README.md index 206af2f317f82..a9a027bfcb460 100644 --- a/node_modules/npm-pick-manifest/README.md +++ b/node_modules/npm-pick-manifest/README.md @@ -74,3 +74,11 @@ The function will throw `ETARGET` if there was no matching manifest, and If `opts.defaultTag` is provided, it will be used instead of `latest`. That is, if that tag matches the selector, it will be used, even if a higher available version matches the range. + +If `opts.enjoyBy` is provided, it should be something that can be passed to `new +Date(x)`, such as a `Date` object or a timestamp string. It will be used to +filter the selected versions such that only versions less than or equal to +`enjoyBy` are considered. + +If `opts.includeDeprecated` passed in as true, deprecated versions will be +selected. By default, deprecated versions other than `defaultTag` are ignored. diff --git a/node_modules/npm-pick-manifest/index.js b/node_modules/npm-pick-manifest/index.js index 133b62723457b..d9a8373e57f14 100644 --- a/node_modules/npm-pick-manifest/index.js +++ b/node_modules/npm-pick-manifest/index.js @@ -1,19 +1,35 @@ 'use strict' +const figgyPudding = require('figgy-pudding') const npa = require('npm-package-arg') const semver = require('semver') +const PickerOpts = figgyPudding({ + defaultTag: { default: 'latest' }, + enjoyBy: {}, + includeDeprecated: { default: false } +}) + module.exports = pickManifest function pickManifest (packument, wanted, opts) { - opts = opts || {} + opts = PickerOpts(opts) + const time = opts.enjoyBy && packument.time && +(new Date(opts.enjoyBy)) const spec = npa.resolve(packument.name, wanted) const type = spec.type if (type === 'version' || type === 'range') { wanted = semver.clean(wanted, true) || wanted } const distTags = packument['dist-tags'] || {} - const versions = Object.keys(packument.versions || {}).filter(v => semver.valid(v, true)) - const undeprecated = versions.filter(v => !packument.versions[v].deprecated) + const versions = Object.keys(packument.versions || {}).filter(v => { + return semver.valid(v, true) + }) + + function enjoyableBy (v) { + return !time || ( + packument.time[v] && time >= +(new Date(packument.time[v])) + ) + } + let err if (!versions.length) { @@ -27,43 +43,69 @@ function pickManifest (packument, wanted, opts) { let target - if (type === 'tag') { + if (type === 'tag' && enjoyableBy(distTags[wanted])) { target = distTags[wanted] } else if (type === 'version') { target = wanted - } else if (type !== 'range') { + } else if (type !== 'range' && enjoyableBy(distTags[wanted])) { throw new Error('Only tag, version, and range are supported') } - const tagVersion = distTags[opts.defaultTag || 'latest'] + const tagVersion = distTags[opts.defaultTag] if ( !target && tagVersion && packument.versions[tagVersion] && + enjoyableBy(tagVersion) && semver.satisfies(tagVersion, wanted, true) ) { target = tagVersion } if (!target && !opts.includeDeprecated) { + const undeprecated = versions.filter(v => !packument.versions[v].deprecated && enjoyableBy(v) + ) target = semver.maxSatisfying(undeprecated, wanted, true) } if (!target) { - target = semver.maxSatisfying(versions, wanted, true) + const stillFresh = versions.filter(enjoyableBy) + target = semver.maxSatisfying(stillFresh, wanted, true) } - if (!target && wanted === '*') { + if (!target && wanted === '*' && enjoyableBy(tagVersion)) { // This specific corner is meant for the case where // someone is using `*` as a selector, but all versions // are pre-releases, which don't match ranges at all. target = tagVersion } - const manifest = target && packument.versions[target] + if ( + !target && + time && + type === 'tag' && + distTags[wanted] && + !enjoyableBy(distTags[wanted]) + ) { + const stillFresh = versions.filter(v => + enjoyableBy(v) && semver.lte(v, distTags[wanted], true) + ).sort(semver.rcompare) + target = stillFresh[0] + } + + const manifest = ( + target && + packument.versions[target] + ) if (!manifest) { err = new Error( - `No matching version found for ${packument.name}@${wanted}` + `No matching version found for ${packument.name}@${wanted}${ + opts.enjoyBy + ? ` with an Enjoy By date of ${ + new Date(opts.enjoyBy).toLocaleString() + }. Maybe try a different date?` + : '' + }` ) err.code = 'ETARGET' err.name = packument.name diff --git a/node_modules/npm-pick-manifest/package.json b/node_modules/npm-pick-manifest/package.json index 4cf8bf1a13c6c..a80c76d372d01 100644 --- a/node_modules/npm-pick-manifest/package.json +++ b/node_modules/npm-pick-manifest/package.json @@ -1,33 +1,28 @@ { - "_args": [ - [ - "npm-pick-manifest@2.1.0", - "/Users/rebecca/code/npm" - ] - ], - "_from": "npm-pick-manifest@2.1.0", - "_id": "npm-pick-manifest@2.1.0", + "_from": "npm-pick-manifest@2.2.3", + "_id": "npm-pick-manifest@2.2.3", "_inBundle": false, - "_integrity": "sha512-q9zLP8cTr8xKPmMZN3naxp1k/NxVFsjxN6uWuO1tiw9gxg7wZWQ/b5UTfzD0ANw2q1lQxdLKTeCCksq+bPSgbQ==", + "_integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", "_location": "/npm-pick-manifest", "_phantomChildren": {}, "_requested": { "type": "version", "registry": true, - "raw": "npm-pick-manifest@2.1.0", + "raw": "npm-pick-manifest@2.2.3", "name": "npm-pick-manifest", "escapedName": "npm-pick-manifest", - "rawSpec": "2.1.0", + "rawSpec": "2.2.3", "saveSpec": null, - "fetchSpec": "2.1.0" + "fetchSpec": "2.2.3" }, "_requiredBy": [ - "/", - "/pacote" + "#USER", + "/" ], - "_resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.1.0.tgz", - "_spec": "2.1.0", - "_where": "/Users/rebecca/code/npm", + "_resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "_shasum": "32111d2a9562638bb2c8f2bf27f7f3092c8fae40", + "_spec": "npm-pick-manifest@2.2.3", + "_where": "/Users/aeschright/code/cli", "author": { "name": "Kat Marchán", "email": "kzm@sykosomatic.org" @@ -35,6 +30,7 @@ "bugs": { "url": "https://github.com/zkat/npm-pick-manifest/issues" }, + "bundleDependencies": false, "config": { "nyc": { "exclude": [ @@ -44,15 +40,17 @@ } }, "dependencies": { + "figgy-pudding": "^3.5.1", "npm-package-arg": "^6.0.0", "semver": "^5.4.1" }, + "deprecated": false, "description": "Resolves a matching manifest from a package metadata document according to standard npm semver resolution rules.", "devDependencies": { - "nyc": "^11.2.1", + "nyc": "^13.1.0", "standard": "^10.0.3", - "standard-version": "^4.2.0", - "tap": "^10.7.0", + "standard-version": "^4.4.0", + "tap": "^12.0.1", "weallbehave": "^1.2.0", "weallcontribute": "^1.0.8" }, @@ -81,5 +79,5 @@ "update-coc": "weallbehave -o . && git add CODE_OF_CONDUCT.md && git commit -m 'docs(coc): updated CODE_OF_CONDUCT.md'", "update-contrib": "weallcontribute -o . && git add CONTRIBUTING.md && git commit -m 'docs(contributing): updated CONTRIBUTING.md'" }, - "version": "2.1.0" + "version": "2.2.3" } diff --git a/package-lock.json b/package-lock.json index 398874a461afd..bd1044eb5e6a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3140,10 +3140,11 @@ } }, "npm-pick-manifest": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.1.0.tgz", - "integrity": "sha512-q9zLP8cTr8xKPmMZN3naxp1k/NxVFsjxN6uWuO1tiw9gxg7wZWQ/b5UTfzD0ANw2q1lQxdLKTeCCksq+bPSgbQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", "requires": { + "figgy-pudding": "^3.5.1", "npm-package-arg": "^6.0.0", "semver": "^5.4.1" } diff --git a/package.json b/package.json index f548c22a80bbb..b9f15bfe1c394 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "npm-lifecycle": "^2.1.0", "npm-package-arg": "^6.1.0", "npm-packlist": "^1.2.0", - "npm-pick-manifest": "^2.1.0", + "npm-pick-manifest": "^2.2.3", "npm-registry-fetch": "^3.8.0", "npm-user-validate": "~1.0.0", "npmlog": "~4.1.2", From 4ffa8a8e9e80e5562898dd76fe5a49f5694f38c8 Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Tue, 8 Jan 2019 13:33:07 -0800 Subject: [PATCH 82/97] query-string@6.2.0 --- node_modules/query-string/index.js | 27 ++++++++++++------- node_modules/query-string/package.json | 36 ++++++++++++-------------- node_modules/query-string/readme.md | 2 +- package-lock.json | 6 ++--- package.json | 2 +- 5 files changed, 40 insertions(+), 33 deletions(-) diff --git a/node_modules/query-string/index.js b/node_modules/query-string/index.js index 523c87fdfb945..6a1b3c2a30eb6 100644 --- a/node_modules/query-string/index.js +++ b/node_modules/query-string/index.js @@ -123,6 +123,7 @@ function extract(input) { if (queryStart === -1) { return ''; } + return input.slice(queryStart + 1); } @@ -171,21 +172,24 @@ exports.extract = extract; exports.parse = parse; exports.stringify = (obj, options) => { - const defaults = { + if (!obj) { + return ''; + } + + options = Object.assign({ encode: true, strict: true, arrayFormat: 'none' - }; + }, options); - options = Object.assign(defaults, options); + const formatter = encoderForArrayFormat(options); + const keys = Object.keys(obj); - if (options.sort === false) { - options.sort = () => {}; + if (options.sort !== false) { + keys.sort(options.sort); } - const formatter = encoderForArrayFormat(options); - - return obj ? Object.keys(obj).sort(options.sort).map(key => { + return keys.map(key => { const value = obj[key]; if (value === undefined) { @@ -211,10 +215,15 @@ exports.stringify = (obj, options) => { } return encode(key, options) + '=' + encode(value, options); - }).filter(x => x.length > 0).join('&') : ''; + }).filter(x => x.length > 0).join('&'); }; exports.parseUrl = (input, options) => { + const hashStart = input.indexOf('#'); + if (hashStart !== -1) { + input = input.slice(0, hashStart); + } + return { url: input.split('?')[0] || '', query: parse(extract(input), options) diff --git a/node_modules/query-string/package.json b/node_modules/query-string/package.json index d29777ef1c07b..8f9b91b4fba93 100644 --- a/node_modules/query-string/package.json +++ b/node_modules/query-string/package.json @@ -1,32 +1,28 @@ { - "_args": [ - [ - "query-string@6.1.0", - "/Users/rebecca/code/npm" - ] - ], - "_from": "query-string@6.1.0", - "_id": "query-string@6.1.0", + "_from": "query-string@6.2.0", + "_id": "query-string@6.2.0", "_inBundle": false, - "_integrity": "sha512-pNB/Gr8SA8ff8KpUFM36o/WFAlthgaThka5bV19AD9PNTH20Pwq5Zxodif2YyHwrctp6SkL4GqlOot0qR/wGaw==", + "_integrity": "sha512-5wupExkIt8RYL4h/FE+WTg3JHk62e6fFPWtAZA9J5IWK1PfTfKkMS93HBUHcFpeYi9KsY5pFbh+ldvEyaz5MyA==", "_location": "/query-string", "_phantomChildren": {}, "_requested": { "type": "version", "registry": true, - "raw": "query-string@6.1.0", + "raw": "query-string@6.2.0", "name": "query-string", "escapedName": "query-string", - "rawSpec": "6.1.0", + "rawSpec": "6.2.0", "saveSpec": null, - "fetchSpec": "6.1.0" + "fetchSpec": "6.2.0" }, "_requiredBy": [ + "#USER", "/" ], - "_resolved": "https://registry.npmjs.org/query-string/-/query-string-6.1.0.tgz", - "_spec": "6.1.0", - "_where": "/Users/rebecca/code/npm", + "_resolved": "https://registry.npmjs.org/query-string/-/query-string-6.2.0.tgz", + "_shasum": "468edeb542b7e0538f9f9b1aeb26f034f19c86e1", + "_spec": "query-string@6.2.0", + "_where": "/Users/aeschright/code/cli", "author": { "name": "Sindre Sorhus", "email": "sindresorhus@gmail.com", @@ -35,16 +31,18 @@ "bugs": { "url": "https://github.com/sindresorhus/query-string/issues" }, + "bundleDependencies": false, "dependencies": { "decode-uri-component": "^0.2.0", "strict-uri-encode": "^2.0.0" }, + "deprecated": false, "description": "Parse and stringify URL query strings", "devDependencies": { - "ava": "*", + "ava": "^0.25.0", "deep-equal": "^1.0.1", - "fast-check": "^1.0.1", - "xo": "*" + "fast-check": "^1.5.0", + "xo": "^0.23.0" }, "engines": { "node": ">=6" @@ -77,5 +75,5 @@ "scripts": { "test": "xo && ava" }, - "version": "6.1.0" + "version": "6.2.0" } diff --git a/node_modules/query-string/readme.md b/node_modules/query-string/readme.md index f81bd6aea2da2..5fa1cfbde4306 100644 --- a/node_modules/query-string/readme.md +++ b/node_modules/query-string/readme.md @@ -15,7 +15,7 @@ $ npm install query-string ``` -This module targets Node.js 6 or later and the latest version of Chrome, Firefox, and Safari. If you want support for older browsers, use version 5: `npm install query-string@5`. +This module targets Node.js 6 or later and the latest version of Chrome, Firefox, and Safari. If you want support for older browsers, or, [if your project is using create-react-app](https://github.com/sindresorhus/query-string/pull/148#issuecomment-399656020), use version 5: `npm install query-string@5`. diff --git a/package-lock.json b/package-lock.json index bd1044eb5e6a8..cddab05f80ee3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6415,9 +6415,9 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "query-string": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.1.0.tgz", - "integrity": "sha512-pNB/Gr8SA8ff8KpUFM36o/WFAlthgaThka5bV19AD9PNTH20Pwq5Zxodif2YyHwrctp6SkL4GqlOot0qR/wGaw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.2.0.tgz", + "integrity": "sha512-5wupExkIt8RYL4h/FE+WTg3JHk62e6fFPWtAZA9J5IWK1PfTfKkMS93HBUHcFpeYi9KsY5pFbh+ldvEyaz5MyA==", "requires": { "decode-uri-component": "^0.2.0", "strict-uri-encode": "^2.0.0" diff --git a/package.json b/package.json index b9f15bfe1c394..793c029eead0b 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,7 @@ "path-is-inside": "~1.0.2", "promise-inflight": "~1.0.1", "qrcode-terminal": "^0.12.0", - "query-string": "^6.1.0", + "query-string": "^6.2.0", "qw": "~1.0.1", "read": "~1.0.7", "read-cmd-shim": "~1.0.1", From a0a0ca9ec2a962183d420fa751f4139969760f18 Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Tue, 8 Jan 2019 13:33:36 -0800 Subject: [PATCH 83/97] pacote@9.3.0 --- node_modules/pacote/CHANGELOG.md | 16 + node_modules/pacote/lib/extract-stream.js | 1 + node_modules/pacote/lib/fetchers/file.js | 2 +- node_modules/pacote/lib/fetchers/git.js | 2 +- node_modules/pacote/lib/util/git.js | 16 +- node_modules/pacote/lib/util/opt-check.js | 1 + node_modules/pacote/node_modules/.bin/semver | 1 - .../{semver => lru-cache}/LICENSE | 0 .../pacote/node_modules/lru-cache/README.md | 166 ++ .../pacote/node_modules/lru-cache/index.js | 334 ++++ .../node_modules/lru-cache/package.json | 67 + .../npm-pick-manifest/CHANGELOG.md | 133 -- .../node_modules/npm-pick-manifest/LICENSE.md | 16 - .../node_modules/npm-pick-manifest/README.md | 84 - .../node_modules/npm-pick-manifest/index.js | 121 -- .../npm-pick-manifest/package.json | 82 - .../pacote/node_modules/semver/README.md | 399 ----- .../pacote/node_modules/semver/bin/semver | 153 -- .../pacote/node_modules/semver/package.json | 55 - .../pacote/node_modules/semver/range.bnf | 16 - .../pacote/node_modules/semver/semver.js | 1352 ----------------- .../node_modules/unique-filename/LICENSE | 5 - .../node_modules/unique-filename/README.md | 33 - .../coverage/__root__/index.html | 73 - .../coverage/__root__/index.js.html | 69 - .../unique-filename/coverage/base.css | 182 --- .../unique-filename/coverage/index.html | 73 - .../unique-filename/coverage/prettify.css | 1 - .../unique-filename/coverage/prettify.js | 1 - .../coverage/sort-arrow-sprite.png | Bin 209 -> 0 bytes .../unique-filename/coverage/sorter.js | 156 -- .../node_modules/unique-filename/index.js | 8 - .../node_modules/unique-filename/package.json | 56 - .../unique-filename/test/index.js | 23 - node_modules/pacote/package.json | 44 +- package-lock.json | 45 +- package.json | 2 +- 37 files changed, 633 insertions(+), 3155 deletions(-) delete mode 120000 node_modules/pacote/node_modules/.bin/semver rename node_modules/pacote/node_modules/{semver => lru-cache}/LICENSE (100%) create mode 100644 node_modules/pacote/node_modules/lru-cache/README.md create mode 100644 node_modules/pacote/node_modules/lru-cache/index.js create mode 100644 node_modules/pacote/node_modules/lru-cache/package.json delete mode 100644 node_modules/pacote/node_modules/npm-pick-manifest/CHANGELOG.md delete mode 100644 node_modules/pacote/node_modules/npm-pick-manifest/LICENSE.md delete mode 100644 node_modules/pacote/node_modules/npm-pick-manifest/README.md delete mode 100644 node_modules/pacote/node_modules/npm-pick-manifest/index.js delete mode 100644 node_modules/pacote/node_modules/npm-pick-manifest/package.json delete mode 100644 node_modules/pacote/node_modules/semver/README.md delete mode 100755 node_modules/pacote/node_modules/semver/bin/semver delete mode 100644 node_modules/pacote/node_modules/semver/package.json delete mode 100644 node_modules/pacote/node_modules/semver/range.bnf delete mode 100644 node_modules/pacote/node_modules/semver/semver.js delete mode 100644 node_modules/pacote/node_modules/unique-filename/LICENSE delete mode 100644 node_modules/pacote/node_modules/unique-filename/README.md delete mode 100644 node_modules/pacote/node_modules/unique-filename/coverage/__root__/index.html delete mode 100644 node_modules/pacote/node_modules/unique-filename/coverage/__root__/index.js.html delete mode 100644 node_modules/pacote/node_modules/unique-filename/coverage/base.css delete mode 100644 node_modules/pacote/node_modules/unique-filename/coverage/index.html delete mode 100644 node_modules/pacote/node_modules/unique-filename/coverage/prettify.css delete mode 100644 node_modules/pacote/node_modules/unique-filename/coverage/prettify.js delete mode 100644 node_modules/pacote/node_modules/unique-filename/coverage/sort-arrow-sprite.png delete mode 100644 node_modules/pacote/node_modules/unique-filename/coverage/sorter.js delete mode 100644 node_modules/pacote/node_modules/unique-filename/index.js delete mode 100644 node_modules/pacote/node_modules/unique-filename/package.json delete mode 100644 node_modules/pacote/node_modules/unique-filename/test/index.js diff --git a/node_modules/pacote/CHANGELOG.md b/node_modules/pacote/CHANGELOG.md index e74c2a0a8b702..520b51b7a509a 100644 --- a/node_modules/pacote/CHANGELOG.md +++ b/node_modules/pacote/CHANGELOG.md @@ -2,6 +2,22 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +# [9.3.0](https://github.com/zkat/pacote/compare/v9.2.3...v9.3.0) (2018-12-21) + + +### Bug Fixes + +* **git, file:** properly catch otherwise unhandled errors ([89d4897](https://github.com/zkat/pacote/commit/89d4897)) +* **test:** set umask opt to fix extract-stream 'accepts dmode/fmode/umask opts' ([e51de83](https://github.com/zkat/pacote/commit/e51de83)) + + +### Features + +* **git:** accept git path option ([#164](https://github.com/zkat/pacote/issues/164)) ([f06c8c5](https://github.com/zkat/pacote/commit/f06c8c5)) + + + ## [9.2.3](https://github.com/zkat/pacote/compare/v9.2.2...v9.2.3) (2018-10-31) diff --git a/node_modules/pacote/lib/extract-stream.js b/node_modules/pacote/lib/extract-stream.js index d7e8fd5a18d73..d967b9f897276 100644 --- a/node_modules/pacote/lib/extract-stream.js +++ b/node_modules/pacote/lib/extract-stream.js @@ -57,6 +57,7 @@ function extractStream (spec, dest, opts) { onwarn: msg => opts.log && opts.log.warn('tar', msg), uid: opts.uid, gid: opts.gid, + umask: opts.umask, transform: opts.resolved && pkgJsonTransform(spec, opts), onentry (entry) { if (entry.type.toLowerCase() === 'file') { diff --git a/node_modules/pacote/lib/fetchers/file.js b/node_modules/pacote/lib/fetchers/file.js index 6852795c091da..a58e329130987 100644 --- a/node_modules/pacote/lib/fetchers/file.js +++ b/node_modules/pacote/lib/fetchers/file.js @@ -68,7 +68,7 @@ Fetcher.impl(fetchFile, { return pipe(fs.createReadStream(src), stream) }) } - }, err => stream.emit('error', err)) + }).catch(err => stream.emit('error', err)) return stream }, diff --git a/node_modules/pacote/lib/fetchers/git.js b/node_modules/pacote/lib/fetchers/git.js index c5928c3eabc11..7db4a79de3dc7 100644 --- a/node_modules/pacote/lib/fetchers/git.js +++ b/node_modules/pacote/lib/fetchers/git.js @@ -45,7 +45,7 @@ Fetcher.impl(fetchGit, { manifest, spec, opts ).on('integrity', i => stream.emit('integrity', i)), stream ) - }, err => stream.emit('error', err)) + }).catch(err => stream.emit('error', err)) return stream }, diff --git a/node_modules/pacote/lib/util/git.js b/node_modules/pacote/lib/util/git.js index 617c29c2ae984..997404dd23cbd 100644 --- a/node_modules/pacote/lib/util/git.js +++ b/node_modules/pacote/lib/util/git.js @@ -74,10 +74,10 @@ function fullClone (repo, committish, target, opts) { if (process.platform === 'win32') { gitArgs.push('--config', 'core.longpaths=true') } - return execGit(gitArgs, { cwd: target }).then(() => { - return execGit(['init'], { cwd: target }) + return execGit(gitArgs, { cwd: target }, opts).then(() => { + return execGit(['init'], { cwd: target }, opts) }).then(() => { - return execGit(['checkout', committish || 'HEAD'], { cwd: target }) + return execGit(['checkout', committish || 'HEAD'], { cwd: target }, opts) }).then(() => { return updateSubmodules(target, opts) }).then(() => headSha(target, opts)) @@ -182,7 +182,7 @@ function revs (repo, opts) { module.exports._exec = execGit function execGit (gitArgs, gitOpts, opts) { opts = optCheck(opts) - return checkGit().then(gitPath => { + return checkGit(opts).then(gitPath => { return promiseRetry((retry, number) => { if (number !== 1) { opts.log.silly('pacote', 'Retrying git command: ' + gitArgs.join(' ') + ' attempt # ' + number) @@ -206,7 +206,7 @@ function execGit (gitArgs, gitOpts, opts) { module.exports._spawn = spawnGit function spawnGit (gitArgs, gitOpts, opts) { opts = optCheck(opts) - return checkGit().then(gitPath => { + return checkGit(opts).then(gitPath => { return promiseRetry((retry, number) => { if (number !== 1) { opts.log.silly('pacote', 'Retrying git command: ' + gitArgs.join(' ') + ' attempt # ' + number) @@ -246,8 +246,10 @@ function mkOpts (_gitOpts, opts) { return gitOpts } -function checkGit () { - if (!GITPATH) { +function checkGit (opts) { + if (opts.git) { + return BB.resolve(opts.git) + } else if (!GITPATH) { const err = new Error('No git binary found in $PATH') err.code = 'ENOGIT' return BB.reject(err) diff --git a/node_modules/pacote/lib/util/opt-check.js b/node_modules/pacote/lib/util/opt-check.js index 51520d71eb1c7..e6afc21c849c4 100644 --- a/node_modules/pacote/lib/util/opt-check.js +++ b/node_modules/pacote/lib/util/opt-check.js @@ -21,6 +21,7 @@ module.exports = figgyPudding({ fullMetadata: 'full-metadata', 'full-metadata': { default: false }, gid: {}, + git: {}, includeDeprecated: { default: true }, 'include-deprecated': 'includeDeprecated', integrity: {}, diff --git a/node_modules/pacote/node_modules/.bin/semver b/node_modules/pacote/node_modules/.bin/semver deleted file mode 120000 index 317eb293d8e12..0000000000000 --- a/node_modules/pacote/node_modules/.bin/semver +++ /dev/null @@ -1 +0,0 @@ -../semver/bin/semver \ No newline at end of file diff --git a/node_modules/pacote/node_modules/semver/LICENSE b/node_modules/pacote/node_modules/lru-cache/LICENSE similarity index 100% rename from node_modules/pacote/node_modules/semver/LICENSE rename to node_modules/pacote/node_modules/lru-cache/LICENSE diff --git a/node_modules/pacote/node_modules/lru-cache/README.md b/node_modules/pacote/node_modules/lru-cache/README.md new file mode 100644 index 0000000000000..435dfebb7e27d --- /dev/null +++ b/node_modules/pacote/node_modules/lru-cache/README.md @@ -0,0 +1,166 @@ +# lru cache + +A cache object that deletes the least-recently-used items. + +[![Build Status](https://travis-ci.org/isaacs/node-lru-cache.svg?branch=master)](https://travis-ci.org/isaacs/node-lru-cache) [![Coverage Status](https://coveralls.io/repos/isaacs/node-lru-cache/badge.svg?service=github)](https://coveralls.io/github/isaacs/node-lru-cache) + +## Installation: + +```javascript +npm install lru-cache --save +``` + +## Usage: + +```javascript +var LRU = require("lru-cache") + , options = { max: 500 + , length: function (n, key) { return n * 2 + key.length } + , dispose: function (key, n) { n.close() } + , maxAge: 1000 * 60 * 60 } + , cache = new LRU(options) + , otherCache = new LRU(50) // sets just the max size + +cache.set("key", "value") +cache.get("key") // "value" + +// non-string keys ARE fully supported +// but note that it must be THE SAME object, not +// just a JSON-equivalent object. +var someObject = { a: 1 } +cache.set(someObject, 'a value') +// Object keys are not toString()-ed +cache.set('[object Object]', 'a different value') +assert.equal(cache.get(someObject), 'a value') +// A similar object with same keys/values won't work, +// because it's a different object identity +assert.equal(cache.get({ a: 1 }), undefined) + +cache.reset() // empty the cache +``` + +If you put more stuff in it, then items will fall out. + +If you try to put an oversized thing in it, then it'll fall out right +away. + +## Options + +* `max` The maximum size of the cache, checked by applying the length + function to all values in the cache. Not setting this is kind of + silly, since that's the whole purpose of this lib, but it defaults + to `Infinity`. Setting it to a non-number or negative number will + throw a `TypeError`. Setting it to 0 makes it be `Infinity`. +* `maxAge` Maximum age in ms. Items are not pro-actively pruned out + as they age, but if you try to get an item that is too old, it'll + drop it and return undefined instead of giving it to you. + Setting this to a negative value will make everything seem old! + Setting it to a non-number will throw a `TypeError`. +* `length` Function that is used to calculate the length of stored + items. If you're storing strings or buffers, then you probably want + to do something like `function(n, key){return n.length}`. The default is + `function(){return 1}`, which is fine if you want to store `max` + like-sized things. The item is passed as the first argument, and + the key is passed as the second argumnet. +* `dispose` Function that is called on items when they are dropped + from the cache. This can be handy if you want to close file + descriptors or do other cleanup tasks when items are no longer + accessible. Called with `key, value`. It's called *before* + actually removing the item from the internal cache, so if you want + to immediately put it back in, you'll have to do that in a + `nextTick` or `setTimeout` callback or it won't do anything. +* `stale` By default, if you set a `maxAge`, it'll only actually pull + stale items out of the cache when you `get(key)`. (That is, it's + not pre-emptively doing a `setTimeout` or anything.) If you set + `stale:true`, it'll return the stale value before deleting it. If + you don't set this, then it'll return `undefined` when you try to + get a stale entry, as if it had already been deleted. +* `noDisposeOnSet` By default, if you set a `dispose()` method, then + it'll be called whenever a `set()` operation overwrites an existing + key. If you set this option, `dispose()` will only be called when a + key falls out of the cache, not when it is overwritten. +* `updateAgeOnGet` When using time-expiring entries with `maxAge`, + setting this to `true` will make each item's effective time update + to the current time whenever it is retrieved from cache, causing it + to not expire. (It can still fall out of cache based on recency of + use, of course.) + +## API + +* `set(key, value, maxAge)` +* `get(key) => value` + + Both of these will update the "recently used"-ness of the key. + They do what you think. `maxAge` is optional and overrides the + cache `maxAge` option if provided. + + If the key is not found, `get()` will return `undefined`. + + The key and val can be any value. + +* `peek(key)` + + Returns the key value (or `undefined` if not found) without + updating the "recently used"-ness of the key. + + (If you find yourself using this a lot, you *might* be using the + wrong sort of data structure, but there are some use cases where + it's handy.) + +* `del(key)` + + Deletes a key out of the cache. + +* `reset()` + + Clear the cache entirely, throwing away all values. + +* `has(key)` + + Check if a key is in the cache, without updating the recent-ness + or deleting it for being stale. + +* `forEach(function(value,key,cache), [thisp])` + + Just like `Array.prototype.forEach`. Iterates over all the keys + in the cache, in order of recent-ness. (Ie, more recently used + items are iterated over first.) + +* `rforEach(function(value,key,cache), [thisp])` + + The same as `cache.forEach(...)` but items are iterated over in + reverse order. (ie, less recently used items are iterated over + first.) + +* `keys()` + + Return an array of the keys in the cache. + +* `values()` + + Return an array of the values in the cache. + +* `length` + + Return total length of objects in cache taking into account + `length` options function. + +* `itemCount` + + Return total quantity of objects currently in cache. Note, that + `stale` (see options) items are returned as part of this item + count. + +* `dump()` + + Return an array of the cache entries ready for serialization and usage + with 'destinationCache.load(arr)`. + +* `load(cacheEntriesArray)` + + Loads another cache entries array, obtained with `sourceCache.dump()`, + into the cache. The destination cache is reset before loading new entries + +* `prune()` + + Manually iterates over the entire cache proactively pruning old entries diff --git a/node_modules/pacote/node_modules/lru-cache/index.js b/node_modules/pacote/node_modules/lru-cache/index.js new file mode 100644 index 0000000000000..573b6b85b9779 --- /dev/null +++ b/node_modules/pacote/node_modules/lru-cache/index.js @@ -0,0 +1,334 @@ +'use strict' + +// A linked list to keep track of recently-used-ness +const Yallist = require('yallist') + +const MAX = Symbol('max') +const LENGTH = Symbol('length') +const LENGTH_CALCULATOR = Symbol('lengthCalculator') +const ALLOW_STALE = Symbol('allowStale') +const MAX_AGE = Symbol('maxAge') +const DISPOSE = Symbol('dispose') +const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet') +const LRU_LIST = Symbol('lruList') +const CACHE = Symbol('cache') +const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet') + +const naiveLength = () => 1 + +// lruList is a yallist where the head is the youngest +// item, and the tail is the oldest. the list contains the Hit +// objects as the entries. +// Each Hit object has a reference to its Yallist.Node. This +// never changes. +// +// cache is a Map (or PseudoMap) that matches the keys to +// the Yallist.Node object. +class LRUCache { + constructor (options) { + if (typeof options === 'number') + options = { max: options } + + if (!options) + options = {} + + if (options.max && (typeof options.max !== 'number' || options.max < 0)) + throw new TypeError('max must be a non-negative number') + // Kind of weird to have a default max of Infinity, but oh well. + const max = this[MAX] = options.max || Infinity + + const lc = options.length || naiveLength + this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc + this[ALLOW_STALE] = options.stale || false + if (options.maxAge && typeof options.maxAge !== 'number') + throw new TypeError('maxAge must be a number') + this[MAX_AGE] = options.maxAge || 0 + this[DISPOSE] = options.dispose + this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false + this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false + this.reset() + } + + // resize the cache when the max changes. + set max (mL) { + if (typeof mL !== 'number' || mL < 0) + throw new TypeError('max must be a non-negative number') + + this[MAX] = mL || Infinity + trim(this) + } + get max () { + return this[MAX] + } + + set allowStale (allowStale) { + this[ALLOW_STALE] = !!allowStale + } + get allowStale () { + return this[ALLOW_STALE] + } + + set maxAge (mA) { + if (typeof mA !== 'number') + throw new TypeError('maxAge must be a non-negative number') + + this[MAX_AGE] = mA + trim(this) + } + get maxAge () { + return this[MAX_AGE] + } + + // resize the cache when the lengthCalculator changes. + set lengthCalculator (lC) { + if (typeof lC !== 'function') + lC = naiveLength + + if (lC !== this[LENGTH_CALCULATOR]) { + this[LENGTH_CALCULATOR] = lC + this[LENGTH] = 0 + this[LRU_LIST].forEach(hit => { + hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key) + this[LENGTH] += hit.length + }) + } + trim(this) + } + get lengthCalculator () { return this[LENGTH_CALCULATOR] } + + get length () { return this[LENGTH] } + get itemCount () { return this[LRU_LIST].length } + + rforEach (fn, thisp) { + thisp = thisp || this + for (let walker = this[LRU_LIST].tail; walker !== null;) { + const prev = walker.prev + forEachStep(this, fn, walker, thisp) + walker = prev + } + } + + forEach (fn, thisp) { + thisp = thisp || this + for (let walker = this[LRU_LIST].head; walker !== null;) { + const next = walker.next + forEachStep(this, fn, walker, thisp) + walker = next + } + } + + keys () { + return this[LRU_LIST].toArray().map(k => k.key) + } + + values () { + return this[LRU_LIST].toArray().map(k => k.value) + } + + reset () { + if (this[DISPOSE] && + this[LRU_LIST] && + this[LRU_LIST].length) { + this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value)) + } + + this[CACHE] = new Map() // hash of items by key + this[LRU_LIST] = new Yallist() // list of items in order of use recency + this[LENGTH] = 0 // length of items in the list + } + + dump () { + return this[LRU_LIST].map(hit => + isStale(this, hit) ? false : { + k: hit.key, + v: hit.value, + e: hit.now + (hit.maxAge || 0) + }).toArray().filter(h => h) + } + + dumpLru () { + return this[LRU_LIST] + } + + set (key, value, maxAge) { + maxAge = maxAge || this[MAX_AGE] + + if (maxAge && typeof maxAge !== 'number') + throw new TypeError('maxAge must be a number') + + const now = maxAge ? Date.now() : 0 + const len = this[LENGTH_CALCULATOR](value, key) + + if (this[CACHE].has(key)) { + if (len > this[MAX]) { + del(this, this[CACHE].get(key)) + return false + } + + const node = this[CACHE].get(key) + const item = node.value + + // dispose of the old one before overwriting + // split out into 2 ifs for better coverage tracking + if (this[DISPOSE]) { + if (!this[NO_DISPOSE_ON_SET]) + this[DISPOSE](key, item.value) + } + + item.now = now + item.maxAge = maxAge + item.value = value + this[LENGTH] += len - item.length + item.length = len + this.get(key) + trim(this) + return true + } + + const hit = new Entry(key, value, len, now, maxAge) + + // oversized objects fall out of cache automatically. + if (hit.length > this[MAX]) { + if (this[DISPOSE]) + this[DISPOSE](key, value) + + return false + } + + this[LENGTH] += hit.length + this[LRU_LIST].unshift(hit) + this[CACHE].set(key, this[LRU_LIST].head) + trim(this) + return true + } + + has (key) { + if (!this[CACHE].has(key)) return false + const hit = this[CACHE].get(key).value + return !isStale(this, hit) + } + + get (key) { + return get(this, key, true) + } + + peek (key) { + return get(this, key, false) + } + + pop () { + const node = this[LRU_LIST].tail + if (!node) + return null + + del(this, node) + return node.value + } + + del (key) { + del(this, this[CACHE].get(key)) + } + + load (arr) { + // reset the cache + this.reset() + + const now = Date.now() + // A previous serialized cache has the most recent items first + for (let l = arr.length - 1; l >= 0; l--) { + const hit = arr[l] + const expiresAt = hit.e || 0 + if (expiresAt === 0) + // the item was created without expiration in a non aged cache + this.set(hit.k, hit.v) + else { + const maxAge = expiresAt - now + // dont add already expired items + if (maxAge > 0) { + this.set(hit.k, hit.v, maxAge) + } + } + } + } + + prune () { + this[CACHE].forEach((value, key) => get(this, key, false)) + } +} + +const get = (self, key, doUse) => { + const node = self[CACHE].get(key) + if (node) { + const hit = node.value + if (isStale(self, hit)) { + del(self, node) + if (!self[ALLOW_STALE]) + return undefined + } else { + if (doUse) { + if (self[UPDATE_AGE_ON_GET]) + node.value.now = Date.now() + self[LRU_LIST].unshiftNode(node) + } + } + return hit.value + } +} + +const isStale = (self, hit) => { + if (!hit || (!hit.maxAge && !self[MAX_AGE])) + return false + + const diff = Date.now() - hit.now + return hit.maxAge ? diff > hit.maxAge + : self[MAX_AGE] && (diff > self[MAX_AGE]) +} + +const trim = self => { + if (self[LENGTH] > self[MAX]) { + for (let walker = self[LRU_LIST].tail; + self[LENGTH] > self[MAX] && walker !== null;) { + // We know that we're about to delete this one, and also + // what the next least recently used key will be, so just + // go ahead and set it now. + const prev = walker.prev + del(self, walker) + walker = prev + } + } +} + +const del = (self, node) => { + if (node) { + const hit = node.value + if (self[DISPOSE]) + self[DISPOSE](hit.key, hit.value) + + self[LENGTH] -= hit.length + self[CACHE].delete(hit.key) + self[LRU_LIST].removeNode(node) + } +} + +class Entry { + constructor (key, value, length, now, maxAge) { + this.key = key + this.value = value + this.length = length + this.now = now + this.maxAge = maxAge || 0 + } +} + +const forEachStep = (self, fn, node, thisp) => { + let hit = node.value + if (isStale(self, hit)) { + del(self, node) + if (!self[ALLOW_STALE]) + hit = undefined + } + if (hit) + fn.call(thisp, hit.value, hit.key, self) +} + +module.exports = LRUCache diff --git a/node_modules/pacote/node_modules/lru-cache/package.json b/node_modules/pacote/node_modules/lru-cache/package.json new file mode 100644 index 0000000000000..a7fbba4b55ddd --- /dev/null +++ b/node_modules/pacote/node_modules/lru-cache/package.json @@ -0,0 +1,67 @@ +{ + "_from": "lru-cache@^5.1.1", + "_id": "lru-cache@5.1.1", + "_inBundle": false, + "_integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "_location": "/pacote/lru-cache", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "lru-cache@^5.1.1", + "name": "lru-cache", + "escapedName": "lru-cache", + "rawSpec": "^5.1.1", + "saveSpec": null, + "fetchSpec": "^5.1.1" + }, + "_requiredBy": [ + "/pacote" + ], + "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "_shasum": "1da27e6710271947695daf6848e847f01d84b920", + "_spec": "lru-cache@^5.1.1", + "_where": "/Users/aeschright/code/cli/node_modules/pacote", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me" + }, + "bugs": { + "url": "https://github.com/isaacs/node-lru-cache/issues" + }, + "bundleDependencies": false, + "dependencies": { + "yallist": "^3.0.2" + }, + "deprecated": false, + "description": "A cache object that deletes the least-recently-used items.", + "devDependencies": { + "benchmark": "^2.1.4", + "tap": "^12.1.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/isaacs/node-lru-cache#readme", + "keywords": [ + "mru", + "lru", + "cache" + ], + "license": "ISC", + "main": "index.js", + "name": "lru-cache", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-lru-cache.git" + }, + "scripts": { + "coveragerport": "tap --coverage-report=html", + "postpublish": "git push origin --all; git push origin --tags", + "postversion": "npm publish", + "preversion": "npm test", + "snap": "TAP_SNAPSHOT=1 tap test/*.js -J", + "test": "tap test/*.js --100 -J" + }, + "version": "5.1.1" +} diff --git a/node_modules/pacote/node_modules/npm-pick-manifest/CHANGELOG.md b/node_modules/pacote/node_modules/npm-pick-manifest/CHANGELOG.md deleted file mode 100644 index 2112665f7572e..0000000000000 --- a/node_modules/pacote/node_modules/npm-pick-manifest/CHANGELOG.md +++ /dev/null @@ -1,133 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. - - -## [2.2.3](https://github.com/zkat/npm-pick-manifest/compare/v2.2.2...v2.2.3) (2018-10-31) - - -### Bug Fixes - -* **enjoyBy:** rework semantics for enjoyBy again ([5e89b62](https://github.com/zkat/npm-pick-manifest/commit/5e89b62)) - - - - -## [2.2.2](https://github.com/zkat/npm-pick-manifest/compare/v2.2.1...v2.2.2) (2018-10-31) - - -### Bug Fixes - -* **enjoyBy:** rework semantics for enjoyBy ([5684f45](https://github.com/zkat/npm-pick-manifest/commit/5684f45)) - - - - -## [2.2.1](https://github.com/zkat/npm-pick-manifest/compare/v2.2.0...v2.2.1) (2018-10-30) - - - - -# [2.2.0](https://github.com/zkat/npm-pick-manifest/compare/v2.1.0...v2.2.0) (2018-10-30) - - -### Bug Fixes - -* **audit:** npm audit fix --force ([d5ae6c4](https://github.com/zkat/npm-pick-manifest/commit/d5ae6c4)) - - -### Features - -* **enjoyBy:** add opts.enjoyBy option to filter versions by date ([0b8a790](https://github.com/zkat/npm-pick-manifest/commit/0b8a790)) - - - - -# [2.1.0](https://github.com/zkat/npm-pick-manifest/compare/v2.0.1...v2.1.0) (2017-10-18) - - -### Features - -* **selection:** allow manually disabling deprecation skipping ([0d239d3](https://github.com/zkat/npm-pick-manifest/commit/0d239d3)) - - - - -## [2.0.1](https://github.com/zkat/npm-pick-manifest/compare/v2.0.0...v2.0.1) (2017-10-18) - - - - -# [2.0.0](https://github.com/zkat/npm-pick-manifest/compare/v1.0.4...v2.0.0) (2017-10-03) - - -### Bug Fixes - -* **license:** relicense project according to npm policy (#3) ([ed743a0](https://github.com/zkat/npm-pick-manifest/commit/ed743a0)) - - -### Features - -* **selection:** Avoid matching deprecated packages if possible ([3fc6c3a](https://github.com/zkat/npm-pick-manifest/commit/3fc6c3a)) - - -### BREAKING CHANGES - -* **selection:** deprecated versions may be skipped now -* **license:** This moves the license from CC0 to ISC and properly documents the copyright as belonging to npm, Inc. - - - - -## [1.0.4](https://github.com/zkat/npm-pick-manifest/compare/v1.0.3...v1.0.4) (2017-06-29) - - -### Bug Fixes - -* **npa:** bump npa version for bugfixes ([7cdaca7](https://github.com/zkat/npm-pick-manifest/commit/7cdaca7)) -* **semver:** use loose semver parsing for *all* ops ([bbc0daa](https://github.com/zkat/npm-pick-manifest/commit/bbc0daa)) - - - - -## [1.0.3](https://github.com/zkat/npm-pick-manifest/compare/v1.0.2...v1.0.3) (2017-05-04) - - -### Bug Fixes - -* **semver:** use semver.clean() instead ([f4133b5](https://github.com/zkat/npm-pick-manifest/commit/f4133b5)) - - - - -## [1.0.2](https://github.com/zkat/npm-pick-manifest/compare/v1.0.1...v1.0.2) (2017-05-04) - - -### Bug Fixes - -* **picker:** spaces in `wanted` prevented match ([97a7d0a](https://github.com/zkat/npm-pick-manifest/commit/97a7d0a)) - - - - -## [1.0.1](https://github.com/zkat/npm-pick-manifest/compare/v1.0.0...v1.0.1) (2017-04-24) - - -### Bug Fixes - -* **deps:** forgot to add semver ([1876f4f](https://github.com/zkat/npm-pick-manifest/commit/1876f4f)) - - - - -# 1.0.0 (2017-04-24) - - -### Features - -* **api:** initial implementation. ([b086912](https://github.com/zkat/npm-pick-manifest/commit/b086912)) - - -### BREAKING CHANGES - -* **api:** ex nihilo diff --git a/node_modules/pacote/node_modules/npm-pick-manifest/LICENSE.md b/node_modules/pacote/node_modules/npm-pick-manifest/LICENSE.md deleted file mode 100644 index 8d28acf866d93..0000000000000 --- a/node_modules/pacote/node_modules/npm-pick-manifest/LICENSE.md +++ /dev/null @@ -1,16 +0,0 @@ -ISC License - -Copyright (c) npm, Inc. - -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 COPYRIGHT HOLDER DISCLAIMS -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -COPYRIGHT HOLDER 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/node_modules/pacote/node_modules/npm-pick-manifest/README.md b/node_modules/pacote/node_modules/npm-pick-manifest/README.md deleted file mode 100644 index a9a027bfcb460..0000000000000 --- a/node_modules/pacote/node_modules/npm-pick-manifest/README.md +++ /dev/null @@ -1,84 +0,0 @@ -# npm-pick-manifest [![npm version](https://img.shields.io/npm/v/npm-pick-manifest.svg)](https://npm.im/npm-pick-manifest) [![license](https://img.shields.io/npm/l/npm-pick-manifest.svg)](https://npm.im/npm-pick-manifest) [![Travis](https://img.shields.io/travis/zkat/npm-pick-manifest.svg)](https://travis-ci.org/zkat/npm-pick-manifest) [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/zkat/npm-pick-manifest?svg=true)](https://ci.appveyor.com/project/zkat/npm-pick-manifest) [![Coverage Status](https://coveralls.io/repos/github/zkat/npm-pick-manifest/badge.svg?branch=latest)](https://coveralls.io/github/zkat/npm-pick-manifest?branch=latest) - -[`npm-pick-manifest`](https://github.com/zkat/npm-pick-manifest) is a standalone -implementation of [npm](https://npmjs.com)'s semver range resolution algorithm. - -## Install - -`$ npm install --save npm-pick-manifest` - -## Table of Contents - -* [Example](#example) -* [Features](#features) -* [Contributing](#contributing) -* [API](#api) - * [`pickManifest()`](#pick-manifest) - -### Example - -```javascript -const pickManifest = require('npm-pick-manifest') - -fetch('https://registry.npmjs.org/npm-pick-manifest').then(res => { - return res.json() -}).then(packument => { - return pickManifest(packument, '^1.0.0') -}) // get same manifest as npm would get if you `npm i npm-pick-manifest@^1.0.0` -``` - -### Features - -* Uses npm's exact semver resolution algorithm -* Supports ranges, tags, and versions - -### Contributing - -The npm-pick-manifest team enthusiastically welcomes contributions and project participation! -There's a bunch of things you can do if you want to contribute! The [Contributor -Guide](CONTRIBUTING.md) has all the information you need for everything from -reporting bugs to contributing entire new features. Please don't hesitate to -jump in if you'd like to, or even ask us questions if something isn't clear. - -### API - -#### `> pickManifest(packument, selector, [opts]) -> manifest` - -Returns the manifest that matches `selector`, or throws an error. - -Packuments are anything returned by metadata URLs from the npm registry. That -is, they're objects with the following shape (only fields used by -`npm-pick-manifest` included): - -```javascript -{ - name: 'some-package', - 'dist-tags': { - foo: '1.0.1' - }, - versions: { - '1.0.0': { version: '1.0.0' }, - '1.0.1': { version: '1.0.1' }, - '1.0.2': { version: '1.0.2' }, - '2.0.0': { version: '2.0.0' } - } -} -``` - -The algorithm will follow npm's algorithm for semver resolution, and only `tag`, -`range`, and `version` selectors are supported. - -The function will throw `ETARGET` if there was no matching manifest, and -`ENOVERSIONS` if the packument object has no valid versions in `versions`. - -If `opts.defaultTag` is provided, it will be used instead of `latest`. That is, -if that tag matches the selector, it will be used, even if a higher available -version matches the range. - -If `opts.enjoyBy` is provided, it should be something that can be passed to `new -Date(x)`, such as a `Date` object or a timestamp string. It will be used to -filter the selected versions such that only versions less than or equal to -`enjoyBy` are considered. - -If `opts.includeDeprecated` passed in as true, deprecated versions will be -selected. By default, deprecated versions other than `defaultTag` are ignored. diff --git a/node_modules/pacote/node_modules/npm-pick-manifest/index.js b/node_modules/pacote/node_modules/npm-pick-manifest/index.js deleted file mode 100644 index d9a8373e57f14..0000000000000 --- a/node_modules/pacote/node_modules/npm-pick-manifest/index.js +++ /dev/null @@ -1,121 +0,0 @@ -'use strict' - -const figgyPudding = require('figgy-pudding') -const npa = require('npm-package-arg') -const semver = require('semver') - -const PickerOpts = figgyPudding({ - defaultTag: { default: 'latest' }, - enjoyBy: {}, - includeDeprecated: { default: false } -}) - -module.exports = pickManifest -function pickManifest (packument, wanted, opts) { - opts = PickerOpts(opts) - const time = opts.enjoyBy && packument.time && +(new Date(opts.enjoyBy)) - const spec = npa.resolve(packument.name, wanted) - const type = spec.type - if (type === 'version' || type === 'range') { - wanted = semver.clean(wanted, true) || wanted - } - const distTags = packument['dist-tags'] || {} - const versions = Object.keys(packument.versions || {}).filter(v => { - return semver.valid(v, true) - }) - - function enjoyableBy (v) { - return !time || ( - packument.time[v] && time >= +(new Date(packument.time[v])) - ) - } - - let err - - if (!versions.length) { - err = new Error(`No valid versions available for ${packument.name}`) - err.code = 'ENOVERSIONS' - err.name = packument.name - err.type = type - err.wanted = wanted - throw err - } - - let target - - if (type === 'tag' && enjoyableBy(distTags[wanted])) { - target = distTags[wanted] - } else if (type === 'version') { - target = wanted - } else if (type !== 'range' && enjoyableBy(distTags[wanted])) { - throw new Error('Only tag, version, and range are supported') - } - - const tagVersion = distTags[opts.defaultTag] - - if ( - !target && - tagVersion && - packument.versions[tagVersion] && - enjoyableBy(tagVersion) && - semver.satisfies(tagVersion, wanted, true) - ) { - target = tagVersion - } - - if (!target && !opts.includeDeprecated) { - const undeprecated = versions.filter(v => !packument.versions[v].deprecated && enjoyableBy(v) - ) - target = semver.maxSatisfying(undeprecated, wanted, true) - } - if (!target) { - const stillFresh = versions.filter(enjoyableBy) - target = semver.maxSatisfying(stillFresh, wanted, true) - } - - if (!target && wanted === '*' && enjoyableBy(tagVersion)) { - // This specific corner is meant for the case where - // someone is using `*` as a selector, but all versions - // are pre-releases, which don't match ranges at all. - target = tagVersion - } - - if ( - !target && - time && - type === 'tag' && - distTags[wanted] && - !enjoyableBy(distTags[wanted]) - ) { - const stillFresh = versions.filter(v => - enjoyableBy(v) && semver.lte(v, distTags[wanted], true) - ).sort(semver.rcompare) - target = stillFresh[0] - } - - const manifest = ( - target && - packument.versions[target] - ) - if (!manifest) { - err = new Error( - `No matching version found for ${packument.name}@${wanted}${ - opts.enjoyBy - ? ` with an Enjoy By date of ${ - new Date(opts.enjoyBy).toLocaleString() - }. Maybe try a different date?` - : '' - }` - ) - err.code = 'ETARGET' - err.name = packument.name - err.type = type - err.wanted = wanted - err.versions = versions - err.distTags = distTags - err.defaultTag = opts.defaultTag - throw err - } else { - return manifest - } -} diff --git a/node_modules/pacote/node_modules/npm-pick-manifest/package.json b/node_modules/pacote/node_modules/npm-pick-manifest/package.json deleted file mode 100644 index b4cf0e455de99..0000000000000 --- a/node_modules/pacote/node_modules/npm-pick-manifest/package.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "_from": "npm-pick-manifest@^2.2.3", - "_id": "npm-pick-manifest@2.2.3", - "_inBundle": false, - "_integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", - "_location": "/pacote/npm-pick-manifest", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "npm-pick-manifest@^2.2.3", - "name": "npm-pick-manifest", - "escapedName": "npm-pick-manifest", - "rawSpec": "^2.2.3", - "saveSpec": null, - "fetchSpec": "^2.2.3" - }, - "_requiredBy": [ - "/pacote" - ], - "_resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", - "_shasum": "32111d2a9562638bb2c8f2bf27f7f3092c8fae40", - "_spec": "npm-pick-manifest@^2.2.3", - "_where": "/Users/zkat/Documents/code/work/npm/node_modules/pacote", - "author": { - "name": "Kat Marchán", - "email": "kzm@sykosomatic.org" - }, - "bugs": { - "url": "https://github.com/zkat/npm-pick-manifest/issues" - }, - "bundleDependencies": false, - "config": { - "nyc": { - "exclude": [ - "node_modules/**", - "test/**" - ] - } - }, - "dependencies": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" - }, - "deprecated": false, - "description": "Resolves a matching manifest from a package metadata document according to standard npm semver resolution rules.", - "devDependencies": { - "nyc": "^13.1.0", - "standard": "^10.0.3", - "standard-version": "^4.4.0", - "tap": "^12.0.1", - "weallbehave": "^1.2.0", - "weallcontribute": "^1.0.8" - }, - "files": [ - "*.js" - ], - "homepage": "https://github.com/zkat/npm-pick-manifest#readme", - "keywords": [ - "npm", - "semver", - "package manager" - ], - "license": "ISC", - "main": "index.js", - "name": "npm-pick-manifest", - "repository": { - "type": "git", - "url": "git+https://github.com/zkat/npm-pick-manifest.git" - }, - "scripts": { - "postrelease": "npm publish && git push --follow-tags", - "prerelease": "npm t", - "pretest": "standard", - "release": "standard-version -s", - "test": "tap -J --100 --coverage test/*.js", - "update-coc": "weallbehave -o . && git add CODE_OF_CONDUCT.md && git commit -m 'docs(coc): updated CODE_OF_CONDUCT.md'", - "update-contrib": "weallcontribute -o . && git add CONTRIBUTING.md && git commit -m 'docs(contributing): updated CONTRIBUTING.md'" - }, - "version": "2.2.3" -} diff --git a/node_modules/pacote/node_modules/semver/README.md b/node_modules/pacote/node_modules/semver/README.md deleted file mode 100644 index e0edbb7333112..0000000000000 --- a/node_modules/pacote/node_modules/semver/README.md +++ /dev/null @@ -1,399 +0,0 @@ -semver(1) -- The semantic versioner for npm -=========================================== - -## Install - -```bash -npm install --save semver -```` - -## Usage - -As a node module: - -```js -const semver = require('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 -semver.valid(semver.coerce('v2')) // '2.0.0' -semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7' -``` - -As a command-line utility: - -``` -$ semver -h - -A JavaScript implementation of the http://semver.org/ specification -Copyright Isaac Z. Schlueter - -Usage: semver [options] [ [...]] -Prints valid versions sorted by SemVer precedence - -Options: --r --range - Print versions that match the specified range. - --i --increment [] - Increment a version by the specified level. Level can - be one of: major, minor, patch, premajor, preminor, - prepatch, or prerelease. Default level is 'patch'. - Only one version may be specified. - ---preid - Identifier to be used to prefix premajor, preminor, - prepatch or prerelease version increments. - --l --loose - Interpret versions and ranges loosely - --p --include-prerelease - Always include prerelease versions in range matching - --c --coerce - Coerce a string into SemVer if possible - (does not imply --loose) - -Program exits successfully if any valid version satisfies -all supplied ranges, and prints all satisfying versions. - -If no satisfying versions are found, then exits failure. - -Versions are printed in ascending order, so supplying -multiple versions to the utility will just sort them. -``` - -## Versions - -A "version" is described by the `v2.0.0` specification found at -. - -A leading `"="` or `"v"` character is stripped off and ignored. - -## Ranges - -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. - -#### Prerelease Identifiers - -The method `.inc` takes an additional `identifier` string argument that -will append the value of the string as a prerelease identifier: - -```javascript -semver.inc('1.2.3', 'prerelease', 'beta') -// '1.2.4-beta.0' -``` - -command-line example: - -```bash -$ semver 1.2.3 -i prerelease --preid beta -1.2.4-beta.0 -``` - -Which then can be used to increment further: - -```bash -$ semver 1.2.4-beta.0 -i prerelease -1.2.4-beta.1 -``` - -### Advanced Range Syntax - -Advanced range syntax desugars to primitive comparators in -deterministic ways. - -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` - -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. - -#### 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` - -### Range Grammar - -Putting all this together, here is a Backus-Naur grammar for ranges, -for the benefit of parser authors: - -```bnf -range-set ::= range ( logical-or range ) * -logical-or ::= ( ' ' ) * '||' ( ' ' ) * -range ::= hyphen | simple ( ' ' simple ) * | '' -hyphen ::= partial ' - ' partial -simple ::= primitive | partial | tilde | caret -primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial -partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? -xr ::= 'x' | 'X' | '*' | nr -nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) * -tilde ::= '~' partial -caret ::= '^' partial -qualifier ::= ( '-' pre )? ( '+' build )? -pre ::= parts -build ::= parts -parts ::= part ( '.' part ) * -part ::= nr | [-0-9A-Za-z]+ -``` - -## Functions - -All methods and classes take a final `options` object argument. All -options in this object are `false` by default. The options supported -are: - -- `loose` Be more forgiving about not-quite-valid semver strings. - (Any resulting output will always be 100% strict compliant, of - course.) For backwards compatibility reasons, if the `options` - argument is a boolean value instead of an object, it is interpreted - to be the `loose` param. -- `includePrerelease` Set to suppress the [default - behavior](https://github.com/npm/node-semver#prerelease-tags) of - excluding prerelease tagged versions from ranges unless they are - explicitly opted into. - -Strict-mode Comparators and Ranges will be strict about the SemVer -strings that they parse. - -* `valid(v)`: Return the parsed version, or null if it's not valid. -* `inc(v, release)`: Return the version incremented by the release - type (`major`, `premajor`, `minor`, `preminor`, `patch`, - `prepatch`, or `prerelease`), or null if it's not valid - * `premajor` in one call will bump the version up to the next major - version and down to a prerelease of that major version. - `preminor`, and `prepatch` work the same way. - * If called from a non-prerelease version, the `prerelease` will work the - same as `prepatch`. It increments the patch version, then makes a - prerelease. If the input version is already a prerelease it simply - increments it. -* `prerelease(v)`: Returns an array of prerelease components, or null - if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]` -* `major(v)`: Return the major version number. -* `minor(v)`: Return the minor version number. -* `patch(v)`: Return the patch version number. -* `intersects(r1, r2, loose)`: Return true if the two supplied ranges - or comparators intersect. - -### Comparison - -* `gt(v1, v2)`: `v1 > v2` -* `gte(v1, v2)`: `v1 >= v2` -* `lt(v1, v2)`: `v1 < v2` -* `lte(v1, v2)`: `v1 <= v2` -* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent, - even if they're not the exact same string. You already know how to - compare strings. -* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`. -* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call - the corresponding function above. `"==="` and `"!=="` do simple - string comparison, but are included for completeness. Throws if an - invalid comparison string is provided. -* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if - `v2` is greater. Sorts in ascending order if passed to `Array.sort()`. -* `rcompare(v1, v2)`: The reverse of compare. Sorts an array of versions - in descending order when passed to `Array.sort()`. -* `diff(v1, v2)`: Returns difference between two versions by the release type - (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`), - or null if the versions are the same. - -### Comparators - -* `intersects(comparator)`: Return true if the comparators intersect - -### Ranges - -* `validRange(range)`: Return the valid range or null if it's not valid -* `satisfies(version, range)`: Return true if the version satisfies the - range. -* `maxSatisfying(versions, range)`: Return the highest version in the list - that satisfies the range, or `null` if none of them do. -* `minSatisfying(versions, range)`: Return the lowest version in the list - that satisfies the range, or `null` if none of them do. -* `gtr(version, range)`: Return `true` if version is greater than all the - versions possible in the range. -* `ltr(version, range)`: Return `true` if version is less than all the - versions possible in the range. -* `outside(version, range, hilo)`: Return true if the version is outside - the bounds of the range in either the high or low direction. The - `hilo` argument must be either the string `'>'` or `'<'`. (This is - the function called by `gtr` and `ltr`.) -* `intersects(range)`: Return true if any of the ranges comparators intersect - -Note that, since ranges may be non-contiguous, a version might not be -greater than a range, less than a range, *or* satisfy a range! For -example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9` -until `2.0.0`, so the version `1.2.10` would not be greater than the -range (because `2.0.1` satisfies, which is higher), nor less than the -range (since `1.2.8` satisfies, which is lower), and it also does not -satisfy the range. - -If you want to know if a version satisfies or does not satisfy a -range, use the `satisfies(version, range)` function. - -### Coercion - -* `coerce(version)`: Coerces a string to semver if possible - -This aims to provide a very forgiving translation of a non-semver -string to semver. It looks for the first digit in a string, and -consumes all remaining characters which satisfy at least a partial semver -(e.g., `1`, `1.2`, `1.2.3`) up to the max permitted length (256 characters). -Longer versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`). -All surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes `3.4.0`). -Only text which lacks digits will fail coercion (`version one` is not valid). -The maximum length for any semver component considered for coercion is 16 characters; -longer components will be ignored (`10000000000000000.4.7.4` becomes `4.7.4`). -The maximum value for any semver component is `Integer.MAX_SAFE_INTEGER || (2**53 - 1)`; -higher value components are invalid (`9999999999999999.4.7.4` is likely invalid). diff --git a/node_modules/pacote/node_modules/semver/bin/semver b/node_modules/pacote/node_modules/semver/bin/semver deleted file mode 100755 index 9100ed42b8821..0000000000000 --- a/node_modules/pacote/node_modules/semver/bin/semver +++ /dev/null @@ -1,153 +0,0 @@ -#!/usr/bin/env node -// Standalone semver comparison program. -// Exits successfully and prints matching version(s) if -// any supplied version is valid and passes all tests. - -var argv = process.argv.slice(2) - , versions = [] - , range = [] - , gt = [] - , lt = [] - , eq = [] - , inc = null - , version = require("../package.json").version - , loose = false - , includePrerelease = false - , coerce = false - , identifier = undefined - , semver = require("../semver") - , reverse = false - , options = {} - -main() - -function main () { - if (!argv.length) return help() - while (argv.length) { - var a = argv.shift() - var i = a.indexOf('=') - if (i !== -1) { - a = a.slice(0, i) - argv.unshift(a.slice(i + 1)) - } - switch (a) { - case "-rv": case "-rev": case "--rev": case "--reverse": - reverse = true - break - case "-l": case "--loose": - loose = true - break - case "-p": case "--include-prerelease": - includePrerelease = true - break - case "-v": case "--version": - versions.push(argv.shift()) - break - case "-i": case "--inc": case "--increment": - switch (argv[0]) { - case "major": case "minor": case "patch": case "prerelease": - case "premajor": case "preminor": case "prepatch": - inc = argv.shift() - break - default: - inc = "patch" - break - } - break - case "--preid": - identifier = argv.shift() - break - case "-r": case "--range": - range.push(argv.shift()) - break - case "-c": case "--coerce": - coerce = true - break - case "-h": case "--help": case "-?": - return help() - default: - versions.push(a) - break - } - } - - var options = { loose: loose, includePrerelease: includePrerelease } - - versions = versions.map(function (v) { - return coerce ? (semver.coerce(v) || {version: v}).version : v - }).filter(function (v) { - return semver.valid(v) - }) - if (!versions.length) return fail() - if (inc && (versions.length !== 1 || range.length)) - return failInc() - - for (var i = 0, l = range.length; i < l ; i ++) { - versions = versions.filter(function (v) { - return semver.satisfies(v, range[i], options) - }) - if (!versions.length) return fail() - } - return success(versions) -} - -function failInc () { - console.error("--inc can only be used on a single version with no range") - fail() -} - -function fail () { process.exit(1) } - -function success () { - var compare = reverse ? "rcompare" : "compare" - versions.sort(function (a, b) { - return semver[compare](a, b, options) - }).map(function (v) { - return semver.clean(v, options) - }).map(function (v) { - return inc ? semver.inc(v, inc, options, identifier) : v - }).forEach(function (v,i,_) { console.log(v) }) -} - -function help () { - console.log(["SemVer " + version - ,"" - ,"A JavaScript implementation of the http://semver.org/ specification" - ,"Copyright Isaac Z. Schlueter" - ,"" - ,"Usage: semver [options] [ [...]]" - ,"Prints valid versions sorted by SemVer precedence" - ,"" - ,"Options:" - ,"-r --range " - ," Print versions that match the specified range." - ,"" - ,"-i --increment []" - ," Increment a version by the specified level. Level can" - ," be one of: major, minor, patch, premajor, preminor," - ," prepatch, or prerelease. Default level is 'patch'." - ," Only one version may be specified." - ,"" - ,"--preid " - ," Identifier to be used to prefix premajor, preminor," - ," prepatch or prerelease version increments." - ,"" - ,"-l --loose" - ," Interpret versions and ranges loosely" - ,"" - ,"-p --include-prerelease" - ," Always include prerelease versions in range matching" - ,"" - ,"-c --coerce" - ," Coerce a string into SemVer if possible" - ," (does not imply --loose)" - ,"" - ,"Program exits successfully if any valid version satisfies" - ,"all supplied ranges, and prints all satisfying versions." - ,"" - ,"If no satisfying versions are found, then exits failure." - ,"" - ,"Versions are printed in ascending order, so supplying" - ,"multiple versions to the utility will just sort them." - ].join("\n")) -} diff --git a/node_modules/pacote/node_modules/semver/package.json b/node_modules/pacote/node_modules/semver/package.json deleted file mode 100644 index 285d247241552..0000000000000 --- a/node_modules/pacote/node_modules/semver/package.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "_from": "semver@^5.6.0", - "_id": "semver@5.6.0", - "_inBundle": false, - "_integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "_location": "/pacote/semver", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "semver@^5.6.0", - "name": "semver", - "escapedName": "semver", - "rawSpec": "^5.6.0", - "saveSpec": null, - "fetchSpec": "^5.6.0" - }, - "_requiredBy": [ - "/pacote", - "/pacote/npm-pick-manifest" - ], - "_resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "_shasum": "7e74256fbaa49c75aa7c7a205cc22799cac80004", - "_spec": "semver@^5.6.0", - "_where": "/Users/zkat/Documents/code/work/npm/node_modules/pacote", - "bin": { - "semver": "./bin/semver" - }, - "bugs": { - "url": "https://github.com/npm/node-semver/issues" - }, - "bundleDependencies": false, - "deprecated": false, - "description": "The semantic version parser used by npm.", - "devDependencies": { - "tap": "^12.0.1" - }, - "files": [ - "bin", - "range.bnf", - "semver.js" - ], - "homepage": "https://github.com/npm/node-semver#readme", - "license": "ISC", - "main": "semver.js", - "name": "semver", - "repository": { - "type": "git", - "url": "git+https://github.com/npm/node-semver.git" - }, - "scripts": { - "test": "tap test/*.js --cov -J" - }, - "version": "5.6.0" -} diff --git a/node_modules/pacote/node_modules/semver/range.bnf b/node_modules/pacote/node_modules/semver/range.bnf deleted file mode 100644 index d4c6ae0d76c9a..0000000000000 --- a/node_modules/pacote/node_modules/semver/range.bnf +++ /dev/null @@ -1,16 +0,0 @@ -range-set ::= range ( logical-or range ) * -logical-or ::= ( ' ' ) * '||' ( ' ' ) * -range ::= hyphen | simple ( ' ' simple ) * | '' -hyphen ::= partial ' - ' partial -simple ::= primitive | partial | tilde | caret -primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial -partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? -xr ::= 'x' | 'X' | '*' | nr -nr ::= '0' | [1-9] ( [0-9] ) * -tilde ::= '~' partial -caret ::= '^' partial -qualifier ::= ( '-' pre )? ( '+' build )? -pre ::= parts -build ::= parts -parts ::= part ( '.' part ) * -part ::= nr | [-0-9A-Za-z]+ diff --git a/node_modules/pacote/node_modules/semver/semver.js b/node_modules/pacote/node_modules/semver/semver.js deleted file mode 100644 index 0cc57350c2c8e..0000000000000 --- a/node_modules/pacote/node_modules/semver/semver.js +++ /dev/null @@ -1,1352 +0,0 @@ -exports = module.exports = SemVer; - -// The debug function is excluded entirely from the minified version. -/* nomin */ var debug; -/* nomin */ if (typeof process === 'object' && - /* nomin */ process.env && - /* nomin */ process.env.NODE_DEBUG && - /* nomin */ /\bsemver\b/i.test(process.env.NODE_DEBUG)) - /* nomin */ debug = function() { - /* nomin */ var args = Array.prototype.slice.call(arguments, 0); - /* nomin */ args.unshift('SEMVER'); - /* nomin */ console.log.apply(console, args); - /* nomin */ }; -/* nomin */ else - /* nomin */ debug = function() {}; - -// Note: this is the semver.org version of the spec that it implements -// Not necessarily the package version of this code. -exports.SEMVER_SPEC_VERSION = '2.0.0'; - -var MAX_LENGTH = 256; -var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; - -// Max safe segment length for coercion. -var MAX_SAFE_COMPONENT_LENGTH = 16; - -// The actual regexps go on exports.re -var re = exports.re = []; -var src = exports.src = []; -var R = 0; - -// The following Regular Expressions can be used for tokenizing, -// validating, and parsing SemVer version strings. - -// ## Numeric Identifier -// A single `0`, or a non-zero digit followed by zero or more digits. - -var NUMERICIDENTIFIER = R++; -src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'; -var NUMERICIDENTIFIERLOOSE = R++; -src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'; - - -// ## Non-numeric Identifier -// Zero or more digits, followed by a letter or hyphen, and then zero or -// more letters, digits, or hyphens. - -var NONNUMERICIDENTIFIER = R++; -src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'; - - -// ## Main Version -// Three dot-separated numeric identifiers. - -var MAINVERSION = R++; -src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + - '(' + src[NUMERICIDENTIFIER] + ')\\.' + - '(' + src[NUMERICIDENTIFIER] + ')'; - -var MAINVERSIONLOOSE = R++; -src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + - '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + - '(' + src[NUMERICIDENTIFIERLOOSE] + ')'; - -// ## Pre-release Version Identifier -// A numeric identifier, or a non-numeric identifier. - -var PRERELEASEIDENTIFIER = R++; -src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + - '|' + src[NONNUMERICIDENTIFIER] + ')'; - -var PRERELEASEIDENTIFIERLOOSE = R++; -src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + - '|' + src[NONNUMERICIDENTIFIER] + ')'; - - -// ## Pre-release Version -// Hyphen, followed by one or more dot-separated pre-release version -// identifiers. - -var PRERELEASE = R++; -src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + - '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'; - -var PRERELEASELOOSE = R++; -src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + - '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'; - -// ## Build Metadata Identifier -// Any combination of digits, letters, or hyphens. - -var BUILDIDENTIFIER = R++; -src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'; - -// ## Build Metadata -// Plus sign, followed by one or more period-separated build metadata -// identifiers. - -var BUILD = R++; -src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + - '(?:\\.' + src[BUILDIDENTIFIER] + ')*))'; - - -// ## Full Version String -// A main version, followed optionally by a pre-release version and -// build metadata. - -// Note that the only major, minor, patch, and pre-release sections of -// the version string are capturing groups. The build metadata is not a -// capturing group, because it should not ever be used in version -// comparison. - -var FULL = R++; -var FULLPLAIN = 'v?' + src[MAINVERSION] + - src[PRERELEASE] + '?' + - src[BUILD] + '?'; - -src[FULL] = '^' + FULLPLAIN + '$'; - -// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. -// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty -// common in the npm registry. -var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + - src[PRERELEASELOOSE] + '?' + - src[BUILD] + '?'; - -var LOOSE = R++; -src[LOOSE] = '^' + LOOSEPLAIN + '$'; - -var GTLT = R++; -src[GTLT] = '((?:<|>)?=?)'; - -// Something like "2.*" or "1.2.x". -// Note that "x.x" is a valid xRange identifer, meaning "any version" -// Only the first item is strictly required. -var XRANGEIDENTIFIERLOOSE = R++; -src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'; -var XRANGEIDENTIFIER = R++; -src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'; - -var XRANGEPLAIN = R++; -src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + - '(?:' + src[PRERELEASE] + ')?' + - src[BUILD] + '?' + - ')?)?'; - -var XRANGEPLAINLOOSE = R++; -src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:' + src[PRERELEASELOOSE] + ')?' + - src[BUILD] + '?' + - ')?)?'; - -var XRANGE = R++; -src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'; -var XRANGELOOSE = R++; -src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'; - -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -var COERCE = R++; -src[COERCE] = '(?:^|[^\\d])' + - '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + - '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + - '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + - '(?:$|[^\\d])'; - -// Tilde ranges. -// Meaning is "reasonably at or greater than" -var LONETILDE = R++; -src[LONETILDE] = '(?:~>?)'; - -var TILDETRIM = R++; -src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'; -re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g'); -var tildeTrimReplace = '$1~'; - -var TILDE = R++; -src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'; -var TILDELOOSE = R++; -src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'; - -// Caret ranges. -// Meaning is "at least and backwards compatible with" -var LONECARET = R++; -src[LONECARET] = '(?:\\^)'; - -var CARETTRIM = R++; -src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'; -re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g'); -var caretTrimReplace = '$1^'; - -var CARET = R++; -src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'; -var CARETLOOSE = R++; -src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'; - -// A simple gt/lt/eq thing, or just "" to indicate "any version" -var COMPARATORLOOSE = R++; -src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'; -var COMPARATOR = R++; -src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'; - - -// An expression to strip any whitespace between the gtlt and the thing -// it modifies, so that `> 1.2.3` ==> `>1.2.3` -var COMPARATORTRIM = R++; -src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + - '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'; - -// this one has to use the /g flag -re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g'); -var comparatorTrimReplace = '$1$2$3'; - - -// Something like `1.2.3 - 1.2.4` -// Note that these all use the loose form, because they'll be -// checked against either the strict or loose comparator form -// later. -var HYPHENRANGE = R++; -src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + - '\\s+-\\s+' + - '(' + src[XRANGEPLAIN] + ')' + - '\\s*$'; - -var HYPHENRANGELOOSE = R++; -src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + - '\\s+-\\s+' + - '(' + src[XRANGEPLAINLOOSE] + ')' + - '\\s*$'; - -// Star ranges basically just allow anything at all. -var STAR = R++; -src[STAR] = '(<|>)?=?\\s*\\*'; - -// Compile to actual regexp objects. -// All are flag-free, unless they were created above with a flag. -for (var i = 0; i < R; i++) { - debug(i, src[i]); - if (!re[i]) - re[i] = new RegExp(src[i]); -} - -exports.parse = parse; -function parse(version, options) { - if (!options || typeof options !== 'object') - options = { loose: !!options, includePrerelease: false } - - if (version instanceof SemVer) - return version; - - if (typeof version !== 'string') - return null; - - if (version.length > MAX_LENGTH) - return null; - - var r = options.loose ? re[LOOSE] : re[FULL]; - if (!r.test(version)) - return null; - - try { - return new SemVer(version, options); - } catch (er) { - return null; - } -} - -exports.valid = valid; -function valid(version, options) { - var v = parse(version, options); - return v ? v.version : null; -} - - -exports.clean = clean; -function clean(version, options) { - var s = parse(version.trim().replace(/^[=v]+/, ''), options); - return s ? s.version : null; -} - -exports.SemVer = SemVer; - -function SemVer(version, options) { - if (!options || typeof options !== 'object') - options = { loose: !!options, includePrerelease: false } - if (version instanceof SemVer) { - if (version.loose === options.loose) - return version; - else - version = version.version; - } else if (typeof version !== 'string') { - throw new TypeError('Invalid Version: ' + version); - } - - if (version.length > MAX_LENGTH) - throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') - - if (!(this instanceof SemVer)) - return new SemVer(version, options); - - debug('SemVer', version, options); - this.options = options; - this.loose = !!options.loose; - - var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL]); - - if (!m) - throw new TypeError('Invalid Version: ' + version); - - this.raw = version; - - // these are actually numbers - this.major = +m[1]; - this.minor = +m[2]; - this.patch = +m[3]; - - if (this.major > MAX_SAFE_INTEGER || this.major < 0) - throw new TypeError('Invalid major version') - - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) - throw new TypeError('Invalid minor version') - - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) - throw new TypeError('Invalid patch version') - - // numberify any prerelease numeric ids - if (!m[4]) - this.prerelease = []; - else - this.prerelease = m[4].split('.').map(function(id) { - if (/^[0-9]+$/.test(id)) { - var num = +id; - if (num >= 0 && num < MAX_SAFE_INTEGER) - return num; - } - return id; - }); - - this.build = m[5] ? m[5].split('.') : []; - this.format(); -} - -SemVer.prototype.format = function() { - this.version = this.major + '.' + this.minor + '.' + this.patch; - if (this.prerelease.length) - this.version += '-' + this.prerelease.join('.'); - return this.version; -}; - -SemVer.prototype.toString = function() { - return this.version; -}; - -SemVer.prototype.compare = function(other) { - debug('SemVer.compare', this.version, this.options, other); - if (!(other instanceof SemVer)) - other = new SemVer(other, this.options); - - return this.compareMain(other) || this.comparePre(other); -}; - -SemVer.prototype.compareMain = function(other) { - if (!(other instanceof SemVer)) - other = new SemVer(other, this.options); - - return compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch); -}; - -SemVer.prototype.comparePre = function(other) { - if (!(other instanceof SemVer)) - other = new SemVer(other, this.options); - - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) - return -1; - else if (!this.prerelease.length && other.prerelease.length) - return 1; - else if (!this.prerelease.length && !other.prerelease.length) - return 0; - - var i = 0; - do { - var a = this.prerelease[i]; - var b = other.prerelease[i]; - debug('prerelease compare', i, a, b); - if (a === undefined && b === undefined) - return 0; - else if (b === undefined) - return 1; - else if (a === undefined) - return -1; - else if (a === b) - continue; - else - return compareIdentifiers(a, b); - } while (++i); -}; - -// preminor will bump the version up to the next minor release, and immediately -// down to pre-release. premajor and prepatch work the same way. -SemVer.prototype.inc = function(release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0; - this.patch = 0; - this.minor = 0; - this.major++; - this.inc('pre', identifier); - break; - case 'preminor': - this.prerelease.length = 0; - this.patch = 0; - this.minor++; - this.inc('pre', identifier); - 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', identifier); - this.inc('pre', identifier); - break; - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) - this.inc('patch', identifier); - this.inc('pre', identifier); - break; - - case 'major': - // 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': - // 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; - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) - this.patch++; - this.prerelease = []; - break; - // This probably shouldn't be used publicly. - // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. - case 'pre': - if (this.prerelease.length === 0) - this.prerelease = [0]; - else { - var i = this.prerelease.length; - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++; - i = -2; - } - } - if (i === -1) // didn't increment anything - this.prerelease.push(0); - } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) - this.prerelease = [identifier, 0]; - } else - this.prerelease = [identifier, 0]; - } - break; - - default: - throw new Error('invalid increment argument: ' + release); - } - this.format(); - this.raw = this.version; - return this; -}; - -exports.inc = inc; -function inc(version, release, loose, identifier) { - if (typeof(loose) === 'string') { - identifier = loose; - loose = undefined; - } - - try { - return new SemVer(version, loose).inc(release, identifier).version; - } catch (er) { - return null; - } -} - -exports.diff = diff; -function diff(version1, version2) { - if (eq(version1, version2)) { - return null; - } else { - var v1 = parse(version1); - var v2 = parse(version2); - if (v1.prerelease.length || v2.prerelease.length) { - for (var key in v1) { - if (key === 'major' || key === 'minor' || key === 'patch') { - if (v1[key] !== v2[key]) { - return 'pre'+key; - } - } - } - return 'prerelease'; - } - for (var key in v1) { - if (key === 'major' || key === 'minor' || key === 'patch') { - if (v1[key] !== v2[key]) { - return key; - } - } - } - } -} - -exports.compareIdentifiers = compareIdentifiers; - -var numeric = /^[0-9]+$/; -function compareIdentifiers(a, b) { - var anum = numeric.test(a); - var bnum = numeric.test(b); - - if (anum && bnum) { - a = +a; - b = +b; - } - - return (anum && !bnum) ? -1 : - (bnum && !anum) ? 1 : - a < b ? -1 : - a > b ? 1 : - 0; -} - -exports.rcompareIdentifiers = rcompareIdentifiers; -function rcompareIdentifiers(a, b) { - return compareIdentifiers(b, a); -} - -exports.major = major; -function major(a, loose) { - return new SemVer(a, loose).major; -} - -exports.minor = minor; -function minor(a, loose) { - return new SemVer(a, loose).minor; -} - -exports.patch = patch; -function patch(a, loose) { - return new SemVer(a, loose).patch; -} - -exports.compare = compare; -function compare(a, b, loose) { - return new SemVer(a, loose).compare(new SemVer(b, loose)); -} - -exports.compareLoose = compareLoose; -function compareLoose(a, b) { - return compare(a, b, true); -} - -exports.rcompare = rcompare; -function rcompare(a, b, loose) { - return compare(b, a, loose); -} - -exports.sort = sort; -function sort(list, loose) { - return list.sort(function(a, b) { - return exports.compare(a, b, loose); - }); -} - -exports.rsort = rsort; -function rsort(list, loose) { - return list.sort(function(a, b) { - return exports.rcompare(a, b, loose); - }); -} - -exports.gt = gt; -function gt(a, b, loose) { - return compare(a, b, loose) > 0; -} - -exports.lt = lt; -function lt(a, b, loose) { - return compare(a, b, loose) < 0; -} - -exports.eq = eq; -function eq(a, b, loose) { - return compare(a, b, loose) === 0; -} - -exports.neq = neq; -function neq(a, b, loose) { - return compare(a, b, loose) !== 0; -} - -exports.gte = gte; -function gte(a, b, loose) { - return compare(a, b, loose) >= 0; -} - -exports.lte = lte; -function lte(a, b, loose) { - return compare(a, b, loose) <= 0; -} - -exports.cmp = cmp; -function cmp(a, op, b, loose) { - var ret; - switch (op) { - 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; - case '>=': ret = gte(a, b, loose); break; - case '<': ret = lt(a, b, loose); break; - case '<=': ret = lte(a, b, loose); break; - default: throw new TypeError('Invalid operator: ' + op); - } - return ret; -} - -exports.Comparator = Comparator; -function Comparator(comp, options) { - if (!options || typeof options !== 'object') - options = { loose: !!options, includePrerelease: false } - - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) - return comp; - else - comp = comp.value; - } - - if (!(this instanceof Comparator)) - return new Comparator(comp, options); - - debug('comparator', comp, options); - this.options = options; - this.loose = !!options.loose; - this.parse(comp); - - if (this.semver === ANY) - this.value = ''; - else - this.value = this.operator + this.semver.version; - - debug('comp', this); -} - -var ANY = {}; -Comparator.prototype.parse = function(comp) { - var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; - var m = comp.match(r); - - if (!m) - 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 - this.semver = new SemVer(m[2], this.options.loose); -}; - -Comparator.prototype.toString = function() { - return this.value; -}; - -Comparator.prototype.test = function(version) { - debug('Comparator.test', version, this.options.loose); - - if (this.semver === ANY) - return true; - - if (typeof version === 'string') - version = new SemVer(version, this.options); - - return cmp(version, this.operator, this.semver, this.options); -}; - -Comparator.prototype.intersects = function(comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required'); - } - - if (!options || typeof options !== 'object') - options = { loose: !!options, includePrerelease: false } - - var rangeTmp; - - if (this.operator === '') { - rangeTmp = new Range(comp.value, options); - return satisfies(this.value, rangeTmp, options); - } else if (comp.operator === '') { - rangeTmp = new Range(this.value, options); - return satisfies(comp.semver, rangeTmp, options); - } - - var sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>'); - var sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<'); - var sameSemVer = this.semver.version === comp.semver.version; - var differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<='); - var oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - ((this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<')); - var oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - ((this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>')); - - return sameDirectionIncreasing || sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || oppositeDirectionsGreaterThan; -}; - - -exports.Range = Range; -function Range(range, options) { - if (!options || typeof options !== 'object') - options = { loose: !!options, includePrerelease: false } - - if (range instanceof Range) { - if (range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease) { - return range; - } else { - return new Range(range.raw, options); - } - } - - if (range instanceof Comparator) { - return new Range(range.value, options); - } - - if (!(this instanceof Range)) - return new Range(range, options); - - this.options = options; - this.loose = !!options.loose; - this.includePrerelease = !!options.includePrerelease - - // First, split based on boolean or || - this.raw = range; - this.set = range.split(/\s*\|\|\s*/).map(function(range) { - return this.parseRange(range.trim()); - }, this).filter(function(c) { - // throw out any that are not relevant for whatever reason - return c.length; - }); - - if (!this.set.length) { - throw new TypeError('Invalid SemVer Range: ' + range); - } - - this.format(); -} - -Range.prototype.format = function() { - this.range = this.set.map(function(comps) { - return comps.join(' ').trim(); - }).join('||').trim(); - return this.range; -}; - -Range.prototype.toString = function() { - return this.range; -}; - -Range.prototype.parseRange = function(range) { - var loose = this.options.loose; - range = range.trim(); - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]; - range = range.replace(hr, hyphenReplace); - debug('hyphen replace', range); - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace); - debug('comparator trim', range, re[COMPARATORTRIM]); - - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[TILDETRIM], tildeTrimReplace); - - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[CARETTRIM], caretTrimReplace); - - // normalize spaces - range = range.split(/\s+/).join(' '); - - // At this point, the range is completely trimmed and - // ready to be split into comparators. - - var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; - var set = range.split(' ').map(function(comp) { - return parseComparator(comp, this.options); - }, this).join(' ').split(/\s+/); - if (this.options.loose) { - // in loose mode, throw out any that are not valid comparators - set = set.filter(function(comp) { - return !!comp.match(compRe); - }); - } - set = set.map(function(comp) { - return new Comparator(comp, this.options); - }, this); - - return set; -}; - -Range.prototype.intersects = function(range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required'); - } - - return this.set.some(function(thisComparators) { - return thisComparators.every(function(thisComparator) { - return range.set.some(function(rangeComparators) { - return rangeComparators.every(function(rangeComparator) { - return thisComparator.intersects(rangeComparator, options); - }); - }); - }); - }); -}; - -// Mostly just for testing and legacy API reasons -exports.toComparators = toComparators; -function toComparators(range, options) { - return new Range(range, options).set.map(function(comp) { - return comp.map(function(c) { - return c.value; - }).join(' ').trim().split(' '); - }); -} - -// comprised of xranges, tildes, stars, and gtlt's at this point. -// already replaced the hyphen ranges -// turn into a set of JUST comparators. -function parseComparator(comp, options) { - debug('comp', comp, options); - comp = replaceCarets(comp, options); - debug('caret', comp); - comp = replaceTildes(comp, options); - debug('tildes', comp); - comp = replaceXRanges(comp, options); - debug('xrange', comp); - comp = replaceStars(comp, options); - debug('stars', comp); - return comp; -} - -function isX(id) { - return !id || id.toLowerCase() === 'x' || id === '*'; -} - -// ~, ~> --> * (any, kinda silly) -// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 -// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 -// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 -// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 -// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 -function replaceTildes(comp, options) { - return comp.trim().split(/\s+/).map(function(comp) { - return replaceTilde(comp, options); - }).join(' '); -} - -function replaceTilde(comp, options) { - if (!options || typeof options !== 'object') - options = { loose: !!options, includePrerelease: false } - var r = options.loose ? re[TILDELOOSE] : re[TILDE]; - return comp.replace(r, function(_, M, m, p, pr) { - debug('tilde', comp, _, M, m, p, pr); - var ret; - - if (isX(M)) - ret = ''; - else if (isX(m)) - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; - else if (isX(p)) - // ~1.2 == >=1.2.0 <1.3.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'; - } else - // ~1.2.3 == >=1.2.3 <1.3.0 - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + (+m + 1) + '.0'; - - debug('tilde return', ret); - return ret; - }); -} - -// ^ --> * (any, kinda silly) -// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 -// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 -// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 -// ^1.2.3 --> >=1.2.3 <2.0.0 -// ^1.2.0 --> >=1.2.0 <2.0.0 -function replaceCarets(comp, options) { - return comp.trim().split(/\s+/).map(function(comp) { - return replaceCaret(comp, options); - }).join(' '); -} - -function replaceCaret(comp, options) { - debug('caret', comp, options); - if (!options || typeof options !== 'object') - options = { loose: !!options, includePrerelease: false } - var r = options.loose ? re[CARETLOOSE] : re[CARET]; - return comp.replace(r, function(_, M, m, p, pr) { - debug('caret', comp, _, M, m, p, pr); - var ret; - - if (isX(M)) - ret = ''; - else if (isX(m)) - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; - else if (isX(p)) { - if (M === '0') - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; - else - 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 + - ' <' + M + '.' + m + '.' + (+p + 1); - else - ret = '>=' + M + '.' + m + '.' + p + pr + - ' <' + M + '.' + (+m + 1) + '.0'; - } else - ret = '>=' + M + '.' + m + '.' + p + pr + - ' <' + (+M + 1) + '.0.0'; - } else { - debug('no pr'); - if (M === '0') { - if (m === '0') - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + m + '.' + (+p + 1); - else - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + (+m + 1) + '.0'; - } else - ret = '>=' + M + '.' + m + '.' + p + - ' <' + (+M + 1) + '.0.0'; - } - - debug('caret return', ret); - return ret; - }); -} - -function replaceXRanges(comp, options) { - debug('replaceXRanges', comp, options); - return comp.split(/\s+/).map(function(comp) { - return replaceXRange(comp, options); - }).join(' '); -} - -function replaceXRange(comp, options) { - comp = comp.trim(); - if (!options || typeof options !== 'object') - options = { loose: !!options, includePrerelease: false } - var r = options.loose ? re[XRANGELOOSE] : re[XRANGE]; - return comp.replace(r, function(ret, gtlt, M, m, p, pr) { - debug('xRange', comp, ret, gtlt, M, m, p, pr); - var xM = isX(M); - var xm = xM || isX(m); - var xp = xm || isX(p); - var anyX = xp; - - if (gtlt === '=' && anyX) - gtlt = ''; - - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0'; - } else { - // nothing is forbidden - ret = '*'; - } - } else if (gtlt && anyX) { - // replace X with 0 - if (xm) - m = 0; - if (xp) - p = 0; - - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - // >1.2.3 => >= 1.2.4 - gtlt = '>='; - if (xm) { - M = +M + 1; - m = 0; - p = 0; - } else if (xp) { - m = +m + 1; - p = 0; - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<'; - if (xm) - M = +M + 1; - else - m = +m + 1; - } - - ret = gtlt + M + '.' + m + '.' + p; - } else if (xm) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; - } else if (xp) { - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; - } - - debug('xRange return', ret); - - return ret; - }); -} - -// Because * is AND-ed with everything else in the comparator, -// and '' means "any version", just remove the *s entirely. -function replaceStars(comp, options) { - debug('replaceStars', comp, options); - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[STAR], ''); -} - -// This function is passed to string.replace(re[HYPHENRANGE]) -// M, m, patch, prerelease, build -// 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) { - - if (isX(fM)) - from = ''; - else if (isX(fm)) - from = '>=' + fM + '.0.0'; - else if (isX(fp)) - from = '>=' + fM + '.' + fm + '.0'; - else - from = '>=' + from; - - if (isX(tM)) - to = ''; - else if (isX(tm)) - to = '<' + (+tM + 1) + '.0.0'; - else if (isX(tp)) - to = '<' + tM + '.' + (+tm + 1) + '.0'; - else if (tpr) - to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; - else - to = '<=' + to; - - return (from + ' ' + to).trim(); -} - - -// if ANY of the sets match ALL of its comparators, then pass -Range.prototype.test = function(version) { - if (!version) - return false; - - if (typeof version === 'string') - version = new SemVer(version, this.options); - - for (var i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) - return true; - } - return false; -}; - -function testSet(set, version, options) { - for (var i = 0; i < set.length; i++) { - if (!set[i].test(version)) - return false; - } - - if (!options) - options = {} - - if (version.prerelease.length && !options.includePrerelease) { - // 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) - continue; - - 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; -} - -exports.satisfies = satisfies; -function satisfies(version, range, options) { - try { - range = new Range(range, options); - } catch (er) { - return false; - } - return range.test(version); -} - -exports.maxSatisfying = maxSatisfying; -function maxSatisfying(versions, range, options) { - var max = null; - var maxSV = null; - try { - var rangeObj = new Range(range, options); - } catch (er) { - return null; - } - versions.forEach(function (v) { - if (rangeObj.test(v)) { // satisfies(v, range, options) - if (!max || maxSV.compare(v) === -1) { // compare(max, v, true) - max = v; - maxSV = new SemVer(max, options); - } - } - }) - return max; -} - -exports.minSatisfying = minSatisfying; -function minSatisfying(versions, range, options) { - var min = null; - var minSV = null; - try { - var rangeObj = new Range(range, options); - } catch (er) { - return null; - } - versions.forEach(function (v) { - if (rangeObj.test(v)) { // satisfies(v, range, options) - if (!min || minSV.compare(v) === 1) { // compare(min, v, true) - min = v; - minSV = new SemVer(min, options); - } - } - }) - return min; -} - -exports.validRange = validRange; -function validRange(range, options) { - try { - // Return '*' instead of '' so that truthiness works. - // This will throw if it's invalid anyway - return new Range(range, options).range || '*'; - } catch (er) { - return null; - } -} - -// Determine if version is less than all the versions possible in the range -exports.ltr = ltr; -function ltr(version, range, options) { - return outside(version, range, '<', options); -} - -// Determine if version is greater than all the versions possible in the range. -exports.gtr = gtr; -function gtr(version, range, options) { - return outside(version, range, '>', options); -} - -exports.outside = outside; -function outside(version, range, hilo, options) { - version = new SemVer(version, options); - range = new Range(range, options); - - var gtfn, ltefn, ltfn, comp, ecomp; - switch (hilo) { - case '>': - gtfn = gt; - ltefn = lte; - ltfn = lt; - comp = '>'; - ecomp = '>='; - break; - case '<': - gtfn = lt; - ltefn = gte; - ltfn = gt; - comp = '<'; - ecomp = '<='; - break; - default: - throw new TypeError('Must provide a hilo val of "<" or ">"'); - } - - // If it satisifes the range it is not outside - if (satisfies(version, range, options)) { - return false; - } - - // From now on, variable terms are as if we're in "gtr" mode. - // but note that everything is flipped for the "ltr" function. - - for (var i = 0; i < range.set.length; ++i) { - var comparators = range.set[i]; - - var high = null; - var low = null; - - comparators.forEach(function(comparator) { - if (comparator.semver === ANY) { - comparator = new Comparator('>=0.0.0') - } - high = high || comparator; - low = low || comparator; - if (gtfn(comparator.semver, high.semver, options)) { - high = comparator; - } else if (ltfn(comparator.semver, low.semver, options)) { - low = comparator; - } - }); - - // If the edge version comparator has a operator then our version - // isn't outside it - if (high.operator === comp || high.operator === ecomp) { - return false; - } - - // If the lowest version comparator has an operator and our version - // is less than it then it isn't higher than the range - if ((!low.operator || low.operator === comp) && - ltefn(version, low.semver)) { - return false; - } else if (low.operator === ecomp && ltfn(version, low.semver)) { - return false; - } - } - return true; -} - -exports.prerelease = prerelease; -function prerelease(version, options) { - var parsed = parse(version, options); - return (parsed && parsed.prerelease.length) ? parsed.prerelease : null; -} - -exports.intersects = intersects; -function intersects(r1, r2, options) { - r1 = new Range(r1, options) - r2 = new Range(r2, options) - return r1.intersects(r2) -} - -exports.coerce = coerce; -function coerce(version) { - if (version instanceof SemVer) - return version; - - if (typeof version !== 'string') - return null; - - var match = version.match(re[COERCE]); - - if (match == null) - return null; - - return parse((match[1] || '0') + '.' + (match[2] || '0') + '.' + (match[3] || '0')); -} diff --git a/node_modules/pacote/node_modules/unique-filename/LICENSE b/node_modules/pacote/node_modules/unique-filename/LICENSE deleted file mode 100644 index 69619c125ea7e..0000000000000 --- a/node_modules/pacote/node_modules/unique-filename/LICENSE +++ /dev/null @@ -1,5 +0,0 @@ -Copyright npm, Inc - -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/node_modules/pacote/node_modules/unique-filename/README.md b/node_modules/pacote/node_modules/unique-filename/README.md deleted file mode 100644 index 74b62b2ab4426..0000000000000 --- a/node_modules/pacote/node_modules/unique-filename/README.md +++ /dev/null @@ -1,33 +0,0 @@ -unique-filename -=============== - -Generate a unique filename for use in temporary directories or caches. - -``` -var uniqueFilename = require('unique-filename') - -// returns something like: /tmp/912ec803b2ce49e4a541068d495ab570 -var randomTmpfile = uniqueFilename(os.tmpdir()) - -// returns something like: /tmp/my-test-912ec803b2ce49e4a541068d495ab570 -var randomPrefixedTmpfile = uniqueFilename(os.tmpdir(), 'my-test') - -var uniqueTmpfile = uniqueFilename('/tmp', 'testing', '/my/thing/to/uniq/on') -``` - -### uniqueFilename(*dir*, *fileprefix*, *uniqstr*) → String - -Returns the full path of a unique filename that looks like: -`dir/prefix-7ddd44c0` -or `dir/7ddd44c0` - -*dir* – The path you want the filename in. `os.tmpdir()` is a good choice for this. - -*fileprefix* – A string to append prior to the unique part of the filename. -The parameter is required if *uniqstr* is also passed in but is otherwise -optional and can be `undefined`/`null`/`''`. If present and not empty -then this string plus a hyphen are prepended to the unique part. - -*uniqstr* – Optional, if not passed the unique part of the resulting -filename will be random. If passed in it will be generated from this string -in a reproducable way. diff --git a/node_modules/pacote/node_modules/unique-filename/coverage/__root__/index.html b/node_modules/pacote/node_modules/unique-filename/coverage/__root__/index.html deleted file mode 100644 index cd55391a67a4c..0000000000000 --- a/node_modules/pacote/node_modules/unique-filename/coverage/__root__/index.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - Code coverage report for __root__/ - - - - - - -
-

Code coverage report for __root__/

-

- Statements: 100% (4 / 4)      - Branches: 100% (2 / 2)      - Functions: 100% (1 / 1)      - Lines: 100% (4 / 4)      - Ignored: none      -

-
All files » __root__/
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
index.js100%(4 / 4)100%(2 / 2)100%(1 / 1)100%(4 / 4)
-
-
- - - - - - diff --git a/node_modules/pacote/node_modules/unique-filename/coverage/__root__/index.js.html b/node_modules/pacote/node_modules/unique-filename/coverage/__root__/index.js.html deleted file mode 100644 index 02e5768d3fb64..0000000000000 --- a/node_modules/pacote/node_modules/unique-filename/coverage/__root__/index.js.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - Code coverage report for index.js - - - - - - -
-

Code coverage report for index.js

-

- Statements: 100% (4 / 4)      - Branches: 100% (2 / 2)      - Functions: 100% (1 / 1)      - Lines: 100% (4 / 4)      - Ignored: none      -

-
All files » __root__/ » index.js
-
-
-

-
-
1 -2 -3 -4 -5 -6 -7 -8 -9  -1 -  -1 -  -1 -6 -  - 
'use strict'
-var path = require('path')
- 
-var uniqueSlug = require('unique-slug')
- 
-module.exports = function (filepath, prefix, uniq) {
-  return path.join(filepath, (prefix ? prefix + '-' : '') + uniqueSlug(uniq))
-}
- 
- -
- - - - - - diff --git a/node_modules/pacote/node_modules/unique-filename/coverage/base.css b/node_modules/pacote/node_modules/unique-filename/coverage/base.css deleted file mode 100644 index a6a2f3284d022..0000000000000 --- a/node_modules/pacote/node_modules/unique-filename/coverage/base.css +++ /dev/null @@ -1,182 +0,0 @@ -body, html { - margin:0; padding: 0; -} -body { - font-family: Helvetica Neue, Helvetica,Arial; - font-size: 10pt; -} -div.header, div.footer { - background: #eee; - padding: 1em; -} -div.header { - z-index: 100; - position: fixed; - top: 0; - border-bottom: 1px solid #666; - width: 100%; -} -div.footer { - border-top: 1px solid #666; -} -div.body { - margin-top: 10em; -} -div.meta { - font-size: 90%; - text-align: center; -} -h1, h2, h3 { - font-weight: normal; -} -h1 { - font-size: 12pt; -} -h2 { - font-size: 10pt; -} -pre { - font-family: Consolas, Menlo, Monaco, monospace; - margin: 0; - padding: 0; - line-height: 1.3; - font-size: 14px; - -moz-tab-size: 2; - -o-tab-size: 2; - tab-size: 2; -} - -div.path { font-size: 110%; } -div.path a:link, div.path a:visited { color: #000; } -table.coverage { border-collapse: collapse; margin:0; padding: 0 } - -table.coverage td { - margin: 0; - padding: 0; - color: #111; - vertical-align: top; -} -table.coverage td.line-count { - width: 50px; - text-align: right; - padding-right: 5px; -} -table.coverage td.line-coverage { - color: #777 !important; - text-align: right; - border-left: 1px solid #666; - border-right: 1px solid #666; -} - -table.coverage td.text { -} - -table.coverage td span.cline-any { - display: inline-block; - padding: 0 5px; - width: 40px; -} -table.coverage td span.cline-neutral { - background: #eee; -} -table.coverage td span.cline-yes { - background: #b5d592; - color: #999; -} -table.coverage td span.cline-no { - background: #fc8c84; -} - -.cstat-yes { color: #111; } -.cstat-no { background: #fc8c84; color: #111; } -.fstat-no { background: #ffc520; color: #111 !important; } -.cbranch-no { background: yellow !important; color: #111; } - -.cstat-skip { background: #ddd; color: #111; } -.fstat-skip { background: #ddd; color: #111 !important; } -.cbranch-skip { background: #ddd !important; color: #111; } - -.missing-if-branch { - display: inline-block; - margin-right: 10px; - position: relative; - padding: 0 4px; - background: black; - color: yellow; -} - -.skip-if-branch { - display: none; - margin-right: 10px; - position: relative; - padding: 0 4px; - background: #ccc; - color: white; -} - -.missing-if-branch .typ, .skip-if-branch .typ { - color: inherit !important; -} - -.entity, .metric { font-weight: bold; } -.metric { display: inline-block; border: 1px solid #333; padding: 0.3em; background: white; } -.metric small { font-size: 80%; font-weight: normal; color: #666; } - -div.coverage-summary table { border-collapse: collapse; margin: 3em; font-size: 110%; } -div.coverage-summary td, div.coverage-summary table th { margin: 0; padding: 0.25em 1em; border-top: 1px solid #666; border-bottom: 1px solid #666; } -div.coverage-summary th { text-align: left; border: 1px solid #666; background: #eee; font-weight: normal; } -div.coverage-summary th.file { border-right: none !important; } -div.coverage-summary th.pic { border-left: none !important; text-align: right; } -div.coverage-summary th.pct { border-right: none !important; } -div.coverage-summary th.abs { border-left: none !important; text-align: right; } -div.coverage-summary td.pct { text-align: right; border-left: 1px solid #666; } -div.coverage-summary td.abs { text-align: right; font-size: 90%; color: #444; border-right: 1px solid #666; } -div.coverage-summary td.file { border-left: 1px solid #666; white-space: nowrap; } -div.coverage-summary td.pic { min-width: 120px !important; } -div.coverage-summary a:link { text-decoration: none; color: #000; } -div.coverage-summary a:visited { text-decoration: none; color: #777; } -div.coverage-summary a:hover { text-decoration: underline; } -div.coverage-summary tfoot td { border-top: 1px solid #666; } - -div.coverage-summary .sorter { - height: 10px; - width: 7px; - display: inline-block; - margin-left: 0.5em; - background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; -} -div.coverage-summary .sorted .sorter { - background-position: 0 -20px; -} -div.coverage-summary .sorted-desc .sorter { - background-position: 0 -10px; -} - -.high { background: #b5d592 !important; } -.medium { background: #ffe87c !important; } -.low { background: #fc8c84 !important; } - -span.cover-fill, span.cover-empty { - display:inline-block; - border:1px solid #444; - background: white; - height: 12px; -} -span.cover-fill { - background: #ccc; - border-right: 1px solid #444; -} -span.cover-empty { - background: white; - border-left: none; -} -span.cover-full { - border-right: none !important; -} -pre.prettyprint { - border: none !important; - padding: 0 !important; - margin: 0 !important; -} -.com { color: #999 !important; } -.ignore-none { color: #999; font-weight: normal; } diff --git a/node_modules/pacote/node_modules/unique-filename/coverage/index.html b/node_modules/pacote/node_modules/unique-filename/coverage/index.html deleted file mode 100644 index b10d186cc3978..0000000000000 --- a/node_modules/pacote/node_modules/unique-filename/coverage/index.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - Code coverage report for All files - - - - - - -
-

Code coverage report for All files

-

- Statements: 100% (4 / 4)      - Branches: 100% (2 / 2)      - Functions: 100% (1 / 1)      - Lines: 100% (4 / 4)      - Ignored: none      -

-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
__root__/100%(4 / 4)100%(2 / 2)100%(1 / 1)100%(4 / 4)
-
-
- - - - - - diff --git a/node_modules/pacote/node_modules/unique-filename/coverage/prettify.css b/node_modules/pacote/node_modules/unique-filename/coverage/prettify.css deleted file mode 100644 index b317a7cda31a4..0000000000000 --- a/node_modules/pacote/node_modules/unique-filename/coverage/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/node_modules/pacote/node_modules/unique-filename/coverage/prettify.js b/node_modules/pacote/node_modules/unique-filename/coverage/prettify.js deleted file mode 100644 index ef51e03866898..0000000000000 --- a/node_modules/pacote/node_modules/unique-filename/coverage/prettify.js +++ /dev/null @@ -1 +0,0 @@ -window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/node_modules/pacote/node_modules/unique-filename/coverage/sort-arrow-sprite.png b/node_modules/pacote/node_modules/unique-filename/coverage/sort-arrow-sprite.png deleted file mode 100644 index 03f704a609c6fd0dbfdac63466a7d7c958b5cbf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jii$m5978H@?Fn+^JD|Y9yzj{W`447Gxa{7*dM7nnnD-Lb z6^}Hx2)'; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function (a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector('.coverage-summary tbody'), - rowNodes = tableBody.querySelectorAll('tr'), - rows = [], - i; - - if (desc) { - finalSorter = function (a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function () { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i =0 ; i < cols.length; i += 1) { - if (cols[i].sortable) { - el = getNthColumn(i).querySelector('.sorter'); - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function () { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(cols); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/node_modules/pacote/node_modules/unique-filename/index.js b/node_modules/pacote/node_modules/unique-filename/index.js deleted file mode 100644 index 02bf1e273143c..0000000000000 --- a/node_modules/pacote/node_modules/unique-filename/index.js +++ /dev/null @@ -1,8 +0,0 @@ -'use strict' -var path = require('path') - -var uniqueSlug = require('unique-slug') - -module.exports = function (filepath, prefix, uniq) { - return path.join(filepath, (prefix ? prefix + '-' : '') + uniqueSlug(uniq)) -} diff --git a/node_modules/pacote/node_modules/unique-filename/package.json b/node_modules/pacote/node_modules/unique-filename/package.json deleted file mode 100644 index 5778e9c213575..0000000000000 --- a/node_modules/pacote/node_modules/unique-filename/package.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "_from": "unique-filename@^1.1.1", - "_id": "unique-filename@1.1.1", - "_inBundle": false, - "_integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "_location": "/pacote/unique-filename", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "unique-filename@^1.1.1", - "name": "unique-filename", - "escapedName": "unique-filename", - "rawSpec": "^1.1.1", - "saveSpec": null, - "fetchSpec": "^1.1.1" - }, - "_requiredBy": [ - "/pacote" - ], - "_resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "_shasum": "1d69769369ada0583103a1e6ae87681b56573230", - "_spec": "unique-filename@^1.1.1", - "_where": "/Users/zkat/Documents/code/work/npm/node_modules/pacote", - "author": { - "name": "Rebecca Turner", - "email": "me@re-becca.org", - "url": "http://re-becca.org/" - }, - "bugs": { - "url": "https://github.com/iarna/unique-filename/issues" - }, - "bundleDependencies": false, - "dependencies": { - "unique-slug": "^2.0.0" - }, - "deprecated": false, - "description": "Generate a unique filename for use in temporary directories or caches.", - "devDependencies": { - "standard": "^5.4.1", - "tap": "^2.3.1" - }, - "homepage": "https://github.com/iarna/unique-filename", - "keywords": [], - "license": "ISC", - "main": "index.js", - "name": "unique-filename", - "repository": { - "type": "git", - "url": "git+https://github.com/iarna/unique-filename.git" - }, - "scripts": { - "test": "standard && tap test" - }, - "version": "1.1.1" -} diff --git a/node_modules/pacote/node_modules/unique-filename/test/index.js b/node_modules/pacote/node_modules/unique-filename/test/index.js deleted file mode 100644 index 105b4e52e8b40..0000000000000 --- a/node_modules/pacote/node_modules/unique-filename/test/index.js +++ /dev/null @@ -1,23 +0,0 @@ -'sue strict' -var t = require('tap') -var uniqueFilename = require('../index.js') - -t.plan(6) - -var randomTmpfile = uniqueFilename('tmp') -t.like(randomTmpfile, /^tmp.[a-f0-9]{8}$/, 'random tmp file') - -var randomAgain = uniqueFilename('tmp') -t.notEqual(randomAgain, randomTmpfile, 'random tmp files are not the same') - -var randomPrefixedTmpfile = uniqueFilename('tmp', 'my-test') -t.like(randomPrefixedTmpfile, /^tmp.my-test-[a-f0-9]{8}$/, 'random prefixed tmp file') - -var randomPrefixedAgain = uniqueFilename('tmp', 'my-test') -t.notEqual(randomPrefixedAgain, randomPrefixedTmpfile, 'random prefixed tmp files are not the same') - -var uniqueTmpfile = uniqueFilename('tmp', 'testing', '/my/thing/to/uniq/on') -t.like(uniqueTmpfile, /^tmp.testing-7ddd44c0$/, 'unique filename') - -var uniqueAgain = uniqueFilename('tmp', 'testing', '/my/thing/to/uniq/on') -t.is(uniqueTmpfile, uniqueAgain, 'same unique string component produces same filename') diff --git a/node_modules/pacote/package.json b/node_modules/pacote/package.json index 1df323dd3621d..48504d8fdbb32 100644 --- a/node_modules/pacote/package.json +++ b/node_modules/pacote/package.json @@ -1,34 +1,32 @@ { - "_from": "pacote@latest", - "_id": "pacote@9.2.3", + "_from": "pacote@9.3.0", + "_id": "pacote@9.3.0", "_inBundle": false, - "_integrity": "sha512-Y3+yY3nBRAxMlZWvr62XLJxOwCmG9UmkGZkFurWHoCjqF0cZL72cTOCRJTvWw8T4OhJS2RTg13x4oYYriauvEw==", + "_integrity": "sha512-uy5xghB5wUtmFS+uNhQGhlsIF9rfsfxw6Zsu2VpmSz4/f+8D2+5V1HwjHdSn7W6aQTrxNNmmoUF5qNE10/EVdA==", "_location": "/pacote", "_phantomChildren": { - "figgy-pudding": "3.5.1", - "npm-package-arg": "6.1.0", - "safe-buffer": "5.1.2", - "unique-slug": "2.0.0" + "safe-buffer": "5.1.2" }, "_requested": { - "type": "tag", + "type": "version", "registry": true, - "raw": "pacote@latest", + "raw": "pacote@9.3.0", "name": "pacote", "escapedName": "pacote", - "rawSpec": "latest", + "rawSpec": "9.3.0", "saveSpec": null, - "fetchSpec": "latest" + "fetchSpec": "9.3.0" }, "_requiredBy": [ "#USER", "/", - "/libcipm" + "/libcipm", + "/libnpm" ], - "_resolved": "https://registry.npmjs.org/pacote/-/pacote-9.2.3.tgz", - "_shasum": "48cfe87beb9177acd6594355a584a538835424b3", - "_spec": "pacote@latest", - "_where": "/Users/zkat/Documents/code/work/npm", + "_resolved": "https://registry.npmjs.org/pacote/-/pacote-9.3.0.tgz", + "_shasum": "ec0d21b739a625d81a19ae546386fedee3300bc1", + "_spec": "pacote@9.3.0", + "_where": "/Users/aeschright/code/cli", "author": { "name": "Kat Marchán", "email": "kzm@sykosomatic.org" @@ -48,12 +46,12 @@ } ], "dependencies": { - "bluebird": "^3.5.2", - "cacache": "^11.2.0", + "bluebird": "^3.5.3", + "cacache": "^11.3.2", "figgy-pudding": "^3.5.1", "get-stream": "^4.1.0", "glob": "^7.1.3", - "lru-cache": "^4.1.3", + "lru-cache": "^5.1.1", "make-fetch-happen": "^4.0.1", "minimatch": "^3.0.4", "minipass": "^2.3.5", @@ -72,21 +70,21 @@ "safe-buffer": "^5.1.2", "semver": "^5.6.0", "ssri": "^6.0.1", - "tar": "^4.4.6", + "tar": "^4.4.8", "unique-filename": "^1.1.1", "which": "^1.3.1" }, "deprecated": false, "description": "JavaScript package downloader", "devDependencies": { - "nock": "^10.0.1", + "nock": "^10.0.3", "npmlog": "^4.1.2", "nyc": "^13.1.0", "require-inject": "^1.4.3", "standard": "^12.0.1", "standard-version": "^4.4.0", "tacks": "^1.2.7", - "tap": "^12.0.1", + "tap": "^12.1.0", "tar-stream": "^1.6.2", "weallbehave": "^1.2.0", "weallcontribute": "^1.0.7" @@ -118,5 +116,5 @@ "update-coc": "weallbehave -o . && git add CODE_OF_CONDUCT.md && git commit -m 'docs(coc): updated CODE_OF_CONDUCT.md'", "update-contrib": "weallcontribute -o . && git add CONTRIBUTING.md && git commit -m 'docs(contributing): updated CONTRIBUTING.md'" }, - "version": "9.2.3" + "version": "9.3.0" } diff --git a/package-lock.json b/package-lock.json index cddab05f80ee3..fbf6f94347867 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6028,16 +6028,16 @@ } }, "pacote": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.2.3.tgz", - "integrity": "sha512-Y3+yY3nBRAxMlZWvr62XLJxOwCmG9UmkGZkFurWHoCjqF0cZL72cTOCRJTvWw8T4OhJS2RTg13x4oYYriauvEw==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.3.0.tgz", + "integrity": "sha512-uy5xghB5wUtmFS+uNhQGhlsIF9rfsfxw6Zsu2VpmSz4/f+8D2+5V1HwjHdSn7W6aQTrxNNmmoUF5qNE10/EVdA==", "requires": { - "bluebird": "^3.5.2", - "cacache": "^11.2.0", + "bluebird": "^3.5.3", + "cacache": "^11.3.2", "figgy-pudding": "^3.5.1", "get-stream": "^4.1.0", "glob": "^7.1.3", - "lru-cache": "^4.1.3", + "lru-cache": "^5.1.1", "make-fetch-happen": "^4.0.1", "minimatch": "^3.0.4", "minipass": "^2.3.5", @@ -6056,11 +6056,19 @@ "safe-buffer": "^5.1.2", "semver": "^5.6.0", "ssri": "^6.0.1", - "tar": "^4.4.6", + "tar": "^4.4.8", "unique-filename": "^1.1.1", "which": "^1.3.1" }, "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, "minipass": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", @@ -6070,29 +6078,6 @@ "yallist": "^3.0.0" } }, - "npm-pick-manifest": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", - "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", - "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" - } - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "requires": { - "unique-slug": "^2.0.0" - } - }, "yallist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", diff --git a/package.json b/package.json index 793c029eead0b..f61730031c851 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ "once": "~1.4.0", "opener": "^1.5.1", "osenv": "^0.1.5", - "pacote": "^9.2.3", + "pacote": "^9.3.0", "path-is-inside": "~1.0.2", "promise-inflight": "~1.0.1", "qrcode-terminal": "^0.12.0", From 5777ea8ad2058be3166a6dad2d31d2d393c9f778 Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Tue, 8 Jan 2019 13:34:11 -0800 Subject: [PATCH 84/97] readable-stream@3.1.1 --- .../node_modules}/readable-stream/.travis.yml | 0 .../readable-stream/CONTRIBUTING.md | 38 + .../readable-stream/GOVERNANCE.md | 136 + .../node_modules/readable-stream/LICENSE | 47 + .../node_modules/readable-stream/README.md | 58 + .../doc/wg-meetings/2015-01-30.md | 0 .../readable-stream/duplex-browser.js | 0 .../node_modules}/readable-stream/duplex.js | 0 .../readable-stream/lib/_stream_duplex.js | 131 + .../lib/_stream_passthrough.js | 47 + .../readable-stream/lib/_stream_readable.js | 1019 +++ .../readable-stream/lib/_stream_transform.js | 214 + .../readable-stream/lib/_stream_writable.js | 687 ++ .../lib/internal/streams/BufferList.js | 0 .../lib/internal/streams/destroy.js | 74 + .../lib/internal/streams/stream-browser.js | 1 + .../lib/internal/streams/stream.js | 1 + .../node_modules/readable-stream/package.json | 81 + .../readable-stream/passthrough.js | 0 .../readable-stream/readable-browser.js | 7 + .../node_modules/readable-stream/readable.js | 19 + .../readable-stream/transform.js | 0 .../readable-stream/writable-browser.js | 0 .../node_modules}/readable-stream/writable.js | 0 .../node_modules}/string_decoder/.travis.yml | 0 .../node_modules/string_decoder/LICENSE | 48 + .../node_modules/string_decoder/README.md | 47 + .../string_decoder/lib/string_decoder.js | 296 + .../node_modules/string_decoder/package.json | 59 + .../node_modules/readable-stream/.travis.yml | 55 + .../readable-stream/CONTRIBUTING.md | 38 + .../readable-stream/GOVERNANCE.md | 136 + .../node_modules/readable-stream/LICENSE | 47 + .../node_modules/readable-stream/README.md | 58 + .../doc/wg-meetings/2015-01-30.md | 60 + .../readable-stream/duplex-browser.js | 1 + .../node_modules/readable-stream/duplex.js | 1 + .../readable-stream/lib/_stream_duplex.js | 131 + .../lib/_stream_passthrough.js | 47 + .../readable-stream/lib/_stream_readable.js | 1019 +++ .../readable-stream/lib/_stream_transform.js | 214 + .../readable-stream/lib/_stream_writable.js | 687 ++ .../lib/internal/streams/BufferList.js | 79 + .../lib/internal/streams/destroy.js | 74 + .../lib/internal/streams/stream-browser.js | 1 + .../lib/internal/streams/stream.js | 1 + .../node_modules/readable-stream/package.json | 81 + .../readable-stream/passthrough.js | 1 + .../readable-stream/readable-browser.js | 7 + .../node_modules/readable-stream/readable.js | 19 + .../node_modules/readable-stream/transform.js | 1 + .../readable-stream/writable-browser.js | 1 + .../node_modules/readable-stream/writable.js | 8 + .../node_modules/string_decoder/.travis.yml | 50 + .../node_modules/string_decoder/LICENSE | 48 + .../node_modules/string_decoder/README.md | 47 + .../string_decoder/lib/string_decoder.js | 296 + .../node_modules/string_decoder/package.json | 59 + .../node_modules/readable-stream/.travis.yml | 55 + .../readable-stream/CONTRIBUTING.md | 38 + .../readable-stream/GOVERNANCE.md | 136 + .../node_modules/readable-stream/LICENSE | 47 + .../node_modules/readable-stream/README.md | 58 + .../doc/wg-meetings/2015-01-30.md | 60 + .../readable-stream/duplex-browser.js | 1 + .../node_modules/readable-stream/duplex.js | 1 + .../readable-stream/lib/_stream_duplex.js | 131 + .../lib/_stream_passthrough.js | 47 + .../readable-stream/lib/_stream_readable.js | 1019 +++ .../readable-stream/lib/_stream_transform.js | 214 + .../readable-stream/lib/_stream_writable.js | 687 ++ .../lib/internal/streams/BufferList.js | 79 + .../lib/internal/streams/destroy.js | 74 + .../lib/internal/streams/stream-browser.js | 1 + .../lib/internal/streams/stream.js | 1 + .../node_modules/readable-stream/package.json | 81 + .../readable-stream/passthrough.js | 1 + .../readable-stream/readable-browser.js | 7 + .../node_modules/readable-stream/readable.js | 19 + .../node_modules/readable-stream/transform.js | 1 + .../readable-stream/writable-browser.js | 1 + .../node_modules/readable-stream/writable.js | 8 + .../node_modules/string_decoder/.travis.yml | 50 + .../node_modules/string_decoder/LICENSE | 48 + .../node_modules/string_decoder/README.md | 47 + .../string_decoder/lib/string_decoder.js | 296 + .../node_modules/string_decoder/package.json | 59 + .../node_modules/readable-stream/.travis.yml | 55 + .../readable-stream/CONTRIBUTING.md | 38 + .../readable-stream/GOVERNANCE.md | 136 + .../node_modules/readable-stream/LICENSE | 47 + .../node_modules/readable-stream/README.md | 58 + .../doc/wg-meetings/2015-01-30.md | 60 + .../readable-stream/duplex-browser.js | 1 + .../node_modules/readable-stream/duplex.js | 1 + .../readable-stream/lib/_stream_duplex.js | 131 + .../lib/_stream_passthrough.js | 47 + .../readable-stream/lib/_stream_readable.js | 1019 +++ .../readable-stream/lib/_stream_transform.js | 214 + .../readable-stream/lib/_stream_writable.js | 687 ++ .../lib/internal/streams/BufferList.js | 79 + .../lib/internal/streams/destroy.js | 74 + .../lib/internal/streams/stream-browser.js | 1 + .../lib/internal/streams/stream.js | 1 + .../node_modules/readable-stream/package.json | 81 + .../readable-stream/passthrough.js | 1 + .../readable-stream/readable-browser.js | 7 + .../node_modules/readable-stream/readable.js | 19 + .../node_modules/readable-stream/transform.js | 1 + .../readable-stream/writable-browser.js | 1 + .../node_modules/readable-stream/writable.js | 8 + .../node_modules/string_decoder/.travis.yml | 50 + .../node_modules/string_decoder/LICENSE | 48 + .../node_modules/string_decoder/README.md | 47 + .../string_decoder/lib/string_decoder.js | 296 + .../node_modules/string_decoder/package.json | 59 + .../node_modules/readable-stream/.travis.yml | 55 + .../readable-stream/CONTRIBUTING.md | 38 + .../readable-stream/GOVERNANCE.md | 136 + .../node_modules/readable-stream/LICENSE | 47 + .../node_modules/readable-stream/README.md | 58 + .../doc/wg-meetings/2015-01-30.md | 60 + .../readable-stream/duplex-browser.js | 1 + .../node_modules/readable-stream/duplex.js | 1 + .../readable-stream/lib/_stream_duplex.js | 131 + .../lib/_stream_passthrough.js | 47 + .../readable-stream/lib/_stream_readable.js | 1019 +++ .../readable-stream/lib/_stream_transform.js | 214 + .../readable-stream/lib/_stream_writable.js | 687 ++ .../lib/internal/streams/BufferList.js | 79 + .../lib/internal/streams/destroy.js | 74 + .../lib/internal/streams/stream-browser.js | 1 + .../lib/internal/streams/stream.js | 1 + .../node_modules/readable-stream/package.json | 81 + .../readable-stream/passthrough.js | 1 + .../readable-stream/readable-browser.js | 7 + .../node_modules/readable-stream/readable.js | 19 + .../node_modules/readable-stream/transform.js | 1 + .../readable-stream/writable-browser.js | 1 + .../node_modules/readable-stream/writable.js | 8 + .../node_modules/string_decoder/.travis.yml | 50 + .../from2/node_modules/string_decoder/LICENSE | 48 + .../node_modules/string_decoder/README.md | 47 + .../string_decoder/lib/string_decoder.js | 296 + .../node_modules/string_decoder/package.json | 59 + .../node_modules/readable-stream/.travis.yml | 55 + .../readable-stream/CONTRIBUTING.md | 38 + .../readable-stream/GOVERNANCE.md | 136 + .../node_modules/readable-stream/LICENSE | 47 + .../node_modules/readable-stream/README.md | 58 + .../doc/wg-meetings/2015-01-30.md | 60 + .../readable-stream/duplex-browser.js | 1 + .../node_modules/readable-stream/duplex.js | 1 + .../readable-stream/lib/_stream_duplex.js | 131 + .../lib/_stream_passthrough.js | 47 + .../readable-stream/lib/_stream_readable.js | 1019 +++ .../readable-stream/lib/_stream_transform.js | 214 + .../readable-stream/lib/_stream_writable.js | 687 ++ .../lib/internal/streams/BufferList.js | 79 + .../lib/internal/streams/destroy.js | 74 + .../lib/internal/streams/stream-browser.js | 1 + .../lib/internal/streams/stream.js | 1 + .../node_modules/readable-stream/package.json | 81 + .../readable-stream/passthrough.js | 1 + .../readable-stream/readable-browser.js | 7 + .../node_modules/readable-stream/readable.js | 19 + .../node_modules/readable-stream/transform.js | 1 + .../readable-stream/writable-browser.js | 1 + .../node_modules/readable-stream/writable.js | 8 + .../node_modules/string_decoder/.travis.yml | 50 + .../node_modules/string_decoder/LICENSE | 48 + .../node_modules/string_decoder/README.md | 47 + .../string_decoder/lib/string_decoder.js | 296 + .../node_modules/string_decoder/package.json | 59 + .../node_modules/readable-stream/.travis.yml | 55 + .../readable-stream/CONTRIBUTING.md | 38 + .../readable-stream/GOVERNANCE.md | 136 + .../node_modules/readable-stream/LICENSE | 47 + .../node_modules/readable-stream/README.md | 58 + .../doc/wg-meetings/2015-01-30.md | 60 + .../readable-stream/duplex-browser.js | 1 + .../node_modules/readable-stream/duplex.js | 1 + .../readable-stream/lib/_stream_duplex.js | 131 + .../lib/_stream_passthrough.js | 47 + .../readable-stream/lib/_stream_readable.js | 1019 +++ .../readable-stream/lib/_stream_transform.js | 214 + .../readable-stream/lib/_stream_writable.js | 687 ++ .../lib/internal/streams/BufferList.js | 79 + .../lib/internal/streams/destroy.js | 74 + .../lib/internal/streams/stream-browser.js | 1 + .../lib/internal/streams/stream.js | 1 + .../node_modules/readable-stream/package.json | 81 + .../readable-stream/passthrough.js | 1 + .../readable-stream/readable-browser.js | 7 + .../node_modules/readable-stream/readable.js | 19 + .../node_modules/readable-stream/transform.js | 1 + .../readable-stream/writable-browser.js | 1 + .../node_modules/readable-stream/writable.js | 8 + .../node_modules/string_decoder/.travis.yml | 50 + .../node_modules/string_decoder/LICENSE | 48 + .../node_modules/string_decoder/README.md | 47 + .../string_decoder/lib/string_decoder.js | 296 + .../node_modules/string_decoder/package.json | 59 + node_modules/readable-stream/README.md | 79 +- .../readable-stream/errors-browser.js | 127 + node_modules/readable-stream/errors.js | 116 + .../readable-stream/experimentalWarning.js | 17 + .../readable-stream/lib/_stream_duplex.js | 96 +- .../lib/_stream_passthrough.js | 10 +- .../readable-stream/lib/_stream_readable.js | 710 +- .../readable-stream/lib/_stream_transform.js | 71 +- .../readable-stream/lib/_stream_writable.js | 364 +- .../lib/internal/streams/async_iterator.js | 204 + .../lib/internal/streams/buffer_list.js | 189 + .../lib/internal/streams/destroy.js | 39 +- .../lib/internal/streams/end-of-stream.js | 91 + .../lib/internal/streams/pipeline.js | 97 + .../lib/internal/streams/state.js | 27 + node_modules/readable-stream/package.json | 92 +- node_modules/readable-stream/readable.js | 2 + node_modules/readable-stream/yarn.lock | 6423 +++++++++++++++++ .../node_modules/readable-stream/.travis.yml | 55 + .../readable-stream/CONTRIBUTING.md | 38 + .../readable-stream/GOVERNANCE.md | 136 + .../sha/node_modules/readable-stream/LICENSE | 47 + .../node_modules/readable-stream/README.md | 58 + .../doc/wg-meetings/2015-01-30.md | 60 + .../readable-stream/duplex-browser.js | 1 + .../node_modules/readable-stream/duplex.js | 1 + .../readable-stream/lib/_stream_duplex.js | 131 + .../lib/_stream_passthrough.js | 47 + .../readable-stream/lib/_stream_readable.js | 1019 +++ .../readable-stream/lib/_stream_transform.js | 214 + .../readable-stream/lib/_stream_writable.js | 687 ++ .../lib/internal/streams/BufferList.js | 79 + .../lib/internal/streams/destroy.js | 74 + .../lib/internal/streams/stream-browser.js | 1 + .../lib/internal/streams/stream.js | 1 + .../node_modules/readable-stream/package.json | 81 + .../readable-stream/passthrough.js | 1 + .../readable-stream/readable-browser.js | 7 + .../node_modules/readable-stream/readable.js | 19 + .../node_modules/readable-stream/transform.js | 1 + .../readable-stream/writable-browser.js | 1 + .../node_modules/readable-stream/writable.js | 8 + .../node_modules/string_decoder/.travis.yml | 50 + .../sha/node_modules/string_decoder/LICENSE | 48 + .../sha/node_modules/string_decoder/README.md | 47 + .../string_decoder/lib/string_decoder.js | 296 + .../node_modules/string_decoder/package.json | 59 + .../node_modules/readable-stream/.travis.yml | 55 + .../readable-stream/CONTRIBUTING.md | 38 + .../readable-stream/GOVERNANCE.md | 136 + .../node_modules/readable-stream/LICENSE | 47 + .../node_modules/readable-stream/README.md | 58 + .../doc/wg-meetings/2015-01-30.md | 60 + .../readable-stream/duplex-browser.js | 1 + .../node_modules/readable-stream/duplex.js | 1 + .../readable-stream/lib/_stream_duplex.js | 131 + .../lib/_stream_passthrough.js | 47 + .../readable-stream/lib/_stream_readable.js | 1019 +++ .../readable-stream/lib/_stream_transform.js | 214 + .../readable-stream/lib/_stream_writable.js | 687 ++ .../lib/internal/streams/BufferList.js | 79 + .../lib/internal/streams/destroy.js | 74 + .../lib/internal/streams/stream-browser.js | 1 + .../lib/internal/streams/stream.js | 1 + .../node_modules/readable-stream/package.json | 81 + .../readable-stream/passthrough.js | 1 + .../readable-stream/readable-browser.js | 7 + .../node_modules/readable-stream/readable.js | 19 + .../node_modules/readable-stream/transform.js | 1 + .../readable-stream/writable-browser.js | 1 + .../node_modules/readable-stream/writable.js | 8 + .../node_modules/string_decoder/.travis.yml | 50 + .../node_modules/string_decoder/LICENSE | 48 + .../node_modules/string_decoder/README.md | 47 + .../string_decoder/lib/string_decoder.js | 296 + .../node_modules/string_decoder/package.json | 59 + node_modules/string_decoder/package.json | 25 +- .../node_modules/readable-stream/.travis.yml | 55 + .../readable-stream/CONTRIBUTING.md | 38 + .../readable-stream/GOVERNANCE.md | 136 + .../node_modules/readable-stream/LICENSE | 47 + .../node_modules/readable-stream/README.md | 58 + .../doc/wg-meetings/2015-01-30.md | 60 + .../readable-stream/duplex-browser.js | 1 + .../node_modules/readable-stream/duplex.js | 1 + .../readable-stream/lib/_stream_duplex.js | 131 + .../lib/_stream_passthrough.js | 47 + .../readable-stream/lib/_stream_readable.js | 1019 +++ .../readable-stream/lib/_stream_transform.js | 214 + .../readable-stream/lib/_stream_writable.js | 687 ++ .../lib/internal/streams/BufferList.js | 79 + .../lib/internal/streams/destroy.js | 74 + .../lib/internal/streams/stream-browser.js | 1 + .../lib/internal/streams/stream.js | 1 + .../node_modules/readable-stream/package.json | 81 + .../readable-stream/passthrough.js | 1 + .../readable-stream/readable-browser.js | 7 + .../node_modules/readable-stream/readable.js | 19 + .../node_modules/readable-stream/transform.js | 1 + .../readable-stream/writable-browser.js | 1 + .../node_modules/readable-stream/writable.js | 8 + .../node_modules/string_decoder/.travis.yml | 50 + .../node_modules/string_decoder/LICENSE | 48 + .../node_modules/string_decoder/README.md | 47 + .../string_decoder/lib/string_decoder.js | 296 + .../node_modules/string_decoder/package.json | 59 + package-lock.json | 286 +- package.json | 2 +- 311 files changed, 40767 insertions(+), 713 deletions(-) rename node_modules/{ => are-we-there-yet/node_modules}/readable-stream/.travis.yml (100%) create mode 100644 node_modules/are-we-there-yet/node_modules/readable-stream/CONTRIBUTING.md create mode 100644 node_modules/are-we-there-yet/node_modules/readable-stream/GOVERNANCE.md create mode 100644 node_modules/are-we-there-yet/node_modules/readable-stream/LICENSE create mode 100644 node_modules/are-we-there-yet/node_modules/readable-stream/README.md rename node_modules/{ => are-we-there-yet/node_modules}/readable-stream/doc/wg-meetings/2015-01-30.md (100%) rename node_modules/{ => are-we-there-yet/node_modules}/readable-stream/duplex-browser.js (100%) rename node_modules/{ => are-we-there-yet/node_modules}/readable-stream/duplex.js (100%) create mode 100644 node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_writable.js rename node_modules/{ => are-we-there-yet/node_modules}/readable-stream/lib/internal/streams/BufferList.js (100%) create mode 100644 node_modules/are-we-there-yet/node_modules/readable-stream/lib/internal/streams/destroy.js create mode 100644 node_modules/are-we-there-yet/node_modules/readable-stream/lib/internal/streams/stream-browser.js create mode 100644 node_modules/are-we-there-yet/node_modules/readable-stream/lib/internal/streams/stream.js create mode 100644 node_modules/are-we-there-yet/node_modules/readable-stream/package.json rename node_modules/{ => are-we-there-yet/node_modules}/readable-stream/passthrough.js (100%) create mode 100644 node_modules/are-we-there-yet/node_modules/readable-stream/readable-browser.js create mode 100644 node_modules/are-we-there-yet/node_modules/readable-stream/readable.js rename node_modules/{ => are-we-there-yet/node_modules}/readable-stream/transform.js (100%) rename node_modules/{ => are-we-there-yet/node_modules}/readable-stream/writable-browser.js (100%) rename node_modules/{ => are-we-there-yet/node_modules}/readable-stream/writable.js (100%) rename node_modules/{ => are-we-there-yet/node_modules}/string_decoder/.travis.yml (100%) create mode 100644 node_modules/are-we-there-yet/node_modules/string_decoder/LICENSE create mode 100644 node_modules/are-we-there-yet/node_modules/string_decoder/README.md create mode 100644 node_modules/are-we-there-yet/node_modules/string_decoder/lib/string_decoder.js create mode 100644 node_modules/are-we-there-yet/node_modules/string_decoder/package.json create mode 100644 node_modules/concat-stream/node_modules/readable-stream/.travis.yml create mode 100644 node_modules/concat-stream/node_modules/readable-stream/CONTRIBUTING.md create mode 100644 node_modules/concat-stream/node_modules/readable-stream/GOVERNANCE.md create mode 100644 node_modules/concat-stream/node_modules/readable-stream/LICENSE create mode 100644 node_modules/concat-stream/node_modules/readable-stream/README.md create mode 100644 node_modules/concat-stream/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md create mode 100644 node_modules/concat-stream/node_modules/readable-stream/duplex-browser.js create mode 100644 node_modules/concat-stream/node_modules/readable-stream/duplex.js create mode 100644 node_modules/concat-stream/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/concat-stream/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/concat-stream/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/concat-stream/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/concat-stream/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/BufferList.js create mode 100644 node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/destroy.js create mode 100644 node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js create mode 100644 node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/stream.js create mode 100644 node_modules/concat-stream/node_modules/readable-stream/package.json create mode 100644 node_modules/concat-stream/node_modules/readable-stream/passthrough.js create mode 100644 node_modules/concat-stream/node_modules/readable-stream/readable-browser.js create mode 100644 node_modules/concat-stream/node_modules/readable-stream/readable.js create mode 100644 node_modules/concat-stream/node_modules/readable-stream/transform.js create mode 100644 node_modules/concat-stream/node_modules/readable-stream/writable-browser.js create mode 100644 node_modules/concat-stream/node_modules/readable-stream/writable.js create mode 100644 node_modules/concat-stream/node_modules/string_decoder/.travis.yml create mode 100644 node_modules/concat-stream/node_modules/string_decoder/LICENSE create mode 100644 node_modules/concat-stream/node_modules/string_decoder/README.md create mode 100644 node_modules/concat-stream/node_modules/string_decoder/lib/string_decoder.js create mode 100644 node_modules/concat-stream/node_modules/string_decoder/package.json create mode 100644 node_modules/duplexify/node_modules/readable-stream/.travis.yml create mode 100644 node_modules/duplexify/node_modules/readable-stream/CONTRIBUTING.md create mode 100644 node_modules/duplexify/node_modules/readable-stream/GOVERNANCE.md create mode 100644 node_modules/duplexify/node_modules/readable-stream/LICENSE create mode 100644 node_modules/duplexify/node_modules/readable-stream/README.md create mode 100644 node_modules/duplexify/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md create mode 100644 node_modules/duplexify/node_modules/readable-stream/duplex-browser.js create mode 100644 node_modules/duplexify/node_modules/readable-stream/duplex.js create mode 100644 node_modules/duplexify/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/duplexify/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/duplexify/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/duplexify/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/BufferList.js create mode 100644 node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/destroy.js create mode 100644 node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/stream-browser.js create mode 100644 node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/stream.js create mode 100644 node_modules/duplexify/node_modules/readable-stream/package.json create mode 100644 node_modules/duplexify/node_modules/readable-stream/passthrough.js create mode 100644 node_modules/duplexify/node_modules/readable-stream/readable-browser.js create mode 100644 node_modules/duplexify/node_modules/readable-stream/readable.js create mode 100644 node_modules/duplexify/node_modules/readable-stream/transform.js create mode 100644 node_modules/duplexify/node_modules/readable-stream/writable-browser.js create mode 100644 node_modules/duplexify/node_modules/readable-stream/writable.js create mode 100644 node_modules/duplexify/node_modules/string_decoder/.travis.yml create mode 100644 node_modules/duplexify/node_modules/string_decoder/LICENSE create mode 100644 node_modules/duplexify/node_modules/string_decoder/README.md create mode 100644 node_modules/duplexify/node_modules/string_decoder/lib/string_decoder.js create mode 100644 node_modules/duplexify/node_modules/string_decoder/package.json create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/.travis.yml create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/CONTRIBUTING.md create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/GOVERNANCE.md create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/LICENSE create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/README.md create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/duplex-browser.js create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/duplex.js create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/lib/internal/streams/BufferList.js create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/lib/internal/streams/destroy.js create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/lib/internal/streams/stream.js create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/package.json create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/passthrough.js create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/readable-browser.js create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/readable.js create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/transform.js create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/writable-browser.js create mode 100644 node_modules/flush-write-stream/node_modules/readable-stream/writable.js create mode 100644 node_modules/flush-write-stream/node_modules/string_decoder/.travis.yml create mode 100644 node_modules/flush-write-stream/node_modules/string_decoder/LICENSE create mode 100644 node_modules/flush-write-stream/node_modules/string_decoder/README.md create mode 100644 node_modules/flush-write-stream/node_modules/string_decoder/lib/string_decoder.js create mode 100644 node_modules/flush-write-stream/node_modules/string_decoder/package.json create mode 100644 node_modules/from2/node_modules/readable-stream/.travis.yml create mode 100644 node_modules/from2/node_modules/readable-stream/CONTRIBUTING.md create mode 100644 node_modules/from2/node_modules/readable-stream/GOVERNANCE.md create mode 100644 node_modules/from2/node_modules/readable-stream/LICENSE create mode 100644 node_modules/from2/node_modules/readable-stream/README.md create mode 100644 node_modules/from2/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md create mode 100644 node_modules/from2/node_modules/readable-stream/duplex-browser.js create mode 100644 node_modules/from2/node_modules/readable-stream/duplex.js create mode 100644 node_modules/from2/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/from2/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/from2/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/from2/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/from2/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 node_modules/from2/node_modules/readable-stream/lib/internal/streams/BufferList.js create mode 100644 node_modules/from2/node_modules/readable-stream/lib/internal/streams/destroy.js create mode 100644 node_modules/from2/node_modules/readable-stream/lib/internal/streams/stream-browser.js create mode 100644 node_modules/from2/node_modules/readable-stream/lib/internal/streams/stream.js create mode 100644 node_modules/from2/node_modules/readable-stream/package.json create mode 100644 node_modules/from2/node_modules/readable-stream/passthrough.js create mode 100644 node_modules/from2/node_modules/readable-stream/readable-browser.js create mode 100644 node_modules/from2/node_modules/readable-stream/readable.js create mode 100644 node_modules/from2/node_modules/readable-stream/transform.js create mode 100644 node_modules/from2/node_modules/readable-stream/writable-browser.js create mode 100644 node_modules/from2/node_modules/readable-stream/writable.js create mode 100644 node_modules/from2/node_modules/string_decoder/.travis.yml create mode 100644 node_modules/from2/node_modules/string_decoder/LICENSE create mode 100644 node_modules/from2/node_modules/string_decoder/README.md create mode 100644 node_modules/from2/node_modules/string_decoder/lib/string_decoder.js create mode 100644 node_modules/from2/node_modules/string_decoder/package.json create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/.travis.yml create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/CONTRIBUTING.md create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/GOVERNANCE.md create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/LICENSE create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/README.md create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/duplex-browser.js create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/duplex.js create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/internal/streams/BufferList.js create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/internal/streams/destroy.js create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/internal/streams/stream-browser.js create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/internal/streams/stream.js create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/package.json create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/passthrough.js create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/readable-browser.js create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/readable.js create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/transform.js create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/writable-browser.js create mode 100644 node_modules/fs-write-stream-atomic/node_modules/readable-stream/writable.js create mode 100644 node_modules/fs-write-stream-atomic/node_modules/string_decoder/.travis.yml create mode 100644 node_modules/fs-write-stream-atomic/node_modules/string_decoder/LICENSE create mode 100644 node_modules/fs-write-stream-atomic/node_modules/string_decoder/README.md create mode 100644 node_modules/fs-write-stream-atomic/node_modules/string_decoder/lib/string_decoder.js create mode 100644 node_modules/fs-write-stream-atomic/node_modules/string_decoder/package.json create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/.travis.yml create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/CONTRIBUTING.md create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/GOVERNANCE.md create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/LICENSE create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/README.md create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/duplex-browser.js create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/duplex.js create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/lib/internal/streams/BufferList.js create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/lib/internal/streams/destroy.js create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/lib/internal/streams/stream-browser.js create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/lib/internal/streams/stream.js create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/package.json create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/passthrough.js create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/readable-browser.js create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/readable.js create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/transform.js create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/writable-browser.js create mode 100644 node_modules/parallel-transform/node_modules/readable-stream/writable.js create mode 100644 node_modules/parallel-transform/node_modules/string_decoder/.travis.yml create mode 100644 node_modules/parallel-transform/node_modules/string_decoder/LICENSE create mode 100644 node_modules/parallel-transform/node_modules/string_decoder/README.md create mode 100644 node_modules/parallel-transform/node_modules/string_decoder/lib/string_decoder.js create mode 100644 node_modules/parallel-transform/node_modules/string_decoder/package.json create mode 100644 node_modules/readable-stream/errors-browser.js create mode 100644 node_modules/readable-stream/errors.js create mode 100644 node_modules/readable-stream/experimentalWarning.js create mode 100644 node_modules/readable-stream/lib/internal/streams/async_iterator.js create mode 100644 node_modules/readable-stream/lib/internal/streams/buffer_list.js create mode 100644 node_modules/readable-stream/lib/internal/streams/end-of-stream.js create mode 100644 node_modules/readable-stream/lib/internal/streams/pipeline.js create mode 100644 node_modules/readable-stream/lib/internal/streams/state.js create mode 100644 node_modules/readable-stream/yarn.lock create mode 100644 node_modules/sha/node_modules/readable-stream/.travis.yml create mode 100644 node_modules/sha/node_modules/readable-stream/CONTRIBUTING.md create mode 100644 node_modules/sha/node_modules/readable-stream/GOVERNANCE.md create mode 100644 node_modules/sha/node_modules/readable-stream/LICENSE create mode 100644 node_modules/sha/node_modules/readable-stream/README.md create mode 100644 node_modules/sha/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md create mode 100644 node_modules/sha/node_modules/readable-stream/duplex-browser.js create mode 100644 node_modules/sha/node_modules/readable-stream/duplex.js create mode 100644 node_modules/sha/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/sha/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/sha/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/sha/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/sha/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 node_modules/sha/node_modules/readable-stream/lib/internal/streams/BufferList.js create mode 100644 node_modules/sha/node_modules/readable-stream/lib/internal/streams/destroy.js create mode 100644 node_modules/sha/node_modules/readable-stream/lib/internal/streams/stream-browser.js create mode 100644 node_modules/sha/node_modules/readable-stream/lib/internal/streams/stream.js create mode 100644 node_modules/sha/node_modules/readable-stream/package.json create mode 100644 node_modules/sha/node_modules/readable-stream/passthrough.js create mode 100644 node_modules/sha/node_modules/readable-stream/readable-browser.js create mode 100644 node_modules/sha/node_modules/readable-stream/readable.js create mode 100644 node_modules/sha/node_modules/readable-stream/transform.js create mode 100644 node_modules/sha/node_modules/readable-stream/writable-browser.js create mode 100644 node_modules/sha/node_modules/readable-stream/writable.js create mode 100644 node_modules/sha/node_modules/string_decoder/.travis.yml create mode 100644 node_modules/sha/node_modules/string_decoder/LICENSE create mode 100644 node_modules/sha/node_modules/string_decoder/README.md create mode 100644 node_modules/sha/node_modules/string_decoder/lib/string_decoder.js create mode 100644 node_modules/sha/node_modules/string_decoder/package.json create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/.travis.yml create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/CONTRIBUTING.md create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/GOVERNANCE.md create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/LICENSE create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/README.md create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/duplex-browser.js create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/duplex.js create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/lib/internal/streams/BufferList.js create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/lib/internal/streams/destroy.js create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/lib/internal/streams/stream-browser.js create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/lib/internal/streams/stream.js create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/package.json create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/passthrough.js create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/readable-browser.js create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/readable.js create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/transform.js create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/writable-browser.js create mode 100644 node_modules/stream-iterate/node_modules/readable-stream/writable.js create mode 100644 node_modules/stream-iterate/node_modules/string_decoder/.travis.yml create mode 100644 node_modules/stream-iterate/node_modules/string_decoder/LICENSE create mode 100644 node_modules/stream-iterate/node_modules/string_decoder/README.md create mode 100644 node_modules/stream-iterate/node_modules/string_decoder/lib/string_decoder.js create mode 100644 node_modules/stream-iterate/node_modules/string_decoder/package.json create mode 100644 node_modules/through2/node_modules/readable-stream/.travis.yml create mode 100644 node_modules/through2/node_modules/readable-stream/CONTRIBUTING.md create mode 100644 node_modules/through2/node_modules/readable-stream/GOVERNANCE.md create mode 100644 node_modules/through2/node_modules/readable-stream/LICENSE create mode 100644 node_modules/through2/node_modules/readable-stream/README.md create mode 100644 node_modules/through2/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md create mode 100644 node_modules/through2/node_modules/readable-stream/duplex-browser.js create mode 100644 node_modules/through2/node_modules/readable-stream/duplex.js create mode 100644 node_modules/through2/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/through2/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 node_modules/through2/node_modules/readable-stream/lib/internal/streams/BufferList.js create mode 100644 node_modules/through2/node_modules/readable-stream/lib/internal/streams/destroy.js create mode 100644 node_modules/through2/node_modules/readable-stream/lib/internal/streams/stream-browser.js create mode 100644 node_modules/through2/node_modules/readable-stream/lib/internal/streams/stream.js create mode 100644 node_modules/through2/node_modules/readable-stream/package.json create mode 100644 node_modules/through2/node_modules/readable-stream/passthrough.js create mode 100644 node_modules/through2/node_modules/readable-stream/readable-browser.js create mode 100644 node_modules/through2/node_modules/readable-stream/readable.js create mode 100644 node_modules/through2/node_modules/readable-stream/transform.js create mode 100644 node_modules/through2/node_modules/readable-stream/writable-browser.js create mode 100644 node_modules/through2/node_modules/readable-stream/writable.js create mode 100644 node_modules/through2/node_modules/string_decoder/.travis.yml create mode 100644 node_modules/through2/node_modules/string_decoder/LICENSE create mode 100644 node_modules/through2/node_modules/string_decoder/README.md create mode 100644 node_modules/through2/node_modules/string_decoder/lib/string_decoder.js create mode 100644 node_modules/through2/node_modules/string_decoder/package.json diff --git a/node_modules/readable-stream/.travis.yml b/node_modules/are-we-there-yet/node_modules/readable-stream/.travis.yml similarity index 100% rename from node_modules/readable-stream/.travis.yml rename to node_modules/are-we-there-yet/node_modules/readable-stream/.travis.yml diff --git a/node_modules/are-we-there-yet/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/are-we-there-yet/node_modules/readable-stream/CONTRIBUTING.md new file mode 100644 index 0000000000000..f478d58dca85b --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/readable-stream/CONTRIBUTING.md @@ -0,0 +1,38 @@ +# Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +* (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +* (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +* (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +* (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +## Moderation Policy + +The [Node.js Moderation Policy] applies to this WG. + +## Code of Conduct + +The [Node.js Code of Conduct][] applies to this WG. + +[Node.js Code of Conduct]: +https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md +[Node.js Moderation Policy]: +https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md diff --git a/node_modules/are-we-there-yet/node_modules/readable-stream/GOVERNANCE.md b/node_modules/are-we-there-yet/node_modules/readable-stream/GOVERNANCE.md new file mode 100644 index 0000000000000..16ffb93f24bec --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/readable-stream/GOVERNANCE.md @@ -0,0 +1,136 @@ +### Streams Working Group + +The Node.js Streams is jointly governed by a Working Group +(WG) +that is responsible for high-level guidance of the project. + +The WG has final authority over this project including: + +* Technical direction +* Project governance and process (including this policy) +* Contribution policy +* GitHub repository hosting +* Conduct guidelines +* Maintaining the list of additional Collaborators + +For the current list of WG members, see the project +[README.md](./README.md#current-project-team-members). + +### Collaborators + +The readable-stream GitHub repository is +maintained by the WG and additional Collaborators who are added by the +WG on an ongoing basis. + +Individuals making significant and valuable contributions are made +Collaborators and given commit-access to the project. These +individuals are identified by the WG and their addition as +Collaborators is discussed during the WG meeting. + +_Note:_ If you make a significant contribution and are not considered +for commit-access log an issue or contact a WG member directly and it +will be brought up in the next WG meeting. + +Modifications of the contents of the readable-stream repository are +made on +a collaborative basis. Anybody with a GitHub account may propose a +modification via pull request and it will be considered by the project +Collaborators. All pull requests must be reviewed and accepted by a +Collaborator with sufficient expertise who is able to take full +responsibility for the change. In the case of pull requests proposed +by an existing Collaborator, an additional Collaborator is required +for sign-off. Consensus should be sought if additional Collaborators +participate and there is disagreement around a particular +modification. See _Consensus Seeking Process_ below for further detail +on the consensus model used for governance. + +Collaborators may opt to elevate significant or controversial +modifications, or modifications that have not found consensus to the +WG for discussion by assigning the ***WG-agenda*** tag to a pull +request or issue. The WG should serve as the final arbiter where +required. + +For the current list of Collaborators, see the project +[README.md](./README.md#members). + +### WG Membership + +WG seats are not time-limited. There is no fixed size of the WG. +However, the expected target is between 6 and 12, to ensure adequate +coverage of important areas of expertise, balanced with the ability to +make decisions efficiently. + +There is no specific set of requirements or qualifications for WG +membership beyond these rules. + +The WG may add additional members to the WG by unanimous consensus. + +A WG member may be removed from the WG by voluntary resignation, or by +unanimous consensus of all other WG members. + +Changes to WG membership should be posted in the agenda, and may be +suggested as any other agenda item (see "WG Meetings" below). + +If an addition or removal is proposed during a meeting, and the full +WG is not in attendance to participate, then the addition or removal +is added to the agenda for the subsequent meeting. This is to ensure +that all members are given the opportunity to participate in all +membership decisions. If a WG member is unable to attend a meeting +where a planned membership decision is being made, then their consent +is assumed. + +No more than 1/3 of the WG members may be affiliated with the same +employer. If removal or resignation of a WG member, or a change of +employment by a WG member, creates a situation where more than 1/3 of +the WG membership shares an employer, then the situation must be +immediately remedied by the resignation or removal of one or more WG +members affiliated with the over-represented employer(s). + +### WG Meetings + +The WG meets occasionally on a Google Hangout On Air. A designated moderator +approved by the WG runs the meeting. Each meeting should be +published to YouTube. + +Items are added to the WG agenda that are considered contentious or +are modifications of governance, contribution policy, WG membership, +or release process. + +The intention of the agenda is not to approve or review all patches; +that should happen continuously on GitHub and be handled by the larger +group of Collaborators. + +Any community member or contributor can ask that something be added to +the next meeting's agenda by logging a GitHub Issue. Any Collaborator, +WG member or the moderator can add the item to the agenda by adding +the ***WG-agenda*** tag to the issue. + +Prior to each WG meeting the moderator will share the Agenda with +members of the WG. WG members can add any items they like to the +agenda at the beginning of each meeting. The moderator and the WG +cannot veto or remove items. + +The WG may invite persons or representatives from certain projects to +participate in a non-voting capacity. + +The moderator is responsible for summarizing the discussion of each +agenda item and sends it as a pull request after the meeting. + +### Consensus Seeking Process + +The WG follows a +[Consensus +Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) +decision-making model. + +When an agenda item has appeared to reach a consensus the moderator +will ask "Does anyone object?" as a final call for dissent from the +consensus. + +If an agenda item cannot reach a consensus a WG member can call for +either a closing vote or a vote to table the issue to the next +meeting. The call for a vote must be seconded by a majority of the WG +or else the discussion will continue. Simple majority wins. + +Note that changes to WG membership require a majority consensus. See +"WG Membership" above. diff --git a/node_modules/are-we-there-yet/node_modules/readable-stream/LICENSE b/node_modules/are-we-there-yet/node_modules/readable-stream/LICENSE new file mode 100644 index 0000000000000..2873b3b2e5950 --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/readable-stream/LICENSE @@ -0,0 +1,47 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/are-we-there-yet/node_modules/readable-stream/README.md b/node_modules/are-we-there-yet/node_modules/readable-stream/README.md new file mode 100644 index 0000000000000..23fe3f3e3009a --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/readable-stream/README.md @@ -0,0 +1,58 @@ +# readable-stream + +***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) + + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) + +```bash +npm install --save readable-stream +``` + +***Node-core streams for userland*** + +This package is a mirror of the Streams2 and Streams3 implementations in +Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html). + +If you want to guarantee a stable streams base, regardless of what version of +Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). + +As of version 2.0.0 **readable-stream** uses semantic versioning. + +# Streams Working Group + +`readable-stream` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + + +## Team Members + +* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> + - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B +* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> + - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 +* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> + - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D +* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> +* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> +* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> +* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) <matteo.collina@gmail.com> + - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E +* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) <shestak.irina@gmail.com> diff --git a/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/node_modules/are-we-there-yet/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md similarity index 100% rename from node_modules/readable-stream/doc/wg-meetings/2015-01-30.md rename to node_modules/are-we-there-yet/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md diff --git a/node_modules/readable-stream/duplex-browser.js b/node_modules/are-we-there-yet/node_modules/readable-stream/duplex-browser.js similarity index 100% rename from node_modules/readable-stream/duplex-browser.js rename to node_modules/are-we-there-yet/node_modules/readable-stream/duplex-browser.js diff --git a/node_modules/readable-stream/duplex.js b/node_modules/are-we-there-yet/node_modules/readable-stream/duplex.js similarity index 100% rename from node_modules/readable-stream/duplex.js rename to node_modules/are-we-there-yet/node_modules/readable-stream/duplex.js diff --git a/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 0000000000000..a1ca813e5acbd --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,131 @@ +// 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. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; \ No newline at end of file diff --git a/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 0000000000000..a9c835884828d --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,47 @@ +// 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. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; \ No newline at end of file diff --git a/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 0000000000000..bf34ac65e1108 --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,1019 @@ +// 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. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); +var destroyImpl = require('./internal/streams/destroy'); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, unpipeInfo); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} \ No newline at end of file diff --git a/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 0000000000000..5d1f8b876d98c --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,214 @@ +// 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. + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} \ No newline at end of file diff --git a/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 0000000000000..b3f4e85a2f6e3 --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,687 @@ +// 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. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = require('./internal/streams/destroy'); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // has it been destroyed + this.destroyed = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; \ No newline at end of file diff --git a/node_modules/readable-stream/lib/internal/streams/BufferList.js b/node_modules/are-we-there-yet/node_modules/readable-stream/lib/internal/streams/BufferList.js similarity index 100% rename from node_modules/readable-stream/lib/internal/streams/BufferList.js rename to node_modules/are-we-there-yet/node_modules/readable-stream/lib/internal/streams/BufferList.js diff --git a/node_modules/are-we-there-yet/node_modules/readable-stream/lib/internal/streams/destroy.js b/node_modules/are-we-there-yet/node_modules/readable-stream/lib/internal/streams/destroy.js new file mode 100644 index 0000000000000..5a0a0d88cec6f --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/readable-stream/lib/internal/streams/destroy.js @@ -0,0 +1,74 @@ +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; \ No newline at end of file diff --git a/node_modules/are-we-there-yet/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/node_modules/are-we-there-yet/node_modules/readable-stream/lib/internal/streams/stream-browser.js new file mode 100644 index 0000000000000..9332a3fdae706 --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/readable-stream/lib/internal/streams/stream-browser.js @@ -0,0 +1 @@ +module.exports = require('events').EventEmitter; diff --git a/node_modules/are-we-there-yet/node_modules/readable-stream/lib/internal/streams/stream.js b/node_modules/are-we-there-yet/node_modules/readable-stream/lib/internal/streams/stream.js new file mode 100644 index 0000000000000..ce2ad5b6ee57f --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/readable-stream/lib/internal/streams/stream.js @@ -0,0 +1 @@ +module.exports = require('stream'); diff --git a/node_modules/are-we-there-yet/node_modules/readable-stream/package.json b/node_modules/are-we-there-yet/node_modules/readable-stream/package.json new file mode 100644 index 0000000000000..387f98ab910c0 --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/readable-stream/package.json @@ -0,0 +1,81 @@ +{ + "_from": "readable-stream@^2.0.6", + "_id": "readable-stream@2.3.6", + "_inBundle": false, + "_integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "_location": "/are-we-there-yet/readable-stream", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "readable-stream@^2.0.6", + "name": "readable-stream", + "escapedName": "readable-stream", + "rawSpec": "^2.0.6", + "saveSpec": null, + "fetchSpec": "^2.0.6" + }, + "_requiredBy": [ + "/are-we-there-yet" + ], + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "_shasum": "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf", + "_spec": "readable-stream@^2.0.6", + "_where": "/Users/aeschright/code/cli/node_modules/are-we-there-yet", + "browser": { + "util": false, + "./readable.js": "./readable-browser.js", + "./writable.js": "./writable-browser.js", + "./duplex.js": "./duplex-browser.js", + "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js" + }, + "bugs": { + "url": "https://github.com/nodejs/readable-stream/issues" + }, + "bundleDependencies": false, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "deprecated": false, + "description": "Streams3, a user-land copy of the stream library from Node.js", + "devDependencies": { + "assert": "^1.4.0", + "babel-polyfill": "^6.9.1", + "buffer": "^4.9.0", + "lolex": "^2.3.2", + "nyc": "^6.4.0", + "tap": "^0.7.0", + "tape": "^4.8.0" + }, + "homepage": "https://github.com/nodejs/readable-stream#readme", + "keywords": [ + "readable", + "stream", + "pipe" + ], + "license": "MIT", + "main": "readable.js", + "name": "readable-stream", + "nyc": { + "include": [ + "lib/**.js" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/nodejs/readable-stream.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "cover": "nyc npm test", + "report": "nyc report --reporter=lcov", + "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js" + }, + "version": "2.3.6" +} diff --git a/node_modules/readable-stream/passthrough.js b/node_modules/are-we-there-yet/node_modules/readable-stream/passthrough.js similarity index 100% rename from node_modules/readable-stream/passthrough.js rename to node_modules/are-we-there-yet/node_modules/readable-stream/passthrough.js diff --git a/node_modules/are-we-there-yet/node_modules/readable-stream/readable-browser.js b/node_modules/are-we-there-yet/node_modules/readable-stream/readable-browser.js new file mode 100644 index 0000000000000..e50372592ee6c --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/readable-stream/readable-browser.js @@ -0,0 +1,7 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); diff --git a/node_modules/are-we-there-yet/node_modules/readable-stream/readable.js b/node_modules/are-we-there-yet/node_modules/readable-stream/readable.js new file mode 100644 index 0000000000000..ec89ec5330649 --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/readable-stream/readable.js @@ -0,0 +1,19 @@ +var Stream = require('stream'); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; + exports = module.exports = Stream.Readable; + exports.Readable = Stream.Readable; + exports.Writable = Stream.Writable; + exports.Duplex = Stream.Duplex; + exports.Transform = Stream.Transform; + exports.PassThrough = Stream.PassThrough; + exports.Stream = Stream; +} else { + exports = module.exports = require('./lib/_stream_readable.js'); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = require('./lib/_stream_writable.js'); + exports.Duplex = require('./lib/_stream_duplex.js'); + exports.Transform = require('./lib/_stream_transform.js'); + exports.PassThrough = require('./lib/_stream_passthrough.js'); +} diff --git a/node_modules/readable-stream/transform.js b/node_modules/are-we-there-yet/node_modules/readable-stream/transform.js similarity index 100% rename from node_modules/readable-stream/transform.js rename to node_modules/are-we-there-yet/node_modules/readable-stream/transform.js diff --git a/node_modules/readable-stream/writable-browser.js b/node_modules/are-we-there-yet/node_modules/readable-stream/writable-browser.js similarity index 100% rename from node_modules/readable-stream/writable-browser.js rename to node_modules/are-we-there-yet/node_modules/readable-stream/writable-browser.js diff --git a/node_modules/readable-stream/writable.js b/node_modules/are-we-there-yet/node_modules/readable-stream/writable.js similarity index 100% rename from node_modules/readable-stream/writable.js rename to node_modules/are-we-there-yet/node_modules/readable-stream/writable.js diff --git a/node_modules/string_decoder/.travis.yml b/node_modules/are-we-there-yet/node_modules/string_decoder/.travis.yml similarity index 100% rename from node_modules/string_decoder/.travis.yml rename to node_modules/are-we-there-yet/node_modules/string_decoder/.travis.yml diff --git a/node_modules/are-we-there-yet/node_modules/string_decoder/LICENSE b/node_modules/are-we-there-yet/node_modules/string_decoder/LICENSE new file mode 100644 index 0000000000000..778edb20730ef --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/string_decoder/LICENSE @@ -0,0 +1,48 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/are-we-there-yet/node_modules/string_decoder/README.md b/node_modules/are-we-there-yet/node_modules/string_decoder/README.md new file mode 100644 index 0000000000000..5fd58315ed588 --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/string_decoder/README.md @@ -0,0 +1,47 @@ +# string_decoder + +***Node-core v8.9.4 string_decoder for userland*** + + +[![NPM](https://nodei.co/npm/string_decoder.png?downloads=true&downloadRank=true)](https://nodei.co/npm/string_decoder/) +[![NPM](https://nodei.co/npm-dl/string_decoder.png?&months=6&height=3)](https://nodei.co/npm/string_decoder/) + + +```bash +npm install --save string_decoder +``` + +***Node-core string_decoder for userland*** + +This package is a mirror of the string_decoder implementation in Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.9.4/docs/api/). + +As of version 1.0.0 **string_decoder** uses semantic versioning. + +## Previous versions + +Previous version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. + +## Update + +The *build/* directory contains a build script that will scrape the source from the [nodejs/node](https://github.com/nodejs/node) repo given a specific Node version. + +## Streams Working Group + +`string_decoder` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + +See [readable-stream](https://github.com/nodejs/readable-stream) for +more details. diff --git a/node_modules/are-we-there-yet/node_modules/string_decoder/lib/string_decoder.js b/node_modules/are-we-there-yet/node_modules/string_decoder/lib/string_decoder.js new file mode 100644 index 0000000000000..2e89e63f7933e --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/string_decoder/lib/string_decoder.js @@ -0,0 +1,296 @@ +// 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. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} \ No newline at end of file diff --git a/node_modules/are-we-there-yet/node_modules/string_decoder/package.json b/node_modules/are-we-there-yet/node_modules/string_decoder/package.json new file mode 100644 index 0000000000000..1e76b8bffe408 --- /dev/null +++ b/node_modules/are-we-there-yet/node_modules/string_decoder/package.json @@ -0,0 +1,59 @@ +{ + "_from": "string_decoder@~1.1.1", + "_id": "string_decoder@1.1.1", + "_inBundle": false, + "_integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "_location": "/are-we-there-yet/string_decoder", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "string_decoder@~1.1.1", + "name": "string_decoder", + "escapedName": "string_decoder", + "rawSpec": "~1.1.1", + "saveSpec": null, + "fetchSpec": "~1.1.1" + }, + "_requiredBy": [ + "/are-we-there-yet/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "_shasum": "9cf1611ba62685d7030ae9e4ba34149c3af03fc8", + "_spec": "string_decoder@~1.1.1", + "_where": "/Users/aeschright/code/cli/node_modules/are-we-there-yet/node_modules/readable-stream", + "bugs": { + "url": "https://github.com/nodejs/string_decoder/issues" + }, + "bundleDependencies": false, + "dependencies": { + "safe-buffer": "~5.1.0" + }, + "deprecated": false, + "description": "The string_decoder module from Node core", + "devDependencies": { + "babel-polyfill": "^6.23.0", + "core-util-is": "^1.0.2", + "inherits": "^2.0.3", + "tap": "~0.4.8" + }, + "homepage": "https://github.com/nodejs/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT", + "main": "lib/string_decoder.js", + "name": "string_decoder", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/string_decoder.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "test": "tap test/parallel/*.js && node test/verify-dependencies" + }, + "version": "1.1.1" +} diff --git a/node_modules/concat-stream/node_modules/readable-stream/.travis.yml b/node_modules/concat-stream/node_modules/readable-stream/.travis.yml new file mode 100644 index 0000000000000..40992555bf5cc --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/.travis.yml @@ -0,0 +1,55 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test +script: "npm run $TASK" +env: + global: + - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc= + - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI= diff --git a/node_modules/concat-stream/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/concat-stream/node_modules/readable-stream/CONTRIBUTING.md new file mode 100644 index 0000000000000..f478d58dca85b --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/CONTRIBUTING.md @@ -0,0 +1,38 @@ +# Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +* (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +* (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +* (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +* (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +## Moderation Policy + +The [Node.js Moderation Policy] applies to this WG. + +## Code of Conduct + +The [Node.js Code of Conduct][] applies to this WG. + +[Node.js Code of Conduct]: +https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md +[Node.js Moderation Policy]: +https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md diff --git a/node_modules/concat-stream/node_modules/readable-stream/GOVERNANCE.md b/node_modules/concat-stream/node_modules/readable-stream/GOVERNANCE.md new file mode 100644 index 0000000000000..16ffb93f24bec --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/GOVERNANCE.md @@ -0,0 +1,136 @@ +### Streams Working Group + +The Node.js Streams is jointly governed by a Working Group +(WG) +that is responsible for high-level guidance of the project. + +The WG has final authority over this project including: + +* Technical direction +* Project governance and process (including this policy) +* Contribution policy +* GitHub repository hosting +* Conduct guidelines +* Maintaining the list of additional Collaborators + +For the current list of WG members, see the project +[README.md](./README.md#current-project-team-members). + +### Collaborators + +The readable-stream GitHub repository is +maintained by the WG and additional Collaborators who are added by the +WG on an ongoing basis. + +Individuals making significant and valuable contributions are made +Collaborators and given commit-access to the project. These +individuals are identified by the WG and their addition as +Collaborators is discussed during the WG meeting. + +_Note:_ If you make a significant contribution and are not considered +for commit-access log an issue or contact a WG member directly and it +will be brought up in the next WG meeting. + +Modifications of the contents of the readable-stream repository are +made on +a collaborative basis. Anybody with a GitHub account may propose a +modification via pull request and it will be considered by the project +Collaborators. All pull requests must be reviewed and accepted by a +Collaborator with sufficient expertise who is able to take full +responsibility for the change. In the case of pull requests proposed +by an existing Collaborator, an additional Collaborator is required +for sign-off. Consensus should be sought if additional Collaborators +participate and there is disagreement around a particular +modification. See _Consensus Seeking Process_ below for further detail +on the consensus model used for governance. + +Collaborators may opt to elevate significant or controversial +modifications, or modifications that have not found consensus to the +WG for discussion by assigning the ***WG-agenda*** tag to a pull +request or issue. The WG should serve as the final arbiter where +required. + +For the current list of Collaborators, see the project +[README.md](./README.md#members). + +### WG Membership + +WG seats are not time-limited. There is no fixed size of the WG. +However, the expected target is between 6 and 12, to ensure adequate +coverage of important areas of expertise, balanced with the ability to +make decisions efficiently. + +There is no specific set of requirements or qualifications for WG +membership beyond these rules. + +The WG may add additional members to the WG by unanimous consensus. + +A WG member may be removed from the WG by voluntary resignation, or by +unanimous consensus of all other WG members. + +Changes to WG membership should be posted in the agenda, and may be +suggested as any other agenda item (see "WG Meetings" below). + +If an addition or removal is proposed during a meeting, and the full +WG is not in attendance to participate, then the addition or removal +is added to the agenda for the subsequent meeting. This is to ensure +that all members are given the opportunity to participate in all +membership decisions. If a WG member is unable to attend a meeting +where a planned membership decision is being made, then their consent +is assumed. + +No more than 1/3 of the WG members may be affiliated with the same +employer. If removal or resignation of a WG member, or a change of +employment by a WG member, creates a situation where more than 1/3 of +the WG membership shares an employer, then the situation must be +immediately remedied by the resignation or removal of one or more WG +members affiliated with the over-represented employer(s). + +### WG Meetings + +The WG meets occasionally on a Google Hangout On Air. A designated moderator +approved by the WG runs the meeting. Each meeting should be +published to YouTube. + +Items are added to the WG agenda that are considered contentious or +are modifications of governance, contribution policy, WG membership, +or release process. + +The intention of the agenda is not to approve or review all patches; +that should happen continuously on GitHub and be handled by the larger +group of Collaborators. + +Any community member or contributor can ask that something be added to +the next meeting's agenda by logging a GitHub Issue. Any Collaborator, +WG member or the moderator can add the item to the agenda by adding +the ***WG-agenda*** tag to the issue. + +Prior to each WG meeting the moderator will share the Agenda with +members of the WG. WG members can add any items they like to the +agenda at the beginning of each meeting. The moderator and the WG +cannot veto or remove items. + +The WG may invite persons or representatives from certain projects to +participate in a non-voting capacity. + +The moderator is responsible for summarizing the discussion of each +agenda item and sends it as a pull request after the meeting. + +### Consensus Seeking Process + +The WG follows a +[Consensus +Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) +decision-making model. + +When an agenda item has appeared to reach a consensus the moderator +will ask "Does anyone object?" as a final call for dissent from the +consensus. + +If an agenda item cannot reach a consensus a WG member can call for +either a closing vote or a vote to table the issue to the next +meeting. The call for a vote must be seconded by a majority of the WG +or else the discussion will continue. Simple majority wins. + +Note that changes to WG membership require a majority consensus. See +"WG Membership" above. diff --git a/node_modules/concat-stream/node_modules/readable-stream/LICENSE b/node_modules/concat-stream/node_modules/readable-stream/LICENSE new file mode 100644 index 0000000000000..2873b3b2e5950 --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/LICENSE @@ -0,0 +1,47 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/concat-stream/node_modules/readable-stream/README.md b/node_modules/concat-stream/node_modules/readable-stream/README.md new file mode 100644 index 0000000000000..23fe3f3e3009a --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/README.md @@ -0,0 +1,58 @@ +# readable-stream + +***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) + + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) + +```bash +npm install --save readable-stream +``` + +***Node-core streams for userland*** + +This package is a mirror of the Streams2 and Streams3 implementations in +Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html). + +If you want to guarantee a stable streams base, regardless of what version of +Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). + +As of version 2.0.0 **readable-stream** uses semantic versioning. + +# Streams Working Group + +`readable-stream` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + + +## Team Members + +* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> + - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B +* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> + - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 +* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> + - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D +* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> +* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> +* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> +* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) <matteo.collina@gmail.com> + - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E +* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) <shestak.irina@gmail.com> diff --git a/node_modules/concat-stream/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/node_modules/concat-stream/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md new file mode 100644 index 0000000000000..83275f192e407 --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md @@ -0,0 +1,60 @@ +# streams WG Meeting 2015-01-30 + +## Links + +* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg +* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106 +* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/ + +## Agenda + +Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting. + +* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105) +* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101) +* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102) +* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99) + +## Minutes + +### adopt a charter + +* group: +1's all around + +### What versioning scheme should be adopted? +* group: +1’s 3.0.0 +* domenic+group: pulling in patches from other sources where appropriate +* mikeal: version independently, suggesting versions for io.js +* mikeal+domenic: work with TC to notify in advance of changes +simpler stream creation + +### streamline creation of streams +* sam: streamline creation of streams +* domenic: nice simple solution posted + but, we lose the opportunity to change the model + may not be backwards incompatible (double check keys) + + **action item:** domenic will check + +### remove implicit flowing of streams on(‘data’) +* add isFlowing / isPaused +* mikeal: worrying that we’re documenting polyfill methods – confuses users +* domenic: more reflective API is probably good, with warning labels for users +* new section for mad scientists (reflective stream access) +* calvin: name the “third state” +* mikeal: maybe borrow the name from whatwg? +* domenic: we’re missing the “third state” +* consensus: kind of difficult to name the third state +* mikeal: figure out differences in states / compat +* mathias: always flow on data – eliminates third state + * explore what it breaks + +**action items:** +* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream) +* ask rod/build for infrastructure +* **chris**: explore the “flow on data” approach +* add isPaused/isFlowing +* add new docs section +* move isPaused to that section + + diff --git a/node_modules/concat-stream/node_modules/readable-stream/duplex-browser.js b/node_modules/concat-stream/node_modules/readable-stream/duplex-browser.js new file mode 100644 index 0000000000000..f8b2db83dbe73 --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/duplex-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_duplex.js'); diff --git a/node_modules/concat-stream/node_modules/readable-stream/duplex.js b/node_modules/concat-stream/node_modules/readable-stream/duplex.js new file mode 100644 index 0000000000000..46924cbfdf538 --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require('./readable').Duplex diff --git a/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 0000000000000..a1ca813e5acbd --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,131 @@ +// 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. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; \ No newline at end of file diff --git a/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 0000000000000..a9c835884828d --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,47 @@ +// 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. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; \ No newline at end of file diff --git a/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 0000000000000..bf34ac65e1108 --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,1019 @@ +// 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. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); +var destroyImpl = require('./internal/streams/destroy'); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, unpipeInfo); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} \ No newline at end of file diff --git a/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 0000000000000..5d1f8b876d98c --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,214 @@ +// 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. + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} \ No newline at end of file diff --git a/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 0000000000000..b3f4e85a2f6e3 --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,687 @@ +// 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. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = require('./internal/streams/destroy'); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // has it been destroyed + this.destroyed = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; \ No newline at end of file diff --git a/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/BufferList.js b/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/BufferList.js new file mode 100644 index 0000000000000..aefc68bd90b9c --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/BufferList.js @@ -0,0 +1,79 @@ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Buffer = require('safe-buffer').Buffer; +var util = require('util'); + +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} + +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; +}(); + +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} \ No newline at end of file diff --git a/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/destroy.js b/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/destroy.js new file mode 100644 index 0000000000000..5a0a0d88cec6f --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/destroy.js @@ -0,0 +1,74 @@ +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; \ No newline at end of file diff --git a/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js new file mode 100644 index 0000000000000..9332a3fdae706 --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js @@ -0,0 +1 @@ +module.exports = require('events').EventEmitter; diff --git a/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/stream.js b/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/stream.js new file mode 100644 index 0000000000000..ce2ad5b6ee57f --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/stream.js @@ -0,0 +1 @@ +module.exports = require('stream'); diff --git a/node_modules/concat-stream/node_modules/readable-stream/package.json b/node_modules/concat-stream/node_modules/readable-stream/package.json new file mode 100644 index 0000000000000..9f2a5ca7ca993 --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/package.json @@ -0,0 +1,81 @@ +{ + "_from": "readable-stream@^2.2.2", + "_id": "readable-stream@2.3.6", + "_inBundle": false, + "_integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "_location": "/concat-stream/readable-stream", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "readable-stream@^2.2.2", + "name": "readable-stream", + "escapedName": "readable-stream", + "rawSpec": "^2.2.2", + "saveSpec": null, + "fetchSpec": "^2.2.2" + }, + "_requiredBy": [ + "/concat-stream" + ], + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "_shasum": "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf", + "_spec": "readable-stream@^2.2.2", + "_where": "/Users/aeschright/code/cli/node_modules/concat-stream", + "browser": { + "util": false, + "./readable.js": "./readable-browser.js", + "./writable.js": "./writable-browser.js", + "./duplex.js": "./duplex-browser.js", + "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js" + }, + "bugs": { + "url": "https://github.com/nodejs/readable-stream/issues" + }, + "bundleDependencies": false, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "deprecated": false, + "description": "Streams3, a user-land copy of the stream library from Node.js", + "devDependencies": { + "assert": "^1.4.0", + "babel-polyfill": "^6.9.1", + "buffer": "^4.9.0", + "lolex": "^2.3.2", + "nyc": "^6.4.0", + "tap": "^0.7.0", + "tape": "^4.8.0" + }, + "homepage": "https://github.com/nodejs/readable-stream#readme", + "keywords": [ + "readable", + "stream", + "pipe" + ], + "license": "MIT", + "main": "readable.js", + "name": "readable-stream", + "nyc": { + "include": [ + "lib/**.js" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/nodejs/readable-stream.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "cover": "nyc npm test", + "report": "nyc report --reporter=lcov", + "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js" + }, + "version": "2.3.6" +} diff --git a/node_modules/concat-stream/node_modules/readable-stream/passthrough.js b/node_modules/concat-stream/node_modules/readable-stream/passthrough.js new file mode 100644 index 0000000000000..ffd791d7ff275 --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require('./readable').PassThrough diff --git a/node_modules/concat-stream/node_modules/readable-stream/readable-browser.js b/node_modules/concat-stream/node_modules/readable-stream/readable-browser.js new file mode 100644 index 0000000000000..e50372592ee6c --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/readable-browser.js @@ -0,0 +1,7 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); diff --git a/node_modules/concat-stream/node_modules/readable-stream/readable.js b/node_modules/concat-stream/node_modules/readable-stream/readable.js new file mode 100644 index 0000000000000..ec89ec5330649 --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/readable.js @@ -0,0 +1,19 @@ +var Stream = require('stream'); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; + exports = module.exports = Stream.Readable; + exports.Readable = Stream.Readable; + exports.Writable = Stream.Writable; + exports.Duplex = Stream.Duplex; + exports.Transform = Stream.Transform; + exports.PassThrough = Stream.PassThrough; + exports.Stream = Stream; +} else { + exports = module.exports = require('./lib/_stream_readable.js'); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = require('./lib/_stream_writable.js'); + exports.Duplex = require('./lib/_stream_duplex.js'); + exports.Transform = require('./lib/_stream_transform.js'); + exports.PassThrough = require('./lib/_stream_passthrough.js'); +} diff --git a/node_modules/concat-stream/node_modules/readable-stream/transform.js b/node_modules/concat-stream/node_modules/readable-stream/transform.js new file mode 100644 index 0000000000000..b1baba26da03d --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require('./readable').Transform diff --git a/node_modules/concat-stream/node_modules/readable-stream/writable-browser.js b/node_modules/concat-stream/node_modules/readable-stream/writable-browser.js new file mode 100644 index 0000000000000..ebdde6a85dcb1 --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/writable-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_writable.js'); diff --git a/node_modules/concat-stream/node_modules/readable-stream/writable.js b/node_modules/concat-stream/node_modules/readable-stream/writable.js new file mode 100644 index 0000000000000..3211a6f80d1ab --- /dev/null +++ b/node_modules/concat-stream/node_modules/readable-stream/writable.js @@ -0,0 +1,8 @@ +var Stream = require("stream") +var Writable = require("./lib/_stream_writable.js") + +if (process.env.READABLE_STREAM === 'disable') { + module.exports = Stream && Stream.Writable || Writable +} else { + module.exports = Writable +} diff --git a/node_modules/concat-stream/node_modules/string_decoder/.travis.yml b/node_modules/concat-stream/node_modules/string_decoder/.travis.yml new file mode 100644 index 0000000000000..3347a72546505 --- /dev/null +++ b/node_modules/concat-stream/node_modules/string_decoder/.travis.yml @@ -0,0 +1,50 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test diff --git a/node_modules/concat-stream/node_modules/string_decoder/LICENSE b/node_modules/concat-stream/node_modules/string_decoder/LICENSE new file mode 100644 index 0000000000000..778edb20730ef --- /dev/null +++ b/node_modules/concat-stream/node_modules/string_decoder/LICENSE @@ -0,0 +1,48 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/concat-stream/node_modules/string_decoder/README.md b/node_modules/concat-stream/node_modules/string_decoder/README.md new file mode 100644 index 0000000000000..5fd58315ed588 --- /dev/null +++ b/node_modules/concat-stream/node_modules/string_decoder/README.md @@ -0,0 +1,47 @@ +# string_decoder + +***Node-core v8.9.4 string_decoder for userland*** + + +[![NPM](https://nodei.co/npm/string_decoder.png?downloads=true&downloadRank=true)](https://nodei.co/npm/string_decoder/) +[![NPM](https://nodei.co/npm-dl/string_decoder.png?&months=6&height=3)](https://nodei.co/npm/string_decoder/) + + +```bash +npm install --save string_decoder +``` + +***Node-core string_decoder for userland*** + +This package is a mirror of the string_decoder implementation in Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.9.4/docs/api/). + +As of version 1.0.0 **string_decoder** uses semantic versioning. + +## Previous versions + +Previous version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. + +## Update + +The *build/* directory contains a build script that will scrape the source from the [nodejs/node](https://github.com/nodejs/node) repo given a specific Node version. + +## Streams Working Group + +`string_decoder` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + +See [readable-stream](https://github.com/nodejs/readable-stream) for +more details. diff --git a/node_modules/concat-stream/node_modules/string_decoder/lib/string_decoder.js b/node_modules/concat-stream/node_modules/string_decoder/lib/string_decoder.js new file mode 100644 index 0000000000000..2e89e63f7933e --- /dev/null +++ b/node_modules/concat-stream/node_modules/string_decoder/lib/string_decoder.js @@ -0,0 +1,296 @@ +// 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. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} \ No newline at end of file diff --git a/node_modules/concat-stream/node_modules/string_decoder/package.json b/node_modules/concat-stream/node_modules/string_decoder/package.json new file mode 100644 index 0000000000000..fcc3a4bdf3b02 --- /dev/null +++ b/node_modules/concat-stream/node_modules/string_decoder/package.json @@ -0,0 +1,59 @@ +{ + "_from": "string_decoder@~1.1.1", + "_id": "string_decoder@1.1.1", + "_inBundle": false, + "_integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "_location": "/concat-stream/string_decoder", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "string_decoder@~1.1.1", + "name": "string_decoder", + "escapedName": "string_decoder", + "rawSpec": "~1.1.1", + "saveSpec": null, + "fetchSpec": "~1.1.1" + }, + "_requiredBy": [ + "/concat-stream/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "_shasum": "9cf1611ba62685d7030ae9e4ba34149c3af03fc8", + "_spec": "string_decoder@~1.1.1", + "_where": "/Users/aeschright/code/cli/node_modules/concat-stream/node_modules/readable-stream", + "bugs": { + "url": "https://github.com/nodejs/string_decoder/issues" + }, + "bundleDependencies": false, + "dependencies": { + "safe-buffer": "~5.1.0" + }, + "deprecated": false, + "description": "The string_decoder module from Node core", + "devDependencies": { + "babel-polyfill": "^6.23.0", + "core-util-is": "^1.0.2", + "inherits": "^2.0.3", + "tap": "~0.4.8" + }, + "homepage": "https://github.com/nodejs/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT", + "main": "lib/string_decoder.js", + "name": "string_decoder", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/string_decoder.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "test": "tap test/parallel/*.js && node test/verify-dependencies" + }, + "version": "1.1.1" +} diff --git a/node_modules/duplexify/node_modules/readable-stream/.travis.yml b/node_modules/duplexify/node_modules/readable-stream/.travis.yml new file mode 100644 index 0000000000000..40992555bf5cc --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/.travis.yml @@ -0,0 +1,55 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test +script: "npm run $TASK" +env: + global: + - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc= + - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI= diff --git a/node_modules/duplexify/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/duplexify/node_modules/readable-stream/CONTRIBUTING.md new file mode 100644 index 0000000000000..f478d58dca85b --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/CONTRIBUTING.md @@ -0,0 +1,38 @@ +# Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +* (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +* (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +* (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +* (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +## Moderation Policy + +The [Node.js Moderation Policy] applies to this WG. + +## Code of Conduct + +The [Node.js Code of Conduct][] applies to this WG. + +[Node.js Code of Conduct]: +https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md +[Node.js Moderation Policy]: +https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md diff --git a/node_modules/duplexify/node_modules/readable-stream/GOVERNANCE.md b/node_modules/duplexify/node_modules/readable-stream/GOVERNANCE.md new file mode 100644 index 0000000000000..16ffb93f24bec --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/GOVERNANCE.md @@ -0,0 +1,136 @@ +### Streams Working Group + +The Node.js Streams is jointly governed by a Working Group +(WG) +that is responsible for high-level guidance of the project. + +The WG has final authority over this project including: + +* Technical direction +* Project governance and process (including this policy) +* Contribution policy +* GitHub repository hosting +* Conduct guidelines +* Maintaining the list of additional Collaborators + +For the current list of WG members, see the project +[README.md](./README.md#current-project-team-members). + +### Collaborators + +The readable-stream GitHub repository is +maintained by the WG and additional Collaborators who are added by the +WG on an ongoing basis. + +Individuals making significant and valuable contributions are made +Collaborators and given commit-access to the project. These +individuals are identified by the WG and their addition as +Collaborators is discussed during the WG meeting. + +_Note:_ If you make a significant contribution and are not considered +for commit-access log an issue or contact a WG member directly and it +will be brought up in the next WG meeting. + +Modifications of the contents of the readable-stream repository are +made on +a collaborative basis. Anybody with a GitHub account may propose a +modification via pull request and it will be considered by the project +Collaborators. All pull requests must be reviewed and accepted by a +Collaborator with sufficient expertise who is able to take full +responsibility for the change. In the case of pull requests proposed +by an existing Collaborator, an additional Collaborator is required +for sign-off. Consensus should be sought if additional Collaborators +participate and there is disagreement around a particular +modification. See _Consensus Seeking Process_ below for further detail +on the consensus model used for governance. + +Collaborators may opt to elevate significant or controversial +modifications, or modifications that have not found consensus to the +WG for discussion by assigning the ***WG-agenda*** tag to a pull +request or issue. The WG should serve as the final arbiter where +required. + +For the current list of Collaborators, see the project +[README.md](./README.md#members). + +### WG Membership + +WG seats are not time-limited. There is no fixed size of the WG. +However, the expected target is between 6 and 12, to ensure adequate +coverage of important areas of expertise, balanced with the ability to +make decisions efficiently. + +There is no specific set of requirements or qualifications for WG +membership beyond these rules. + +The WG may add additional members to the WG by unanimous consensus. + +A WG member may be removed from the WG by voluntary resignation, or by +unanimous consensus of all other WG members. + +Changes to WG membership should be posted in the agenda, and may be +suggested as any other agenda item (see "WG Meetings" below). + +If an addition or removal is proposed during a meeting, and the full +WG is not in attendance to participate, then the addition or removal +is added to the agenda for the subsequent meeting. This is to ensure +that all members are given the opportunity to participate in all +membership decisions. If a WG member is unable to attend a meeting +where a planned membership decision is being made, then their consent +is assumed. + +No more than 1/3 of the WG members may be affiliated with the same +employer. If removal or resignation of a WG member, or a change of +employment by a WG member, creates a situation where more than 1/3 of +the WG membership shares an employer, then the situation must be +immediately remedied by the resignation or removal of one or more WG +members affiliated with the over-represented employer(s). + +### WG Meetings + +The WG meets occasionally on a Google Hangout On Air. A designated moderator +approved by the WG runs the meeting. Each meeting should be +published to YouTube. + +Items are added to the WG agenda that are considered contentious or +are modifications of governance, contribution policy, WG membership, +or release process. + +The intention of the agenda is not to approve or review all patches; +that should happen continuously on GitHub and be handled by the larger +group of Collaborators. + +Any community member or contributor can ask that something be added to +the next meeting's agenda by logging a GitHub Issue. Any Collaborator, +WG member or the moderator can add the item to the agenda by adding +the ***WG-agenda*** tag to the issue. + +Prior to each WG meeting the moderator will share the Agenda with +members of the WG. WG members can add any items they like to the +agenda at the beginning of each meeting. The moderator and the WG +cannot veto or remove items. + +The WG may invite persons or representatives from certain projects to +participate in a non-voting capacity. + +The moderator is responsible for summarizing the discussion of each +agenda item and sends it as a pull request after the meeting. + +### Consensus Seeking Process + +The WG follows a +[Consensus +Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) +decision-making model. + +When an agenda item has appeared to reach a consensus the moderator +will ask "Does anyone object?" as a final call for dissent from the +consensus. + +If an agenda item cannot reach a consensus a WG member can call for +either a closing vote or a vote to table the issue to the next +meeting. The call for a vote must be seconded by a majority of the WG +or else the discussion will continue. Simple majority wins. + +Note that changes to WG membership require a majority consensus. See +"WG Membership" above. diff --git a/node_modules/duplexify/node_modules/readable-stream/LICENSE b/node_modules/duplexify/node_modules/readable-stream/LICENSE new file mode 100644 index 0000000000000..2873b3b2e5950 --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/LICENSE @@ -0,0 +1,47 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/duplexify/node_modules/readable-stream/README.md b/node_modules/duplexify/node_modules/readable-stream/README.md new file mode 100644 index 0000000000000..23fe3f3e3009a --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/README.md @@ -0,0 +1,58 @@ +# readable-stream + +***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) + + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) + +```bash +npm install --save readable-stream +``` + +***Node-core streams for userland*** + +This package is a mirror of the Streams2 and Streams3 implementations in +Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html). + +If you want to guarantee a stable streams base, regardless of what version of +Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). + +As of version 2.0.0 **readable-stream** uses semantic versioning. + +# Streams Working Group + +`readable-stream` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + + +## Team Members + +* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> + - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B +* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> + - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 +* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> + - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D +* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> +* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> +* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> +* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) <matteo.collina@gmail.com> + - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E +* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) <shestak.irina@gmail.com> diff --git a/node_modules/duplexify/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/node_modules/duplexify/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md new file mode 100644 index 0000000000000..83275f192e407 --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md @@ -0,0 +1,60 @@ +# streams WG Meeting 2015-01-30 + +## Links + +* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg +* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106 +* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/ + +## Agenda + +Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting. + +* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105) +* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101) +* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102) +* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99) + +## Minutes + +### adopt a charter + +* group: +1's all around + +### What versioning scheme should be adopted? +* group: +1’s 3.0.0 +* domenic+group: pulling in patches from other sources where appropriate +* mikeal: version independently, suggesting versions for io.js +* mikeal+domenic: work with TC to notify in advance of changes +simpler stream creation + +### streamline creation of streams +* sam: streamline creation of streams +* domenic: nice simple solution posted + but, we lose the opportunity to change the model + may not be backwards incompatible (double check keys) + + **action item:** domenic will check + +### remove implicit flowing of streams on(‘data’) +* add isFlowing / isPaused +* mikeal: worrying that we’re documenting polyfill methods – confuses users +* domenic: more reflective API is probably good, with warning labels for users +* new section for mad scientists (reflective stream access) +* calvin: name the “third state” +* mikeal: maybe borrow the name from whatwg? +* domenic: we’re missing the “third state” +* consensus: kind of difficult to name the third state +* mikeal: figure out differences in states / compat +* mathias: always flow on data – eliminates third state + * explore what it breaks + +**action items:** +* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream) +* ask rod/build for infrastructure +* **chris**: explore the “flow on data” approach +* add isPaused/isFlowing +* add new docs section +* move isPaused to that section + + diff --git a/node_modules/duplexify/node_modules/readable-stream/duplex-browser.js b/node_modules/duplexify/node_modules/readable-stream/duplex-browser.js new file mode 100644 index 0000000000000..f8b2db83dbe73 --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/duplex-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_duplex.js'); diff --git a/node_modules/duplexify/node_modules/readable-stream/duplex.js b/node_modules/duplexify/node_modules/readable-stream/duplex.js new file mode 100644 index 0000000000000..46924cbfdf538 --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require('./readable').Duplex diff --git a/node_modules/duplexify/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/duplexify/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 0000000000000..a1ca813e5acbd --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,131 @@ +// 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. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; \ No newline at end of file diff --git a/node_modules/duplexify/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/duplexify/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 0000000000000..a9c835884828d --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,47 @@ +// 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. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; \ No newline at end of file diff --git a/node_modules/duplexify/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/duplexify/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 0000000000000..bf34ac65e1108 --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,1019 @@ +// 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. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); +var destroyImpl = require('./internal/streams/destroy'); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, unpipeInfo); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} \ No newline at end of file diff --git a/node_modules/duplexify/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/duplexify/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 0000000000000..5d1f8b876d98c --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,214 @@ +// 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. + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} \ No newline at end of file diff --git a/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 0000000000000..b3f4e85a2f6e3 --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,687 @@ +// 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. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = require('./internal/streams/destroy'); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // has it been destroyed + this.destroyed = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; \ No newline at end of file diff --git a/node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/BufferList.js b/node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/BufferList.js new file mode 100644 index 0000000000000..aefc68bd90b9c --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/BufferList.js @@ -0,0 +1,79 @@ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Buffer = require('safe-buffer').Buffer; +var util = require('util'); + +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} + +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; +}(); + +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} \ No newline at end of file diff --git a/node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/destroy.js b/node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/destroy.js new file mode 100644 index 0000000000000..5a0a0d88cec6f --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/destroy.js @@ -0,0 +1,74 @@ +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; \ No newline at end of file diff --git a/node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/stream-browser.js new file mode 100644 index 0000000000000..9332a3fdae706 --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/stream-browser.js @@ -0,0 +1 @@ +module.exports = require('events').EventEmitter; diff --git a/node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/stream.js b/node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/stream.js new file mode 100644 index 0000000000000..ce2ad5b6ee57f --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/stream.js @@ -0,0 +1 @@ +module.exports = require('stream'); diff --git a/node_modules/duplexify/node_modules/readable-stream/package.json b/node_modules/duplexify/node_modules/readable-stream/package.json new file mode 100644 index 0000000000000..e0a80537228c9 --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/package.json @@ -0,0 +1,81 @@ +{ + "_from": "readable-stream@^2.0.0", + "_id": "readable-stream@2.3.6", + "_inBundle": false, + "_integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "_location": "/duplexify/readable-stream", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "readable-stream@^2.0.0", + "name": "readable-stream", + "escapedName": "readable-stream", + "rawSpec": "^2.0.0", + "saveSpec": null, + "fetchSpec": "^2.0.0" + }, + "_requiredBy": [ + "/duplexify" + ], + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "_shasum": "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf", + "_spec": "readable-stream@^2.0.0", + "_where": "/Users/aeschright/code/cli/node_modules/duplexify", + "browser": { + "util": false, + "./readable.js": "./readable-browser.js", + "./writable.js": "./writable-browser.js", + "./duplex.js": "./duplex-browser.js", + "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js" + }, + "bugs": { + "url": "https://github.com/nodejs/readable-stream/issues" + }, + "bundleDependencies": false, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "deprecated": false, + "description": "Streams3, a user-land copy of the stream library from Node.js", + "devDependencies": { + "assert": "^1.4.0", + "babel-polyfill": "^6.9.1", + "buffer": "^4.9.0", + "lolex": "^2.3.2", + "nyc": "^6.4.0", + "tap": "^0.7.0", + "tape": "^4.8.0" + }, + "homepage": "https://github.com/nodejs/readable-stream#readme", + "keywords": [ + "readable", + "stream", + "pipe" + ], + "license": "MIT", + "main": "readable.js", + "name": "readable-stream", + "nyc": { + "include": [ + "lib/**.js" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/nodejs/readable-stream.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "cover": "nyc npm test", + "report": "nyc report --reporter=lcov", + "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js" + }, + "version": "2.3.6" +} diff --git a/node_modules/duplexify/node_modules/readable-stream/passthrough.js b/node_modules/duplexify/node_modules/readable-stream/passthrough.js new file mode 100644 index 0000000000000..ffd791d7ff275 --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require('./readable').PassThrough diff --git a/node_modules/duplexify/node_modules/readable-stream/readable-browser.js b/node_modules/duplexify/node_modules/readable-stream/readable-browser.js new file mode 100644 index 0000000000000..e50372592ee6c --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/readable-browser.js @@ -0,0 +1,7 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); diff --git a/node_modules/duplexify/node_modules/readable-stream/readable.js b/node_modules/duplexify/node_modules/readable-stream/readable.js new file mode 100644 index 0000000000000..ec89ec5330649 --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/readable.js @@ -0,0 +1,19 @@ +var Stream = require('stream'); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; + exports = module.exports = Stream.Readable; + exports.Readable = Stream.Readable; + exports.Writable = Stream.Writable; + exports.Duplex = Stream.Duplex; + exports.Transform = Stream.Transform; + exports.PassThrough = Stream.PassThrough; + exports.Stream = Stream; +} else { + exports = module.exports = require('./lib/_stream_readable.js'); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = require('./lib/_stream_writable.js'); + exports.Duplex = require('./lib/_stream_duplex.js'); + exports.Transform = require('./lib/_stream_transform.js'); + exports.PassThrough = require('./lib/_stream_passthrough.js'); +} diff --git a/node_modules/duplexify/node_modules/readable-stream/transform.js b/node_modules/duplexify/node_modules/readable-stream/transform.js new file mode 100644 index 0000000000000..b1baba26da03d --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require('./readable').Transform diff --git a/node_modules/duplexify/node_modules/readable-stream/writable-browser.js b/node_modules/duplexify/node_modules/readable-stream/writable-browser.js new file mode 100644 index 0000000000000..ebdde6a85dcb1 --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/writable-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_writable.js'); diff --git a/node_modules/duplexify/node_modules/readable-stream/writable.js b/node_modules/duplexify/node_modules/readable-stream/writable.js new file mode 100644 index 0000000000000..3211a6f80d1ab --- /dev/null +++ b/node_modules/duplexify/node_modules/readable-stream/writable.js @@ -0,0 +1,8 @@ +var Stream = require("stream") +var Writable = require("./lib/_stream_writable.js") + +if (process.env.READABLE_STREAM === 'disable') { + module.exports = Stream && Stream.Writable || Writable +} else { + module.exports = Writable +} diff --git a/node_modules/duplexify/node_modules/string_decoder/.travis.yml b/node_modules/duplexify/node_modules/string_decoder/.travis.yml new file mode 100644 index 0000000000000..3347a72546505 --- /dev/null +++ b/node_modules/duplexify/node_modules/string_decoder/.travis.yml @@ -0,0 +1,50 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test diff --git a/node_modules/duplexify/node_modules/string_decoder/LICENSE b/node_modules/duplexify/node_modules/string_decoder/LICENSE new file mode 100644 index 0000000000000..778edb20730ef --- /dev/null +++ b/node_modules/duplexify/node_modules/string_decoder/LICENSE @@ -0,0 +1,48 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/duplexify/node_modules/string_decoder/README.md b/node_modules/duplexify/node_modules/string_decoder/README.md new file mode 100644 index 0000000000000..5fd58315ed588 --- /dev/null +++ b/node_modules/duplexify/node_modules/string_decoder/README.md @@ -0,0 +1,47 @@ +# string_decoder + +***Node-core v8.9.4 string_decoder for userland*** + + +[![NPM](https://nodei.co/npm/string_decoder.png?downloads=true&downloadRank=true)](https://nodei.co/npm/string_decoder/) +[![NPM](https://nodei.co/npm-dl/string_decoder.png?&months=6&height=3)](https://nodei.co/npm/string_decoder/) + + +```bash +npm install --save string_decoder +``` + +***Node-core string_decoder for userland*** + +This package is a mirror of the string_decoder implementation in Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.9.4/docs/api/). + +As of version 1.0.0 **string_decoder** uses semantic versioning. + +## Previous versions + +Previous version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. + +## Update + +The *build/* directory contains a build script that will scrape the source from the [nodejs/node](https://github.com/nodejs/node) repo given a specific Node version. + +## Streams Working Group + +`string_decoder` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + +See [readable-stream](https://github.com/nodejs/readable-stream) for +more details. diff --git a/node_modules/duplexify/node_modules/string_decoder/lib/string_decoder.js b/node_modules/duplexify/node_modules/string_decoder/lib/string_decoder.js new file mode 100644 index 0000000000000..2e89e63f7933e --- /dev/null +++ b/node_modules/duplexify/node_modules/string_decoder/lib/string_decoder.js @@ -0,0 +1,296 @@ +// 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. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} \ No newline at end of file diff --git a/node_modules/duplexify/node_modules/string_decoder/package.json b/node_modules/duplexify/node_modules/string_decoder/package.json new file mode 100644 index 0000000000000..cccb055a2fa29 --- /dev/null +++ b/node_modules/duplexify/node_modules/string_decoder/package.json @@ -0,0 +1,59 @@ +{ + "_from": "string_decoder@~1.1.1", + "_id": "string_decoder@1.1.1", + "_inBundle": false, + "_integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "_location": "/duplexify/string_decoder", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "string_decoder@~1.1.1", + "name": "string_decoder", + "escapedName": "string_decoder", + "rawSpec": "~1.1.1", + "saveSpec": null, + "fetchSpec": "~1.1.1" + }, + "_requiredBy": [ + "/duplexify/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "_shasum": "9cf1611ba62685d7030ae9e4ba34149c3af03fc8", + "_spec": "string_decoder@~1.1.1", + "_where": "/Users/aeschright/code/cli/node_modules/duplexify/node_modules/readable-stream", + "bugs": { + "url": "https://github.com/nodejs/string_decoder/issues" + }, + "bundleDependencies": false, + "dependencies": { + "safe-buffer": "~5.1.0" + }, + "deprecated": false, + "description": "The string_decoder module from Node core", + "devDependencies": { + "babel-polyfill": "^6.23.0", + "core-util-is": "^1.0.2", + "inherits": "^2.0.3", + "tap": "~0.4.8" + }, + "homepage": "https://github.com/nodejs/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT", + "main": "lib/string_decoder.js", + "name": "string_decoder", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/string_decoder.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "test": "tap test/parallel/*.js && node test/verify-dependencies" + }, + "version": "1.1.1" +} diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/.travis.yml b/node_modules/flush-write-stream/node_modules/readable-stream/.travis.yml new file mode 100644 index 0000000000000..40992555bf5cc --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/.travis.yml @@ -0,0 +1,55 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test +script: "npm run $TASK" +env: + global: + - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc= + - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI= diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/flush-write-stream/node_modules/readable-stream/CONTRIBUTING.md new file mode 100644 index 0000000000000..f478d58dca85b --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/CONTRIBUTING.md @@ -0,0 +1,38 @@ +# Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +* (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +* (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +* (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +* (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +## Moderation Policy + +The [Node.js Moderation Policy] applies to this WG. + +## Code of Conduct + +The [Node.js Code of Conduct][] applies to this WG. + +[Node.js Code of Conduct]: +https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md +[Node.js Moderation Policy]: +https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/GOVERNANCE.md b/node_modules/flush-write-stream/node_modules/readable-stream/GOVERNANCE.md new file mode 100644 index 0000000000000..16ffb93f24bec --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/GOVERNANCE.md @@ -0,0 +1,136 @@ +### Streams Working Group + +The Node.js Streams is jointly governed by a Working Group +(WG) +that is responsible for high-level guidance of the project. + +The WG has final authority over this project including: + +* Technical direction +* Project governance and process (including this policy) +* Contribution policy +* GitHub repository hosting +* Conduct guidelines +* Maintaining the list of additional Collaborators + +For the current list of WG members, see the project +[README.md](./README.md#current-project-team-members). + +### Collaborators + +The readable-stream GitHub repository is +maintained by the WG and additional Collaborators who are added by the +WG on an ongoing basis. + +Individuals making significant and valuable contributions are made +Collaborators and given commit-access to the project. These +individuals are identified by the WG and their addition as +Collaborators is discussed during the WG meeting. + +_Note:_ If you make a significant contribution and are not considered +for commit-access log an issue or contact a WG member directly and it +will be brought up in the next WG meeting. + +Modifications of the contents of the readable-stream repository are +made on +a collaborative basis. Anybody with a GitHub account may propose a +modification via pull request and it will be considered by the project +Collaborators. All pull requests must be reviewed and accepted by a +Collaborator with sufficient expertise who is able to take full +responsibility for the change. In the case of pull requests proposed +by an existing Collaborator, an additional Collaborator is required +for sign-off. Consensus should be sought if additional Collaborators +participate and there is disagreement around a particular +modification. See _Consensus Seeking Process_ below for further detail +on the consensus model used for governance. + +Collaborators may opt to elevate significant or controversial +modifications, or modifications that have not found consensus to the +WG for discussion by assigning the ***WG-agenda*** tag to a pull +request or issue. The WG should serve as the final arbiter where +required. + +For the current list of Collaborators, see the project +[README.md](./README.md#members). + +### WG Membership + +WG seats are not time-limited. There is no fixed size of the WG. +However, the expected target is between 6 and 12, to ensure adequate +coverage of important areas of expertise, balanced with the ability to +make decisions efficiently. + +There is no specific set of requirements or qualifications for WG +membership beyond these rules. + +The WG may add additional members to the WG by unanimous consensus. + +A WG member may be removed from the WG by voluntary resignation, or by +unanimous consensus of all other WG members. + +Changes to WG membership should be posted in the agenda, and may be +suggested as any other agenda item (see "WG Meetings" below). + +If an addition or removal is proposed during a meeting, and the full +WG is not in attendance to participate, then the addition or removal +is added to the agenda for the subsequent meeting. This is to ensure +that all members are given the opportunity to participate in all +membership decisions. If a WG member is unable to attend a meeting +where a planned membership decision is being made, then their consent +is assumed. + +No more than 1/3 of the WG members may be affiliated with the same +employer. If removal or resignation of a WG member, or a change of +employment by a WG member, creates a situation where more than 1/3 of +the WG membership shares an employer, then the situation must be +immediately remedied by the resignation or removal of one or more WG +members affiliated with the over-represented employer(s). + +### WG Meetings + +The WG meets occasionally on a Google Hangout On Air. A designated moderator +approved by the WG runs the meeting. Each meeting should be +published to YouTube. + +Items are added to the WG agenda that are considered contentious or +are modifications of governance, contribution policy, WG membership, +or release process. + +The intention of the agenda is not to approve or review all patches; +that should happen continuously on GitHub and be handled by the larger +group of Collaborators. + +Any community member or contributor can ask that something be added to +the next meeting's agenda by logging a GitHub Issue. Any Collaborator, +WG member or the moderator can add the item to the agenda by adding +the ***WG-agenda*** tag to the issue. + +Prior to each WG meeting the moderator will share the Agenda with +members of the WG. WG members can add any items they like to the +agenda at the beginning of each meeting. The moderator and the WG +cannot veto or remove items. + +The WG may invite persons or representatives from certain projects to +participate in a non-voting capacity. + +The moderator is responsible for summarizing the discussion of each +agenda item and sends it as a pull request after the meeting. + +### Consensus Seeking Process + +The WG follows a +[Consensus +Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) +decision-making model. + +When an agenda item has appeared to reach a consensus the moderator +will ask "Does anyone object?" as a final call for dissent from the +consensus. + +If an agenda item cannot reach a consensus a WG member can call for +either a closing vote or a vote to table the issue to the next +meeting. The call for a vote must be seconded by a majority of the WG +or else the discussion will continue. Simple majority wins. + +Note that changes to WG membership require a majority consensus. See +"WG Membership" above. diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/LICENSE b/node_modules/flush-write-stream/node_modules/readable-stream/LICENSE new file mode 100644 index 0000000000000..2873b3b2e5950 --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/LICENSE @@ -0,0 +1,47 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/flush-write-stream/node_modules/readable-stream/README.md b/node_modules/flush-write-stream/node_modules/readable-stream/README.md new file mode 100644 index 0000000000000..23fe3f3e3009a --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/README.md @@ -0,0 +1,58 @@ +# readable-stream + +***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) + + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) + +```bash +npm install --save readable-stream +``` + +***Node-core streams for userland*** + +This package is a mirror of the Streams2 and Streams3 implementations in +Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html). + +If you want to guarantee a stable streams base, regardless of what version of +Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). + +As of version 2.0.0 **readable-stream** uses semantic versioning. + +# Streams Working Group + +`readable-stream` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + + +## Team Members + +* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> + - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B +* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> + - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 +* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> + - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D +* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> +* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> +* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> +* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) <matteo.collina@gmail.com> + - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E +* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) <shestak.irina@gmail.com> diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/node_modules/flush-write-stream/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md new file mode 100644 index 0000000000000..83275f192e407 --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md @@ -0,0 +1,60 @@ +# streams WG Meeting 2015-01-30 + +## Links + +* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg +* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106 +* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/ + +## Agenda + +Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting. + +* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105) +* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101) +* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102) +* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99) + +## Minutes + +### adopt a charter + +* group: +1's all around + +### What versioning scheme should be adopted? +* group: +1’s 3.0.0 +* domenic+group: pulling in patches from other sources where appropriate +* mikeal: version independently, suggesting versions for io.js +* mikeal+domenic: work with TC to notify in advance of changes +simpler stream creation + +### streamline creation of streams +* sam: streamline creation of streams +* domenic: nice simple solution posted + but, we lose the opportunity to change the model + may not be backwards incompatible (double check keys) + + **action item:** domenic will check + +### remove implicit flowing of streams on(‘data’) +* add isFlowing / isPaused +* mikeal: worrying that we’re documenting polyfill methods – confuses users +* domenic: more reflective API is probably good, with warning labels for users +* new section for mad scientists (reflective stream access) +* calvin: name the “third state” +* mikeal: maybe borrow the name from whatwg? +* domenic: we’re missing the “third state” +* consensus: kind of difficult to name the third state +* mikeal: figure out differences in states / compat +* mathias: always flow on data – eliminates third state + * explore what it breaks + +**action items:** +* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream) +* ask rod/build for infrastructure +* **chris**: explore the “flow on data” approach +* add isPaused/isFlowing +* add new docs section +* move isPaused to that section + + diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/duplex-browser.js b/node_modules/flush-write-stream/node_modules/readable-stream/duplex-browser.js new file mode 100644 index 0000000000000..f8b2db83dbe73 --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/duplex-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_duplex.js'); diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/duplex.js b/node_modules/flush-write-stream/node_modules/readable-stream/duplex.js new file mode 100644 index 0000000000000..46924cbfdf538 --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require('./readable').Duplex diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 0000000000000..a1ca813e5acbd --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,131 @@ +// 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. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; \ No newline at end of file diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 0000000000000..a9c835884828d --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,47 @@ +// 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. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; \ No newline at end of file diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 0000000000000..bf34ac65e1108 --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,1019 @@ +// 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. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); +var destroyImpl = require('./internal/streams/destroy'); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, unpipeInfo); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} \ No newline at end of file diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 0000000000000..5d1f8b876d98c --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,214 @@ +// 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. + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} \ No newline at end of file diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 0000000000000..b3f4e85a2f6e3 --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,687 @@ +// 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. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = require('./internal/streams/destroy'); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // has it been destroyed + this.destroyed = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; \ No newline at end of file diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/lib/internal/streams/BufferList.js b/node_modules/flush-write-stream/node_modules/readable-stream/lib/internal/streams/BufferList.js new file mode 100644 index 0000000000000..aefc68bd90b9c --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/lib/internal/streams/BufferList.js @@ -0,0 +1,79 @@ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Buffer = require('safe-buffer').Buffer; +var util = require('util'); + +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} + +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; +}(); + +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} \ No newline at end of file diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/lib/internal/streams/destroy.js b/node_modules/flush-write-stream/node_modules/readable-stream/lib/internal/streams/destroy.js new file mode 100644 index 0000000000000..5a0a0d88cec6f --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/lib/internal/streams/destroy.js @@ -0,0 +1,74 @@ +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; \ No newline at end of file diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/node_modules/flush-write-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js new file mode 100644 index 0000000000000..9332a3fdae706 --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js @@ -0,0 +1 @@ +module.exports = require('events').EventEmitter; diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/lib/internal/streams/stream.js b/node_modules/flush-write-stream/node_modules/readable-stream/lib/internal/streams/stream.js new file mode 100644 index 0000000000000..ce2ad5b6ee57f --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/lib/internal/streams/stream.js @@ -0,0 +1 @@ +module.exports = require('stream'); diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/package.json b/node_modules/flush-write-stream/node_modules/readable-stream/package.json new file mode 100644 index 0000000000000..d6f84bde6b982 --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/package.json @@ -0,0 +1,81 @@ +{ + "_from": "readable-stream@^2.0.4", + "_id": "readable-stream@2.3.6", + "_inBundle": false, + "_integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "_location": "/flush-write-stream/readable-stream", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "readable-stream@^2.0.4", + "name": "readable-stream", + "escapedName": "readable-stream", + "rawSpec": "^2.0.4", + "saveSpec": null, + "fetchSpec": "^2.0.4" + }, + "_requiredBy": [ + "/flush-write-stream" + ], + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "_shasum": "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf", + "_spec": "readable-stream@^2.0.4", + "_where": "/Users/aeschright/code/cli/node_modules/flush-write-stream", + "browser": { + "util": false, + "./readable.js": "./readable-browser.js", + "./writable.js": "./writable-browser.js", + "./duplex.js": "./duplex-browser.js", + "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js" + }, + "bugs": { + "url": "https://github.com/nodejs/readable-stream/issues" + }, + "bundleDependencies": false, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "deprecated": false, + "description": "Streams3, a user-land copy of the stream library from Node.js", + "devDependencies": { + "assert": "^1.4.0", + "babel-polyfill": "^6.9.1", + "buffer": "^4.9.0", + "lolex": "^2.3.2", + "nyc": "^6.4.0", + "tap": "^0.7.0", + "tape": "^4.8.0" + }, + "homepage": "https://github.com/nodejs/readable-stream#readme", + "keywords": [ + "readable", + "stream", + "pipe" + ], + "license": "MIT", + "main": "readable.js", + "name": "readable-stream", + "nyc": { + "include": [ + "lib/**.js" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/nodejs/readable-stream.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "cover": "nyc npm test", + "report": "nyc report --reporter=lcov", + "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js" + }, + "version": "2.3.6" +} diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/passthrough.js b/node_modules/flush-write-stream/node_modules/readable-stream/passthrough.js new file mode 100644 index 0000000000000..ffd791d7ff275 --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require('./readable').PassThrough diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/readable-browser.js b/node_modules/flush-write-stream/node_modules/readable-stream/readable-browser.js new file mode 100644 index 0000000000000..e50372592ee6c --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/readable-browser.js @@ -0,0 +1,7 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/readable.js b/node_modules/flush-write-stream/node_modules/readable-stream/readable.js new file mode 100644 index 0000000000000..ec89ec5330649 --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/readable.js @@ -0,0 +1,19 @@ +var Stream = require('stream'); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; + exports = module.exports = Stream.Readable; + exports.Readable = Stream.Readable; + exports.Writable = Stream.Writable; + exports.Duplex = Stream.Duplex; + exports.Transform = Stream.Transform; + exports.PassThrough = Stream.PassThrough; + exports.Stream = Stream; +} else { + exports = module.exports = require('./lib/_stream_readable.js'); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = require('./lib/_stream_writable.js'); + exports.Duplex = require('./lib/_stream_duplex.js'); + exports.Transform = require('./lib/_stream_transform.js'); + exports.PassThrough = require('./lib/_stream_passthrough.js'); +} diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/transform.js b/node_modules/flush-write-stream/node_modules/readable-stream/transform.js new file mode 100644 index 0000000000000..b1baba26da03d --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require('./readable').Transform diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/writable-browser.js b/node_modules/flush-write-stream/node_modules/readable-stream/writable-browser.js new file mode 100644 index 0000000000000..ebdde6a85dcb1 --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/writable-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_writable.js'); diff --git a/node_modules/flush-write-stream/node_modules/readable-stream/writable.js b/node_modules/flush-write-stream/node_modules/readable-stream/writable.js new file mode 100644 index 0000000000000..3211a6f80d1ab --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/readable-stream/writable.js @@ -0,0 +1,8 @@ +var Stream = require("stream") +var Writable = require("./lib/_stream_writable.js") + +if (process.env.READABLE_STREAM === 'disable') { + module.exports = Stream && Stream.Writable || Writable +} else { + module.exports = Writable +} diff --git a/node_modules/flush-write-stream/node_modules/string_decoder/.travis.yml b/node_modules/flush-write-stream/node_modules/string_decoder/.travis.yml new file mode 100644 index 0000000000000..3347a72546505 --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/string_decoder/.travis.yml @@ -0,0 +1,50 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test diff --git a/node_modules/flush-write-stream/node_modules/string_decoder/LICENSE b/node_modules/flush-write-stream/node_modules/string_decoder/LICENSE new file mode 100644 index 0000000000000..778edb20730ef --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/string_decoder/LICENSE @@ -0,0 +1,48 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/flush-write-stream/node_modules/string_decoder/README.md b/node_modules/flush-write-stream/node_modules/string_decoder/README.md new file mode 100644 index 0000000000000..5fd58315ed588 --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/string_decoder/README.md @@ -0,0 +1,47 @@ +# string_decoder + +***Node-core v8.9.4 string_decoder for userland*** + + +[![NPM](https://nodei.co/npm/string_decoder.png?downloads=true&downloadRank=true)](https://nodei.co/npm/string_decoder/) +[![NPM](https://nodei.co/npm-dl/string_decoder.png?&months=6&height=3)](https://nodei.co/npm/string_decoder/) + + +```bash +npm install --save string_decoder +``` + +***Node-core string_decoder for userland*** + +This package is a mirror of the string_decoder implementation in Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.9.4/docs/api/). + +As of version 1.0.0 **string_decoder** uses semantic versioning. + +## Previous versions + +Previous version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. + +## Update + +The *build/* directory contains a build script that will scrape the source from the [nodejs/node](https://github.com/nodejs/node) repo given a specific Node version. + +## Streams Working Group + +`string_decoder` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + +See [readable-stream](https://github.com/nodejs/readable-stream) for +more details. diff --git a/node_modules/flush-write-stream/node_modules/string_decoder/lib/string_decoder.js b/node_modules/flush-write-stream/node_modules/string_decoder/lib/string_decoder.js new file mode 100644 index 0000000000000..2e89e63f7933e --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/string_decoder/lib/string_decoder.js @@ -0,0 +1,296 @@ +// 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. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} \ No newline at end of file diff --git a/node_modules/flush-write-stream/node_modules/string_decoder/package.json b/node_modules/flush-write-stream/node_modules/string_decoder/package.json new file mode 100644 index 0000000000000..56012b0108109 --- /dev/null +++ b/node_modules/flush-write-stream/node_modules/string_decoder/package.json @@ -0,0 +1,59 @@ +{ + "_from": "string_decoder@~1.1.1", + "_id": "string_decoder@1.1.1", + "_inBundle": false, + "_integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "_location": "/flush-write-stream/string_decoder", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "string_decoder@~1.1.1", + "name": "string_decoder", + "escapedName": "string_decoder", + "rawSpec": "~1.1.1", + "saveSpec": null, + "fetchSpec": "~1.1.1" + }, + "_requiredBy": [ + "/flush-write-stream/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "_shasum": "9cf1611ba62685d7030ae9e4ba34149c3af03fc8", + "_spec": "string_decoder@~1.1.1", + "_where": "/Users/aeschright/code/cli/node_modules/flush-write-stream/node_modules/readable-stream", + "bugs": { + "url": "https://github.com/nodejs/string_decoder/issues" + }, + "bundleDependencies": false, + "dependencies": { + "safe-buffer": "~5.1.0" + }, + "deprecated": false, + "description": "The string_decoder module from Node core", + "devDependencies": { + "babel-polyfill": "^6.23.0", + "core-util-is": "^1.0.2", + "inherits": "^2.0.3", + "tap": "~0.4.8" + }, + "homepage": "https://github.com/nodejs/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT", + "main": "lib/string_decoder.js", + "name": "string_decoder", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/string_decoder.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "test": "tap test/parallel/*.js && node test/verify-dependencies" + }, + "version": "1.1.1" +} diff --git a/node_modules/from2/node_modules/readable-stream/.travis.yml b/node_modules/from2/node_modules/readable-stream/.travis.yml new file mode 100644 index 0000000000000..40992555bf5cc --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/.travis.yml @@ -0,0 +1,55 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test +script: "npm run $TASK" +env: + global: + - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc= + - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI= diff --git a/node_modules/from2/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/from2/node_modules/readable-stream/CONTRIBUTING.md new file mode 100644 index 0000000000000..f478d58dca85b --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/CONTRIBUTING.md @@ -0,0 +1,38 @@ +# Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +* (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +* (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +* (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +* (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +## Moderation Policy + +The [Node.js Moderation Policy] applies to this WG. + +## Code of Conduct + +The [Node.js Code of Conduct][] applies to this WG. + +[Node.js Code of Conduct]: +https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md +[Node.js Moderation Policy]: +https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md diff --git a/node_modules/from2/node_modules/readable-stream/GOVERNANCE.md b/node_modules/from2/node_modules/readable-stream/GOVERNANCE.md new file mode 100644 index 0000000000000..16ffb93f24bec --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/GOVERNANCE.md @@ -0,0 +1,136 @@ +### Streams Working Group + +The Node.js Streams is jointly governed by a Working Group +(WG) +that is responsible for high-level guidance of the project. + +The WG has final authority over this project including: + +* Technical direction +* Project governance and process (including this policy) +* Contribution policy +* GitHub repository hosting +* Conduct guidelines +* Maintaining the list of additional Collaborators + +For the current list of WG members, see the project +[README.md](./README.md#current-project-team-members). + +### Collaborators + +The readable-stream GitHub repository is +maintained by the WG and additional Collaborators who are added by the +WG on an ongoing basis. + +Individuals making significant and valuable contributions are made +Collaborators and given commit-access to the project. These +individuals are identified by the WG and their addition as +Collaborators is discussed during the WG meeting. + +_Note:_ If you make a significant contribution and are not considered +for commit-access log an issue or contact a WG member directly and it +will be brought up in the next WG meeting. + +Modifications of the contents of the readable-stream repository are +made on +a collaborative basis. Anybody with a GitHub account may propose a +modification via pull request and it will be considered by the project +Collaborators. All pull requests must be reviewed and accepted by a +Collaborator with sufficient expertise who is able to take full +responsibility for the change. In the case of pull requests proposed +by an existing Collaborator, an additional Collaborator is required +for sign-off. Consensus should be sought if additional Collaborators +participate and there is disagreement around a particular +modification. See _Consensus Seeking Process_ below for further detail +on the consensus model used for governance. + +Collaborators may opt to elevate significant or controversial +modifications, or modifications that have not found consensus to the +WG for discussion by assigning the ***WG-agenda*** tag to a pull +request or issue. The WG should serve as the final arbiter where +required. + +For the current list of Collaborators, see the project +[README.md](./README.md#members). + +### WG Membership + +WG seats are not time-limited. There is no fixed size of the WG. +However, the expected target is between 6 and 12, to ensure adequate +coverage of important areas of expertise, balanced with the ability to +make decisions efficiently. + +There is no specific set of requirements or qualifications for WG +membership beyond these rules. + +The WG may add additional members to the WG by unanimous consensus. + +A WG member may be removed from the WG by voluntary resignation, or by +unanimous consensus of all other WG members. + +Changes to WG membership should be posted in the agenda, and may be +suggested as any other agenda item (see "WG Meetings" below). + +If an addition or removal is proposed during a meeting, and the full +WG is not in attendance to participate, then the addition or removal +is added to the agenda for the subsequent meeting. This is to ensure +that all members are given the opportunity to participate in all +membership decisions. If a WG member is unable to attend a meeting +where a planned membership decision is being made, then their consent +is assumed. + +No more than 1/3 of the WG members may be affiliated with the same +employer. If removal or resignation of a WG member, or a change of +employment by a WG member, creates a situation where more than 1/3 of +the WG membership shares an employer, then the situation must be +immediately remedied by the resignation or removal of one or more WG +members affiliated with the over-represented employer(s). + +### WG Meetings + +The WG meets occasionally on a Google Hangout On Air. A designated moderator +approved by the WG runs the meeting. Each meeting should be +published to YouTube. + +Items are added to the WG agenda that are considered contentious or +are modifications of governance, contribution policy, WG membership, +or release process. + +The intention of the agenda is not to approve or review all patches; +that should happen continuously on GitHub and be handled by the larger +group of Collaborators. + +Any community member or contributor can ask that something be added to +the next meeting's agenda by logging a GitHub Issue. Any Collaborator, +WG member or the moderator can add the item to the agenda by adding +the ***WG-agenda*** tag to the issue. + +Prior to each WG meeting the moderator will share the Agenda with +members of the WG. WG members can add any items they like to the +agenda at the beginning of each meeting. The moderator and the WG +cannot veto or remove items. + +The WG may invite persons or representatives from certain projects to +participate in a non-voting capacity. + +The moderator is responsible for summarizing the discussion of each +agenda item and sends it as a pull request after the meeting. + +### Consensus Seeking Process + +The WG follows a +[Consensus +Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) +decision-making model. + +When an agenda item has appeared to reach a consensus the moderator +will ask "Does anyone object?" as a final call for dissent from the +consensus. + +If an agenda item cannot reach a consensus a WG member can call for +either a closing vote or a vote to table the issue to the next +meeting. The call for a vote must be seconded by a majority of the WG +or else the discussion will continue. Simple majority wins. + +Note that changes to WG membership require a majority consensus. See +"WG Membership" above. diff --git a/node_modules/from2/node_modules/readable-stream/LICENSE b/node_modules/from2/node_modules/readable-stream/LICENSE new file mode 100644 index 0000000000000..2873b3b2e5950 --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/LICENSE @@ -0,0 +1,47 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/from2/node_modules/readable-stream/README.md b/node_modules/from2/node_modules/readable-stream/README.md new file mode 100644 index 0000000000000..23fe3f3e3009a --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/README.md @@ -0,0 +1,58 @@ +# readable-stream + +***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) + + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) + +```bash +npm install --save readable-stream +``` + +***Node-core streams for userland*** + +This package is a mirror of the Streams2 and Streams3 implementations in +Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html). + +If you want to guarantee a stable streams base, regardless of what version of +Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). + +As of version 2.0.0 **readable-stream** uses semantic versioning. + +# Streams Working Group + +`readable-stream` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + + +## Team Members + +* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> + - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B +* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> + - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 +* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> + - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D +* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> +* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> +* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> +* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) <matteo.collina@gmail.com> + - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E +* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) <shestak.irina@gmail.com> diff --git a/node_modules/from2/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/node_modules/from2/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md new file mode 100644 index 0000000000000..83275f192e407 --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md @@ -0,0 +1,60 @@ +# streams WG Meeting 2015-01-30 + +## Links + +* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg +* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106 +* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/ + +## Agenda + +Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting. + +* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105) +* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101) +* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102) +* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99) + +## Minutes + +### adopt a charter + +* group: +1's all around + +### What versioning scheme should be adopted? +* group: +1’s 3.0.0 +* domenic+group: pulling in patches from other sources where appropriate +* mikeal: version independently, suggesting versions for io.js +* mikeal+domenic: work with TC to notify in advance of changes +simpler stream creation + +### streamline creation of streams +* sam: streamline creation of streams +* domenic: nice simple solution posted + but, we lose the opportunity to change the model + may not be backwards incompatible (double check keys) + + **action item:** domenic will check + +### remove implicit flowing of streams on(‘data’) +* add isFlowing / isPaused +* mikeal: worrying that we’re documenting polyfill methods – confuses users +* domenic: more reflective API is probably good, with warning labels for users +* new section for mad scientists (reflective stream access) +* calvin: name the “third state” +* mikeal: maybe borrow the name from whatwg? +* domenic: we’re missing the “third state” +* consensus: kind of difficult to name the third state +* mikeal: figure out differences in states / compat +* mathias: always flow on data – eliminates third state + * explore what it breaks + +**action items:** +* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream) +* ask rod/build for infrastructure +* **chris**: explore the “flow on data” approach +* add isPaused/isFlowing +* add new docs section +* move isPaused to that section + + diff --git a/node_modules/from2/node_modules/readable-stream/duplex-browser.js b/node_modules/from2/node_modules/readable-stream/duplex-browser.js new file mode 100644 index 0000000000000..f8b2db83dbe73 --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/duplex-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_duplex.js'); diff --git a/node_modules/from2/node_modules/readable-stream/duplex.js b/node_modules/from2/node_modules/readable-stream/duplex.js new file mode 100644 index 0000000000000..46924cbfdf538 --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require('./readable').Duplex diff --git a/node_modules/from2/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/from2/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 0000000000000..a1ca813e5acbd --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,131 @@ +// 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. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; \ No newline at end of file diff --git a/node_modules/from2/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/from2/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 0000000000000..a9c835884828d --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,47 @@ +// 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. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; \ No newline at end of file diff --git a/node_modules/from2/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/from2/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 0000000000000..bf34ac65e1108 --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,1019 @@ +// 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. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); +var destroyImpl = require('./internal/streams/destroy'); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, unpipeInfo); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} \ No newline at end of file diff --git a/node_modules/from2/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/from2/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 0000000000000..5d1f8b876d98c --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,214 @@ +// 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. + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} \ No newline at end of file diff --git a/node_modules/from2/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/from2/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 0000000000000..b3f4e85a2f6e3 --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,687 @@ +// 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. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = require('./internal/streams/destroy'); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // has it been destroyed + this.destroyed = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; \ No newline at end of file diff --git a/node_modules/from2/node_modules/readable-stream/lib/internal/streams/BufferList.js b/node_modules/from2/node_modules/readable-stream/lib/internal/streams/BufferList.js new file mode 100644 index 0000000000000..aefc68bd90b9c --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/lib/internal/streams/BufferList.js @@ -0,0 +1,79 @@ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Buffer = require('safe-buffer').Buffer; +var util = require('util'); + +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} + +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; +}(); + +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} \ No newline at end of file diff --git a/node_modules/from2/node_modules/readable-stream/lib/internal/streams/destroy.js b/node_modules/from2/node_modules/readable-stream/lib/internal/streams/destroy.js new file mode 100644 index 0000000000000..5a0a0d88cec6f --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/lib/internal/streams/destroy.js @@ -0,0 +1,74 @@ +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; \ No newline at end of file diff --git a/node_modules/from2/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/node_modules/from2/node_modules/readable-stream/lib/internal/streams/stream-browser.js new file mode 100644 index 0000000000000..9332a3fdae706 --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/lib/internal/streams/stream-browser.js @@ -0,0 +1 @@ +module.exports = require('events').EventEmitter; diff --git a/node_modules/from2/node_modules/readable-stream/lib/internal/streams/stream.js b/node_modules/from2/node_modules/readable-stream/lib/internal/streams/stream.js new file mode 100644 index 0000000000000..ce2ad5b6ee57f --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/lib/internal/streams/stream.js @@ -0,0 +1 @@ +module.exports = require('stream'); diff --git a/node_modules/from2/node_modules/readable-stream/package.json b/node_modules/from2/node_modules/readable-stream/package.json new file mode 100644 index 0000000000000..699ff7e674306 --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/package.json @@ -0,0 +1,81 @@ +{ + "_from": "readable-stream@^2.0.0", + "_id": "readable-stream@2.3.6", + "_inBundle": false, + "_integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "_location": "/from2/readable-stream", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "readable-stream@^2.0.0", + "name": "readable-stream", + "escapedName": "readable-stream", + "rawSpec": "^2.0.0", + "saveSpec": null, + "fetchSpec": "^2.0.0" + }, + "_requiredBy": [ + "/from2" + ], + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "_shasum": "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf", + "_spec": "readable-stream@^2.0.0", + "_where": "/Users/aeschright/code/cli/node_modules/from2", + "browser": { + "util": false, + "./readable.js": "./readable-browser.js", + "./writable.js": "./writable-browser.js", + "./duplex.js": "./duplex-browser.js", + "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js" + }, + "bugs": { + "url": "https://github.com/nodejs/readable-stream/issues" + }, + "bundleDependencies": false, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "deprecated": false, + "description": "Streams3, a user-land copy of the stream library from Node.js", + "devDependencies": { + "assert": "^1.4.0", + "babel-polyfill": "^6.9.1", + "buffer": "^4.9.0", + "lolex": "^2.3.2", + "nyc": "^6.4.0", + "tap": "^0.7.0", + "tape": "^4.8.0" + }, + "homepage": "https://github.com/nodejs/readable-stream#readme", + "keywords": [ + "readable", + "stream", + "pipe" + ], + "license": "MIT", + "main": "readable.js", + "name": "readable-stream", + "nyc": { + "include": [ + "lib/**.js" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/nodejs/readable-stream.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "cover": "nyc npm test", + "report": "nyc report --reporter=lcov", + "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js" + }, + "version": "2.3.6" +} diff --git a/node_modules/from2/node_modules/readable-stream/passthrough.js b/node_modules/from2/node_modules/readable-stream/passthrough.js new file mode 100644 index 0000000000000..ffd791d7ff275 --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require('./readable').PassThrough diff --git a/node_modules/from2/node_modules/readable-stream/readable-browser.js b/node_modules/from2/node_modules/readable-stream/readable-browser.js new file mode 100644 index 0000000000000..e50372592ee6c --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/readable-browser.js @@ -0,0 +1,7 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); diff --git a/node_modules/from2/node_modules/readable-stream/readable.js b/node_modules/from2/node_modules/readable-stream/readable.js new file mode 100644 index 0000000000000..ec89ec5330649 --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/readable.js @@ -0,0 +1,19 @@ +var Stream = require('stream'); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; + exports = module.exports = Stream.Readable; + exports.Readable = Stream.Readable; + exports.Writable = Stream.Writable; + exports.Duplex = Stream.Duplex; + exports.Transform = Stream.Transform; + exports.PassThrough = Stream.PassThrough; + exports.Stream = Stream; +} else { + exports = module.exports = require('./lib/_stream_readable.js'); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = require('./lib/_stream_writable.js'); + exports.Duplex = require('./lib/_stream_duplex.js'); + exports.Transform = require('./lib/_stream_transform.js'); + exports.PassThrough = require('./lib/_stream_passthrough.js'); +} diff --git a/node_modules/from2/node_modules/readable-stream/transform.js b/node_modules/from2/node_modules/readable-stream/transform.js new file mode 100644 index 0000000000000..b1baba26da03d --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require('./readable').Transform diff --git a/node_modules/from2/node_modules/readable-stream/writable-browser.js b/node_modules/from2/node_modules/readable-stream/writable-browser.js new file mode 100644 index 0000000000000..ebdde6a85dcb1 --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/writable-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_writable.js'); diff --git a/node_modules/from2/node_modules/readable-stream/writable.js b/node_modules/from2/node_modules/readable-stream/writable.js new file mode 100644 index 0000000000000..3211a6f80d1ab --- /dev/null +++ b/node_modules/from2/node_modules/readable-stream/writable.js @@ -0,0 +1,8 @@ +var Stream = require("stream") +var Writable = require("./lib/_stream_writable.js") + +if (process.env.READABLE_STREAM === 'disable') { + module.exports = Stream && Stream.Writable || Writable +} else { + module.exports = Writable +} diff --git a/node_modules/from2/node_modules/string_decoder/.travis.yml b/node_modules/from2/node_modules/string_decoder/.travis.yml new file mode 100644 index 0000000000000..3347a72546505 --- /dev/null +++ b/node_modules/from2/node_modules/string_decoder/.travis.yml @@ -0,0 +1,50 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test diff --git a/node_modules/from2/node_modules/string_decoder/LICENSE b/node_modules/from2/node_modules/string_decoder/LICENSE new file mode 100644 index 0000000000000..778edb20730ef --- /dev/null +++ b/node_modules/from2/node_modules/string_decoder/LICENSE @@ -0,0 +1,48 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/from2/node_modules/string_decoder/README.md b/node_modules/from2/node_modules/string_decoder/README.md new file mode 100644 index 0000000000000..5fd58315ed588 --- /dev/null +++ b/node_modules/from2/node_modules/string_decoder/README.md @@ -0,0 +1,47 @@ +# string_decoder + +***Node-core v8.9.4 string_decoder for userland*** + + +[![NPM](https://nodei.co/npm/string_decoder.png?downloads=true&downloadRank=true)](https://nodei.co/npm/string_decoder/) +[![NPM](https://nodei.co/npm-dl/string_decoder.png?&months=6&height=3)](https://nodei.co/npm/string_decoder/) + + +```bash +npm install --save string_decoder +``` + +***Node-core string_decoder for userland*** + +This package is a mirror of the string_decoder implementation in Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.9.4/docs/api/). + +As of version 1.0.0 **string_decoder** uses semantic versioning. + +## Previous versions + +Previous version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. + +## Update + +The *build/* directory contains a build script that will scrape the source from the [nodejs/node](https://github.com/nodejs/node) repo given a specific Node version. + +## Streams Working Group + +`string_decoder` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + +See [readable-stream](https://github.com/nodejs/readable-stream) for +more details. diff --git a/node_modules/from2/node_modules/string_decoder/lib/string_decoder.js b/node_modules/from2/node_modules/string_decoder/lib/string_decoder.js new file mode 100644 index 0000000000000..2e89e63f7933e --- /dev/null +++ b/node_modules/from2/node_modules/string_decoder/lib/string_decoder.js @@ -0,0 +1,296 @@ +// 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. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} \ No newline at end of file diff --git a/node_modules/from2/node_modules/string_decoder/package.json b/node_modules/from2/node_modules/string_decoder/package.json new file mode 100644 index 0000000000000..feec8efa23be6 --- /dev/null +++ b/node_modules/from2/node_modules/string_decoder/package.json @@ -0,0 +1,59 @@ +{ + "_from": "string_decoder@~1.1.1", + "_id": "string_decoder@1.1.1", + "_inBundle": false, + "_integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "_location": "/from2/string_decoder", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "string_decoder@~1.1.1", + "name": "string_decoder", + "escapedName": "string_decoder", + "rawSpec": "~1.1.1", + "saveSpec": null, + "fetchSpec": "~1.1.1" + }, + "_requiredBy": [ + "/from2/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "_shasum": "9cf1611ba62685d7030ae9e4ba34149c3af03fc8", + "_spec": "string_decoder@~1.1.1", + "_where": "/Users/aeschright/code/cli/node_modules/from2/node_modules/readable-stream", + "bugs": { + "url": "https://github.com/nodejs/string_decoder/issues" + }, + "bundleDependencies": false, + "dependencies": { + "safe-buffer": "~5.1.0" + }, + "deprecated": false, + "description": "The string_decoder module from Node core", + "devDependencies": { + "babel-polyfill": "^6.23.0", + "core-util-is": "^1.0.2", + "inherits": "^2.0.3", + "tap": "~0.4.8" + }, + "homepage": "https://github.com/nodejs/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT", + "main": "lib/string_decoder.js", + "name": "string_decoder", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/string_decoder.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "test": "tap test/parallel/*.js && node test/verify-dependencies" + }, + "version": "1.1.1" +} diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/.travis.yml b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/.travis.yml new file mode 100644 index 0000000000000..40992555bf5cc --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/.travis.yml @@ -0,0 +1,55 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test +script: "npm run $TASK" +env: + global: + - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc= + - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI= diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/CONTRIBUTING.md new file mode 100644 index 0000000000000..f478d58dca85b --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/CONTRIBUTING.md @@ -0,0 +1,38 @@ +# Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +* (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +* (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +* (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +* (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +## Moderation Policy + +The [Node.js Moderation Policy] applies to this WG. + +## Code of Conduct + +The [Node.js Code of Conduct][] applies to this WG. + +[Node.js Code of Conduct]: +https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md +[Node.js Moderation Policy]: +https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/GOVERNANCE.md b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/GOVERNANCE.md new file mode 100644 index 0000000000000..16ffb93f24bec --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/GOVERNANCE.md @@ -0,0 +1,136 @@ +### Streams Working Group + +The Node.js Streams is jointly governed by a Working Group +(WG) +that is responsible for high-level guidance of the project. + +The WG has final authority over this project including: + +* Technical direction +* Project governance and process (including this policy) +* Contribution policy +* GitHub repository hosting +* Conduct guidelines +* Maintaining the list of additional Collaborators + +For the current list of WG members, see the project +[README.md](./README.md#current-project-team-members). + +### Collaborators + +The readable-stream GitHub repository is +maintained by the WG and additional Collaborators who are added by the +WG on an ongoing basis. + +Individuals making significant and valuable contributions are made +Collaborators and given commit-access to the project. These +individuals are identified by the WG and their addition as +Collaborators is discussed during the WG meeting. + +_Note:_ If you make a significant contribution and are not considered +for commit-access log an issue or contact a WG member directly and it +will be brought up in the next WG meeting. + +Modifications of the contents of the readable-stream repository are +made on +a collaborative basis. Anybody with a GitHub account may propose a +modification via pull request and it will be considered by the project +Collaborators. All pull requests must be reviewed and accepted by a +Collaborator with sufficient expertise who is able to take full +responsibility for the change. In the case of pull requests proposed +by an existing Collaborator, an additional Collaborator is required +for sign-off. Consensus should be sought if additional Collaborators +participate and there is disagreement around a particular +modification. See _Consensus Seeking Process_ below for further detail +on the consensus model used for governance. + +Collaborators may opt to elevate significant or controversial +modifications, or modifications that have not found consensus to the +WG for discussion by assigning the ***WG-agenda*** tag to a pull +request or issue. The WG should serve as the final arbiter where +required. + +For the current list of Collaborators, see the project +[README.md](./README.md#members). + +### WG Membership + +WG seats are not time-limited. There is no fixed size of the WG. +However, the expected target is between 6 and 12, to ensure adequate +coverage of important areas of expertise, balanced with the ability to +make decisions efficiently. + +There is no specific set of requirements or qualifications for WG +membership beyond these rules. + +The WG may add additional members to the WG by unanimous consensus. + +A WG member may be removed from the WG by voluntary resignation, or by +unanimous consensus of all other WG members. + +Changes to WG membership should be posted in the agenda, and may be +suggested as any other agenda item (see "WG Meetings" below). + +If an addition or removal is proposed during a meeting, and the full +WG is not in attendance to participate, then the addition or removal +is added to the agenda for the subsequent meeting. This is to ensure +that all members are given the opportunity to participate in all +membership decisions. If a WG member is unable to attend a meeting +where a planned membership decision is being made, then their consent +is assumed. + +No more than 1/3 of the WG members may be affiliated with the same +employer. If removal or resignation of a WG member, or a change of +employment by a WG member, creates a situation where more than 1/3 of +the WG membership shares an employer, then the situation must be +immediately remedied by the resignation or removal of one or more WG +members affiliated with the over-represented employer(s). + +### WG Meetings + +The WG meets occasionally on a Google Hangout On Air. A designated moderator +approved by the WG runs the meeting. Each meeting should be +published to YouTube. + +Items are added to the WG agenda that are considered contentious or +are modifications of governance, contribution policy, WG membership, +or release process. + +The intention of the agenda is not to approve or review all patches; +that should happen continuously on GitHub and be handled by the larger +group of Collaborators. + +Any community member or contributor can ask that something be added to +the next meeting's agenda by logging a GitHub Issue. Any Collaborator, +WG member or the moderator can add the item to the agenda by adding +the ***WG-agenda*** tag to the issue. + +Prior to each WG meeting the moderator will share the Agenda with +members of the WG. WG members can add any items they like to the +agenda at the beginning of each meeting. The moderator and the WG +cannot veto or remove items. + +The WG may invite persons or representatives from certain projects to +participate in a non-voting capacity. + +The moderator is responsible for summarizing the discussion of each +agenda item and sends it as a pull request after the meeting. + +### Consensus Seeking Process + +The WG follows a +[Consensus +Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) +decision-making model. + +When an agenda item has appeared to reach a consensus the moderator +will ask "Does anyone object?" as a final call for dissent from the +consensus. + +If an agenda item cannot reach a consensus a WG member can call for +either a closing vote or a vote to table the issue to the next +meeting. The call for a vote must be seconded by a majority of the WG +or else the discussion will continue. Simple majority wins. + +Note that changes to WG membership require a majority consensus. See +"WG Membership" above. diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/LICENSE b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/LICENSE new file mode 100644 index 0000000000000..2873b3b2e5950 --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/LICENSE @@ -0,0 +1,47 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/fs-write-stream-atomic/node_modules/readable-stream/README.md b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/README.md new file mode 100644 index 0000000000000..23fe3f3e3009a --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/README.md @@ -0,0 +1,58 @@ +# readable-stream + +***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) + + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) + +```bash +npm install --save readable-stream +``` + +***Node-core streams for userland*** + +This package is a mirror of the Streams2 and Streams3 implementations in +Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html). + +If you want to guarantee a stable streams base, regardless of what version of +Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). + +As of version 2.0.0 **readable-stream** uses semantic versioning. + +# Streams Working Group + +`readable-stream` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + + +## Team Members + +* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> + - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B +* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> + - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 +* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> + - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D +* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> +* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> +* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> +* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) <matteo.collina@gmail.com> + - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E +* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) <shestak.irina@gmail.com> diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md new file mode 100644 index 0000000000000..83275f192e407 --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md @@ -0,0 +1,60 @@ +# streams WG Meeting 2015-01-30 + +## Links + +* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg +* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106 +* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/ + +## Agenda + +Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting. + +* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105) +* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101) +* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102) +* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99) + +## Minutes + +### adopt a charter + +* group: +1's all around + +### What versioning scheme should be adopted? +* group: +1’s 3.0.0 +* domenic+group: pulling in patches from other sources where appropriate +* mikeal: version independently, suggesting versions for io.js +* mikeal+domenic: work with TC to notify in advance of changes +simpler stream creation + +### streamline creation of streams +* sam: streamline creation of streams +* domenic: nice simple solution posted + but, we lose the opportunity to change the model + may not be backwards incompatible (double check keys) + + **action item:** domenic will check + +### remove implicit flowing of streams on(‘data’) +* add isFlowing / isPaused +* mikeal: worrying that we’re documenting polyfill methods – confuses users +* domenic: more reflective API is probably good, with warning labels for users +* new section for mad scientists (reflective stream access) +* calvin: name the “third state” +* mikeal: maybe borrow the name from whatwg? +* domenic: we’re missing the “third state” +* consensus: kind of difficult to name the third state +* mikeal: figure out differences in states / compat +* mathias: always flow on data – eliminates third state + * explore what it breaks + +**action items:** +* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream) +* ask rod/build for infrastructure +* **chris**: explore the “flow on data” approach +* add isPaused/isFlowing +* add new docs section +* move isPaused to that section + + diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/duplex-browser.js b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/duplex-browser.js new file mode 100644 index 0000000000000..f8b2db83dbe73 --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/duplex-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_duplex.js'); diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/duplex.js b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/duplex.js new file mode 100644 index 0000000000000..46924cbfdf538 --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require('./readable').Duplex diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 0000000000000..a1ca813e5acbd --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,131 @@ +// 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. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; \ No newline at end of file diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 0000000000000..a9c835884828d --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,47 @@ +// 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. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; \ No newline at end of file diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 0000000000000..bf34ac65e1108 --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,1019 @@ +// 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. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); +var destroyImpl = require('./internal/streams/destroy'); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, unpipeInfo); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} \ No newline at end of file diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 0000000000000..5d1f8b876d98c --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,214 @@ +// 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. + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} \ No newline at end of file diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 0000000000000..b3f4e85a2f6e3 --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,687 @@ +// 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. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = require('./internal/streams/destroy'); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // has it been destroyed + this.destroyed = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; \ No newline at end of file diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/internal/streams/BufferList.js b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/internal/streams/BufferList.js new file mode 100644 index 0000000000000..aefc68bd90b9c --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/internal/streams/BufferList.js @@ -0,0 +1,79 @@ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Buffer = require('safe-buffer').Buffer; +var util = require('util'); + +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} + +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; +}(); + +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} \ No newline at end of file diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/internal/streams/destroy.js b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/internal/streams/destroy.js new file mode 100644 index 0000000000000..5a0a0d88cec6f --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/internal/streams/destroy.js @@ -0,0 +1,74 @@ +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; \ No newline at end of file diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/internal/streams/stream-browser.js new file mode 100644 index 0000000000000..9332a3fdae706 --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/internal/streams/stream-browser.js @@ -0,0 +1 @@ +module.exports = require('events').EventEmitter; diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/internal/streams/stream.js b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/internal/streams/stream.js new file mode 100644 index 0000000000000..ce2ad5b6ee57f --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/lib/internal/streams/stream.js @@ -0,0 +1 @@ +module.exports = require('stream'); diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/package.json b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/package.json new file mode 100644 index 0000000000000..6ef1cd32a9de4 --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/package.json @@ -0,0 +1,81 @@ +{ + "_from": "readable-stream@1 || 2", + "_id": "readable-stream@2.3.6", + "_inBundle": false, + "_integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "_location": "/fs-write-stream-atomic/readable-stream", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "readable-stream@1 || 2", + "name": "readable-stream", + "escapedName": "readable-stream", + "rawSpec": "1 || 2", + "saveSpec": null, + "fetchSpec": "1 || 2" + }, + "_requiredBy": [ + "/fs-write-stream-atomic" + ], + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "_shasum": "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf", + "_spec": "readable-stream@1 || 2", + "_where": "/Users/aeschright/code/cli/node_modules/fs-write-stream-atomic", + "browser": { + "util": false, + "./readable.js": "./readable-browser.js", + "./writable.js": "./writable-browser.js", + "./duplex.js": "./duplex-browser.js", + "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js" + }, + "bugs": { + "url": "https://github.com/nodejs/readable-stream/issues" + }, + "bundleDependencies": false, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "deprecated": false, + "description": "Streams3, a user-land copy of the stream library from Node.js", + "devDependencies": { + "assert": "^1.4.0", + "babel-polyfill": "^6.9.1", + "buffer": "^4.9.0", + "lolex": "^2.3.2", + "nyc": "^6.4.0", + "tap": "^0.7.0", + "tape": "^4.8.0" + }, + "homepage": "https://github.com/nodejs/readable-stream#readme", + "keywords": [ + "readable", + "stream", + "pipe" + ], + "license": "MIT", + "main": "readable.js", + "name": "readable-stream", + "nyc": { + "include": [ + "lib/**.js" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/nodejs/readable-stream.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "cover": "nyc npm test", + "report": "nyc report --reporter=lcov", + "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js" + }, + "version": "2.3.6" +} diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/passthrough.js b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/passthrough.js new file mode 100644 index 0000000000000..ffd791d7ff275 --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require('./readable').PassThrough diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/readable-browser.js b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/readable-browser.js new file mode 100644 index 0000000000000..e50372592ee6c --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/readable-browser.js @@ -0,0 +1,7 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/readable.js b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/readable.js new file mode 100644 index 0000000000000..ec89ec5330649 --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/readable.js @@ -0,0 +1,19 @@ +var Stream = require('stream'); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; + exports = module.exports = Stream.Readable; + exports.Readable = Stream.Readable; + exports.Writable = Stream.Writable; + exports.Duplex = Stream.Duplex; + exports.Transform = Stream.Transform; + exports.PassThrough = Stream.PassThrough; + exports.Stream = Stream; +} else { + exports = module.exports = require('./lib/_stream_readable.js'); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = require('./lib/_stream_writable.js'); + exports.Duplex = require('./lib/_stream_duplex.js'); + exports.Transform = require('./lib/_stream_transform.js'); + exports.PassThrough = require('./lib/_stream_passthrough.js'); +} diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/transform.js b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/transform.js new file mode 100644 index 0000000000000..b1baba26da03d --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require('./readable').Transform diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/writable-browser.js b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/writable-browser.js new file mode 100644 index 0000000000000..ebdde6a85dcb1 --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/writable-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_writable.js'); diff --git a/node_modules/fs-write-stream-atomic/node_modules/readable-stream/writable.js b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/writable.js new file mode 100644 index 0000000000000..3211a6f80d1ab --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/readable-stream/writable.js @@ -0,0 +1,8 @@ +var Stream = require("stream") +var Writable = require("./lib/_stream_writable.js") + +if (process.env.READABLE_STREAM === 'disable') { + module.exports = Stream && Stream.Writable || Writable +} else { + module.exports = Writable +} diff --git a/node_modules/fs-write-stream-atomic/node_modules/string_decoder/.travis.yml b/node_modules/fs-write-stream-atomic/node_modules/string_decoder/.travis.yml new file mode 100644 index 0000000000000..3347a72546505 --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/string_decoder/.travis.yml @@ -0,0 +1,50 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test diff --git a/node_modules/fs-write-stream-atomic/node_modules/string_decoder/LICENSE b/node_modules/fs-write-stream-atomic/node_modules/string_decoder/LICENSE new file mode 100644 index 0000000000000..778edb20730ef --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/string_decoder/LICENSE @@ -0,0 +1,48 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/fs-write-stream-atomic/node_modules/string_decoder/README.md b/node_modules/fs-write-stream-atomic/node_modules/string_decoder/README.md new file mode 100644 index 0000000000000..5fd58315ed588 --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/string_decoder/README.md @@ -0,0 +1,47 @@ +# string_decoder + +***Node-core v8.9.4 string_decoder for userland*** + + +[![NPM](https://nodei.co/npm/string_decoder.png?downloads=true&downloadRank=true)](https://nodei.co/npm/string_decoder/) +[![NPM](https://nodei.co/npm-dl/string_decoder.png?&months=6&height=3)](https://nodei.co/npm/string_decoder/) + + +```bash +npm install --save string_decoder +``` + +***Node-core string_decoder for userland*** + +This package is a mirror of the string_decoder implementation in Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.9.4/docs/api/). + +As of version 1.0.0 **string_decoder** uses semantic versioning. + +## Previous versions + +Previous version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. + +## Update + +The *build/* directory contains a build script that will scrape the source from the [nodejs/node](https://github.com/nodejs/node) repo given a specific Node version. + +## Streams Working Group + +`string_decoder` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + +See [readable-stream](https://github.com/nodejs/readable-stream) for +more details. diff --git a/node_modules/fs-write-stream-atomic/node_modules/string_decoder/lib/string_decoder.js b/node_modules/fs-write-stream-atomic/node_modules/string_decoder/lib/string_decoder.js new file mode 100644 index 0000000000000..2e89e63f7933e --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/string_decoder/lib/string_decoder.js @@ -0,0 +1,296 @@ +// 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. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} \ No newline at end of file diff --git a/node_modules/fs-write-stream-atomic/node_modules/string_decoder/package.json b/node_modules/fs-write-stream-atomic/node_modules/string_decoder/package.json new file mode 100644 index 0000000000000..65d08e2cac18f --- /dev/null +++ b/node_modules/fs-write-stream-atomic/node_modules/string_decoder/package.json @@ -0,0 +1,59 @@ +{ + "_from": "string_decoder@~1.1.1", + "_id": "string_decoder@1.1.1", + "_inBundle": false, + "_integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "_location": "/fs-write-stream-atomic/string_decoder", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "string_decoder@~1.1.1", + "name": "string_decoder", + "escapedName": "string_decoder", + "rawSpec": "~1.1.1", + "saveSpec": null, + "fetchSpec": "~1.1.1" + }, + "_requiredBy": [ + "/fs-write-stream-atomic/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "_shasum": "9cf1611ba62685d7030ae9e4ba34149c3af03fc8", + "_spec": "string_decoder@~1.1.1", + "_where": "/Users/aeschright/code/cli/node_modules/fs-write-stream-atomic/node_modules/readable-stream", + "bugs": { + "url": "https://github.com/nodejs/string_decoder/issues" + }, + "bundleDependencies": false, + "dependencies": { + "safe-buffer": "~5.1.0" + }, + "deprecated": false, + "description": "The string_decoder module from Node core", + "devDependencies": { + "babel-polyfill": "^6.23.0", + "core-util-is": "^1.0.2", + "inherits": "^2.0.3", + "tap": "~0.4.8" + }, + "homepage": "https://github.com/nodejs/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT", + "main": "lib/string_decoder.js", + "name": "string_decoder", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/string_decoder.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "test": "tap test/parallel/*.js && node test/verify-dependencies" + }, + "version": "1.1.1" +} diff --git a/node_modules/parallel-transform/node_modules/readable-stream/.travis.yml b/node_modules/parallel-transform/node_modules/readable-stream/.travis.yml new file mode 100644 index 0000000000000..40992555bf5cc --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/.travis.yml @@ -0,0 +1,55 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test +script: "npm run $TASK" +env: + global: + - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc= + - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI= diff --git a/node_modules/parallel-transform/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/parallel-transform/node_modules/readable-stream/CONTRIBUTING.md new file mode 100644 index 0000000000000..f478d58dca85b --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/CONTRIBUTING.md @@ -0,0 +1,38 @@ +# Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +* (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +* (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +* (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +* (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +## Moderation Policy + +The [Node.js Moderation Policy] applies to this WG. + +## Code of Conduct + +The [Node.js Code of Conduct][] applies to this WG. + +[Node.js Code of Conduct]: +https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md +[Node.js Moderation Policy]: +https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md diff --git a/node_modules/parallel-transform/node_modules/readable-stream/GOVERNANCE.md b/node_modules/parallel-transform/node_modules/readable-stream/GOVERNANCE.md new file mode 100644 index 0000000000000..16ffb93f24bec --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/GOVERNANCE.md @@ -0,0 +1,136 @@ +### Streams Working Group + +The Node.js Streams is jointly governed by a Working Group +(WG) +that is responsible for high-level guidance of the project. + +The WG has final authority over this project including: + +* Technical direction +* Project governance and process (including this policy) +* Contribution policy +* GitHub repository hosting +* Conduct guidelines +* Maintaining the list of additional Collaborators + +For the current list of WG members, see the project +[README.md](./README.md#current-project-team-members). + +### Collaborators + +The readable-stream GitHub repository is +maintained by the WG and additional Collaborators who are added by the +WG on an ongoing basis. + +Individuals making significant and valuable contributions are made +Collaborators and given commit-access to the project. These +individuals are identified by the WG and their addition as +Collaborators is discussed during the WG meeting. + +_Note:_ If you make a significant contribution and are not considered +for commit-access log an issue or contact a WG member directly and it +will be brought up in the next WG meeting. + +Modifications of the contents of the readable-stream repository are +made on +a collaborative basis. Anybody with a GitHub account may propose a +modification via pull request and it will be considered by the project +Collaborators. All pull requests must be reviewed and accepted by a +Collaborator with sufficient expertise who is able to take full +responsibility for the change. In the case of pull requests proposed +by an existing Collaborator, an additional Collaborator is required +for sign-off. Consensus should be sought if additional Collaborators +participate and there is disagreement around a particular +modification. See _Consensus Seeking Process_ below for further detail +on the consensus model used for governance. + +Collaborators may opt to elevate significant or controversial +modifications, or modifications that have not found consensus to the +WG for discussion by assigning the ***WG-agenda*** tag to a pull +request or issue. The WG should serve as the final arbiter where +required. + +For the current list of Collaborators, see the project +[README.md](./README.md#members). + +### WG Membership + +WG seats are not time-limited. There is no fixed size of the WG. +However, the expected target is between 6 and 12, to ensure adequate +coverage of important areas of expertise, balanced with the ability to +make decisions efficiently. + +There is no specific set of requirements or qualifications for WG +membership beyond these rules. + +The WG may add additional members to the WG by unanimous consensus. + +A WG member may be removed from the WG by voluntary resignation, or by +unanimous consensus of all other WG members. + +Changes to WG membership should be posted in the agenda, and may be +suggested as any other agenda item (see "WG Meetings" below). + +If an addition or removal is proposed during a meeting, and the full +WG is not in attendance to participate, then the addition or removal +is added to the agenda for the subsequent meeting. This is to ensure +that all members are given the opportunity to participate in all +membership decisions. If a WG member is unable to attend a meeting +where a planned membership decision is being made, then their consent +is assumed. + +No more than 1/3 of the WG members may be affiliated with the same +employer. If removal or resignation of a WG member, or a change of +employment by a WG member, creates a situation where more than 1/3 of +the WG membership shares an employer, then the situation must be +immediately remedied by the resignation or removal of one or more WG +members affiliated with the over-represented employer(s). + +### WG Meetings + +The WG meets occasionally on a Google Hangout On Air. A designated moderator +approved by the WG runs the meeting. Each meeting should be +published to YouTube. + +Items are added to the WG agenda that are considered contentious or +are modifications of governance, contribution policy, WG membership, +or release process. + +The intention of the agenda is not to approve or review all patches; +that should happen continuously on GitHub and be handled by the larger +group of Collaborators. + +Any community member or contributor can ask that something be added to +the next meeting's agenda by logging a GitHub Issue. Any Collaborator, +WG member or the moderator can add the item to the agenda by adding +the ***WG-agenda*** tag to the issue. + +Prior to each WG meeting the moderator will share the Agenda with +members of the WG. WG members can add any items they like to the +agenda at the beginning of each meeting. The moderator and the WG +cannot veto or remove items. + +The WG may invite persons or representatives from certain projects to +participate in a non-voting capacity. + +The moderator is responsible for summarizing the discussion of each +agenda item and sends it as a pull request after the meeting. + +### Consensus Seeking Process + +The WG follows a +[Consensus +Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) +decision-making model. + +When an agenda item has appeared to reach a consensus the moderator +will ask "Does anyone object?" as a final call for dissent from the +consensus. + +If an agenda item cannot reach a consensus a WG member can call for +either a closing vote or a vote to table the issue to the next +meeting. The call for a vote must be seconded by a majority of the WG +or else the discussion will continue. Simple majority wins. + +Note that changes to WG membership require a majority consensus. See +"WG Membership" above. diff --git a/node_modules/parallel-transform/node_modules/readable-stream/LICENSE b/node_modules/parallel-transform/node_modules/readable-stream/LICENSE new file mode 100644 index 0000000000000..2873b3b2e5950 --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/LICENSE @@ -0,0 +1,47 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/parallel-transform/node_modules/readable-stream/README.md b/node_modules/parallel-transform/node_modules/readable-stream/README.md new file mode 100644 index 0000000000000..23fe3f3e3009a --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/README.md @@ -0,0 +1,58 @@ +# readable-stream + +***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) + + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) + +```bash +npm install --save readable-stream +``` + +***Node-core streams for userland*** + +This package is a mirror of the Streams2 and Streams3 implementations in +Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html). + +If you want to guarantee a stable streams base, regardless of what version of +Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). + +As of version 2.0.0 **readable-stream** uses semantic versioning. + +# Streams Working Group + +`readable-stream` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + + +## Team Members + +* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> + - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B +* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> + - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 +* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> + - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D +* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> +* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> +* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> +* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) <matteo.collina@gmail.com> + - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E +* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) <shestak.irina@gmail.com> diff --git a/node_modules/parallel-transform/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/node_modules/parallel-transform/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md new file mode 100644 index 0000000000000..83275f192e407 --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md @@ -0,0 +1,60 @@ +# streams WG Meeting 2015-01-30 + +## Links + +* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg +* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106 +* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/ + +## Agenda + +Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting. + +* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105) +* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101) +* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102) +* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99) + +## Minutes + +### adopt a charter + +* group: +1's all around + +### What versioning scheme should be adopted? +* group: +1’s 3.0.0 +* domenic+group: pulling in patches from other sources where appropriate +* mikeal: version independently, suggesting versions for io.js +* mikeal+domenic: work with TC to notify in advance of changes +simpler stream creation + +### streamline creation of streams +* sam: streamline creation of streams +* domenic: nice simple solution posted + but, we lose the opportunity to change the model + may not be backwards incompatible (double check keys) + + **action item:** domenic will check + +### remove implicit flowing of streams on(‘data’) +* add isFlowing / isPaused +* mikeal: worrying that we’re documenting polyfill methods – confuses users +* domenic: more reflective API is probably good, with warning labels for users +* new section for mad scientists (reflective stream access) +* calvin: name the “third state” +* mikeal: maybe borrow the name from whatwg? +* domenic: we’re missing the “third state” +* consensus: kind of difficult to name the third state +* mikeal: figure out differences in states / compat +* mathias: always flow on data – eliminates third state + * explore what it breaks + +**action items:** +* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream) +* ask rod/build for infrastructure +* **chris**: explore the “flow on data” approach +* add isPaused/isFlowing +* add new docs section +* move isPaused to that section + + diff --git a/node_modules/parallel-transform/node_modules/readable-stream/duplex-browser.js b/node_modules/parallel-transform/node_modules/readable-stream/duplex-browser.js new file mode 100644 index 0000000000000..f8b2db83dbe73 --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/duplex-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_duplex.js'); diff --git a/node_modules/parallel-transform/node_modules/readable-stream/duplex.js b/node_modules/parallel-transform/node_modules/readable-stream/duplex.js new file mode 100644 index 0000000000000..46924cbfdf538 --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require('./readable').Duplex diff --git a/node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 0000000000000..a1ca813e5acbd --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,131 @@ +// 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. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; \ No newline at end of file diff --git a/node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 0000000000000..a9c835884828d --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,47 @@ +// 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. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; \ No newline at end of file diff --git a/node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 0000000000000..bf34ac65e1108 --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,1019 @@ +// 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. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); +var destroyImpl = require('./internal/streams/destroy'); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, unpipeInfo); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} \ No newline at end of file diff --git a/node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 0000000000000..5d1f8b876d98c --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,214 @@ +// 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. + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} \ No newline at end of file diff --git a/node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 0000000000000..b3f4e85a2f6e3 --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,687 @@ +// 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. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = require('./internal/streams/destroy'); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // has it been destroyed + this.destroyed = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; \ No newline at end of file diff --git a/node_modules/parallel-transform/node_modules/readable-stream/lib/internal/streams/BufferList.js b/node_modules/parallel-transform/node_modules/readable-stream/lib/internal/streams/BufferList.js new file mode 100644 index 0000000000000..aefc68bd90b9c --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/lib/internal/streams/BufferList.js @@ -0,0 +1,79 @@ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Buffer = require('safe-buffer').Buffer; +var util = require('util'); + +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} + +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; +}(); + +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} \ No newline at end of file diff --git a/node_modules/parallel-transform/node_modules/readable-stream/lib/internal/streams/destroy.js b/node_modules/parallel-transform/node_modules/readable-stream/lib/internal/streams/destroy.js new file mode 100644 index 0000000000000..5a0a0d88cec6f --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/lib/internal/streams/destroy.js @@ -0,0 +1,74 @@ +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; \ No newline at end of file diff --git a/node_modules/parallel-transform/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/node_modules/parallel-transform/node_modules/readable-stream/lib/internal/streams/stream-browser.js new file mode 100644 index 0000000000000..9332a3fdae706 --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/lib/internal/streams/stream-browser.js @@ -0,0 +1 @@ +module.exports = require('events').EventEmitter; diff --git a/node_modules/parallel-transform/node_modules/readable-stream/lib/internal/streams/stream.js b/node_modules/parallel-transform/node_modules/readable-stream/lib/internal/streams/stream.js new file mode 100644 index 0000000000000..ce2ad5b6ee57f --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/lib/internal/streams/stream.js @@ -0,0 +1 @@ +module.exports = require('stream'); diff --git a/node_modules/parallel-transform/node_modules/readable-stream/package.json b/node_modules/parallel-transform/node_modules/readable-stream/package.json new file mode 100644 index 0000000000000..5429283d787ee --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/package.json @@ -0,0 +1,81 @@ +{ + "_from": "readable-stream@^2.1.5", + "_id": "readable-stream@2.3.6", + "_inBundle": false, + "_integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "_location": "/parallel-transform/readable-stream", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "readable-stream@^2.1.5", + "name": "readable-stream", + "escapedName": "readable-stream", + "rawSpec": "^2.1.5", + "saveSpec": null, + "fetchSpec": "^2.1.5" + }, + "_requiredBy": [ + "/parallel-transform" + ], + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "_shasum": "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf", + "_spec": "readable-stream@^2.1.5", + "_where": "/Users/aeschright/code/cli/node_modules/parallel-transform", + "browser": { + "util": false, + "./readable.js": "./readable-browser.js", + "./writable.js": "./writable-browser.js", + "./duplex.js": "./duplex-browser.js", + "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js" + }, + "bugs": { + "url": "https://github.com/nodejs/readable-stream/issues" + }, + "bundleDependencies": false, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "deprecated": false, + "description": "Streams3, a user-land copy of the stream library from Node.js", + "devDependencies": { + "assert": "^1.4.0", + "babel-polyfill": "^6.9.1", + "buffer": "^4.9.0", + "lolex": "^2.3.2", + "nyc": "^6.4.0", + "tap": "^0.7.0", + "tape": "^4.8.0" + }, + "homepage": "https://github.com/nodejs/readable-stream#readme", + "keywords": [ + "readable", + "stream", + "pipe" + ], + "license": "MIT", + "main": "readable.js", + "name": "readable-stream", + "nyc": { + "include": [ + "lib/**.js" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/nodejs/readable-stream.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "cover": "nyc npm test", + "report": "nyc report --reporter=lcov", + "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js" + }, + "version": "2.3.6" +} diff --git a/node_modules/parallel-transform/node_modules/readable-stream/passthrough.js b/node_modules/parallel-transform/node_modules/readable-stream/passthrough.js new file mode 100644 index 0000000000000..ffd791d7ff275 --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require('./readable').PassThrough diff --git a/node_modules/parallel-transform/node_modules/readable-stream/readable-browser.js b/node_modules/parallel-transform/node_modules/readable-stream/readable-browser.js new file mode 100644 index 0000000000000..e50372592ee6c --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/readable-browser.js @@ -0,0 +1,7 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); diff --git a/node_modules/parallel-transform/node_modules/readable-stream/readable.js b/node_modules/parallel-transform/node_modules/readable-stream/readable.js new file mode 100644 index 0000000000000..ec89ec5330649 --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/readable.js @@ -0,0 +1,19 @@ +var Stream = require('stream'); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; + exports = module.exports = Stream.Readable; + exports.Readable = Stream.Readable; + exports.Writable = Stream.Writable; + exports.Duplex = Stream.Duplex; + exports.Transform = Stream.Transform; + exports.PassThrough = Stream.PassThrough; + exports.Stream = Stream; +} else { + exports = module.exports = require('./lib/_stream_readable.js'); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = require('./lib/_stream_writable.js'); + exports.Duplex = require('./lib/_stream_duplex.js'); + exports.Transform = require('./lib/_stream_transform.js'); + exports.PassThrough = require('./lib/_stream_passthrough.js'); +} diff --git a/node_modules/parallel-transform/node_modules/readable-stream/transform.js b/node_modules/parallel-transform/node_modules/readable-stream/transform.js new file mode 100644 index 0000000000000..b1baba26da03d --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require('./readable').Transform diff --git a/node_modules/parallel-transform/node_modules/readable-stream/writable-browser.js b/node_modules/parallel-transform/node_modules/readable-stream/writable-browser.js new file mode 100644 index 0000000000000..ebdde6a85dcb1 --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/writable-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_writable.js'); diff --git a/node_modules/parallel-transform/node_modules/readable-stream/writable.js b/node_modules/parallel-transform/node_modules/readable-stream/writable.js new file mode 100644 index 0000000000000..3211a6f80d1ab --- /dev/null +++ b/node_modules/parallel-transform/node_modules/readable-stream/writable.js @@ -0,0 +1,8 @@ +var Stream = require("stream") +var Writable = require("./lib/_stream_writable.js") + +if (process.env.READABLE_STREAM === 'disable') { + module.exports = Stream && Stream.Writable || Writable +} else { + module.exports = Writable +} diff --git a/node_modules/parallel-transform/node_modules/string_decoder/.travis.yml b/node_modules/parallel-transform/node_modules/string_decoder/.travis.yml new file mode 100644 index 0000000000000..3347a72546505 --- /dev/null +++ b/node_modules/parallel-transform/node_modules/string_decoder/.travis.yml @@ -0,0 +1,50 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test diff --git a/node_modules/parallel-transform/node_modules/string_decoder/LICENSE b/node_modules/parallel-transform/node_modules/string_decoder/LICENSE new file mode 100644 index 0000000000000..778edb20730ef --- /dev/null +++ b/node_modules/parallel-transform/node_modules/string_decoder/LICENSE @@ -0,0 +1,48 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/parallel-transform/node_modules/string_decoder/README.md b/node_modules/parallel-transform/node_modules/string_decoder/README.md new file mode 100644 index 0000000000000..5fd58315ed588 --- /dev/null +++ b/node_modules/parallel-transform/node_modules/string_decoder/README.md @@ -0,0 +1,47 @@ +# string_decoder + +***Node-core v8.9.4 string_decoder for userland*** + + +[![NPM](https://nodei.co/npm/string_decoder.png?downloads=true&downloadRank=true)](https://nodei.co/npm/string_decoder/) +[![NPM](https://nodei.co/npm-dl/string_decoder.png?&months=6&height=3)](https://nodei.co/npm/string_decoder/) + + +```bash +npm install --save string_decoder +``` + +***Node-core string_decoder for userland*** + +This package is a mirror of the string_decoder implementation in Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.9.4/docs/api/). + +As of version 1.0.0 **string_decoder** uses semantic versioning. + +## Previous versions + +Previous version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. + +## Update + +The *build/* directory contains a build script that will scrape the source from the [nodejs/node](https://github.com/nodejs/node) repo given a specific Node version. + +## Streams Working Group + +`string_decoder` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + +See [readable-stream](https://github.com/nodejs/readable-stream) for +more details. diff --git a/node_modules/parallel-transform/node_modules/string_decoder/lib/string_decoder.js b/node_modules/parallel-transform/node_modules/string_decoder/lib/string_decoder.js new file mode 100644 index 0000000000000..2e89e63f7933e --- /dev/null +++ b/node_modules/parallel-transform/node_modules/string_decoder/lib/string_decoder.js @@ -0,0 +1,296 @@ +// 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. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} \ No newline at end of file diff --git a/node_modules/parallel-transform/node_modules/string_decoder/package.json b/node_modules/parallel-transform/node_modules/string_decoder/package.json new file mode 100644 index 0000000000000..8c4d6e474852f --- /dev/null +++ b/node_modules/parallel-transform/node_modules/string_decoder/package.json @@ -0,0 +1,59 @@ +{ + "_from": "string_decoder@~1.1.1", + "_id": "string_decoder@1.1.1", + "_inBundle": false, + "_integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "_location": "/parallel-transform/string_decoder", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "string_decoder@~1.1.1", + "name": "string_decoder", + "escapedName": "string_decoder", + "rawSpec": "~1.1.1", + "saveSpec": null, + "fetchSpec": "~1.1.1" + }, + "_requiredBy": [ + "/parallel-transform/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "_shasum": "9cf1611ba62685d7030ae9e4ba34149c3af03fc8", + "_spec": "string_decoder@~1.1.1", + "_where": "/Users/aeschright/code/cli/node_modules/parallel-transform/node_modules/readable-stream", + "bugs": { + "url": "https://github.com/nodejs/string_decoder/issues" + }, + "bundleDependencies": false, + "dependencies": { + "safe-buffer": "~5.1.0" + }, + "deprecated": false, + "description": "The string_decoder module from Node core", + "devDependencies": { + "babel-polyfill": "^6.23.0", + "core-util-is": "^1.0.2", + "inherits": "^2.0.3", + "tap": "~0.4.8" + }, + "homepage": "https://github.com/nodejs/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT", + "main": "lib/string_decoder.js", + "name": "string_decoder", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/string_decoder.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "test": "tap test/parallel/*.js && node test/verify-dependencies" + }, + "version": "1.1.1" +} diff --git a/node_modules/readable-stream/README.md b/node_modules/readable-stream/README.md index 23fe3f3e3009a..791576af683ad 100644 --- a/node_modules/readable-stream/README.md +++ b/node_modules/readable-stream/README.md @@ -1,30 +1,86 @@ # readable-stream -***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) +***Node.js core streams for userland*** [![Build Status](https://travis-ci.com/nodejs/readable-stream.svg?branch=master)](https://travis-ci.com/nodejs/readable-stream) [![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) [![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) -[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readabe-stream.svg)](https://saucelabs.com/u/readabe-stream) ```bash npm install --save readable-stream ``` -***Node-core streams for userland*** +This package is a mirror of the streams implementations in Node.js. -This package is a mirror of the Streams2 and Streams3 implementations in -Node-core. - -Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html). +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v10.14.2/docs/api/stream.html). If you want to guarantee a stable streams base, regardless of what version of Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). As of version 2.0.0 **readable-stream** uses semantic versioning. +## Version 3.x.x + +v3.x.x of `readable-stream` supports Node 6, 8, and 10, as well as +evergreen browsers, IE 11 and latest Safari. The breaking changes +introduced by v3 are composed by the combined breaking changes in [Node v9](https://nodejs.org/en/blog/release/v9.0.0/) +and [Node v10](https://nodejs.org/en/blog/release/v10.0.0/), as follows: + +1. Error codes: https://github.com/nodejs/node/pull/13310, + https://github.com/nodejs/node/pull/13291, + https://github.com/nodejs/node/pull/16589, + https://github.com/nodejs/node/pull/15042, + https://github.com/nodejs/node/pull/15665, + https://github.com/nodejs/readable-stream/pull/344 +2. 'readable' have precedence over flowing + https://github.com/nodejs/node/pull/18994 +3. make virtual methods errors consistent + https://github.com/nodejs/node/pull/18813 +4. updated streams error handling + https://github.com/nodejs/node/pull/18438 +5. writable.end should return this. + https://github.com/nodejs/node/pull/18780 +6. readable continues to read when push('') + https://github.com/nodejs/node/pull/18211 +7. add custom inspect to BufferList + https://github.com/nodejs/node/pull/17907 +8. always defer 'readable' with nextTick + https://github.com/nodejs/node/pull/17979 + +## Version 2.x.x + +v2.x.x of `readable-stream` supports all Node.js version from 0.8, as well as +evergreen browsers and IE 10 & 11. + +### Big Thanks + +Cross-browser Testing Platform and Open Source <3 Provided by [Sauce Labs][sauce] + +# Usage + +You can swap your `require('stream')` with `require('readable-stream')` +without any changes, if you are just using one of the main classes and +functions. + +```js +const { + Readable, + Writable, + Transform, + Duplex, + pipeline, + finished +} = require('readable-stream') +```` + +Note that `require('stream')` will return `Stream`, while +`require('readable-stream')` will return `Readable`. We discourage using +whatever is exported directly, but rather use one of the properties as +shown in the example above. + # Streams Working Group `readable-stream` is maintained by the Streams Working Group, which @@ -44,15 +100,12 @@ Node.js. The responsibilities of the Streams Working Group include: ## Team Members -* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> - - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B * **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 -* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> - - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D -* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> * **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> -* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> * **Matteo Collina** ([@mcollina](https://github.com/mcollina)) <matteo.collina@gmail.com> - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E * **Irina Shestak** ([@lrlna](https://github.com/lrlna)) <shestak.irina@gmail.com> +* **Yoshua Wyuts** ([@yoshuawuyts](https://github.com/yoshuawuyts)) <yoshuawuyts@gmail.com> + +[sauce]: https://saucelabs.com diff --git a/node_modules/readable-stream/errors-browser.js b/node_modules/readable-stream/errors-browser.js new file mode 100644 index 0000000000000..fb8e73e1893b1 --- /dev/null +++ b/node_modules/readable-stream/errors-browser.js @@ -0,0 +1,127 @@ +'use strict'; + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +var codes = {}; + +function createErrorType(code, message, Base) { + if (!Base) { + Base = Error; + } + + function getMessage(arg1, arg2, arg3) { + if (typeof message === 'string') { + return message; + } else { + return message(arg1, arg2, arg3); + } + } + + var NodeError = + /*#__PURE__*/ + function (_Base) { + _inheritsLoose(NodeError, _Base); + + function NodeError(arg1, arg2, arg3) { + return _Base.call(this, getMessage(arg1, arg2, arg3)) || this; + } + + return NodeError; + }(Base); + + NodeError.prototype.name = Base.name; + NodeError.prototype.code = code; + codes[code] = NodeError; +} // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js + + +function oneOf(expected, thing) { + if (Array.isArray(expected)) { + var len = expected.length; + expected = expected.map(function (i) { + return String(i); + }); + + if (len > 2) { + return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(', '), ", or ") + expected[len - 1]; + } else if (len === 2) { + return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]); + } else { + return "of ".concat(thing, " ").concat(expected[0]); + } + } else { + return "of ".concat(thing, " ").concat(String(expected)); + } +} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith + + +function startsWith(str, search, pos) { + return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; +} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith + + +function endsWith(str, search, this_len) { + if (this_len === undefined || this_len > str.length) { + this_len = str.length; + } + + return str.substring(this_len - search.length, this_len) === search; +} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes + + +function includes(str, search, start) { + if (typeof start !== 'number') { + start = 0; + } + + if (start + search.length > str.length) { + return false; + } else { + return str.indexOf(search, start) !== -1; + } +} + +createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) { + return 'The value "' + value + '" is invalid for option "' + name + '"'; +}, TypeError); +createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) { + // determiner: 'must be' or 'must not be' + var determiner; + + if (typeof expected === 'string' && startsWith(expected, 'not ')) { + determiner = 'must not be'; + expected = expected.replace(/^not /, ''); + } else { + determiner = 'must be'; + } + + var msg; + + if (endsWith(name, ' argument')) { + // For cases like 'first argument' + msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, 'type')); + } else { + var type = includes(name, '.') ? 'property' : 'argument'; + msg = "The \"".concat(name, "\" ").concat(type, " ").concat(determiner, " ").concat(oneOf(expected, 'type')); + } + + msg += ". Received type ".concat(typeof actual); + return msg; +}, TypeError); +createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF'); +createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) { + return 'The ' + name + ' method is not implemented'; +}); +createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close'); +createErrorType('ERR_STREAM_DESTROYED', function (name) { + return 'Cannot call ' + name + ' after a stream was destroyed'; +}); +createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times'); +createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable'); +createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end'); +createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError); +createErrorType('ERR_UNKNOWN_ENCODING', function (arg) { + return 'Unknown encoding: ' + arg; +}, TypeError); +createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event'); +module.exports.codes = codes; diff --git a/node_modules/readable-stream/errors.js b/node_modules/readable-stream/errors.js new file mode 100644 index 0000000000000..8471526d6e7f7 --- /dev/null +++ b/node_modules/readable-stream/errors.js @@ -0,0 +1,116 @@ +'use strict'; + +const codes = {}; + +function createErrorType(code, message, Base) { + if (!Base) { + Base = Error + } + + function getMessage (arg1, arg2, arg3) { + if (typeof message === 'string') { + return message + } else { + return message(arg1, arg2, arg3) + } + } + + class NodeError extends Base { + constructor (arg1, arg2, arg3) { + super(getMessage(arg1, arg2, arg3)); + } + } + + NodeError.prototype.name = Base.name; + NodeError.prototype.code = code; + + codes[code] = NodeError; +} + +// https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js +function oneOf(expected, thing) { + if (Array.isArray(expected)) { + const len = expected.length; + expected = expected.map((i) => String(i)); + if (len > 2) { + return `one of ${thing} ${expected.slice(0, len - 1).join(', ')}, or ` + + expected[len - 1]; + } else if (len === 2) { + return `one of ${thing} ${expected[0]} or ${expected[1]}`; + } else { + return `of ${thing} ${expected[0]}`; + } + } else { + return `of ${thing} ${String(expected)}`; + } +} + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith +function startsWith(str, search, pos) { + return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; +} + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith +function endsWith(str, search, this_len) { + if (this_len === undefined || this_len > str.length) { + this_len = str.length; + } + return str.substring(this_len - search.length, this_len) === search; +} + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes +function includes(str, search, start) { + if (typeof start !== 'number') { + start = 0; + } + + if (start + search.length > str.length) { + return false; + } else { + return str.indexOf(search, start) !== -1; + } +} + +createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) { + return 'The value "' + value + '" is invalid for option "' + name + '"' +}, TypeError); +createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) { + // determiner: 'must be' or 'must not be' + let determiner; + if (typeof expected === 'string' && startsWith(expected, 'not ')) { + determiner = 'must not be'; + expected = expected.replace(/^not /, ''); + } else { + determiner = 'must be'; + } + + let msg; + if (endsWith(name, ' argument')) { + // For cases like 'first argument' + msg = `The ${name} ${determiner} ${oneOf(expected, 'type')}`; + } else { + const type = includes(name, '.') ? 'property' : 'argument'; + msg = `The "${name}" ${type} ${determiner} ${oneOf(expected, 'type')}`; + } + + msg += `. Received type ${typeof actual}`; + return msg; +}, TypeError); +createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF'); +createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) { + return 'The ' + name + ' method is not implemented' +}); +createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close'); +createErrorType('ERR_STREAM_DESTROYED', function (name) { + return 'Cannot call ' + name + ' after a stream was destroyed'; +}); +createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times'); +createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable'); +createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end'); +createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError); +createErrorType('ERR_UNKNOWN_ENCODING', function (arg) { + return 'Unknown encoding: ' + arg +}, TypeError); +createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event'); + +module.exports.codes = codes; diff --git a/node_modules/readable-stream/experimentalWarning.js b/node_modules/readable-stream/experimentalWarning.js new file mode 100644 index 0000000000000..78e841495bf24 --- /dev/null +++ b/node_modules/readable-stream/experimentalWarning.js @@ -0,0 +1,17 @@ +'use strict' + +var experimentalWarnings = new Set(); + +function emitExperimentalWarning(feature) { + if (experimentalWarnings.has(feature)) return; + var msg = feature + ' is an experimental feature. This feature could ' + + 'change at any time'; + experimentalWarnings.add(feature); + process.emitWarning(msg, 'ExperimentalWarning'); +} + +function noop() {} + +module.exports.emitExperimentalWarning = process.emitWarning + ? emitExperimentalWarning + : noop; diff --git a/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/readable-stream/lib/_stream_duplex.js index a1ca813e5acbd..67525192250f6 100644 --- a/node_modules/readable-stream/lib/_stream_duplex.js +++ b/node_modules/readable-stream/lib/_stream_duplex.js @@ -18,43 +18,37 @@ // 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. - // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from // Writable. - 'use strict'; - /**/ -var pna = require('process-nextick-args'); -/**/ - -/**/ var objectKeys = Object.keys || function (obj) { var keys = []; + for (var key in obj) { keys.push(key); - }return keys; + } + + return keys; }; /**/ -module.exports = Duplex; -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ +module.exports = Duplex; var Readable = require('./_stream_readable'); + var Writable = require('./_stream_writable'); -util.inherits(Duplex, Readable); +require('inherits')(Duplex, Readable); { - // avoid scope creep, the keys array can then be collected + // Allow the keys array to be GC'ed. var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { var method = keys[v]; if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; @@ -63,18 +57,19 @@ util.inherits(Duplex, Readable); function Duplex(options) { if (!(this instanceof Duplex)) return new Duplex(options); - Readable.call(this, options); Writable.call(this, options); - - if (options && options.readable === false) this.readable = false; - - if (options && options.writable === false) this.writable = false; - this.allowHalfOpen = true; - if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; - this.once('end', onend); + if (options) { + if (options.readable === false) this.readable = false; + if (options.writable === false) this.writable = false; + + if (options.allowHalfOpen === false) { + this.allowHalfOpen = false; + this.once('end', onend); + } + } } Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { @@ -82,20 +77,35 @@ Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { // because otherwise some prototype manipulation in // userland will fail enumerable: false, - get: function () { + get: function get() { return this._writableState.highWaterMark; } }); +Object.defineProperty(Duplex.prototype, 'writableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState && this._writableState.getBuffer(); + } +}); +Object.defineProperty(Duplex.prototype, 'writableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.length; + } +}); // the no-half-open enforcer -// the no-half-open enforcer function onend() { - // if we allow half-open state, or if the writable side ended, - // then we're ok. - if (this.allowHalfOpen || this._writableState.ended) return; - - // no more data can be written. + // If the writable side ended, then we're ok. + if (this._writableState.ended) return; // no more data can be written. // But allow more writes to happen in this tick. - pna.nextTick(onEndNT, this); + + process.nextTick(onEndNT, this); } function onEndNT(self) { @@ -103,29 +113,27 @@ function onEndNT(self) { } Object.defineProperty(Duplex.prototype, 'destroyed', { - get: function () { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { if (this._readableState === undefined || this._writableState === undefined) { return false; } + return this._readableState.destroyed && this._writableState.destroyed; }, - set: function (value) { + set: function set(value) { // we ignore the value if the stream // has not been initialized yet if (this._readableState === undefined || this._writableState === undefined) { return; - } - - // backward compatibility, the user is explicitly + } // backward compatibility, the user is explicitly // managing destroyed + + this._readableState.destroyed = value; this._writableState.destroyed = value; } -}); - -Duplex.prototype._destroy = function (err, cb) { - this.push(null); - this.end(); - - pna.nextTick(cb, err); -}; \ No newline at end of file +}); \ No newline at end of file diff --git a/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/readable-stream/lib/_stream_passthrough.js index a9c835884828d..32e7414c5a827 100644 --- a/node_modules/readable-stream/lib/_stream_passthrough.js +++ b/node_modules/readable-stream/lib/_stream_passthrough.js @@ -18,27 +18,19 @@ // 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. - // a passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. - 'use strict'; module.exports = PassThrough; var Transform = require('./_stream_transform'); -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -util.inherits(PassThrough, Transform); +require('inherits')(PassThrough, Transform); function PassThrough(options) { if (!(this instanceof PassThrough)) return new PassThrough(options); - Transform.call(this, options); } diff --git a/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/readable-stream/lib/_stream_readable.js index bf34ac65e1108..b9b1b742cc594 100644 --- a/node_modules/readable-stream/lib/_stream_readable.js +++ b/node_modules/readable-stream/lib/_stream_readable.js @@ -18,118 +18,111 @@ // 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. - 'use strict'; -/**/ - -var pna = require('process-nextick-args'); -/**/ - module.exports = Readable; - /**/ -var isArray = require('isarray'); -/**/ -/**/ var Duplex; /**/ Readable.ReadableState = ReadableState; - /**/ + var EE = require('events').EventEmitter; -var EElistenerCount = function (emitter, type) { +var EElistenerCount = function EElistenerCount(emitter, type) { return emitter.listeners(type).length; }; /**/ /**/ + + var Stream = require('./internal/streams/stream'); /**/ -/**/ -var Buffer = require('safe-buffer').Buffer; +var Buffer = require('buffer').Buffer; + var OurUint8Array = global.Uint8Array || function () {}; + function _uint8ArrayToBuffer(chunk) { return Buffer.from(chunk); } + function _isUint8Array(obj) { return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; } - -/**/ - /**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ -/**/ + var debugUtil = require('util'); -var debug = void 0; + +var debug; + if (debugUtil && debugUtil.debuglog) { debug = debugUtil.debuglog('stream'); } else { - debug = function () {}; + debug = function debug() {}; } /**/ -var BufferList = require('./internal/streams/BufferList'); + +var BufferList = require('./internal/streams/buffer_list'); + var destroyImpl = require('./internal/streams/destroy'); + +var _require = require('./internal/streams/state'), + getHighWaterMark = _require.getHighWaterMark; + +var _require$codes = require('../errors').codes, + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; + +var _require2 = require('../experimentalWarning'), + emitExperimentalWarning = _require2.emitExperimentalWarning; // Lazy loaded to improve the startup performance. + + var StringDecoder; +var createReadableStreamAsyncIterator; -util.inherits(Readable, Stream); +require('inherits')(Readable, Stream); var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; function prependListener(emitter, event, fn) { // Sadly this is not cacheable as some libraries bundle their own // event emitter implementation with them. - if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); - - // This is a hack to make sure that our error handler is attached before any + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any // userland ones. NEVER DO THIS. This is here only because this code needs // to continue to work with older versions of Node.js that do not include // the prependListener() method. The goal is to eventually remove this hack. - if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; + + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; } -function ReadableState(options, stream) { +function ReadableState(options, stream, isDuplex) { Duplex = Duplex || require('./_stream_duplex'); - - options = options || {}; - - // Duplex streams are both readable and writable, but share + options = options || {}; // Duplex streams are both readable and writable, but share // the same options object. // However, some cases require setting options to different // values for the readable and the writable sides of the duplex stream. // These options can be provided separately as readableXXX and writableXXX. - var isDuplex = stream instanceof Duplex; - // object stream flag. Used to make read(n) ignore n and to + if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away - this.objectMode = !!options.objectMode; - - if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; - // the point at which it stops calling _read() to fill the buffer + this.objectMode = !!options.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" - var hwm = options.highWaterMark; - var readableHwm = options.readableHighWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - - if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; - - // cast to ints. - this.highWaterMark = Math.floor(this.highWaterMark); - // A linked list is used to store data chunks instead of an array because the + this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the // linked list can remove elements from the beginning faster than // array.shift() + this.buffer = new BufferList(); this.length = 0; this.pipes = null; @@ -137,37 +130,33 @@ function ReadableState(options, stream) { this.flowing = null; this.ended = false; this.endEmitted = false; - this.reading = false; - - // a flag to be able to tell if the event 'readable'/'data' is emitted + this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted // immediately, or on a later tick. We set this to true at first, because // any actions that shouldn't happen until "later" should generally also // not happen before the first read call. - this.sync = true; - // whenever we return null, then we set a flag to say + this.sync = true; // whenever we return null, then we set a flag to say // that we're awaiting a 'readable' event emission. + this.needReadable = false; this.emittedReadable = false; this.readableListening = false; - this.resumeScheduled = false; + this.resumeScheduled = false; // Should close be emitted on destroy. Defaults to true. - // has it been destroyed - this.destroyed = false; + this.emitClose = options.emitClose !== false; // has it been destroyed - // Crypto is kind of old and crusty. Historically, its default string + this.destroyed = false; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - // the number of writers that are awaiting a drain event in .pipe()s - this.awaitDrain = 0; + this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s - // if true, a maybeReadMore has been scheduled - this.readingMore = false; + this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled + this.readingMore = false; this.decoder = null; this.encoding = null; + if (options.encoding) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this.decoder = new StringDecoder(options.encoding); @@ -177,17 +166,16 @@ function ReadableState(options, stream) { function Readable(options) { Duplex = Duplex || require('./_stream_duplex'); + if (!(this instanceof Readable)) return new Readable(options); // Checking for a Stream.Duplex instance is faster here instead of inside + // the ReadableState constructor, at least with V8 6.5 - if (!(this instanceof Readable)) return new Readable(options); + var isDuplex = this instanceof Duplex; + this._readableState = new ReadableState(options, this, isDuplex); // legacy - this._readableState = new ReadableState(options, this); - - // legacy this.readable = true; if (options) { if (typeof options.read === 'function') this._read = options.read; - if (typeof options.destroy === 'function') this._destroy = options.destroy; } @@ -195,36 +183,40 @@ function Readable(options) { } Object.defineProperty(Readable.prototype, 'destroyed', { - get: function () { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { if (this._readableState === undefined) { return false; } + return this._readableState.destroyed; }, - set: function (value) { + set: function set(value) { // we ignore the value if the stream // has not been initialized yet if (!this._readableState) { return; - } - - // backward compatibility, the user is explicitly + } // backward compatibility, the user is explicitly // managing destroyed + + this._readableState.destroyed = value; } }); - Readable.prototype.destroy = destroyImpl.destroy; Readable.prototype._undestroy = destroyImpl.undestroy; + Readable.prototype._destroy = function (err, cb) { - this.push(null); cb(err); -}; - -// Manually shove something into the read() buffer. +}; // Manually shove something into the read() buffer. // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. + + Readable.prototype.push = function (chunk, encoding) { var state = this._readableState; var skipChunkCheck; @@ -232,10 +224,12 @@ Readable.prototype.push = function (chunk, encoding) { if (!state.objectMode) { if (typeof chunk === 'string') { encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { chunk = Buffer.from(chunk, encoding); encoding = ''; } + skipChunkCheck = true; } } else { @@ -243,21 +237,24 @@ Readable.prototype.push = function (chunk, encoding) { } return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); -}; +}; // Unshift should *always* be something directly out of read() + -// Unshift should *always* be something directly out of read() Readable.prototype.unshift = function (chunk) { return readableAddChunk(this, chunk, null, true, false); }; function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + debug('readableAddChunk', chunk); var state = stream._readableState; + if (chunk === null) { state.reading = false; onEofChunk(stream, state); } else { var er; if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { stream.emit('error', er); } else if (state.objectMode || chunk && chunk.length > 0) { @@ -266,11 +263,14 @@ function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { } if (addToFront) { - if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + if (state.endEmitted) stream.emit('error', new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true); } else if (state.ended) { - stream.emit('error', new Error('stream.push() after EOF')); + stream.emit('error', new ERR_STREAM_PUSH_AFTER_EOF()); + } else if (state.destroyed) { + return false; } else { state.reading = false; + if (state.decoder && !encoding) { chunk = state.decoder.write(chunk); if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); @@ -280,59 +280,56 @@ function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { } } else if (!addToFront) { state.reading = false; + maybeReadMore(stream, state); } - } + } // We can push more data if we are below the highWaterMark. + // Also, if we have no data yet, we can stand some more bytes. + // This is to work around cases where hwm=0, such as the repl. - return needMoreData(state); + + return !state.ended && (state.length < state.highWaterMark || state.length === 0); } function addChunk(stream, state, chunk, addToFront) { if (state.flowing && state.length === 0 && !state.sync) { + state.awaitDrain = 0; stream.emit('data', chunk); - stream.read(0); } else { // update the buffer info. state.length += state.objectMode ? 1 : chunk.length; if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); - if (state.needReadable) emitReadable(stream); } + maybeReadMore(stream, state); } function chunkInvalid(state, chunk) { var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); + er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk); } - return er; -} -// if it's past the high water mark, we can push in some more. -// Also, if we have no data yet, we can stand some -// more bytes. This is to work around cases where hwm=0, -// such as the repl. Also, if the push() triggered a -// readable event, and the user called read(largeNumber) such that -// needReadable was set, then we ought to push more, so that another -// 'readable' event will be triggered. -function needMoreData(state) { - return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); + return er; } Readable.prototype.isPaused = function () { return this._readableState.flowing === false; -}; +}; // backwards compatibility. + -// backwards compatibility. Readable.prototype.setEncoding = function (enc) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; - this._readableState.decoder = new StringDecoder(enc); - this._readableState.encoding = enc; + this._readableState.decoder = new StringDecoder(enc); // if setEncoding(null), decoder.encoding equals utf8 + + this._readableState.encoding = this._readableState.decoder.encoding; return this; -}; +}; // Don't raise the hwm > 8MB + -// Don't raise the hwm > 8MB var MAX_HWM = 0x800000; + function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { n = MAX_HWM; @@ -347,56 +344,55 @@ function computeNewHighWaterMark(n) { n |= n >>> 16; n++; } - return n; -} -// This function is designed to be inlinable, so please take care when making + return n; +} // This function is designed to be inlinable, so please take care when making // changes to the function body. + + function howMuchToRead(n, state) { if (n <= 0 || state.length === 0 && state.ended) return 0; if (state.objectMode) return 1; + if (n !== n) { // Only flow one buffer at a time if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; - } - // If we're asking for more than the current hwm, then raise the hwm. + } // If we're asking for more than the current hwm, then raise the hwm. + + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); - if (n <= state.length) return n; - // Don't have enough + if (n <= state.length) return n; // Don't have enough + if (!state.ended) { state.needReadable = true; return 0; } + return state.length; -} +} // you can override either this method, or the async _read(n) below. + -// you can override either this method, or the async _read(n) below. Readable.prototype.read = function (n) { debug('read', n); n = parseInt(n, 10); var state = this._readableState; var nOrig = n; - - if (n !== 0) state.emittedReadable = false; - - // if we're doing read(0) to trigger a readable event, but we + if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. - if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + + if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) { debug('read: emitReadable', state.length, state.ended); if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); return null; } - n = howMuchToRead(n, state); + n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. - // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { if (state.length === 0) endReadable(this); return null; - } - - // All the actual chunk generation logic needs to be + } // All the actual chunk generation logic needs to be // *below* the call to _read. The reason is that in certain // synthetic stream cases, such as passthrough streams, _read // may be a completely synchronous operation which may change @@ -417,33 +413,34 @@ Readable.prototype.read = function (n) { // 'readable' etc. // // 3. Actually pull the requested chunks out of the buffer and return. - // if we need a readable event, then we need to do some reading. + + var doRead = state.needReadable; - debug('need readable', doRead); + debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some - // if we currently have less than the highWaterMark, then also read some if (state.length === 0 || state.length - n < state.highWaterMark) { doRead = true; debug('length less than watermark', doRead); - } - - // however, if we've ended, then there's no point, and if we're already + } // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. + + if (state.ended || state.reading) { doRead = false; debug('reading or ended', doRead); } else if (doRead) { debug('do read'); state.reading = true; - state.sync = true; - // if the length is currently zero, then we *need* a readable event. - if (state.length === 0) state.needReadable = true; - // call internal read method + state.sync = true; // if the length is currently zero, then we *need* a readable event. + + if (state.length === 0) state.needReadable = true; // call internal read method + this._read(state.highWaterMark); - state.sync = false; - // If _read pushed data synchronously, then `reading` will be false, + + state.sync = false; // If _read pushed data synchronously, then `reading` will be false, // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); } @@ -455,87 +452,115 @@ Readable.prototype.read = function (n) { n = 0; } else { state.length -= n; + state.awaitDrain = 0; } if (state.length === 0) { // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. - if (!state.ended) state.needReadable = true; + if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. - // If we tried to read() past the EOF, then emit end on the next tick. if (nOrig !== n && state.ended) endReadable(this); } if (ret !== null) this.emit('data', ret); - return ret; }; function onEofChunk(stream, state) { if (state.ended) return; + if (state.decoder) { var chunk = state.decoder.end(); + if (chunk && chunk.length) { state.buffer.push(chunk); state.length += state.objectMode ? 1 : chunk.length; } } + state.ended = true; - // emit 'readable' now to make sure it gets picked up. - emitReadable(stream); -} + if (state.sync) { + // if we are sync, wait until next tick to emit the data. + // Otherwise we risk emitting data in the flow() + // the readable code triggers during a read() call + emitReadable(stream); + } else { + // emit 'readable' now to make sure it gets picked up. + state.needReadable = false; -// Don't emit readable right away in sync mode, because this can trigger + if (!state.emittedReadable) { + state.emittedReadable = true; + emitReadable_(stream); + } + } +} // Don't emit readable right away in sync mode, because this can trigger // another read() call => stack overflow. This way, it might trigger // a nextTick recursion warning, but that's not so bad. + + function emitReadable(stream) { var state = stream._readableState; state.needReadable = false; + if (!state.emittedReadable) { debug('emitReadable', state.flowing); state.emittedReadable = true; - if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + process.nextTick(emitReadable_, stream); } } function emitReadable_(stream) { - debug('emit readable'); - stream.emit('readable'); - flow(stream); -} + var state = stream._readableState; + debug('emitReadable_', state.destroyed, state.length, state.ended); + + if (!state.destroyed && (state.length || state.ended)) { + stream.emit('readable'); + } // The stream needs another readable event if + // 1. It is not flowing, as the flow mechanism will take + // care of it. + // 2. It is not ended. + // 3. It is below the highWaterMark, so we can schedule + // another readable later. + -// at this point, the user has presumably seen the 'readable' event, + state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark; + flow(stream); +} // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if // it's in progress. // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. + + function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; - pna.nextTick(maybeReadMore_, stream, state); + process.nextTick(maybeReadMore_, stream, state); } } function maybeReadMore_(stream, state) { var len = state.length; - while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + + while (!state.reading && !state.ended && state.length < state.highWaterMark) { debug('maybeReadMore read 0'); stream.read(0); - if (len === state.length) - // didn't get any data, stop spinning. + if (len === state.length) // didn't get any data, stop spinning. break;else len = state.length; } - state.readingMore = false; -} -// abstract method. to be overridden in specific implementation classes. + state.readingMore = false; +} // abstract method. to be overridden in specific implementation classes. // call cb(er, data) where data is <= n in length. // for virtual (non-string, non-buffer) streams, "length" is somewhat // arbitrary, and perhaps not very meaningful. + + Readable.prototype._read = function (n) { - this.emit('error', new Error('_read() is not implemented')); + this.emit('error', new ERR_METHOD_NOT_IMPLEMENTED('_read()')); }; Readable.prototype.pipe = function (dest, pipeOpts) { @@ -546,24 +571,26 @@ Readable.prototype.pipe = function (dest, pipeOpts) { case 0: state.pipes = dest; break; + case 1: state.pipes = [state.pipes, dest]; break; + default: state.pipes.push(dest); break; } + state.pipesCount += 1; debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); - var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; - var endFn = doEnd ? onend : unpipe; - if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); - + if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn); dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { debug('onunpipe'); + if (readable === src) { if (unpipeInfo && unpipeInfo.hasUnpiped === false) { unpipeInfo.hasUnpiped = true; @@ -575,19 +602,19 @@ Readable.prototype.pipe = function (dest, pipeOpts) { function onend() { debug('onend'); dest.end(); - } - - // when the dest drains, it reduces the awaitDrain counter + } // when the dest drains, it reduces the awaitDrain counter // on the source. This would be more elegant with a .once() // handler in flow(), but adding and removing repeatedly is // too slow. + + var ondrain = pipeOnDrain(src); dest.on('drain', ondrain); - var cleanedUp = false; + function cleanup() { - debug('cleanup'); - // cleanup event handlers once the pipe is broken + debug('cleanup'); // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); dest.removeListener('finish', onfinish); dest.removeListener('drain', ondrain); @@ -596,75 +623,71 @@ Readable.prototype.pipe = function (dest, pipeOpts) { src.removeListener('end', onend); src.removeListener('end', unpipe); src.removeListener('data', ondata); - - cleanedUp = true; - - // if the reader is waiting for a drain event from this + cleanedUp = true; // if the reader is waiting for a drain event from this // specific writer, then it would cause it to never start // flowing again. // So, if this is awaiting a drain, then we just call it now. // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); } - // If the user pushes more data while we're writing to dest then we'll end up - // in ondata again. However, we only want to increase awaitDrain once because - // dest will only emit one 'drain' event for the multiple writes. - // => Introduce a guard on increasing awaitDrain. - var increasedAwaitDrain = false; src.on('data', ondata); + function ondata(chunk) { debug('ondata'); - increasedAwaitDrain = false; var ret = dest.write(chunk); - if (false === ret && !increasedAwaitDrain) { + debug('dest.write', ret); + + if (ret === false) { // If the user unpiped during `dest.write()`, it is possible // to get stuck in a permanently paused state if that write // also returned false. // => Check whether `dest` is still a piping destination. if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { - debug('false write response, pause', src._readableState.awaitDrain); - src._readableState.awaitDrain++; - increasedAwaitDrain = true; + debug('false write response, pause', state.awaitDrain); + state.awaitDrain++; } + src.pause(); } - } - - // if the dest has an error, then stop piping into it. + } // if the dest has an error, then stop piping into it. // however, don't suppress the throwing behavior for this. + + function onerror(er) { debug('onerror', er); unpipe(); dest.removeListener('error', onerror); if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); - } + } // Make sure our error handler is attached before userland ones. + - // Make sure our error handler is attached before userland ones. - prependListener(dest, 'error', onerror); + prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once. - // Both close and finish should trigger unpipe, but only once. function onclose() { dest.removeListener('finish', onfinish); unpipe(); } + dest.once('close', onclose); + function onfinish() { debug('onfinish'); dest.removeListener('close', onclose); unpipe(); } + dest.once('finish', onfinish); function unpipe() { debug('unpipe'); src.unpipe(dest); - } + } // tell the dest that it's being piped to + - // tell the dest that it's being piped to - dest.emit('pipe', src); + dest.emit('pipe', src); // start the flow if it hasn't been started already. - // start the flow if it hasn't been started already. if (!state.flowing) { debug('pipe resume'); src.resume(); @@ -674,10 +697,11 @@ Readable.prototype.pipe = function (dest, pipeOpts) { }; function pipeOnDrain(src) { - return function () { + return function pipeOnDrainFunctionResult() { var state = src._readableState; debug('pipeOnDrain', state.awaitDrain); if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { state.flowing = true; flow(src); @@ -687,27 +711,24 @@ function pipeOnDrain(src) { Readable.prototype.unpipe = function (dest) { var state = this._readableState; - var unpipeInfo = { hasUnpiped: false }; + var unpipeInfo = { + hasUnpiped: false + }; // if we're not piping anywhere, then do nothing. - // if we're not piping anywhere, then do nothing. - if (state.pipesCount === 0) return this; + if (state.pipesCount === 0) return this; // just one destination. most common case. - // just one destination. most common case. if (state.pipesCount === 1) { // passed in one, but it's not the right one. if (dest && dest !== state.pipes) return this; + if (!dest) dest = state.pipes; // got a match. - if (!dest) dest = state.pipes; - - // got a match. state.pipes = null; state.pipesCount = 0; state.flowing = false; if (dest) dest.emit('unpipe', this, unpipeInfo); return this; - } + } // slow case. multiple pipe destinations. - // slow case. multiple pipe destinations. if (!dest) { // remove all. @@ -718,80 +739,133 @@ Readable.prototype.unpipe = function (dest) { state.flowing = false; for (var i = 0; i < len; i++) { - dests[i].emit('unpipe', this, unpipeInfo); - }return this; - } + dests[i].emit('unpipe', this, { + hasUnpiped: false + }); + } + + return this; + } // try to find the right one. + - // try to find the right one. var index = indexOf(state.pipes, dest); if (index === -1) return this; - state.pipes.splice(index, 1); state.pipesCount -= 1; if (state.pipesCount === 1) state.pipes = state.pipes[0]; - dest.emit('unpipe', this, unpipeInfo); - return this; -}; - -// set up data events if they are asked for +}; // set up data events if they are asked for // Ensure readable listeners eventually get something + + Readable.prototype.on = function (ev, fn) { var res = Stream.prototype.on.call(this, ev, fn); + var state = this._readableState; if (ev === 'data') { - // Start flowing on next tick if stream isn't explicitly paused - if (this._readableState.flowing !== false) this.resume(); + // update readableListening so that resume() may be a no-op + // a few lines down. This is needed to support once('readable'). + state.readableListening = this.listenerCount('readable') > 0; // Try start flowing on next tick if stream isn't explicitly paused + + if (state.flowing !== false) this.resume(); } else if (ev === 'readable') { - var state = this._readableState; if (!state.endEmitted && !state.readableListening) { state.readableListening = state.needReadable = true; + state.flowing = false; state.emittedReadable = false; - if (!state.reading) { - pna.nextTick(nReadingNextTick, this); - } else if (state.length) { + debug('on readable', state.length, state.reading); + + if (state.length) { emitReadable(this); + } else if (!state.reading) { + process.nextTick(nReadingNextTick, this); } } } return res; }; + Readable.prototype.addListener = Readable.prototype.on; +Readable.prototype.removeListener = function (ev, fn) { + var res = Stream.prototype.removeListener.call(this, ev, fn); + + if (ev === 'readable') { + // We need to check if there is someone still listening to + // readable and reset the state. However this needs to happen + // after readable has been emitted but before I/O (nextTick) to + // support once('readable', fn) cycles. This means that calling + // resume within the same tick will have no + // effect. + process.nextTick(updateReadableListening, this); + } + + return res; +}; + +Readable.prototype.removeAllListeners = function (ev) { + var res = Stream.prototype.removeAllListeners.apply(this, arguments); + + if (ev === 'readable' || ev === undefined) { + // We need to check if there is someone still listening to + // readable and reset the state. However this needs to happen + // after readable has been emitted but before I/O (nextTick) to + // support once('readable', fn) cycles. This means that calling + // resume within the same tick will have no + // effect. + process.nextTick(updateReadableListening, this); + } + + return res; +}; + +function updateReadableListening(self) { + self._readableState.readableListening = self.listenerCount('readable') > 0; // crude way to check if we should resume + + if (self.listenerCount('data') > 0) { + self.resume(); + } +} + function nReadingNextTick(self) { debug('readable nexttick read 0'); self.read(0); -} - -// pause() and resume() are remnants of the legacy readable stream API +} // pause() and resume() are remnants of the legacy readable stream API // If the user uses them, then switch into old mode. + + Readable.prototype.resume = function () { var state = this._readableState; + if (!state.flowing) { - debug('resume'); - state.flowing = true; + debug('resume'); // we flow only if there is no one listening + // for readable, but we still have to call + // resume() + + state.flowing = !state.readableListening; resume(this, state); } + return this; }; function resume(stream, state) { if (!state.resumeScheduled) { state.resumeScheduled = true; - pna.nextTick(resume_, stream, state); + process.nextTick(resume_, stream, state); } } function resume_(stream, state) { + debug('resume', state.reading); + if (!state.reading) { - debug('resume read 0'); stream.read(0); } state.resumeScheduled = false; - state.awaitDrain = 0; stream.emit('resume'); flow(stream); if (state.flowing && !state.reading) stream.read(0); @@ -799,31 +873,36 @@ function resume_(stream, state) { Readable.prototype.pause = function () { debug('call pause flowing=%j', this._readableState.flowing); - if (false !== this._readableState.flowing) { + + if (this._readableState.flowing !== false) { debug('pause'); this._readableState.flowing = false; this.emit('pause'); } + return this; }; function flow(stream) { var state = stream._readableState; debug('flow', state.flowing); - while (state.flowing && stream.read() !== null) {} -} -// wrap an old-style stream as the async data source. + while (state.flowing && stream.read() !== null) { + ; + } +} // wrap an old-style stream as the async data source. // This is *not* part of the readable stream interface. // It is an ugly unfortunate mess of history. + + Readable.prototype.wrap = function (stream) { var _this = this; var state = this._readableState; var paused = false; - stream.on('end', function () { debug('wrapped end'); + if (state.decoder && !state.ended) { var chunk = state.decoder.end(); if (chunk && chunk.length) _this.push(chunk); @@ -831,42 +910,41 @@ Readable.prototype.wrap = function (stream) { _this.push(null); }); - stream.on('data', function (chunk) { debug('wrapped data'); - if (state.decoder) chunk = state.decoder.write(chunk); + if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode - // don't skip over falsy values in objectMode if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; var ret = _this.push(chunk); + if (!ret) { paused = true; stream.pause(); } - }); - - // proxy all the other methods. + }); // proxy all the other methods. // important when wrapping filters and duplexes. + for (var i in stream) { if (this[i] === undefined && typeof stream[i] === 'function') { - this[i] = function (method) { - return function () { + this[i] = function methodWrap(method) { + return function methodWrapReturnFunction() { return stream[method].apply(stream, arguments); }; }(i); } - } + } // proxy certain important events. + - // proxy certain important events. for (var n = 0; n < kProxyEvents.length; n++) { stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); - } - - // when we try to consume some more bytes, simply unpause the + } // when we try to consume some more bytes, simply unpause the // underlying stream. + + this._read = function (n) { debug('wrapped _read', n); + if (paused) { paused = false; stream.resume(); @@ -876,134 +954,93 @@ Readable.prototype.wrap = function (stream) { return this; }; +if (typeof Symbol === 'function') { + Readable.prototype[Symbol.asyncIterator] = function () { + emitExperimentalWarning('Readable[Symbol.asyncIterator]'); + + if (createReadableStreamAsyncIterator === undefined) { + createReadableStreamAsyncIterator = require('./internal/streams/async_iterator'); + } + + return createReadableStreamAsyncIterator(this); + }; +} + Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, - get: function () { + get: function get() { return this._readableState.highWaterMark; } }); +Object.defineProperty(Readable.prototype, 'readableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState && this._readableState.buffer; + } +}); +Object.defineProperty(Readable.prototype, 'readableFlowing', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.flowing; + }, + set: function set(state) { + if (this._readableState) { + this._readableState.flowing = state; + } + } +}); // exposed for testing purposes only. -// exposed for testing purposes only. Readable._fromList = fromList; - -// Pluck off n bytes from an array of buffers. +Object.defineProperty(Readable.prototype, 'readableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.length; + } +}); // Pluck off n bytes from an array of buffers. // Length is the combined lengths of all the buffers in the list. // This function is designed to be inlinable, so please take care when making // changes to the function body. + function fromList(n, state) { // nothing buffered if (state.length === 0) return null; - var ret; if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { // read it all, truncate the list - if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length); state.buffer.clear(); } else { // read part of list - ret = fromListPartial(n, state.buffer, state.decoder); - } - - return ret; -} - -// Extracts only enough buffered data to satisfy the amount requested. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromListPartial(n, list, hasStrings) { - var ret; - if (n < list.head.data.length) { - // slice is the same for buffers and strings - ret = list.head.data.slice(0, n); - list.head.data = list.head.data.slice(n); - } else if (n === list.head.data.length) { - // first chunk is a perfect match - ret = list.shift(); - } else { - // result spans more than one buffer - ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); - } - return ret; -} - -// Copies a specified amount of characters from the list of buffered data -// chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBufferString(n, list) { - var p = list.head; - var c = 1; - var ret = p.data; - n -= ret.length; - while (p = p.next) { - var str = p.data; - var nb = n > str.length ? str.length : n; - if (nb === str.length) ret += str;else ret += str.slice(0, n); - n -= nb; - if (n === 0) { - if (nb === str.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = str.slice(nb); - } - break; - } - ++c; - } - list.length -= c; - return ret; -} - -// Copies a specified amount of bytes from the list of buffered data chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBuffer(n, list) { - var ret = Buffer.allocUnsafe(n); - var p = list.head; - var c = 1; - p.data.copy(ret); - n -= p.data.length; - while (p = p.next) { - var buf = p.data; - var nb = n > buf.length ? buf.length : n; - buf.copy(ret, ret.length - n, 0, nb); - n -= nb; - if (n === 0) { - if (nb === buf.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = buf.slice(nb); - } - break; - } - ++c; + ret = state.buffer.consume(n, state.decoder); } - list.length -= c; return ret; } function endReadable(stream) { var state = stream._readableState; - - // If we get here before consuming all the bytes, then that is a - // bug in node. Should never happen. - if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + debug('endReadable', state.endEmitted); if (!state.endEmitted) { state.ended = true; - pna.nextTick(endReadableNT, state, stream); + process.nextTick(endReadableNT, state, stream); } } function endReadableNT(state, stream) { - // Check that we didn't get one last unshift. + debug('endReadableNT', state.endEmitted, state.length); // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; @@ -1015,5 +1052,6 @@ function indexOf(xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } + return -1; } \ No newline at end of file diff --git a/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/readable-stream/lib/_stream_transform.js index 5d1f8b876d98c..41a738c4e9359 100644 --- a/node_modules/readable-stream/lib/_stream_transform.js +++ b/node_modules/readable-stream/lib/_stream_transform.js @@ -18,7 +18,6 @@ // 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. - // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where @@ -60,40 +59,37 @@ // However, even in such a pathological case, only a single written chunk // would be consumed, and then the rest would wait (un-transformed) until // the results of the previous transformed chunk were consumed. - 'use strict'; module.exports = Transform; -var Duplex = require('./_stream_duplex'); +var _require$codes = require('../errors').codes, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, + ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ +var Duplex = require('./_stream_duplex'); -util.inherits(Transform, Duplex); +require('inherits')(Transform, Duplex); function afterTransform(er, data) { var ts = this._transformState; ts.transforming = false; - var cb = ts.writecb; - if (!cb) { - return this.emit('error', new Error('write callback called multiple times')); + if (cb === null) { + return this.emit('error', new ERR_MULTIPLE_CALLBACK()); } ts.writechunk = null; ts.writecb = null; - if (data != null) // single equals check for both `null` and `undefined` this.push(data); - cb(er); - var rs = this._readableState; rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { this._read(rs.highWaterMark); } @@ -101,9 +97,7 @@ function afterTransform(er, data) { function Transform(options) { if (!(this instanceof Transform)) return new Transform(options); - Duplex.call(this, options); - this._transformState = { afterTransform: afterTransform.bind(this), needTransform: false, @@ -111,30 +105,27 @@ function Transform(options) { writecb: null, writechunk: null, writeencoding: null - }; - - // start out asking for a readable event once data is transformed. - this._readableState.needReadable = true; + }; // start out asking for a readable event once data is transformed. - // we have implemented the _read method, and done the other things + this._readableState.needReadable = true; // we have implemented the _read method, and done the other things // that Readable wants before the first _read call, so unset the // sync guard flag. + this._readableState.sync = false; if (options) { if (typeof options.transform === 'function') this._transform = options.transform; - if (typeof options.flush === 'function') this._flush = options.flush; - } + } // When the writable side finishes, then flush out anything remaining. + - // When the writable side finishes, then flush out anything remaining. this.on('prefinish', prefinish); } function prefinish() { var _this = this; - if (typeof this._flush === 'function') { + if (typeof this._flush === 'function' && !this._readableState.destroyed) { this._flush(function (er, data) { done(_this, er, data); }); @@ -146,9 +137,7 @@ function prefinish() { Transform.prototype.push = function (chunk, encoding) { this._transformState.needTransform = false; return Duplex.prototype.push.call(this, chunk, encoding); -}; - -// This is the part where you do stuff! +}; // This is the part where you do stuff! // override this function in implementation classes. // 'chunk' is an input chunk. // @@ -158,8 +147,10 @@ Transform.prototype.push = function (chunk, encoding) { // Call `cb(err)` when you are done with this chunk. If you pass // an error, then that'll put the hurt on the whole operation. If you // never call cb(), then you'll never get another chunk. + + Transform.prototype._transform = function (chunk, encoding, cb) { - throw new Error('_transform() is not implemented'); + cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()')); }; Transform.prototype._write = function (chunk, encoding, cb) { @@ -167,20 +158,22 @@ Transform.prototype._write = function (chunk, encoding, cb) { ts.writecb = cb; ts.writechunk = chunk; ts.writeencoding = encoding; + if (!ts.transforming) { var rs = this._readableState; if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); } -}; - -// Doesn't matter what the args are here. +}; // Doesn't matter what the args are here. // _transform does all the work. // That we got here means that the readable side wants more data. + + Transform.prototype._read = function (n) { var ts = this._transformState; - if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + if (ts.writechunk !== null && !ts.transforming) { ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); } else { // mark that we need a transform, so that any data that comes in @@ -190,25 +183,19 @@ Transform.prototype._read = function (n) { }; Transform.prototype._destroy = function (err, cb) { - var _this2 = this; - Duplex.prototype._destroy.call(this, err, function (err2) { cb(err2); - _this2.emit('close'); }); }; function done(stream, er, data) { if (er) return stream.emit('error', er); - if (data != null) // single equals check for both `null` and `undefined` - stream.push(data); - + stream.push(data); // TODO(BridgeAR): Write a test for these two error cases // if there's nothing in the write buffer, then that means // that nothing more will ever be provided - if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); - - if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0(); + if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING(); return stream.push(null); } \ No newline at end of file diff --git a/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/readable-stream/lib/_stream_writable.js index b3f4e85a2f6e3..9abbad6bc2cbe 100644 --- a/node_modules/readable-stream/lib/_stream_writable.js +++ b/node_modules/readable-stream/lib/_stream_writable.js @@ -18,35 +18,29 @@ // 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. - // A bit simpler than readable streams. // Implement an async ._write(chunk, encoding, cb), and it'll handle all // the drain event emission and buffering. - 'use strict'; -/**/ - -var pna = require('process-nextick-args'); -/**/ - module.exports = Writable; - /* */ + function WriteReq(chunk, encoding, cb) { this.chunk = chunk; this.encoding = encoding; this.callback = cb; this.next = null; -} - -// It seems a linked list but it is not +} // It seems a linked list but it is not // there will be only 2 of these for each stream + + function CorkedRequest(state) { var _this = this; this.next = null; this.entry = null; + this.finish = function () { onCorkedFinish(_this, state); }; @@ -54,266 +48,243 @@ function CorkedRequest(state) { /* */ /**/ -var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; -/**/ -/**/ + var Duplex; /**/ Writable.WritableState = WritableState; - /**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ -/**/ var internalUtil = { deprecate: require('util-deprecate') }; /**/ /**/ + var Stream = require('./internal/streams/stream'); /**/ -/**/ -var Buffer = require('safe-buffer').Buffer; +var Buffer = require('buffer').Buffer; + var OurUint8Array = global.Uint8Array || function () {}; + function _uint8ArrayToBuffer(chunk) { return Buffer.from(chunk); } + function _isUint8Array(obj) { return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; } -/**/ - var destroyImpl = require('./internal/streams/destroy'); -util.inherits(Writable, Stream); +var _require = require('./internal/streams/state'), + getHighWaterMark = _require.getHighWaterMark; -function nop() {} +var _require$codes = require('../errors').codes, + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED, + ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, + ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, + ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; -function WritableState(options, stream) { - Duplex = Duplex || require('./_stream_duplex'); +require('inherits')(Writable, Stream); - options = options || {}; +function nop() {} - // Duplex streams are both readable and writable, but share +function WritableState(options, stream, isDuplex) { + Duplex = Duplex || require('./_stream_duplex'); + options = options || {}; // Duplex streams are both readable and writable, but share // the same options object. // However, some cases require setting options to different // values for the readable and the writable sides of the duplex stream. // These options can be provided separately as readableXXX and writableXXX. - var isDuplex = stream instanceof Duplex; - // object stream flag to indicate whether or not this stream + if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream // contains buffers or objects. - this.objectMode = !!options.objectMode; - if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; - - // the point at which write() starts returning false + this.objectMode = !!options.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false // Note: 0 is a valid value, means that we always return false if // the entire buffer is not flushed immediately on write() - var hwm = options.highWaterMark; - var writableHwm = options.writableHighWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // if _final has been called - // cast to ints. - this.highWaterMark = Math.floor(this.highWaterMark); + this.finalCalled = false; // drain event flag. - // if _final has been called - this.finalCalled = false; + this.needDrain = false; // at the start of calling end() - // drain event flag. - this.needDrain = false; - // at the start of calling end() - this.ending = false; - // when end() has been called, and returned - this.ended = false; - // when 'finish' is emitted - this.finished = false; + this.ending = false; // when end() has been called, and returned - // has it been destroyed - this.destroyed = false; + this.ended = false; // when 'finish' is emitted - // should we decode strings into buffers before passing to _write? + this.finished = false; // has it been destroyed + + this.destroyed = false; // should we decode strings into buffers before passing to _write? // this is here so that some node-core streams can optimize string // handling at a lower level. - var noDecode = options.decodeStrings === false; - this.decodeStrings = !noDecode; - // Crypto is kind of old and crusty. Historically, its default string + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - // not an actual buffer we keep track of, but a measurement + this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement // of how much we're waiting to get pushed to some underlying // socket or file. - this.length = 0; - // a flag to see when we're in the middle of a write. - this.writing = false; + this.length = 0; // a flag to see when we're in the middle of a write. - // when true all writes will be buffered until .uncork() call - this.corked = 0; + this.writing = false; // when true all writes will be buffered until .uncork() call - // a flag to be able to tell if the onwrite cb is called immediately, + this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. - this.sync = true; - // a flag to know if we're processing previously buffered items, which + this.sync = true; // a flag to know if we're processing previously buffered items, which // may call the _write() callback in the same tick, so that we don't // end up in an overlapped onwrite situation. - this.bufferProcessing = false; - // the callback that's passed to _write(chunk,cb) + this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { onwrite(stream, er); - }; + }; // the callback that the user supplies to write(chunk,encoding,cb) - // the callback that the user supplies to write(chunk,encoding,cb) - this.writecb = null; - // the amount that is being written when _write is called. - this.writelen = 0; + this.writecb = null; // the amount that is being written when _write is called. + this.writelen = 0; this.bufferedRequest = null; - this.lastBufferedRequest = null; - - // number of pending user-supplied write callbacks + this.lastBufferedRequest = null; // number of pending user-supplied write callbacks // this must be 0 before 'finish' can be emitted - this.pendingcb = 0; - // emit prefinish if the only thing we're waiting for is _write cbs + this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs // This is relevant for synchronous Transform streams - this.prefinished = false; - // True if the error was already emitted and should not be thrown again - this.errorEmitted = false; + this.prefinished = false; // True if the error was already emitted and should not be thrown again + + this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true. - // count buffered requests - this.bufferedRequestCount = 0; + this.emitClose = options.emitClose !== false; // count buffered requests - // allocate the first CorkedRequest, there is always + this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); } WritableState.prototype.getBuffer = function getBuffer() { var current = this.bufferedRequest; var out = []; + while (current) { out.push(current); current = current.next; } + return out; }; (function () { try { Object.defineProperty(WritableState.prototype, 'buffer', { - get: internalUtil.deprecate(function () { + get: internalUtil.deprecate(function writableStateBufferGetter() { return this.getBuffer(); }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') }); } catch (_) {} -})(); - -// Test _writableState for inheritance to account for Duplex streams, +})(); // Test _writableState for inheritance to account for Duplex streams, // whose prototype chain only points to Readable. + + var realHasInstance; + if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { realHasInstance = Function.prototype[Symbol.hasInstance]; Object.defineProperty(Writable, Symbol.hasInstance, { - value: function (object) { + value: function value(object) { if (realHasInstance.call(this, object)) return true; if (this !== Writable) return false; - return object && object._writableState instanceof WritableState; } }); } else { - realHasInstance = function (object) { + realHasInstance = function realHasInstance(object) { return object instanceof this; }; } function Writable(options) { - Duplex = Duplex || require('./_stream_duplex'); - - // Writable ctor is applied to Duplexes, too. + Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, too. // `realHasInstance` is necessary because using plain `instanceof` // would return false, as no `_writableState` property is attached. - // Trying to use the custom `instanceof` for Writable here will also break the // Node.js LazyTransform implementation, which has a non-trivial getter for // `_writableState` that would lead to infinite recursion. - if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { - return new Writable(options); - } + // Checking for a Stream.Duplex instance is faster here instead of inside + // the WritableState constructor, at least with V8 6.5 - this._writableState = new WritableState(options, this); + var isDuplex = this instanceof Duplex; + if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options); + this._writableState = new WritableState(options, this, isDuplex); // legacy. - // legacy. this.writable = true; if (options) { if (typeof options.write === 'function') this._write = options.write; - if (typeof options.writev === 'function') this._writev = options.writev; - if (typeof options.destroy === 'function') this._destroy = options.destroy; - if (typeof options.final === 'function') this._final = options.final; } Stream.call(this); -} +} // Otherwise people can pipe Writable streams, which is just wrong. + -// Otherwise people can pipe Writable streams, which is just wrong. Writable.prototype.pipe = function () { - this.emit('error', new Error('Cannot pipe, not readable')); + this.emit('error', new ERR_STREAM_CANNOT_PIPE()); }; function writeAfterEnd(stream, cb) { - var er = new Error('write after end'); - // TODO: defer error events consistently everywhere, not just the cb - stream.emit('error', er); - pna.nextTick(cb, er); -} + var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb -// Checks that a user-supplied chunk is valid, especially for the particular + stream.emit('error', er); + process.nextTick(cb, er); +} // Checks that a user-supplied chunk is valid, especially for the particular // mode the stream is in. Currently this means that `null` is never accepted // and undefined/non-string values are only allowed in object mode. + + function validChunk(stream, state, chunk, cb) { - var valid = true; - var er = false; + var er; if (chunk === null) { - er = new TypeError('May not write null values to stream'); - } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); + er = new ERR_STREAM_NULL_VALUES(); + } else if (typeof chunk !== 'string' && !state.objectMode) { + er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk); } + if (er) { stream.emit('error', er); - pna.nextTick(cb, er); - valid = false; + process.nextTick(cb, er); + return false; } - return valid; + + return true; } Writable.prototype.write = function (chunk, encoding, cb) { var state = this._writableState; var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); if (isBuf && !Buffer.isBuffer(chunk)) { @@ -326,21 +297,16 @@ Writable.prototype.write = function (chunk, encoding, cb) { } if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; - if (typeof cb !== 'function') cb = nop; - - if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { state.pendingcb++; ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); } - return ret; }; Writable.prototype.cork = function () { - var state = this._writableState; - - state.corked++; + this._writableState.corked++; }; Writable.prototype.uncork = function () { @@ -348,23 +314,33 @@ Writable.prototype.uncork = function () { if (state.corked) { state.corked--; - - if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); } }; Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { // node::ParseEncoding() requires lower case. if (typeof encoding === 'string') encoding = encoding.toLowerCase(); - if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding); this._writableState.defaultEncoding = encoding; return this; }; +Object.defineProperty(Writable.prototype, 'writableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState && this._writableState.getBuffer(); + } +}); + function decodeChunk(state, chunk, encoding) { if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { chunk = Buffer.from(chunk, encoding); } + return chunk; } @@ -373,29 +349,28 @@ Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { // because otherwise some prototype manipulation in // userland will fail enumerable: false, - get: function () { + get: function get() { return this._writableState.highWaterMark; } -}); - -// if we're already writing something, then just put this +}); // if we're already writing something, then just put this // in the queue, and wait our turn. Otherwise, call _write // If we return false, then we need a drain event, so set that flag. + function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { if (!isBuf) { var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { isBuf = true; encoding = 'buffer'; chunk = newChunk; } } - var len = state.objectMode ? 1 : chunk.length; + var len = state.objectMode ? 1 : chunk.length; state.length += len; + var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. - var ret = state.length < state.highWaterMark; - // we must ensure that previous needDrain will not be reset to false. if (!ret) state.needDrain = true; if (state.writing || state.corked) { @@ -407,11 +382,13 @@ function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { callback: cb, next: null }; + if (last) { last.next = state.lastBufferedRequest; } else { state.bufferedRequest = state.lastBufferedRequest; } + state.bufferedRequestCount += 1; } else { doWrite(stream, state, false, len, chunk, encoding, cb); @@ -425,7 +402,7 @@ function doWrite(stream, state, writev, len, chunk, encoding, cb) { state.writecb = cb; state.writing = true; state.sync = true; - if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); state.sync = false; } @@ -435,10 +412,10 @@ function onwriteError(stream, state, sync, er, cb) { if (sync) { // defer the callback if we are being called synchronously // to avoid piling up things on the stack - pna.nextTick(cb, er); - // this can emit finish, and it will always happen + process.nextTick(cb, er); // this can emit finish, and it will always happen // after error - pna.nextTick(finishMaybe, stream, state); + + process.nextTick(finishMaybe, stream, state); stream._writableState.errorEmitted = true; stream.emit('error', er); } else { @@ -446,9 +423,9 @@ function onwriteError(stream, state, sync, er, cb) { // it is async cb(er); stream._writableState.errorEmitted = true; - stream.emit('error', er); - // this can emit finish, but finish must + stream.emit('error', er); // this can emit finish, but finish must // always follow error + finishMaybe(stream, state); } } @@ -464,9 +441,8 @@ function onwrite(stream, er) { var state = stream._writableState; var sync = state.sync; var cb = state.writecb; - + if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK(); onwriteStateUpdate(state); - if (er) onwriteError(stream, state, sync, er, cb);else { // Check if we're actually ready to finish, but don't emit yet var finished = needFinish(state); @@ -476,9 +452,7 @@ function onwrite(stream, er) { } if (sync) { - /**/ - asyncWrite(afterWrite, stream, state, finished, cb); - /**/ + process.nextTick(afterWrite, stream, state, finished, cb); } else { afterWrite(stream, state, finished, cb); } @@ -490,19 +464,19 @@ function afterWrite(stream, state, finished, cb) { state.pendingcb--; cb(); finishMaybe(stream, state); -} - -// Must force callback to be called on nextTick, so that we don't +} // Must force callback to be called on nextTick, so that we don't // emit 'drain' before the write() consumer gets the 'false' return // value, and has a chance to attach a 'drain' listener. + + function onwriteDrain(stream, state) { if (state.length === 0 && state.needDrain) { state.needDrain = false; stream.emit('drain'); } -} +} // if there's something in the buffer waiting, then process it + -// if there's something in the buffer waiting, then process it function clearBuffer(stream, state) { state.bufferProcessing = true; var entry = state.bufferedRequest; @@ -513,29 +487,30 @@ function clearBuffer(stream, state) { var buffer = new Array(l); var holder = state.corkedRequestsFree; holder.entry = entry; - var count = 0; var allBuffers = true; + while (entry) { buffer[count] = entry; if (!entry.isBuf) allBuffers = false; entry = entry.next; count += 1; } - buffer.allBuffers = allBuffers; - - doWrite(stream, state, true, state.length, buffer, '', holder.finish); - // doWrite is almost always async, defer these to save a bit of time + buffer.allBuffers = allBuffers; + doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time // as the hot path ends with doWrite + state.pendingcb++; state.lastBufferedRequest = null; + if (holder.next) { state.corkedRequestsFree = holder.next; holder.next = null; } else { state.corkedRequestsFree = new CorkedRequest(state); } + state.bufferedRequestCount = 0; } else { // Slow case, write chunks one-by-one @@ -544,14 +519,13 @@ function clearBuffer(stream, state) { var encoding = entry.encoding; var cb = entry.callback; var len = state.objectMode ? 1 : chunk.length; - doWrite(stream, state, false, len, chunk, encoding, cb); entry = entry.next; - state.bufferedRequestCount--; - // if we didn't call the onwrite immediately, then + state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then // it means that we need to wait until it does. // also, that means that the chunk and cb are currently // being processed, so move the buffer counter past them. + if (state.writing) { break; } @@ -565,7 +539,7 @@ function clearBuffer(stream, state) { } Writable.prototype._write = function (chunk, encoding, cb) { - cb(new Error('_write() is not implemented')); + cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()')); }; Writable.prototype._writev = null; @@ -582,38 +556,52 @@ Writable.prototype.end = function (chunk, encoding, cb) { encoding = null; } - if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks - // .end() fully uncorks if (state.corked) { state.corked = 1; this.uncork(); - } + } // ignore unnecessary end() calls. + - // ignore unnecessary end() calls. - if (!state.ending && !state.finished) endWritable(this, state, cb); + if (!state.ending) endWritable(this, state, cb); + return this; }; +Object.defineProperty(Writable.prototype, 'writableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.length; + } +}); + function needFinish(state) { return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; } + function callFinal(stream, state) { stream._final(function (err) { state.pendingcb--; + if (err) { stream.emit('error', err); } + state.prefinished = true; stream.emit('prefinish'); finishMaybe(stream, state); }); } + function prefinish(stream, state) { if (!state.prefinished && !state.finalCalled) { - if (typeof stream._final === 'function') { + if (typeof stream._final === 'function' && !state.destroyed) { state.pendingcb++; state.finalCalled = true; - pna.nextTick(callFinal, stream, state); + process.nextTick(callFinal, stream, state); } else { state.prefinished = true; stream.emit('prefinish'); @@ -623,22 +611,27 @@ function prefinish(stream, state) { function finishMaybe(stream, state) { var need = needFinish(state); + if (need) { prefinish(stream, state); + if (state.pendingcb === 0) { state.finished = true; stream.emit('finish'); } } + return need; } function endWritable(stream, state, cb) { state.ending = true; finishMaybe(stream, state); + if (cb) { - if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + if (state.finished) process.nextTick(cb);else stream.once('finish', cb); } + state.ended = true; stream.writable = false; } @@ -646,42 +639,45 @@ function endWritable(stream, state, cb) { function onCorkedFinish(corkReq, state, err) { var entry = corkReq.entry; corkReq.entry = null; + while (entry) { var cb = entry.callback; state.pendingcb--; cb(err); entry = entry.next; - } - if (state.corkedRequestsFree) { - state.corkedRequestsFree.next = corkReq; - } else { - state.corkedRequestsFree = corkReq; - } + } // reuse the free corkReq. + + + state.corkedRequestsFree.next = corkReq; } Object.defineProperty(Writable.prototype, 'destroyed', { - get: function () { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { if (this._writableState === undefined) { return false; } + return this._writableState.destroyed; }, - set: function (value) { + set: function set(value) { // we ignore the value if the stream // has not been initialized yet if (!this._writableState) { return; - } - - // backward compatibility, the user is explicitly + } // backward compatibility, the user is explicitly // managing destroyed + + this._writableState.destroyed = value; } }); - Writable.prototype.destroy = destroyImpl.destroy; Writable.prototype._undestroy = destroyImpl.undestroy; + Writable.prototype._destroy = function (err, cb) { - this.end(); cb(err); }; \ No newline at end of file diff --git a/node_modules/readable-stream/lib/internal/streams/async_iterator.js b/node_modules/readable-stream/lib/internal/streams/async_iterator.js new file mode 100644 index 0000000000000..79a6e1e11e010 --- /dev/null +++ b/node_modules/readable-stream/lib/internal/streams/async_iterator.js @@ -0,0 +1,204 @@ +'use strict'; + +var _Object$setPrototypeO; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var finished = require('./end-of-stream'); + +var kLastResolve = Symbol('lastResolve'); +var kLastReject = Symbol('lastReject'); +var kError = Symbol('error'); +var kEnded = Symbol('ended'); +var kLastPromise = Symbol('lastPromise'); +var kHandlePromise = Symbol('handlePromise'); +var kStream = Symbol('stream'); + +function createIterResult(value, done) { + return { + value: value, + done: done + }; +} + +function readAndResolve(iter) { + var resolve = iter[kLastResolve]; + + if (resolve !== null) { + var data = iter[kStream].read(); // we defer if data is null + // we can be expecting either 'end' or + // 'error' + + if (data !== null) { + iter[kLastPromise] = null; + iter[kLastResolve] = null; + iter[kLastReject] = null; + resolve(createIterResult(data, false)); + } + } +} + +function onReadable(iter) { + // we wait for the next tick, because it might + // emit an error with process.nextTick + process.nextTick(readAndResolve, iter); +} + +function wrapForNext(lastPromise, iter) { + return function (resolve, reject) { + lastPromise.then(function () { + iter[kHandlePromise](resolve, reject); + }, reject); + }; +} + +var AsyncIteratorPrototype = Object.getPrototypeOf(function () {}); +var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = { + get stream() { + return this[kStream]; + }, + + next: function next() { + var _this = this; + + // if we have detected an error in the meanwhile + // reject straight away + var error = this[kError]; + + if (error !== null) { + return Promise.reject(error); + } + + if (this[kEnded]) { + return Promise.resolve(createIterResult(null, true)); + } + + if (this[kStream].destroyed) { + // We need to defer via nextTick because if .destroy(err) is + // called, the error will be emitted via nextTick, and + // we cannot guarantee that there is no error lingering around + // waiting to be emitted. + return new Promise(function (resolve, reject) { + process.nextTick(function () { + if (_this[kError]) { + reject(_this[kError]); + } else { + resolve(createIterResult(null, true)); + } + }); + }); + } // if we have multiple next() calls + // we will wait for the previous Promise to finish + // this logic is optimized to support for await loops, + // where next() is only called once at a time + + + var lastPromise = this[kLastPromise]; + var promise; + + if (lastPromise) { + promise = new Promise(wrapForNext(lastPromise, this)); + } else { + // fast path needed to support multiple this.push() + // without triggering the next() queue + var data = this[kStream].read(); + + if (data !== null) { + return Promise.resolve(createIterResult(data, false)); + } + + promise = new Promise(this[kHandlePromise]); + } + + this[kLastPromise] = promise; + return promise; + } +}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () { + return this; +}), _defineProperty(_Object$setPrototypeO, "return", function _return() { + var _this2 = this; + + // destroy(err, cb) is a private API + // we can guarantee we have that here, because we control the + // Readable class this is attached to + return new Promise(function (resolve, reject) { + _this2[kStream].destroy(null, function (err) { + if (err) { + reject(err); + return; + } + + resolve(createIterResult(null, true)); + }); + }); +}), _Object$setPrototypeO), AsyncIteratorPrototype); + +var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) { + var _Object$create; + + var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, { + value: stream, + writable: true + }), _defineProperty(_Object$create, kLastResolve, { + value: null, + writable: true + }), _defineProperty(_Object$create, kLastReject, { + value: null, + writable: true + }), _defineProperty(_Object$create, kError, { + value: null, + writable: true + }), _defineProperty(_Object$create, kEnded, { + value: stream._readableState.endEmitted, + writable: true + }), _defineProperty(_Object$create, kLastPromise, { + value: null, + writable: true + }), _defineProperty(_Object$create, kHandlePromise, { + value: function value(resolve, reject) { + var data = iterator[kStream].read(); + + if (data) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(data, false)); + } else { + iterator[kLastResolve] = resolve; + iterator[kLastReject] = reject; + } + }, + writable: true + }), _Object$create)); + finished(stream, function (err) { + if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { + var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise + // returned by next() and store the error + + if (reject !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + reject(err); + } + + iterator[kError] = err; + return; + } + + var resolve = iterator[kLastResolve]; + + if (resolve !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(null, true)); + } + + iterator[kEnded] = true; + }); + stream.on('readable', onReadable.bind(null, iterator)); + return iterator; +}; + +module.exports = createReadableStreamAsyncIterator; \ No newline at end of file diff --git a/node_modules/readable-stream/lib/internal/streams/buffer_list.js b/node_modules/readable-stream/lib/internal/streams/buffer_list.js new file mode 100644 index 0000000000000..ebaf5c72aa7a6 --- /dev/null +++ b/node_modules/readable-stream/lib/internal/streams/buffer_list.js @@ -0,0 +1,189 @@ +'use strict'; + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var _require = require('buffer'), + Buffer = _require.Buffer; + +var _require2 = require('util'), + inspect = _require2.inspect; + +var custom = inspect && inspect.custom || 'inspect'; + +function copyBuffer(src, target, offset) { + Buffer.prototype.copy.call(src, target, offset); +} + +module.exports = +/*#__PURE__*/ +function () { + function BufferList() { + this.head = null; + this.tail = null; + this.length = 0; + } + + var _proto = BufferList.prototype; + + _proto.push = function push(v) { + var entry = { + data: v, + next: null + }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + _proto.unshift = function unshift(v) { + var entry = { + data: v, + next: this.head + }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + _proto.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + _proto.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + _proto.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + + while (p = p.next) { + ret += s + p.data; + } + + return ret; + }; + + _proto.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + + return ret; + } // Consumes a specified amount of bytes or characters from the buffered data. + ; + + _proto.consume = function consume(n, hasStrings) { + var ret; + + if (n < this.head.data.length) { + // `slice` is the same for buffers and strings. + ret = this.head.data.slice(0, n); + this.head.data = this.head.data.slice(n); + } else if (n === this.head.data.length) { + // First chunk is a perfect match. + ret = this.shift(); + } else { + // Result spans more than one buffer. + ret = hasStrings ? this._getString(n) : this._getBuffer(n); + } + + return ret; + }; + + _proto.first = function first() { + return this.head.data; + } // Consumes a specified amount of characters from the buffered data. + ; + + _proto._getString = function _getString(n) { + var p = this.head; + var c = 1; + var ret = p.data; + n -= ret.length; + + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) this.head = p.next;else this.head = this.tail = null; + } else { + this.head = p; + p.data = str.slice(nb); + } + + break; + } + + ++c; + } + + this.length -= c; + return ret; + } // Consumes a specified amount of bytes from the buffered data. + ; + + _proto._getBuffer = function _getBuffer(n) { + var ret = Buffer.allocUnsafe(n); + var p = this.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) this.head = p.next;else this.head = this.tail = null; + } else { + this.head = p; + p.data = buf.slice(nb); + } + + break; + } + + ++c; + } + + this.length -= c; + return ret; + } // Make sure the linked list only shows the minimal necessary information. + ; + + _proto[custom] = function (_, options) { + return inspect(this, _objectSpread({}, options, { + // Only inspect one level. + depth: 0, + // It should not recurse. + customInspect: false + })); + }; + + return BufferList; +}(); \ No newline at end of file diff --git a/node_modules/readable-stream/lib/internal/streams/destroy.js b/node_modules/readable-stream/lib/internal/streams/destroy.js index 5a0a0d88cec6f..63ae49928dd95 100644 --- a/node_modules/readable-stream/lib/internal/streams/destroy.js +++ b/node_modules/readable-stream/lib/internal/streams/destroy.js @@ -1,11 +1,5 @@ -'use strict'; +'use strict'; // undocumented cb() API, needed for core, not for public API -/**/ - -var pna = require('process-nextick-args'); -/**/ - -// undocumented cb() API, needed for core, not for public API function destroy(err, cb) { var _this = this; @@ -16,37 +10,52 @@ function destroy(err, cb) { if (cb) { cb(err); } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { - pna.nextTick(emitErrorNT, this, err); + process.nextTick(emitErrorNT, this, err); } - return this; - } - // we set destroyed to true before firing error callbacks in order + return this; + } // we set destroyed to true before firing error callbacks in order // to make it re-entrance safe in case destroy() is called within callbacks + if (this._readableState) { this._readableState.destroyed = true; - } + } // if this is a duplex stream mark the writable part as destroyed as well + - // if this is a duplex stream mark the writable part as destroyed as well if (this._writableState) { this._writableState.destroyed = true; } this._destroy(err || null, function (err) { if (!cb && err) { - pna.nextTick(emitErrorNT, _this, err); + process.nextTick(emitErrorAndCloseNT, _this, err); + if (_this._writableState) { _this._writableState.errorEmitted = true; } } else if (cb) { + process.nextTick(emitCloseNT, _this); cb(err); + } else { + process.nextTick(emitCloseNT, _this); } }); return this; } +function emitErrorAndCloseNT(self, err) { + emitErrorNT(self, err); + emitCloseNT(self); +} + +function emitCloseNT(self) { + if (self._writableState && !self._writableState.emitClose) return; + if (self._readableState && !self._readableState.emitClose) return; + self.emit('close'); +} + function undestroy() { if (this._readableState) { this._readableState.destroyed = false; @@ -59,6 +68,8 @@ function undestroy() { this._writableState.destroyed = false; this._writableState.ended = false; this._writableState.ending = false; + this._writableState.finalCalled = false; + this._writableState.prefinished = false; this._writableState.finished = false; this._writableState.errorEmitted = false; } diff --git a/node_modules/readable-stream/lib/internal/streams/end-of-stream.js b/node_modules/readable-stream/lib/internal/streams/end-of-stream.js new file mode 100644 index 0000000000000..cf23d53b5af3a --- /dev/null +++ b/node_modules/readable-stream/lib/internal/streams/end-of-stream.js @@ -0,0 +1,91 @@ +// Ported from https://github.com/mafintosh/end-of-stream with +// permission from the author, Mathias Buus (@mafintosh). +'use strict'; + +var ERR_STREAM_PREMATURE_CLOSE = require('../../../errors').codes.ERR_STREAM_PREMATURE_CLOSE; + +function noop() {} + +function isRequest(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +} + +function once(callback) { + var called = false; + return function (err) { + if (called) return; + called = true; + callback.call(this, err); + }; +} + +function eos(stream, opts, callback) { + if (typeof opts === 'function') return eos(stream, null, opts); + if (!opts) opts = {}; + callback = once(callback || noop); + var ws = stream._writableState; + var rs = stream._readableState; + var readable = opts.readable || opts.readable !== false && stream.readable; + var writable = opts.writable || opts.writable !== false && stream.writable; + + var onlegacyfinish = function onlegacyfinish() { + if (!stream.writable) onfinish(); + }; + + var onfinish = function onfinish() { + writable = false; + if (!readable) callback.call(stream); + }; + + var onend = function onend() { + readable = false; + if (!writable) callback.call(stream); + }; + + var onerror = function onerror(err) { + callback.call(stream, err); + }; + + var onclose = function onclose() { + if (readable && !(rs && rs.ended)) { + return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE()); + } + + if (writable && !(ws && ws.ended)) { + return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE()); + } + }; + + var onrequest = function onrequest() { + stream.req.on('finish', onfinish); + }; + + if (isRequest(stream)) { + stream.on('complete', onfinish); + stream.on('abort', onclose); + if (stream.req) onrequest();else stream.on('request', onrequest); + } else if (writable && !ws) { + // legacy streams + stream.on('end', onlegacyfinish); + stream.on('close', onlegacyfinish); + } + + stream.on('end', onend); + stream.on('finish', onfinish); + if (opts.error !== false) stream.on('error', onerror); + stream.on('close', onclose); + return function () { + stream.removeListener('complete', onfinish); + stream.removeListener('abort', onclose); + stream.removeListener('request', onrequest); + if (stream.req) stream.req.removeListener('finish', onfinish); + stream.removeListener('end', onlegacyfinish); + stream.removeListener('close', onlegacyfinish); + stream.removeListener('finish', onfinish); + stream.removeListener('end', onend); + stream.removeListener('error', onerror); + stream.removeListener('close', onclose); + }; +} + +module.exports = eos; \ No newline at end of file diff --git a/node_modules/readable-stream/lib/internal/streams/pipeline.js b/node_modules/readable-stream/lib/internal/streams/pipeline.js new file mode 100644 index 0000000000000..6589909889c58 --- /dev/null +++ b/node_modules/readable-stream/lib/internal/streams/pipeline.js @@ -0,0 +1,97 @@ +// Ported from https://github.com/mafintosh/pump with +// permission from the author, Mathias Buus (@mafintosh). +'use strict'; + +var eos; + +function once(callback) { + var called = false; + return function () { + if (called) return; + called = true; + callback.apply(void 0, arguments); + }; +} + +var _require$codes = require('../../../errors').codes, + ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; + +function noop(err) { + // Rethrow the error if it exists to avoid swallowing it + if (err) throw err; +} + +function isRequest(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +} + +function destroyer(stream, reading, writing, callback) { + callback = once(callback); + var closed = false; + stream.on('close', function () { + closed = true; + }); + if (eos === undefined) eos = require('./end-of-stream'); + eos(stream, { + readable: reading, + writable: writing + }, function (err) { + if (err) return callback(err); + closed = true; + callback(); + }); + var destroyed = false; + return function (err) { + if (closed) return; + if (destroyed) return; + destroyed = true; // request.destroy just do .end - .abort is what we want + + if (isRequest(stream)) return stream.abort(); + if (typeof stream.destroy === 'function') return stream.destroy(); + callback(err || new ERR_STREAM_DESTROYED('pipe')); + }; +} + +function call(fn) { + fn(); +} + +function pipe(from, to) { + return from.pipe(to); +} + +function popCallback(streams) { + if (!streams.length) return noop; + if (typeof streams[streams.length - 1] !== 'function') return noop; + return streams.pop(); +} + +function pipeline() { + for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) { + streams[_key] = arguments[_key]; + } + + var callback = popCallback(streams); + if (Array.isArray(streams[0])) streams = streams[0]; + + if (streams.length < 2) { + throw new ERR_MISSING_ARGS('streams'); + } + + var error; + var destroys = streams.map(function (stream, i) { + var reading = i < streams.length - 1; + var writing = i > 0; + return destroyer(stream, reading, writing, function (err) { + if (!error) error = err; + if (err) destroys.forEach(call); + if (reading) return; + destroys.forEach(call); + callback(error); + }); + }); + return streams.reduce(pipe); +} + +module.exports = pipeline; \ No newline at end of file diff --git a/node_modules/readable-stream/lib/internal/streams/state.js b/node_modules/readable-stream/lib/internal/streams/state.js new file mode 100644 index 0000000000000..19887eb8a9070 --- /dev/null +++ b/node_modules/readable-stream/lib/internal/streams/state.js @@ -0,0 +1,27 @@ +'use strict'; + +var ERR_INVALID_OPT_VALUE = require('../../../errors').codes.ERR_INVALID_OPT_VALUE; + +function highWaterMarkFrom(options, isDuplex, duplexKey) { + return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null; +} + +function getHighWaterMark(state, options, duplexKey, isDuplex) { + var hwm = highWaterMarkFrom(options, isDuplex, duplexKey); + + if (hwm != null) { + if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) { + var name = isDuplex ? duplexKey : 'highWaterMark'; + throw new ERR_INVALID_OPT_VALUE(name, hwm); + } + + return Math.floor(hwm); + } // Default value + + + return state.objectMode ? 16 : 16 * 1024; +} + +module.exports = { + getHighWaterMark: getHighWaterMark +}; \ No newline at end of file diff --git a/node_modules/readable-stream/package.json b/node_modules/readable-stream/package.json index a5db7b61296f5..71ce7faf4b4b1 100644 --- a/node_modules/readable-stream/package.json +++ b/node_modules/readable-stream/package.json @@ -1,72 +1,69 @@ { - "_args": [ - [ - "readable-stream@2.3.6", - "/Users/rebecca/code/npm" - ] - ], - "_from": "readable-stream@2.3.6", - "_id": "readable-stream@2.3.6", + "_from": "readable-stream@3.1.1", + "_id": "readable-stream@3.1.1", "_inBundle": false, - "_integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "_integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", "_location": "/readable-stream", "_phantomChildren": {}, "_requested": { "type": "version", "registry": true, - "raw": "readable-stream@2.3.6", + "raw": "readable-stream@3.1.1", "name": "readable-stream", "escapedName": "readable-stream", - "rawSpec": "2.3.6", + "rawSpec": "3.1.1", "saveSpec": null, - "fetchSpec": "2.3.6" + "fetchSpec": "3.1.1" }, "_requiredBy": [ - "/", - "/are-we-there-yet", - "/concat-stream", - "/duplexify", - "/flush-write-stream", - "/from2", - "/fs-write-stream-atomic", - "/parallel-transform", - "/sha", - "/stream-iterate", - "/tap-mocha-reporter", - "/tap-mocha-reporter/tap-parser", - "/through2" + "#USER", + "/" ], - "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "_spec": "2.3.6", - "_where": "/Users/rebecca/code/npm", + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", + "_shasum": "ed6bbc6c5ba58b090039ff18ce670515795aeb06", + "_spec": "readable-stream@3.1.1", + "_where": "/Users/aeschright/code/cli", "browser": { "util": false, + "worker_threads": false, + "./errors": "./errors-browser.js", "./readable.js": "./readable-browser.js", - "./writable.js": "./writable-browser.js", - "./duplex.js": "./duplex-browser.js", "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js" }, "bugs": { "url": "https://github.com/nodejs/readable-stream/issues" }, + "bundleDependencies": false, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, + "deprecated": false, "description": "Streams3, a user-land copy of the stream library from Node.js", "devDependencies": { + "@babel/cli": "^7.2.0", + "@babel/core": "^7.2.0", + "@babel/polyfill": "^7.0.0", + "@babel/preset-env": "^7.2.0", + "airtap": "0.0.9", "assert": "^1.4.0", - "babel-polyfill": "^6.9.1", - "buffer": "^4.9.0", - "lolex": "^2.3.2", - "nyc": "^6.4.0", - "tap": "^0.7.0", - "tape": "^4.8.0" + "bl": "^2.0.0", + "deep-strict-equal": "^0.2.0", + "glob": "^7.1.2", + "gunzip-maybe": "^1.4.1", + "hyperquest": "^2.1.3", + "lolex": "^2.6.0", + "nyc": "^11.0.0", + "pump": "^3.0.0", + "rimraf": "^2.6.2", + "tap": "^11.0.0", + "tape": "^4.9.0", + "tar-fs": "^1.16.2", + "util-promisify": "^2.1.0" + }, + "engines": { + "node": ">= 6" }, "homepage": "https://github.com/nodejs/readable-stream#readme", "keywords": [ @@ -87,10 +84,13 @@ "url": "git://github.com/nodejs/readable-stream.git" }, "scripts": { - "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "ci": "TAP=1 tap test/parallel/*.js test/ours/*.js | tee test.tap", "cover": "nyc npm test", "report": "nyc report --reporter=lcov", - "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js" + "test": "tap -j 4 test/parallel/*.js test/ours/*.js", + "test-browser-local": "airtap --open --local -- test/browser.js", + "test-browsers": "airtap --sauce-connect --loopback airtap.local -- test/browser.js", + "update-browser-errors": "babel -o errors-browser.js errors.js" }, - "version": "2.3.6" + "version": "3.1.1" } diff --git a/node_modules/readable-stream/readable.js b/node_modules/readable-stream/readable.js index ec89ec5330649..aeec0df5b34ee 100644 --- a/node_modules/readable-stream/readable.js +++ b/node_modules/readable-stream/readable.js @@ -16,4 +16,6 @@ if (process.env.READABLE_STREAM === 'disable' && Stream) { exports.Duplex = require('./lib/_stream_duplex.js'); exports.Transform = require('./lib/_stream_transform.js'); exports.PassThrough = require('./lib/_stream_passthrough.js'); + exports.finished = require('./lib/internal/streams/end-of-stream.js'); + exports.pipeline = require('./lib/internal/streams/pipeline.js'); } diff --git a/node_modules/readable-stream/yarn.lock b/node_modules/readable-stream/yarn.lock new file mode 100644 index 0000000000000..e52970fc95b8c --- /dev/null +++ b/node_modules/readable-stream/yarn.lock @@ -0,0 +1,6423 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/cli@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.2.0.tgz#505ed8d351daee6a88918da02c046c18c8c5a24f" + integrity sha512-FLteTkEoony0DX8NbnT51CmwmLBzINdlXmiJCSqCLmqWCDA/xk8EITPWqwDnVLbuK0bsZONt/grqHnQzQ15j0Q== + dependencies: + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.1.0" + glob "^7.0.0" + lodash "^4.17.10" + mkdirp "^0.5.1" + output-file-sync "^2.0.0" + slash "^2.0.0" + source-map "^0.5.0" + optionalDependencies: + chokidar "^2.0.3" + +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.2.tgz#07adba6dde27bb5ad8d8672f15fde3e08184a687" + integrity sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.2.2" + "@babel/helpers" "^7.2.0" + "@babel/parser" "^7.2.2" + "@babel/template" "^7.2.2" + "@babel/traverse" "^7.2.2" + "@babel/types" "^7.2.2" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.10" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.2.tgz#18c816c70962640eab42fe8cae5f3947a5c65ccc" + integrity sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg== + dependencies: + "@babel/types" "^7.2.2" + jsesc "^2.5.1" + lodash "^4.17.10" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-call-delegate@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" + integrity sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ== + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-define-map@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" + integrity sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" + integrity sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz#ab2f8e8d231409f8370c883d20c335190284b963" + integrity sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/template" "^7.2.2" + "@babel/types" "^7.2.2" + lodash "^4.17.10" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" + integrity sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg== + dependencies: + lodash "^4.17.10" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz#5fc31de522ec0ef0899dc9b3e7cf6a5dd655f362" + integrity sha512-BvcDWYZRWVuDeXTYZWxekQNO5D4kO55aArwZOTFXw6rlLQA8ZaDicJR1sO47h+HrnCiDFiww0fSPV0d713KBGQ== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/helpers@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.2.0.tgz#8335f3140f3144270dc63c4732a4f8b0a50b7a21" + integrity sha512-Fr07N+ea0dMcMN8nFpuK6dUIT7/ivt9yKQdEEnjVS83tG2pHwPi03gYmk/tyuwONnZ+sY+GFFPlWGgCtW1hF9A== + dependencies: + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.5" + "@babel/types" "^7.2.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.2.tgz#37ebdbc88a2e1ebc6c8dd3d35ea9436e3e39e477" + integrity sha512-UNTmQ5cSLDeBGBl+s7JeowkqIHgmFAGBnLDdIzFmUNSuS5JF0XBcN59jsh/vJO/YjfsBqMxhMjoFGmNExmf0FA== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.2.0.tgz#88f5fec3e7ad019014c97f7ee3c992f0adbf7fb8" + integrity sha512-1L5mWLSvR76XYUQJXkd/EEQgjq8HHRP6lQuZTTg0VA4tTGPpGemmCdAfQIz1rzEuWAm+ecP8PyyEm30jC1eQCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz#abe7281fe46c95ddc143a65e5358647792039520" + integrity sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.2.0" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz#68b8a438663e88519e65b776f8938f3445b1a2ff" + integrity sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz#f17c49d91eedbcdf5dd50597d16f5f2f770132d4" + integrity sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.10" + +"@babel/plugin-transform-classes@^7.2.0", "@babel/plugin-transform-classes@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz#6c90542f210ee975aa2aa8c8b5af7fa73a126953" + integrity sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.1.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz#e75269b4b7889ec3a332cd0d0c8cff8fed0dc6f3" + integrity sha512-coVO2Ayv7g0qdDbrNiadE4bU7lvCd9H539m2gMknyVjjMdwF/iCOM7R+E8PkntoqLkltO0rk+3axhpp/0v68VQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz#f0aabb93d120a8ac61e925ea0ba440812dbe0e49" + integrity sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" + integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz#ab7468befa80f764bb03d3cb5eef8cc998e1cad9" + integrity sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz#f7930362829ff99a3174c39f0afcc024ef59731a" + integrity sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz#c4f1933f5991d5145e9cfad1dfd848ea1727f404" + integrity sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz#912bfe9e5ff982924c81d0937c92d24994bb9068" + integrity sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ== + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-new-target@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" + integrity sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz#0d5ad15dc805e2ea866df4dd6682bfe76d1408c2" + integrity sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA== + dependencies: + "@babel/helper-call-delegate" "^7.1.0" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" + integrity sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw== + dependencies: + regenerator-transform "^0.13.3" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" + integrity sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz#4eb8db16f972f8abb5062c161b8b115546ade08b" + integrity sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/polyfill@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.0.0.tgz#c8ff65c9ec3be6a1ba10113ebd40e8750fb90bff" + integrity sha512-dnrMRkyyr74CRelJwvgnnSUDh2ge2NCTyHVwpOdvRMHtJUyxLtMAfhBN3s64pY41zdw0kgiLPh6S20eb1NcX6Q== + dependencies: + core-js "^2.5.7" + regenerator-runtime "^0.11.1" + +"@babel/preset-env@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.2.0.tgz#a5030e7e4306af5a295dd5d7c78dc5464af3fee2" + integrity sha512-haGR38j5vOGVeBatrQPr3l0xHbs14505DcM57cbJy48kgMFvvHHoYEhHuRV+7vi559yyAUAVbTWzbK/B/pzJng== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.2.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.2.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.2.0" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.2.0" + "@babel/plugin-transform-classes" "^7.2.0" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.2.0" + "@babel/plugin-transform-dotall-regex" "^7.2.0" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.2.0" + "@babel/plugin-transform-function-name" "^7.2.0" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.2.0" + "@babel/plugin-transform-modules-systemjs" "^7.2.0" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-new-target" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.2.0" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.2.0" + browserslist "^4.3.4" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.3.0" + +"@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" + integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.2.2" + "@babel/types" "^7.2.2" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.2.tgz#961039de1f9bcb946d807efe2dba9c92e859d188" + integrity sha512-E5Bn9FSwHpSkUhthw/XEuvFZxIgrqb9M8cX8j5EUQtrUG5DQUy6bFyl7G7iQ1D1Czudor+xkmp81JbLVVM0Sjg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.2.2" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.2.2" + "@babel/types" "^7.2.2" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.10" + +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.2.2.tgz#44e10fc24e33af524488b716cdaee5360ea8ed1e" + integrity sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg== + dependencies: + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" + +"@sindresorhus/is@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" + integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== + +JSONStream@^1.0.3: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== + +acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.6.2.tgz#b7d7ceca6f22e6417af933a62cad4de01048d5d2" + integrity sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg== + dependencies: + acorn "^6.0.2" + acorn-dynamic-import "^4.0.0" + acorn-walk "^6.1.0" + xtend "^4.0.1" + +acorn-walk@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" + integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + +acorn@^5.2.1: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@^6.0.2: + version "6.0.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754" + integrity sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg== + +adm-zip@~0.4.x: + version "0.4.13" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.13.tgz#597e2f8cc3672151e1307d3e95cddbc75672314a" + integrity sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw== + +airtap@0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/airtap/-/airtap-0.0.9.tgz#de0b2f3c0b7371ef5fe5c65b179e0de675e4f047" + integrity sha512-TlwVCtNx6ylUfSglscKAoP5h2IdygnyjOKT50eftSDYhMfwNRZZwoAzFYimIEW8P/jcOef6VhMfm66ahpRBQ2Q== + dependencies: + batch "~0.6.1" + body-parser "~1.18.3" + browserify "~13.3.0" + browserify-istanbul "~3.0.1" + chalk "^2.3.1" + commander "~2.16.0" + compression "~1.7.1" + convert-source-map "~1.5.1" + debug "~3.1.0" + express "~4.16.2" + express-state "~1.4.0" + find-nearest-file "~1.1.0" + firefox-profile "~1.1.0" + globs-to-files "~1.0.0" + hbs "~4.0.1" + highlight.js "~9.12.0" + http-proxy "~1.17.0" + humanize-duration "~3.15.0" + load-script "~1.0.0" + lodash "~4.17.5" + mkdirp "~0.5.1" + opener "~1.4.3" + sauce-browsers "~2.0.0" + server-destroy "~1.0.1" + shell-quote "~1.6.1" + split2 "^2.2.0" + stack-mapper "~0.2.2" + stacktrace-js "~2.0.0" + superagent "~3.8.2" + tap-finished "~0.0.1" + tap-parser "~5.4.0" + watchify "~3.11.0" + wd "~1.10.0" + yamljs "~0.3.0" + +ajv@^5.1.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ajv@^6.5.5: + version "6.6.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.1.tgz#6360f5ed0d80f232cc2b294c362d5dc2e538dd61" + integrity sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + integrity sha1-126/jKlNJ24keja61EpLdKthGZE= + dependencies: + default-require-extensions "^1.0.0" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +archiver-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174" + integrity sha1-5QtMCccL89aA4y/xt5lOn52JUXQ= + dependencies: + glob "^7.0.0" + graceful-fs "^4.1.0" + lazystream "^1.0.0" + lodash "^4.8.0" + normalize-path "^2.0.0" + readable-stream "^2.0.0" + +archiver@2.1.1, archiver@~2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-2.1.1.tgz#ff662b4a78201494a3ee544d3a33fe7496509ebc" + integrity sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw= + dependencies: + archiver-utils "^1.3.0" + async "^2.0.0" + buffer-crc32 "^0.2.1" + glob "^7.0.0" + lodash "^4.8.0" + readable-stream "^2.0.0" + tar-stream "^1.5.0" + zip-stream "^1.2.0" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-map@0.0.0, array-map@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= + +array-uniq@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + dependencies: + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + integrity sha1-GdOGodntxufByF04iu28xW0zYC0= + +async@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.0.1.tgz#b709cc0280a9c36f09f4536be823c838a9049e25" + integrity sha1-twnMAoCpw28J9FNr6CPIOKkEniU= + dependencies: + lodash "^4.8.0" + +async@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + +async@^2.0.0, async@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== + dependencies: + lodash "^4.17.10" + +async@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" + integrity sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw== + dependencies: + lodash "^4.14.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +asyncreduce@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/asyncreduce/-/asyncreduce-0.1.4.tgz#18210e01978bfdcba043955497a5cd315c0a6a41" + integrity sha1-GCEOAZeL/cugQ5VUl6XNMVwKakE= + dependencies: + runnel "~0.5.0" + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.6.0, aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-generator@^6.18.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.16.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.18.0, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.18.0, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^1.0.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" + integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== + +bind-obj-methods@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bind-obj-methods/-/bind-obj-methods-2.0.0.tgz#0178140dbe7b7bb67dc74892ace59bc0247f06f0" + integrity sha512-3/qRXczDi2Cdbz6jE+W3IflJOutRVica8frpBn14de1mBOkzDo+6tY33kNhvkw54Kn3PzRRD2VnGbGPcTAk4sw== + +bl@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" + integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +bl@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-2.1.2.tgz#591182cb9f3f2eff3beb1e76dabedfb5c5fa9a26" + integrity sha512-DvC0x+PxmSJNx8wXoFV15pC2+GOJ3ohb4F1REq3X32a2Z3nEBpR1Guu740M7ouYAImFj4BXDNilLNZbygtG9lQ== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +bluebird@^3.5.1: + version "3.5.3" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" + integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +body-parser@1.18.3, body-parser@~1.18.3: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" + +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + integrity sha1-T4owBctKfjiJ90kDD9JbluAdLjE= + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + integrity sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw== + dependencies: + hoek "4.x.x" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.0, braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-pack@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.1.0.tgz#c34ba10d0b9ce162b5af227c7131c92c2ecd5774" + integrity sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA== + dependencies: + JSONStream "^1.0.3" + combine-source-map "~0.8.0" + defined "^1.0.0" + safe-buffer "^5.1.1" + through2 "^2.0.0" + umd "^3.0.0" + +browser-resolve@^1.11.0, browser-resolve@^1.7.0: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-istanbul@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/browserify-istanbul/-/browserify-istanbul-3.0.1.tgz#1a2dd63c0c81a12391a80a466fbef917eb12de07" + integrity sha1-Gi3WPAyBoSORqApGb775F+sS3gc= + dependencies: + istanbul-lib-instrument "^1.8.0" + minimatch "^3.0.4" + object-assign "^4.1.1" + through "^2.3.8" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.1.4, browserify-zlib@~0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" + integrity sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0= + dependencies: + pako "~0.2.0" + +browserify-zlib@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserify@^16.1.0: + version "16.2.3" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.2.3.tgz#7ee6e654ba4f92bce6ab3599c3485b1cc7a0ad0b" + integrity sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ== + dependencies: + JSONStream "^1.0.3" + assert "^1.4.0" + browser-pack "^6.0.1" + browser-resolve "^1.11.0" + browserify-zlib "~0.2.0" + buffer "^5.0.2" + cached-path-relative "^1.0.0" + concat-stream "^1.6.0" + console-browserify "^1.1.0" + constants-browserify "~1.0.0" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^2.0.0" + domain-browser "^1.2.0" + duplexer2 "~0.1.2" + events "^2.0.0" + glob "^7.1.0" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "^1.0.0" + inherits "~2.0.1" + insert-module-globals "^7.0.0" + labeled-stream-splicer "^2.0.0" + mkdirp "^0.5.0" + module-deps "^6.0.0" + os-browserify "~0.3.0" + parents "^1.0.1" + path-browserify "~0.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^2.0.0" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum "^1.0.0" + shell-quote "^1.6.1" + stream-browserify "^2.0.0" + stream-http "^2.0.0" + string_decoder "^1.1.1" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^2.0.0" + timers-browserify "^1.0.1" + tty-browserify "0.0.1" + url "~0.11.0" + util "~0.10.1" + vm-browserify "^1.0.0" + xtend "^4.0.0" + +browserify@~13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-13.3.0.tgz#b5a9c9020243f0c70e4675bec8223bc627e415ce" + integrity sha1-tanJAgJD8McORnW+yCI7xifkFc4= + dependencies: + JSONStream "^1.0.3" + assert "^1.4.0" + browser-pack "^6.0.1" + browser-resolve "^1.11.0" + browserify-zlib "~0.1.2" + buffer "^4.1.0" + cached-path-relative "^1.0.0" + concat-stream "~1.5.1" + console-browserify "^1.1.0" + constants-browserify "~1.0.0" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^2.0.0" + domain-browser "~1.1.0" + duplexer2 "~0.1.2" + events "~1.1.0" + glob "^7.1.0" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "~0.0.0" + inherits "~2.0.1" + insert-module-globals "^7.0.0" + labeled-stream-splicer "^2.0.0" + module-deps "^4.0.8" + os-browserify "~0.1.1" + parents "^1.0.1" + path-browserify "~0.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^2.0.0" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum "^1.0.0" + shell-quote "^1.6.1" + stream-browserify "^2.0.0" + stream-http "^2.0.0" + string_decoder "~0.10.0" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^2.0.0" + timers-browserify "^1.0.1" + tty-browserify "~0.0.0" + url "~0.11.0" + util "~0.10.1" + vm-browserify "~0.0.1" + xtend "^4.0.0" + +browserslist@^4.3.4: + version "4.3.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.3.6.tgz#0f9d9081afc66b36f477c6bdf3813f784f42396a" + integrity sha512-kMGKs4BTzRWviZ8yru18xBpx+CyHG9eqgRbj9XbE3IMgtczf4aiA0Y1YCpVdvUieKGZ03kolSPXqTcscBCb9qw== + dependencies: + caniuse-lite "^1.0.30000921" + electron-to-chromium "^1.3.92" + node-releases "^1.1.1" + +buf-compare@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buf-compare/-/buf-compare-1.0.1.tgz#fef28da8b8113a0a0db4430b0b6467b69730b34a" + integrity sha1-/vKNqLgROgoNtEMLC2Rntpcws0o= + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@^0.2.1: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + +buffer-from@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-0.1.2.tgz#15f4b9bcef012044df31142c14333caf6e0260d0" + integrity sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg== + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.1.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@^5.0.2, buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" + integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cacheable-request@^2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" + integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0= + dependencies: + clone-response "1.0.2" + get-stream "3.0.0" + http-cache-semantics "3.8.1" + keyv "3.0.0" + lowercase-keys "1.0.0" + normalize-url "2.0.1" + responselike "1.0.2" + +cached-path-relative@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" + integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg== + +caching-transform@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" + integrity sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE= + dependencies: + md5-hex "^1.2.0" + mkdirp "^0.5.1" + write-file-atomic "^1.1.4" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +caniuse-lite@^1.0.30000921: + version "1.0.30000921" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000921.tgz#7a607c1623444b22351d834e093aedda3c42fbe8" + integrity sha512-Bu09ciy0lMWLgpYC77I0YGuI8eFRBPPzaSOYJK1jTI64txCphYCqnWbxJYjHABYVt/TYX/p3jNjLBR87u1Bfpw== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.3.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chokidar@^1.0.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +chokidar@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" + integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + lodash.debounce "^4.0.8" + normalize-path "^2.1.1" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + upath "^1.0.5" + optionalDependencies: + fsevents "^1.2.2" + +chownr@^1.0.1, chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-yaml-object@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz#63fb110dc2ce1a84dc21f6d9334876d010ae8b68" + integrity sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g= + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +clone-response@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-support@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +combine-source-map@^0.8.0, combine-source-map@~0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" + integrity sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos= + dependencies: + convert-source-map "~1.1.0" + inline-source-map "~0.6.0" + lodash.memoize "~3.0.3" + source-map "~0.5.3" + +combined-stream@^1.0.6, combined-stream@~1.0.5, combined-stream@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" + integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.8.1: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + +commander@~2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" + integrity sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew== + +commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.0, component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +compress-commons@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f" + integrity sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8= + dependencies: + buffer-crc32 "^0.2.1" + crc32-stream "^2.0.0" + normalize-path "^2.0.0" + readable-stream "^2.0.0" + +compressible@~2.0.14: + version "2.0.15" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.15.tgz#857a9ab0a7e5a07d8d837ed43fe2defff64fe212" + integrity sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw== + dependencies: + mime-db ">= 1.36.0 < 2" + +compression@~1.7.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" + integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.14" + debug "2.6.9" + on-headers "~1.0.1" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concat-stream@~1.5.0, concat-stream@~1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" + integrity sha1-cIl4Yk2FavQaWnQd790mHadSwmY= + dependencies: + inherits "~2.0.1" + readable-stream "~2.0.0" + typedarray "~0.0.5" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +constants-browserify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.1.0, convert-source-map@^1.5.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@~1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" + integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA= + +convert-source-map@~1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + integrity sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU= + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +cookiejar@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" + integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-assert@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/core-assert/-/core-assert-0.2.1.tgz#f85e2cf9bfed28f773cc8b3fa5c5b69bdc02fe3f" + integrity sha1-+F4s+b/tKPdzzIs/pcW2m9wC/j8= + dependencies: + buf-compare "^1.0.0" + is-error "^2.2.0" + +core-js@^2.4.0, core-js@^2.5.7: + version "2.6.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.0.tgz#1e30793e9ee5782b307e37ffa22da0eacddd84d4" + integrity sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +coveralls@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.2.tgz#f5a0bcd90ca4e64e088b710fa8dda640aea4884f" + integrity sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw== + dependencies: + growl "~> 1.10.0" + js-yaml "^3.11.0" + lcov-parse "^0.0.10" + log-driver "^1.2.7" + minimist "^1.2.0" + request "^2.85.0" + +crc32-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4" + integrity sha1-483TtN8xaN10494/u8t7KX/pCPQ= + dependencies: + crc "^3.4.4" + readable-stream "^2.0.0" + +crc@^3.4.4: + version "3.8.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + integrity sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE= + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cryptiles@3.x.x: + version "3.1.4" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.4.tgz#769a68c95612b56faadfcebf57ac86479cbe8322" + integrity sha512-8I1sgZHfVwcSOY6mSGpVU3lw/GSIZvusg8dD2+OGehCJpOhQRLNcH0qb9upQnOH4XhgxxFJSg6E2kx95deb1Tw== + dependencies: + boom "5.x.x" + +crypto-browserify@^3.0.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= + +debug-log@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" + integrity sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8= + +debug@2.6.9, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@=3.1.0, debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" + integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== + dependencies: + ms "^2.1.1" + +decamelize@^1.0.0, decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +deep-equal@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-strict-equal@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/deep-strict-equal/-/deep-strict-equal-0.2.0.tgz#4a078147a8ab57f6a0d4f5547243cd22f44eb4e4" + integrity sha1-SgeBR6irV/ag1PVUckPNIvROtOQ= + dependencies: + core-assert "^0.2.0" + +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + integrity sha1-836hXT4T/9m0N9M+GnW1+5eHTLg= + dependencies: + strip-bom "^2.0.0" + +define-properties@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@^1.0.0, defined@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +deps-sort@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5" + integrity sha1-CRckkC6EZYJg65EHSMzNGvbiH7U= + dependencies: + JSONStream "^1.0.3" + shasum "^1.0.0" + subarg "^1.0.0" + through2 "^2.0.0" + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detective@^4.0.0: + version "4.7.1" + resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e" + integrity sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig== + dependencies: + acorn "^5.2.1" + defined "^1.0.0" + +detective@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.1.0.tgz#7a20d89236d7b331ccea65832e7123b5551bb7cb" + integrity sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ== + dependencies: + acorn-node "^1.3.0" + defined "^1.0.0" + minimist "^1.1.1" + +diff@^1.3.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" + integrity sha1-fyjS657nsVqX79ic5j3P2qPMur8= + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +domain-browser@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domain-browser@~1.1.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" + integrity sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw= + +duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" + +duplexer2@~0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds= + dependencies: + readable-stream "~1.1.9" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duplexify@^3.5.0, duplexify@^3.6.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125" + integrity sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.92: + version "1.3.92" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.92.tgz#9027b5abaea400045edd652c0e4838675c814399" + integrity sha512-En051LMzMl3/asMWGZEtU808HOoVWIpmmZx1Ep8N+TT9e7z/X8RcLeBU2kLSNLGQ+5SuKELzMx+MVuTBXk6Q9w== + +elliptic@^6.0.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" + integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + +error-ex@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.2.tgz#4ae8dbaa2bf90a8b450707b9149dcabca135520d" + integrity sha512-E1fPutRDdIj/hohG0UpT5mayXNCxXP9d+snxFsPU9X0XgccOumKraa3juDMwTUyi7+Bu5+mCGagjg4IYeNbOdw== + dependencies: + stackframe "^1.0.4" + +es-abstract@^1.5.0, es-abstract@^1.5.1: + version "1.12.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" + integrity sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA== + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== + +events-to-array@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" + integrity sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y= + +events@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-2.1.0.tgz#2a9a1e18e6106e0e812aa9ebd4a819b3c29c0ba5" + integrity sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg== + +events@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + dependencies: + fill-range "^2.1.0" + +express-state@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/express-state/-/express-state-1.4.0.tgz#3ae100132ae11fdfef836fe190cab7ba729d227d" + integrity sha1-OuEAEyrhH9/vg2/hkMq3unKdIn0= + dependencies: + serialize-javascript "^1.1.0" + +express@~4.16.2: + version "4.16.4" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" + integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.3" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.4" + qs "6.5.2" + range-parser "~1.2.0" + safe-buffer "5.1.2" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.1, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + +find-nearest-file@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-nearest-file/-/find-nearest-file-1.1.0.tgz#e29441740329a2015f7655faecd7b85e02cad686" + integrity sha512-NMsS0ITOwpBPrHOyO7YUtDhaVEGUKS0kBJDVaWZPuCzO7JMW+uzFQQVts/gPyIV9ioyNWDb5LjhHWXVf1OnBDA== + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +firefox-profile@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/firefox-profile/-/firefox-profile-1.1.0.tgz#50090d1ff62dce3052cc7f46d1243c6a487db47a" + integrity sha512-wUIE4QeAjwoHvFbomWmXgKyYtV4/oZxDcJG4znxtGGa/0BhKkd3HzeOf3tAsMWPq1ExARZxCRRiNw1BL3FuPqA== + dependencies: + adm-zip "~0.4.x" + archiver "~2.1.0" + async "~2.5.0" + fs-extra "~4.0.2" + ini "~1.3.3" + jetpack-id "1.0.0" + lazystream "~1.0.0" + lodash "~4.17.2" + minimist "^1.1.1" + uuid "^3.0.0" + xml2js "~0.4.4" + +follow-redirects@^1.0.0: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + +for-each@~0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + +foreach-shim@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/foreach-shim/-/foreach-shim-0.1.1.tgz#be61d75f46abb7176f5abd295e35885751b71d94" + integrity sha1-vmHXX0artxdvWr0pXjWIV1G3HZQ= + +foreachasync@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/foreachasync/-/foreachasync-3.0.0.tgz#5502987dc8714be3392097f32e0071c9dee07cf6" + integrity sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY= + +foreground-child@^1.3.3, foreground-child@^1.5.3, foreground-child@^1.5.6: + version "1.5.6" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" + integrity sha1-T9ca0t/elnibmApcCilZN8svXOk= + dependencies: + cross-spawn "^4" + signal-exit "^3.0.0" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@^2.3.1, form-data@~2.3.1, form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +formidable@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659" + integrity sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg== + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-exists-cached@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz#cf25554ca050dc49ae6656b41de42258989dcbce" + integrity sha1-zyVVTKBQ3EmuZla0HeQiWJidy84= + +fs-extra@~4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + dependencies: + minipass "^2.2.1" + +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.0.0, fsevents@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function-loop@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/function-loop/-/function-loop-1.0.1.tgz#8076bb305e8e6a3cceee2920765f330d190f340c" + integrity sha1-gHa7MF6OajzO7ikgdl8zDRkPNAw= + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-assigned-identifiers@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" + integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-stream@3.0.0, get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob@^5.0.10: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.5, glob@^7.0.6, glob@^7.1.0, glob@^7.1.2, glob@~7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.9.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.9.0.tgz#bde236808e987f290768a93d065060d78e6ab249" + integrity sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg== + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +globs-to-files@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/globs-to-files/-/globs-to-files-1.0.0.tgz#54490f6d1f4b9fd2de9d99445146ffb37550380d" + integrity sha1-VEkPbR9Ln9LenZlEUUb/s3VQOA0= + dependencies: + array-uniq "~1.0.2" + asyncreduce "~0.1.4" + glob "^5.0.10" + xtend "^4.0.0" + +got@^8.2.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" + integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw== + dependencies: + "@sindresorhus/is" "^0.7.0" + cacheable-request "^2.1.1" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + into-stream "^3.1.0" + is-retry-allowed "^1.1.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + mimic-response "^1.0.0" + p-cancelable "^0.4.0" + p-timeout "^2.0.1" + pify "^3.0.0" + safe-buffer "^5.1.1" + timed-out "^4.0.1" + url-parse-lax "^3.0.0" + url-to-options "^1.0.1" + +graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + +"growl@~> 1.10.0": + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +gunzip-maybe@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/gunzip-maybe/-/gunzip-maybe-1.4.1.tgz#39c72ed89d1b49ba708e18776500488902a52027" + integrity sha512-qtutIKMthNJJgeHQS7kZ9FqDq59/Wn0G2HYCRNjpup7yKfVI6/eqwpmroyZGFoCYaG+sW6psNVb4zoLADHpp2g== + dependencies: + browserify-zlib "^0.1.4" + is-deflate "^1.0.0" + is-gzip "^1.0.0" + peek-stream "^1.1.0" + pumpify "^1.3.3" + through2 "^2.0.3" + +handlebars@4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.5.tgz#92c6ed6bb164110c50d4d8d0fbddc70806c6f8e7" + integrity sha1-ksbta7FkEQxQ1NjQ+93HCAbG+Oc= + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +handlebars@^4.0.3: + version "4.0.12" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" + integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== + dependencies: + async "^2.5.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + integrity sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0= + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbol-support-x@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" + integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + +has-to-string-tag-x@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" + integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== + dependencies: + has-symbol-support-x "^1.4.1" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.1, has@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + integrity sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ== + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + +hbs@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/hbs/-/hbs-4.0.1.tgz#4bfd98650dc8c9dac44b3ca9adf9c098e8bc33b6" + integrity sha1-S/2YZQ3IydrESzyprfnAmOi8M7Y= + dependencies: + handlebars "4.0.5" + walk "2.3.9" + +highlight.js@~9.12.0: + version "9.12.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e" + integrity sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4= + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoek@4.x.x: + version "4.2.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" + integrity sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA== + +hosted-git-info@^2.1.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + +htmlescape@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" + integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E= + +http-cache-semantics@3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== + +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-proxy@~1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" + integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== + dependencies: + eventemitter3 "^3.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +https-browserify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" + integrity sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI= + +humanize-duration@~3.15.0: + version "3.15.3" + resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.15.3.tgz#600a939bd9d9a16b696e907b3fc08d1a4f15e8c9" + integrity sha512-BMz6w8p3NVa6QP9wDtqUkXfwgBqDaZ5z/np0EYdoWrLqL849Onp6JWMXMhbHtuvO9jUThLN5H1ThRQ8dUWnYkA== + +hyperquest@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/hyperquest/-/hyperquest-2.1.3.tgz#523127d7a343181b40bf324e231d2576edf52633" + integrity sha512-fUuDOrB47PqNK/BAMOS13v41UoaqIxqSLHX6CAbOD7OfT+/GCWO1/vPLfTNutOeXrv1ikuaZ3yux+33Z9vh+rw== + dependencies: + buffer-from "^0.1.1" + duplexer2 "~0.0.2" + through2 "~0.6.3" + +iconv-lite@0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.4: + version "1.1.12" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +ini@~1.3.0, ini@~1.3.3: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inline-source-map@~0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" + integrity sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU= + dependencies: + source-map "~0.5.3" + +insert-module-globals@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.0.tgz#ec87e5b42728479e327bd5c5c71611ddfb4752ba" + integrity sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw== + dependencies: + JSONStream "^1.0.3" + acorn-node "^1.5.2" + combine-source-map "^0.8.0" + concat-stream "^1.6.1" + is-buffer "^1.1.0" + path-is-absolute "^1.0.1" + process "~0.11.0" + through2 "^2.0.0" + undeclared-identifiers "^1.1.2" + xtend "^4.0.0" + +into-stream@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" + integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY= + dependencies: + from2 "^2.1.1" + p-is-promise "^1.1.0" + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" + integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.0, is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= + dependencies: + builtin-modules "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + +is-deflate@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-deflate/-/is-deflate-1.0.0.tgz#c862901c3c161fb09dac7cdc7e784f80e98f2f14" + integrity sha1-yGKQHDwWH7CdrHzcfnhPgOmPLxQ= + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= + dependencies: + is-primitive "^2.0.0" + +is-error@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.1.tgz#684a96d84076577c98f4cdb40c6d26a5123bf19c" + integrity sha1-aEqW2EB2V3yY9M20DG0mpRI78Zw= + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= + dependencies: + is-extglob "^2.1.1" + +is-gzip@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" + integrity sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM= + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + +is-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= + +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + +is-retry-allowed@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isarray@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7" + integrity sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" + integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== + +istanbul-lib-hook@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86" + integrity sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw== + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.10.0, istanbul-lib-instrument@^1.8.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" + integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A== + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.18.0" + istanbul-lib-coverage "^1.2.1" + semver "^5.3.0" + +istanbul-lib-report@^1.1.3: + version "1.1.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c" + integrity sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw== + dependencies: + istanbul-lib-coverage "^1.2.1" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.2.3: + version "1.2.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f" + integrity sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg== + dependencies: + debug "^3.1.0" + istanbul-lib-coverage "^1.2.1" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-reports@^1.4.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a" + integrity sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw== + dependencies: + handlebars "^4.0.3" + +isurl@^1.0.0-alpha5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" + integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== + dependencies: + has-to-string-tag-x "^1.2.0" + is-object "^1.0.1" + +jetpack-id@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/jetpack-id/-/jetpack-id-1.0.0.tgz#2cf9fbae46d8074fc16b7de0071c8efebca473a6" + integrity sha1-LPn7rkbYB0/Ba33gBxyO/rykc6Y= + +js-levenshtein@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.4.tgz#3a56e3cbf589ca0081eb22cd9ba0b1290a16d26e" + integrity sha512-PxfGzSs0ztShKrUYPIn5r0MtyAhYcCwmndozzpz8YObbPnD1jFxzlBGbRnX2mIu6Z13xN6+PTu05TQFnZFlzow== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@^3.11.0, js-yaml@^3.2.7, js-yaml@^3.3.1: + version "3.12.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" + integrity sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U= + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +keyv@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" + integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== + dependencies: + json-buffer "3.0.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +labeled-stream-splicer@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz#9cffa32fd99e1612fd1d86a8db962416d5292926" + integrity sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg== + dependencies: + inherits "^2.0.1" + isarray "^2.0.4" + stream-splicer "^2.0.0" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= + +lazystream@^1.0.0, lazystream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= + dependencies: + readable-stream "^2.0.5" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +lcov-parse@^0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" + integrity sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM= + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-script@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/load-script/-/load-script-1.0.0.tgz#0491939e0bee5643ee494a7e3da3d2bac70c6ca4" + integrity sha1-BJGTngvuVkPuSUp+PaPSuscMbKQ= + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.memoize@~3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" + integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8= + +lodash@4.17.10: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== + +lodash@^4.14.0, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.8.0, lodash@~4.17.2, lodash@~4.17.5: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + +log-driver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" + integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== + +lolex@^2.6.0: + version "2.7.5" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" + integrity sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q== + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lowercase-keys@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +math-random@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" + integrity sha1-izqsWIuKZuSXXjzepn97sylgH6w= + +md5-hex@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" + integrity sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ= + dependencies: + md5-o-matic "^0.1.1" + +md5-o-matic@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" + integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= + dependencies: + mimic-fn "^1.0.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== + dependencies: + source-map "^0.6.1" + +methods@^1.1.1, methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +"mime-db@>= 1.36.0 < 2", mime-db@~1.37.0: + version "1.37.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" + integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19: + version "2.1.21" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" + integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== + dependencies: + mime-db "~1.37.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + +mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +"minimatch@2 || 3", minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + +minipass@^2.2.0, minipass@^2.2.1, minipass@^2.3.0, minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +module-deps@^4.0.8: + version "4.1.1" + resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.1.1.tgz#23215833f1da13fd606ccb8087b44852dcb821fd" + integrity sha1-IyFYM/HaE/1gbMuAh7RIUty4If0= + dependencies: + JSONStream "^1.0.3" + browser-resolve "^1.7.0" + cached-path-relative "^1.0.0" + concat-stream "~1.5.0" + defined "^1.0.0" + detective "^4.0.0" + duplexer2 "^0.1.2" + inherits "^2.0.1" + parents "^1.0.0" + readable-stream "^2.0.2" + resolve "^1.1.3" + stream-combiner2 "^1.1.1" + subarg "^1.0.0" + through2 "^2.0.0" + xtend "^4.0.0" + +module-deps@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.0.tgz#d41a2e790245ce319171e4e7c4d8c73993ba3cd5" + integrity sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA== + dependencies: + JSONStream "^1.0.3" + browser-resolve "^1.7.0" + cached-path-relative "^1.0.0" + concat-stream "~1.6.0" + defined "^1.0.0" + detective "^5.0.2" + duplexer2 "^0.1.2" + inherits "^2.0.1" + parents "^1.0.0" + readable-stream "^2.0.2" + resolve "^1.4.0" + stream-combiner2 "^1.1.1" + subarg "^1.0.0" + through2 "^2.0.0" + xtend "^4.0.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +nan@^2.9.2: + version "2.11.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" + integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +needle@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= + +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-releases@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.1.tgz#8fff8aea1cfcad1fb4205f805149054fbf73cafd" + integrity sha512-2UXrBr6gvaebo5TNF84C66qyJJ6r0kxBObgZIDX3D3/mt1ADKiHux3NJPWisq0wxvJJdkjECH+9IIKYViKj71Q== + dependencies: + semver "^5.3.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-url@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" + integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== + dependencies: + prepend-http "^2.0.0" + query-string "^5.0.1" + sort-keys "^2.0.0" + +npm-bundled@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" + integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== + +npm-packlist@^1.1.6: + version "1.1.12" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" + integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +nyc@^11.0.0, nyc@^11.7.2: + version "11.9.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-11.9.0.tgz#4106e89e8fbe73623a1fc8b6ecb7abaa271ae1e4" + integrity sha512-w8OdJAhXL5izerzZMdqzYKMj/pgHJyY3qEPYBjLLxrhcVoHEY9pU5ENIiZyCgG9OR7x3VcUMoD40o6PtVpfR4g== + dependencies: + archy "^1.0.0" + arrify "^1.0.1" + caching-transform "^1.0.0" + convert-source-map "^1.5.1" + debug-log "^1.0.1" + default-require-extensions "^1.0.0" + find-cache-dir "^0.1.1" + find-up "^2.1.0" + foreground-child "^1.5.3" + glob "^7.0.6" + istanbul-lib-coverage "^1.1.2" + istanbul-lib-hook "^1.1.0" + istanbul-lib-instrument "^1.10.0" + istanbul-lib-report "^1.1.3" + istanbul-lib-source-maps "^1.2.3" + istanbul-reports "^1.4.0" + md5-hex "^1.2.0" + merge-source-map "^1.1.0" + micromatch "^3.1.10" + mkdirp "^0.5.0" + resolve-from "^2.0.0" + rimraf "^2.6.2" + signal-exit "^3.0.1" + spawn-wrap "^1.4.2" + test-exclude "^4.2.0" + yargs "11.1.0" + yargs-parser "^8.0.0" + +oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@~1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" + integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== + +object-keys@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" + integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +opener@^1.4.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + +opener@~1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" + integrity sha1-XG2ixdflgx6P+jlklQ+NZnSskLg= + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +os-browserify@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a617d8fe54" + integrity sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ= + +os-browserify@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-homedir@^1.0.0, os-homedir@^1.0.1, os-homedir@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +outpipe@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2" + integrity sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I= + dependencies: + shell-quote "^1.4.2" + +output-file-sync@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" + integrity sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ== + dependencies: + graceful-fs "^4.1.11" + is-plain-obj "^1.1.0" + mkdirp "^0.5.1" + +own-or-env@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/own-or-env/-/own-or-env-1.0.1.tgz#54ce601d3bf78236c5c65633aa1c8ec03f8007e4" + integrity sha512-y8qULRbRAlL6x2+M0vIe7jJbJx/kmUTzYonRAa2ayesR2qWLswninkVyeJe4x3IEXhdgoNodzjQRKAoEs6Fmrw== + dependencies: + own-or "^1.0.0" + +own-or@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/own-or/-/own-or-1.0.0.tgz#4e877fbeda9a2ec8000fbc0bcae39645ee8bf8dc" + integrity sha1-Tod/vtqaLsgAD7wLyuOWRe6L+Nw= + +p-cancelable@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" + integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-timeout@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" + integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== + dependencies: + p-finally "^1.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +pako@~0.2.0: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= + +pako@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.7.tgz#2473439021b57f1516c82f58be7275ad8ef1bb27" + integrity sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ== + +parents@^1.0.0, parents@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" + integrity sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E= + dependencies: + path-platform "~0.11.15" + +parse-asn1@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + integrity sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-platform@~0.11.15: + version "0.11.15" + resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" + integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I= + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +peek-stream@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/peek-stream/-/peek-stream-1.1.3.tgz#3b35d84b7ccbbd262fff31dc10da56856ead6d67" + integrity sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA== + dependencies: + buffer-from "^1.0.0" + duplexify "^3.5.0" + through2 "^2.0.3" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= + dependencies: + find-up "^1.0.0" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + +private@^0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + +process@~0.11.0: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +proxy-addr@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.8.0" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.24: + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" + integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.3.2, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" + integrity sha1-VXBbzZPF82c1MMLCy8DCs63cKG4= + +qs@6.5.2, qs@~6.5.1, qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +qs@^6.5.1: + version "6.6.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.6.0.tgz#a99c0f69a8d26bf7ef012f871cdabb0aee4424c2" + integrity sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA== + +query-string@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@~0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + integrity sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= + +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-only-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" + integrity sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A= + dependencies: + readable-stream "^2.0.2" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@>=1.0.33-1 <1.1.0-0": + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2, readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + integrity sha1-j5A0HmilPMySh4jaz80Rs265t44= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +regenerate-unicode-properties@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" + integrity sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-transform@^0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" + integrity sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA== + dependencies: + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpu-core@^4.1.3, regexpu-core@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.4.0.tgz#8d43e0d1266883969720345e70c275ee0aec0d32" + integrity sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^7.0.0" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.0.2" + +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +request@2.85.0: + version "2.85.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" + integrity sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +request@^2.85.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-from@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" + integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@^1.1.3, resolve@^1.1.4, resolve@^1.3.2, resolve@^1.4.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== + dependencies: + path-parse "^1.0.5" + +resolve@~1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" + integrity sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw== + dependencies: + path-parse "^1.0.5" + +responselike@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + +resumer@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= + dependencies: + through "~2.3.4" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= + dependencies: + align-text "^0.1.1" + +rimraf@^2.6.1, rimraf@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== + dependencies: + glob "^7.0.5" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +runnel@~0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/runnel/-/runnel-0.5.3.tgz#f9362b165a05fc6f5e46e458f77a1f7ecdc0daec" + integrity sha1-+TYrFloF/G9eRuRY93offs3A2uw= + +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sauce-browsers@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sauce-browsers/-/sauce-browsers-2.0.0.tgz#a3ecd9252fd431b499a2df37b30b78fd57136612" + integrity sha512-IW+G/5ceUFRITwSqL9L9Pyg68VJerAGK4Nf1ubiZw5oAVNvH59lpBiHEaDfbr6MyZqUfVGExfihyHmbfbnlV7A== + dependencies: + got "^8.2.0" + +sax@>=0.6.0, sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + +serialize-javascript@^1.1.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" + integrity sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ== + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +server-destroy@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" + integrity sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0= + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shasum@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" + integrity sha1-5wEjENj0F/TetXEhUOVni4euVl8= + dependencies: + json-stable-stringify "~0.0.0" + sha.js "~2.4.4" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shell-quote@^1.4.2, shell-quote@^1.6.1, shell-quote@~1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + +signal-exit@^3.0.0, signal-exit@^3.0.1, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +simple-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" + integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + integrity sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg== + dependencies: + hoek "4.x.x" + +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + dependencies: + is-plain-obj "^1.0.0" + +source-map-cjs@~0.1.31: + version "0.1.32" + resolved "https://registry.yarnpkg.com/source-map-cjs/-/source-map-cjs-0.1.32.tgz#b113f00065b484f4d3a1123ef084046a56228ce7" + integrity sha1-sRPwAGW0hPTToRI+8IQEalYijOc= + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.5: + version "0.5.9" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" + integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1, source-map@~0.5.3: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spawn-wrap@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.2.tgz#cff58e73a8224617b6561abdc32586ea0c82248c" + integrity sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg== + dependencies: + foreground-child "^1.5.6" + mkdirp "^0.5.0" + os-homedir "^1.0.1" + rimraf "^2.6.2" + signal-exit "^3.0.2" + which "^1.3.0" + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2" + integrity sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +split2@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" + integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== + dependencies: + through2 "^2.0.2" + +split@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/split/-/split-0.1.2.tgz#f0710744c453d551fc7143ead983da6014e336cc" + integrity sha1-8HEHRMRT1VH8cUPq2YPaYBTjNsw= + dependencies: + through "1" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629" + integrity sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +stack-generator@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.3.tgz#bb74385c67ffc4ccf3c4dee5831832d4e509c8a0" + integrity sha512-kdzGoqrnqsMxOEuXsXyQTmvWXZmG0f3Ql2GDx5NtmZs59sT2Bt9Vdyq0XdtxUi58q/+nxtbF9KOQ9HkV1QznGg== + dependencies: + stackframe "^1.0.4" + +stack-mapper@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stack-mapper/-/stack-mapper-0.2.2.tgz#789029054937b7d47c1b5b67612cbb1e7cfe7071" + integrity sha1-eJApBUk3t9R8G1tnYSy7Hnz+cHE= + dependencies: + array-map "0.0.0" + foreach-shim "~0.1.1" + isarray "0.0.1" + source-map-cjs "~0.1.31" + +stack-utils@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + +stackframe@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.0.4.tgz#357b24a992f9427cba6b545d96a14ed2cbca187b" + integrity sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw== + +stacktrace-gps@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-3.0.2.tgz#33f8baa4467323ab2bd1816efa279942ba431ccc" + integrity sha512-9o+nWhiz5wFnrB3hBHs2PTyYrS60M1vvpSzHxwxnIbtY2q9Nt51hZvhrG1+2AxD374ecwyS+IUwfkHRE/2zuGg== + dependencies: + source-map "0.5.6" + stackframe "^1.0.4" + +stacktrace-js@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/stacktrace-js/-/stacktrace-js-2.0.0.tgz#776ca646a95bc6c6b2b90776536a7fc72c6ddb58" + integrity sha1-d2ymRqlbxsayuQd2U2p/xyxt21g= + dependencies: + error-stack-parser "^2.0.1" + stack-generator "^2.0.1" + stacktrace-gps "^3.0.1" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + +stream-browserify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + integrity sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds= + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-combiner2@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" + integrity sha1-+02KFCDqNidk4hrUeAOXvry0HL4= + dependencies: + duplexer2 "~0.1.0" + readable-stream "^2.0.2" + +stream-http@^2.0.0: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + +stream-splicer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83" + integrity sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.2" + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string.prototype.trim@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" + integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.0" + function-bind "^1.0.2" + +string_decoder@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~0.10.0, string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" + integrity sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA== + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +subarg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + integrity sha1-9izxdYHplrSPyWVpn1TAauJouNI= + dependencies: + minimist "^1.1.0" + +superagent@~3.8.2: + version "3.8.3" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" + integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== + dependencies: + component-emitter "^1.2.0" + cookiejar "^2.1.0" + debug "^3.1.0" + extend "^3.0.0" + form-data "^2.3.1" + formidable "^1.2.0" + methods "^1.1.1" + mime "^1.4.1" + qs "^6.5.1" + readable-stream "^2.3.5" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^3.1.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +syntax-error@^1.1.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" + integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w== + dependencies: + acorn-node "^1.2.0" + +tap-finished@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tap-finished/-/tap-finished-0.0.1.tgz#08b5b543fdc04830290c6c561279552e71c4bd67" + integrity sha1-CLW1Q/3ASDApDGxWEnlVLnHEvWc= + dependencies: + tap-parser "~0.2.0" + through "~2.3.4" + +tap-mocha-reporter@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/tap-mocha-reporter/-/tap-mocha-reporter-3.0.7.tgz#235e57893b500861ea5d0924965dadfb2f05eaa7" + integrity sha512-GHVXJ38C3oPRpM3YUc43JlGdpVZYiKeT1fmAd3HH2+J+ZWwsNAUFvRRdoGsXLw9+gU9o+zXpBqhS/oXyRQYwlA== + dependencies: + color-support "^1.1.0" + debug "^2.1.3" + diff "^1.3.2" + escape-string-regexp "^1.0.3" + glob "^7.0.5" + js-yaml "^3.3.1" + tap-parser "^5.1.0" + unicode-length "^1.0.0" + optionalDependencies: + readable-stream "^2.1.5" + +tap-parser@^5.1.0, tap-parser@~5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-5.4.0.tgz#6907e89725d7b7fa6ae41ee2c464c3db43188aec" + integrity sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA== + dependencies: + events-to-array "^1.0.1" + js-yaml "^3.2.7" + optionalDependencies: + readable-stream "^2" + +tap-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-7.0.0.tgz#54db35302fda2c2ccc21954ad3be22b2cba42721" + integrity sha512-05G8/LrzqOOFvZhhAk32wsGiPZ1lfUrl+iV7+OkKgfofZxiceZWMHkKmow71YsyVQ8IvGBP2EjcIjE5gL4l5lA== + dependencies: + events-to-array "^1.0.1" + js-yaml "^3.2.7" + minipass "^2.2.0" + +tap-parser@~0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-0.2.1.tgz#8e1e823f2114ee21d032e2f31e4fb642a296f50b" + integrity sha1-jh6CPyEU7iHQMuLzHk+2QqKW9Qs= + dependencies: + split "~0.1.2" + +tap@^11.0.0: + version "11.1.5" + resolved "https://registry.yarnpkg.com/tap/-/tap-11.1.5.tgz#31bbef84c7a2ca78b2f811edf5fabd336c0ec846" + integrity sha512-rOmL7+8U5v7E8ADxFF9SYbGIrqdYPeJy8d6eFMStEXIasJ85tjv8F9M4SSry314eIvqRv/aKf/0YVrkoMj/byQ== + dependencies: + bind-obj-methods "^2.0.0" + bluebird "^3.5.1" + clean-yaml-object "^0.1.0" + color-support "^1.1.0" + coveralls "^3.0.1" + foreground-child "^1.3.3" + fs-exists-cached "^1.0.0" + function-loop "^1.0.1" + glob "^7.0.0" + isexe "^2.0.0" + js-yaml "^3.11.0" + minipass "^2.3.0" + mkdirp "^0.5.1" + nyc "^11.7.2" + opener "^1.4.1" + os-homedir "^1.0.2" + own-or "^1.0.0" + own-or-env "^1.0.1" + rimraf "^2.6.2" + signal-exit "^3.0.0" + source-map-support "^0.5.5" + stack-utils "^1.0.0" + tap-mocha-reporter "^3.0.7" + tap-parser "^7.0.0" + tmatch "^3.1.0" + trivial-deferred "^1.0.1" + tsame "^1.1.2" + write-file-atomic "^2.3.0" + yapool "^1.0.0" + +tape@^4.9.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.9.1.tgz#1173d7337e040c76fbf42ec86fcabedc9b3805c9" + integrity sha512-6fKIXknLpoe/Jp4rzHKFPpJUHDHDqn8jus99IfPnHIjyz78HYlefTGD3b5EkbQzuLfaEvmfPK3IolLgq2xT3kw== + dependencies: + deep-equal "~1.0.1" + defined "~1.0.0" + for-each "~0.3.3" + function-bind "~1.1.1" + glob "~7.1.2" + has "~1.0.3" + inherits "~2.0.3" + minimist "~1.2.0" + object-inspect "~1.6.0" + resolve "~1.7.1" + resumer "~0.0.0" + string.prototype.trim "~1.1.2" + through "~2.3.8" + +tar-fs@^1.16.2: + version "1.16.3" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" + integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw== + dependencies: + chownr "^1.0.1" + mkdirp "^0.5.1" + pump "^1.0.0" + tar-stream "^1.1.2" + +tar-stream@^1.1.2, tar-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== + dependencies: + bl "^1.0.0" + buffer-alloc "^1.2.0" + end-of-stream "^1.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.1" + xtend "^4.0.0" + +tar@^4: + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.4" + minizlib "^1.1.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +test-exclude@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" + integrity sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA== + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + +through2@^2.0.0, through2@^2.0.2, through2@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through2@~0.6.3: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through@1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/through/-/through-1.1.2.tgz#344a5425a3773314ca7e0eb6512fbafaf76c0bfe" + integrity sha1-NEpUJaN3MxTKfg62US+6+vdsC/4= + +"through@>=2.2.7 <3", through@^2.3.8, through@~2.3.4, through@~2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +timed-out@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +timers-browserify@^1.0.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" + integrity sha1-ycWLV1voQHN1y14kYtrO50NZ9B0= + dependencies: + process "~0.11.0" + +tmatch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/tmatch/-/tmatch-3.1.0.tgz#701264fd7582d0144a80c85af3358cca269c71e3" + integrity sha512-W3MSATOCN4pVu2qFxmJLIArSifeSOFqnfx9hiUaVgOmeRoI2NbU7RNga+6G+L8ojlFeQge+ZPCclWyUpQ8UeNQ== + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-buffer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tough-cookie@~2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + integrity sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA== + dependencies: + punycode "^1.4.1" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +trivial-deferred@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trivial-deferred/-/trivial-deferred-1.0.1.tgz#376d4d29d951d6368a6f7a0ae85c2f4d5e0658f3" + integrity sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM= + +tsame@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/tsame/-/tsame-1.1.2.tgz#5ce0002acf685942789c63018797a2aa5e6b03c5" + integrity sha512-ovCs24PGjmByVPr9tSIOs/yjUX9sJl0grEmOsj9dZA/UknQkgPOKcUqM84aSCvt9awHuhc/boMzTg3BHFalxWw== + +tty-browserify@0.0.1, tty-browserify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + +typedarray@^0.0.6, typedarray@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +uglify-js@^2.6: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-js@^3.1.4: + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= + +umd@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" + integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== + +undeclared-identifiers@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz#7d850a98887cff4bd0bf64999c014d08ed6d1acc" + integrity sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ== + dependencies: + acorn-node "^1.3.0" + get-assigned-identifiers "^1.2.0" + simple-concat "^1.0.0" + xtend "^4.0.1" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-length@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/unicode-length/-/unicode-length-1.0.3.tgz#5ada7a7fed51841a418a328cf149478ac8358abb" + integrity sha1-Wtp6f+1RhBpBijKM8UlHisg1irs= + dependencies: + punycode "^1.3.2" + strip-ansi "^3.0.1" + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" + integrity sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" + integrity sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg== + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +url-to-options@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" + integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= + +url@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util-promisify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53" + integrity sha1-PCI2R2xNMsX/PEcAKt18E7moKlM= + dependencies: + object.getownpropertydescriptors "^2.0.3" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@~0.10.1: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.0.0, uuid@^3.1.0, uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vargs@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/vargs/-/vargs-0.1.0.tgz#6b6184da6520cc3204ce1b407cac26d92609ebff" + integrity sha1-a2GE2mUgzDIEzhtAfKwm2SYJ6/8= + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" + integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== + +vm-browserify@~0.0.1: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= + dependencies: + indexof "0.0.1" + +walk@2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/walk/-/walk-2.3.9.tgz#31b4db6678f2ae01c39ea9fb8725a9031e558a7b" + integrity sha1-MbTbZnjyrgHDnqn7hyWpAx5Vins= + dependencies: + foreachasync "^3.0.0" + +watchify@~3.11.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.11.0.tgz#03f1355c643955e7ab8dcbf399f624644221330f" + integrity sha512-7jWG0c3cKKm2hKScnSAMUEUjRJKXUShwMPk0ASVhICycQhwND3IMAdhJYmc1mxxKzBUJTSF5HZizfrKrS6BzkA== + dependencies: + anymatch "^1.3.0" + browserify "^16.1.0" + chokidar "^1.0.0" + defined "^1.0.0" + outpipe "^1.1.0" + through2 "^2.0.0" + xtend "^4.0.0" + +wd@~1.10.0: + version "1.10.3" + resolved "https://registry.yarnpkg.com/wd/-/wd-1.10.3.tgz#395ac7eb58a98e556369f8f8e5f845d91fb152a3" + integrity sha512-ffqqZDtFFLeg5u/4pw2vYKECW+z+vW6vc+7rcqF15uu1/rmw3BydV84BONNc9DIcQ5Z7gQFS/hAuMvj53eVtSg== + dependencies: + archiver "2.1.1" + async "2.0.1" + lodash "4.17.10" + mkdirp "^0.5.1" + q "1.4.1" + request "2.85.0" + vargs "0.1.0" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^1.1.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + integrity sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8= + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write-file-atomic@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +xml2js@~0.4.4: + version "0.4.19" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" + integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== + dependencies: + sax ">=0.6.0" + xmlbuilder "~9.0.1" + +xmlbuilder@~9.0.1: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + +yamljs@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/yamljs/-/yamljs-0.3.0.tgz#dc060bf267447b39f7304e9b2bfbe8b5a7ddb03b" + integrity sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ== + dependencies: + argparse "^1.0.7" + glob "^7.0.5" + +yapool@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yapool/-/yapool-1.0.0.tgz#f693f29a315b50d9a9da2646a7a6645c96985b6a" + integrity sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o= + +yargs-parser@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" + integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ== + dependencies: + camelcase "^4.1.0" + +yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= + dependencies: + camelcase "^4.1.0" + +yargs@11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^9.0.2" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +zip-stream@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04" + integrity sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ= + dependencies: + archiver-utils "^1.3.0" + compress-commons "^1.2.0" + lodash "^4.8.0" + readable-stream "^2.0.0" diff --git a/node_modules/sha/node_modules/readable-stream/.travis.yml b/node_modules/sha/node_modules/readable-stream/.travis.yml new file mode 100644 index 0000000000000..40992555bf5cc --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/.travis.yml @@ -0,0 +1,55 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test +script: "npm run $TASK" +env: + global: + - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc= + - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI= diff --git a/node_modules/sha/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/sha/node_modules/readable-stream/CONTRIBUTING.md new file mode 100644 index 0000000000000..f478d58dca85b --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/CONTRIBUTING.md @@ -0,0 +1,38 @@ +# Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +* (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +* (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +* (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +* (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +## Moderation Policy + +The [Node.js Moderation Policy] applies to this WG. + +## Code of Conduct + +The [Node.js Code of Conduct][] applies to this WG. + +[Node.js Code of Conduct]: +https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md +[Node.js Moderation Policy]: +https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md diff --git a/node_modules/sha/node_modules/readable-stream/GOVERNANCE.md b/node_modules/sha/node_modules/readable-stream/GOVERNANCE.md new file mode 100644 index 0000000000000..16ffb93f24bec --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/GOVERNANCE.md @@ -0,0 +1,136 @@ +### Streams Working Group + +The Node.js Streams is jointly governed by a Working Group +(WG) +that is responsible for high-level guidance of the project. + +The WG has final authority over this project including: + +* Technical direction +* Project governance and process (including this policy) +* Contribution policy +* GitHub repository hosting +* Conduct guidelines +* Maintaining the list of additional Collaborators + +For the current list of WG members, see the project +[README.md](./README.md#current-project-team-members). + +### Collaborators + +The readable-stream GitHub repository is +maintained by the WG and additional Collaborators who are added by the +WG on an ongoing basis. + +Individuals making significant and valuable contributions are made +Collaborators and given commit-access to the project. These +individuals are identified by the WG and their addition as +Collaborators is discussed during the WG meeting. + +_Note:_ If you make a significant contribution and are not considered +for commit-access log an issue or contact a WG member directly and it +will be brought up in the next WG meeting. + +Modifications of the contents of the readable-stream repository are +made on +a collaborative basis. Anybody with a GitHub account may propose a +modification via pull request and it will be considered by the project +Collaborators. All pull requests must be reviewed and accepted by a +Collaborator with sufficient expertise who is able to take full +responsibility for the change. In the case of pull requests proposed +by an existing Collaborator, an additional Collaborator is required +for sign-off. Consensus should be sought if additional Collaborators +participate and there is disagreement around a particular +modification. See _Consensus Seeking Process_ below for further detail +on the consensus model used for governance. + +Collaborators may opt to elevate significant or controversial +modifications, or modifications that have not found consensus to the +WG for discussion by assigning the ***WG-agenda*** tag to a pull +request or issue. The WG should serve as the final arbiter where +required. + +For the current list of Collaborators, see the project +[README.md](./README.md#members). + +### WG Membership + +WG seats are not time-limited. There is no fixed size of the WG. +However, the expected target is between 6 and 12, to ensure adequate +coverage of important areas of expertise, balanced with the ability to +make decisions efficiently. + +There is no specific set of requirements or qualifications for WG +membership beyond these rules. + +The WG may add additional members to the WG by unanimous consensus. + +A WG member may be removed from the WG by voluntary resignation, or by +unanimous consensus of all other WG members. + +Changes to WG membership should be posted in the agenda, and may be +suggested as any other agenda item (see "WG Meetings" below). + +If an addition or removal is proposed during a meeting, and the full +WG is not in attendance to participate, then the addition or removal +is added to the agenda for the subsequent meeting. This is to ensure +that all members are given the opportunity to participate in all +membership decisions. If a WG member is unable to attend a meeting +where a planned membership decision is being made, then their consent +is assumed. + +No more than 1/3 of the WG members may be affiliated with the same +employer. If removal or resignation of a WG member, or a change of +employment by a WG member, creates a situation where more than 1/3 of +the WG membership shares an employer, then the situation must be +immediately remedied by the resignation or removal of one or more WG +members affiliated with the over-represented employer(s). + +### WG Meetings + +The WG meets occasionally on a Google Hangout On Air. A designated moderator +approved by the WG runs the meeting. Each meeting should be +published to YouTube. + +Items are added to the WG agenda that are considered contentious or +are modifications of governance, contribution policy, WG membership, +or release process. + +The intention of the agenda is not to approve or review all patches; +that should happen continuously on GitHub and be handled by the larger +group of Collaborators. + +Any community member or contributor can ask that something be added to +the next meeting's agenda by logging a GitHub Issue. Any Collaborator, +WG member or the moderator can add the item to the agenda by adding +the ***WG-agenda*** tag to the issue. + +Prior to each WG meeting the moderator will share the Agenda with +members of the WG. WG members can add any items they like to the +agenda at the beginning of each meeting. The moderator and the WG +cannot veto or remove items. + +The WG may invite persons or representatives from certain projects to +participate in a non-voting capacity. + +The moderator is responsible for summarizing the discussion of each +agenda item and sends it as a pull request after the meeting. + +### Consensus Seeking Process + +The WG follows a +[Consensus +Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) +decision-making model. + +When an agenda item has appeared to reach a consensus the moderator +will ask "Does anyone object?" as a final call for dissent from the +consensus. + +If an agenda item cannot reach a consensus a WG member can call for +either a closing vote or a vote to table the issue to the next +meeting. The call for a vote must be seconded by a majority of the WG +or else the discussion will continue. Simple majority wins. + +Note that changes to WG membership require a majority consensus. See +"WG Membership" above. diff --git a/node_modules/sha/node_modules/readable-stream/LICENSE b/node_modules/sha/node_modules/readable-stream/LICENSE new file mode 100644 index 0000000000000..2873b3b2e5950 --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/LICENSE @@ -0,0 +1,47 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/sha/node_modules/readable-stream/README.md b/node_modules/sha/node_modules/readable-stream/README.md new file mode 100644 index 0000000000000..23fe3f3e3009a --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/README.md @@ -0,0 +1,58 @@ +# readable-stream + +***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) + + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) + +```bash +npm install --save readable-stream +``` + +***Node-core streams for userland*** + +This package is a mirror of the Streams2 and Streams3 implementations in +Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html). + +If you want to guarantee a stable streams base, regardless of what version of +Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). + +As of version 2.0.0 **readable-stream** uses semantic versioning. + +# Streams Working Group + +`readable-stream` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + + +## Team Members + +* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> + - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B +* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> + - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 +* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> + - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D +* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> +* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> +* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> +* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) <matteo.collina@gmail.com> + - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E +* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) <shestak.irina@gmail.com> diff --git a/node_modules/sha/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/node_modules/sha/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md new file mode 100644 index 0000000000000..83275f192e407 --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md @@ -0,0 +1,60 @@ +# streams WG Meeting 2015-01-30 + +## Links + +* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg +* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106 +* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/ + +## Agenda + +Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting. + +* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105) +* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101) +* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102) +* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99) + +## Minutes + +### adopt a charter + +* group: +1's all around + +### What versioning scheme should be adopted? +* group: +1’s 3.0.0 +* domenic+group: pulling in patches from other sources where appropriate +* mikeal: version independently, suggesting versions for io.js +* mikeal+domenic: work with TC to notify in advance of changes +simpler stream creation + +### streamline creation of streams +* sam: streamline creation of streams +* domenic: nice simple solution posted + but, we lose the opportunity to change the model + may not be backwards incompatible (double check keys) + + **action item:** domenic will check + +### remove implicit flowing of streams on(‘data’) +* add isFlowing / isPaused +* mikeal: worrying that we’re documenting polyfill methods – confuses users +* domenic: more reflective API is probably good, with warning labels for users +* new section for mad scientists (reflective stream access) +* calvin: name the “third state” +* mikeal: maybe borrow the name from whatwg? +* domenic: we’re missing the “third state” +* consensus: kind of difficult to name the third state +* mikeal: figure out differences in states / compat +* mathias: always flow on data – eliminates third state + * explore what it breaks + +**action items:** +* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream) +* ask rod/build for infrastructure +* **chris**: explore the “flow on data” approach +* add isPaused/isFlowing +* add new docs section +* move isPaused to that section + + diff --git a/node_modules/sha/node_modules/readable-stream/duplex-browser.js b/node_modules/sha/node_modules/readable-stream/duplex-browser.js new file mode 100644 index 0000000000000..f8b2db83dbe73 --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/duplex-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_duplex.js'); diff --git a/node_modules/sha/node_modules/readable-stream/duplex.js b/node_modules/sha/node_modules/readable-stream/duplex.js new file mode 100644 index 0000000000000..46924cbfdf538 --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require('./readable').Duplex diff --git a/node_modules/sha/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/sha/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 0000000000000..a1ca813e5acbd --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,131 @@ +// 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. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; \ No newline at end of file diff --git a/node_modules/sha/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/sha/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 0000000000000..a9c835884828d --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,47 @@ +// 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. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; \ No newline at end of file diff --git a/node_modules/sha/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/sha/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 0000000000000..bf34ac65e1108 --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,1019 @@ +// 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. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); +var destroyImpl = require('./internal/streams/destroy'); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, unpipeInfo); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} \ No newline at end of file diff --git a/node_modules/sha/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/sha/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 0000000000000..5d1f8b876d98c --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,214 @@ +// 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. + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} \ No newline at end of file diff --git a/node_modules/sha/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/sha/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 0000000000000..b3f4e85a2f6e3 --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,687 @@ +// 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. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = require('./internal/streams/destroy'); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // has it been destroyed + this.destroyed = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; \ No newline at end of file diff --git a/node_modules/sha/node_modules/readable-stream/lib/internal/streams/BufferList.js b/node_modules/sha/node_modules/readable-stream/lib/internal/streams/BufferList.js new file mode 100644 index 0000000000000..aefc68bd90b9c --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/lib/internal/streams/BufferList.js @@ -0,0 +1,79 @@ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Buffer = require('safe-buffer').Buffer; +var util = require('util'); + +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} + +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; +}(); + +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} \ No newline at end of file diff --git a/node_modules/sha/node_modules/readable-stream/lib/internal/streams/destroy.js b/node_modules/sha/node_modules/readable-stream/lib/internal/streams/destroy.js new file mode 100644 index 0000000000000..5a0a0d88cec6f --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/lib/internal/streams/destroy.js @@ -0,0 +1,74 @@ +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; \ No newline at end of file diff --git a/node_modules/sha/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/node_modules/sha/node_modules/readable-stream/lib/internal/streams/stream-browser.js new file mode 100644 index 0000000000000..9332a3fdae706 --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/lib/internal/streams/stream-browser.js @@ -0,0 +1 @@ +module.exports = require('events').EventEmitter; diff --git a/node_modules/sha/node_modules/readable-stream/lib/internal/streams/stream.js b/node_modules/sha/node_modules/readable-stream/lib/internal/streams/stream.js new file mode 100644 index 0000000000000..ce2ad5b6ee57f --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/lib/internal/streams/stream.js @@ -0,0 +1 @@ +module.exports = require('stream'); diff --git a/node_modules/sha/node_modules/readable-stream/package.json b/node_modules/sha/node_modules/readable-stream/package.json new file mode 100644 index 0000000000000..3f5e9beb37c60 --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/package.json @@ -0,0 +1,81 @@ +{ + "_from": "readable-stream@^2.0.2", + "_id": "readable-stream@2.3.6", + "_inBundle": false, + "_integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "_location": "/sha/readable-stream", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "readable-stream@^2.0.2", + "name": "readable-stream", + "escapedName": "readable-stream", + "rawSpec": "^2.0.2", + "saveSpec": null, + "fetchSpec": "^2.0.2" + }, + "_requiredBy": [ + "/sha" + ], + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "_shasum": "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf", + "_spec": "readable-stream@^2.0.2", + "_where": "/Users/aeschright/code/cli/node_modules/sha", + "browser": { + "util": false, + "./readable.js": "./readable-browser.js", + "./writable.js": "./writable-browser.js", + "./duplex.js": "./duplex-browser.js", + "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js" + }, + "bugs": { + "url": "https://github.com/nodejs/readable-stream/issues" + }, + "bundleDependencies": false, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "deprecated": false, + "description": "Streams3, a user-land copy of the stream library from Node.js", + "devDependencies": { + "assert": "^1.4.0", + "babel-polyfill": "^6.9.1", + "buffer": "^4.9.0", + "lolex": "^2.3.2", + "nyc": "^6.4.0", + "tap": "^0.7.0", + "tape": "^4.8.0" + }, + "homepage": "https://github.com/nodejs/readable-stream#readme", + "keywords": [ + "readable", + "stream", + "pipe" + ], + "license": "MIT", + "main": "readable.js", + "name": "readable-stream", + "nyc": { + "include": [ + "lib/**.js" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/nodejs/readable-stream.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "cover": "nyc npm test", + "report": "nyc report --reporter=lcov", + "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js" + }, + "version": "2.3.6" +} diff --git a/node_modules/sha/node_modules/readable-stream/passthrough.js b/node_modules/sha/node_modules/readable-stream/passthrough.js new file mode 100644 index 0000000000000..ffd791d7ff275 --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require('./readable').PassThrough diff --git a/node_modules/sha/node_modules/readable-stream/readable-browser.js b/node_modules/sha/node_modules/readable-stream/readable-browser.js new file mode 100644 index 0000000000000..e50372592ee6c --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/readable-browser.js @@ -0,0 +1,7 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); diff --git a/node_modules/sha/node_modules/readable-stream/readable.js b/node_modules/sha/node_modules/readable-stream/readable.js new file mode 100644 index 0000000000000..ec89ec5330649 --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/readable.js @@ -0,0 +1,19 @@ +var Stream = require('stream'); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; + exports = module.exports = Stream.Readable; + exports.Readable = Stream.Readable; + exports.Writable = Stream.Writable; + exports.Duplex = Stream.Duplex; + exports.Transform = Stream.Transform; + exports.PassThrough = Stream.PassThrough; + exports.Stream = Stream; +} else { + exports = module.exports = require('./lib/_stream_readable.js'); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = require('./lib/_stream_writable.js'); + exports.Duplex = require('./lib/_stream_duplex.js'); + exports.Transform = require('./lib/_stream_transform.js'); + exports.PassThrough = require('./lib/_stream_passthrough.js'); +} diff --git a/node_modules/sha/node_modules/readable-stream/transform.js b/node_modules/sha/node_modules/readable-stream/transform.js new file mode 100644 index 0000000000000..b1baba26da03d --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require('./readable').Transform diff --git a/node_modules/sha/node_modules/readable-stream/writable-browser.js b/node_modules/sha/node_modules/readable-stream/writable-browser.js new file mode 100644 index 0000000000000..ebdde6a85dcb1 --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/writable-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_writable.js'); diff --git a/node_modules/sha/node_modules/readable-stream/writable.js b/node_modules/sha/node_modules/readable-stream/writable.js new file mode 100644 index 0000000000000..3211a6f80d1ab --- /dev/null +++ b/node_modules/sha/node_modules/readable-stream/writable.js @@ -0,0 +1,8 @@ +var Stream = require("stream") +var Writable = require("./lib/_stream_writable.js") + +if (process.env.READABLE_STREAM === 'disable') { + module.exports = Stream && Stream.Writable || Writable +} else { + module.exports = Writable +} diff --git a/node_modules/sha/node_modules/string_decoder/.travis.yml b/node_modules/sha/node_modules/string_decoder/.travis.yml new file mode 100644 index 0000000000000..3347a72546505 --- /dev/null +++ b/node_modules/sha/node_modules/string_decoder/.travis.yml @@ -0,0 +1,50 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test diff --git a/node_modules/sha/node_modules/string_decoder/LICENSE b/node_modules/sha/node_modules/string_decoder/LICENSE new file mode 100644 index 0000000000000..778edb20730ef --- /dev/null +++ b/node_modules/sha/node_modules/string_decoder/LICENSE @@ -0,0 +1,48 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/sha/node_modules/string_decoder/README.md b/node_modules/sha/node_modules/string_decoder/README.md new file mode 100644 index 0000000000000..5fd58315ed588 --- /dev/null +++ b/node_modules/sha/node_modules/string_decoder/README.md @@ -0,0 +1,47 @@ +# string_decoder + +***Node-core v8.9.4 string_decoder for userland*** + + +[![NPM](https://nodei.co/npm/string_decoder.png?downloads=true&downloadRank=true)](https://nodei.co/npm/string_decoder/) +[![NPM](https://nodei.co/npm-dl/string_decoder.png?&months=6&height=3)](https://nodei.co/npm/string_decoder/) + + +```bash +npm install --save string_decoder +``` + +***Node-core string_decoder for userland*** + +This package is a mirror of the string_decoder implementation in Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.9.4/docs/api/). + +As of version 1.0.0 **string_decoder** uses semantic versioning. + +## Previous versions + +Previous version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. + +## Update + +The *build/* directory contains a build script that will scrape the source from the [nodejs/node](https://github.com/nodejs/node) repo given a specific Node version. + +## Streams Working Group + +`string_decoder` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + +See [readable-stream](https://github.com/nodejs/readable-stream) for +more details. diff --git a/node_modules/sha/node_modules/string_decoder/lib/string_decoder.js b/node_modules/sha/node_modules/string_decoder/lib/string_decoder.js new file mode 100644 index 0000000000000..2e89e63f7933e --- /dev/null +++ b/node_modules/sha/node_modules/string_decoder/lib/string_decoder.js @@ -0,0 +1,296 @@ +// 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. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} \ No newline at end of file diff --git a/node_modules/sha/node_modules/string_decoder/package.json b/node_modules/sha/node_modules/string_decoder/package.json new file mode 100644 index 0000000000000..8bd2cfa9ab49d --- /dev/null +++ b/node_modules/sha/node_modules/string_decoder/package.json @@ -0,0 +1,59 @@ +{ + "_from": "string_decoder@~1.1.1", + "_id": "string_decoder@1.1.1", + "_inBundle": false, + "_integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "_location": "/sha/string_decoder", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "string_decoder@~1.1.1", + "name": "string_decoder", + "escapedName": "string_decoder", + "rawSpec": "~1.1.1", + "saveSpec": null, + "fetchSpec": "~1.1.1" + }, + "_requiredBy": [ + "/sha/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "_shasum": "9cf1611ba62685d7030ae9e4ba34149c3af03fc8", + "_spec": "string_decoder@~1.1.1", + "_where": "/Users/aeschright/code/cli/node_modules/sha/node_modules/readable-stream", + "bugs": { + "url": "https://github.com/nodejs/string_decoder/issues" + }, + "bundleDependencies": false, + "dependencies": { + "safe-buffer": "~5.1.0" + }, + "deprecated": false, + "description": "The string_decoder module from Node core", + "devDependencies": { + "babel-polyfill": "^6.23.0", + "core-util-is": "^1.0.2", + "inherits": "^2.0.3", + "tap": "~0.4.8" + }, + "homepage": "https://github.com/nodejs/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT", + "main": "lib/string_decoder.js", + "name": "string_decoder", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/string_decoder.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "test": "tap test/parallel/*.js && node test/verify-dependencies" + }, + "version": "1.1.1" +} diff --git a/node_modules/stream-iterate/node_modules/readable-stream/.travis.yml b/node_modules/stream-iterate/node_modules/readable-stream/.travis.yml new file mode 100644 index 0000000000000..40992555bf5cc --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/.travis.yml @@ -0,0 +1,55 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test +script: "npm run $TASK" +env: + global: + - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc= + - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI= diff --git a/node_modules/stream-iterate/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/stream-iterate/node_modules/readable-stream/CONTRIBUTING.md new file mode 100644 index 0000000000000..f478d58dca85b --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/CONTRIBUTING.md @@ -0,0 +1,38 @@ +# Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +* (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +* (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +* (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +* (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +## Moderation Policy + +The [Node.js Moderation Policy] applies to this WG. + +## Code of Conduct + +The [Node.js Code of Conduct][] applies to this WG. + +[Node.js Code of Conduct]: +https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md +[Node.js Moderation Policy]: +https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md diff --git a/node_modules/stream-iterate/node_modules/readable-stream/GOVERNANCE.md b/node_modules/stream-iterate/node_modules/readable-stream/GOVERNANCE.md new file mode 100644 index 0000000000000..16ffb93f24bec --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/GOVERNANCE.md @@ -0,0 +1,136 @@ +### Streams Working Group + +The Node.js Streams is jointly governed by a Working Group +(WG) +that is responsible for high-level guidance of the project. + +The WG has final authority over this project including: + +* Technical direction +* Project governance and process (including this policy) +* Contribution policy +* GitHub repository hosting +* Conduct guidelines +* Maintaining the list of additional Collaborators + +For the current list of WG members, see the project +[README.md](./README.md#current-project-team-members). + +### Collaborators + +The readable-stream GitHub repository is +maintained by the WG and additional Collaborators who are added by the +WG on an ongoing basis. + +Individuals making significant and valuable contributions are made +Collaborators and given commit-access to the project. These +individuals are identified by the WG and their addition as +Collaborators is discussed during the WG meeting. + +_Note:_ If you make a significant contribution and are not considered +for commit-access log an issue or contact a WG member directly and it +will be brought up in the next WG meeting. + +Modifications of the contents of the readable-stream repository are +made on +a collaborative basis. Anybody with a GitHub account may propose a +modification via pull request and it will be considered by the project +Collaborators. All pull requests must be reviewed and accepted by a +Collaborator with sufficient expertise who is able to take full +responsibility for the change. In the case of pull requests proposed +by an existing Collaborator, an additional Collaborator is required +for sign-off. Consensus should be sought if additional Collaborators +participate and there is disagreement around a particular +modification. See _Consensus Seeking Process_ below for further detail +on the consensus model used for governance. + +Collaborators may opt to elevate significant or controversial +modifications, or modifications that have not found consensus to the +WG for discussion by assigning the ***WG-agenda*** tag to a pull +request or issue. The WG should serve as the final arbiter where +required. + +For the current list of Collaborators, see the project +[README.md](./README.md#members). + +### WG Membership + +WG seats are not time-limited. There is no fixed size of the WG. +However, the expected target is between 6 and 12, to ensure adequate +coverage of important areas of expertise, balanced with the ability to +make decisions efficiently. + +There is no specific set of requirements or qualifications for WG +membership beyond these rules. + +The WG may add additional members to the WG by unanimous consensus. + +A WG member may be removed from the WG by voluntary resignation, or by +unanimous consensus of all other WG members. + +Changes to WG membership should be posted in the agenda, and may be +suggested as any other agenda item (see "WG Meetings" below). + +If an addition or removal is proposed during a meeting, and the full +WG is not in attendance to participate, then the addition or removal +is added to the agenda for the subsequent meeting. This is to ensure +that all members are given the opportunity to participate in all +membership decisions. If a WG member is unable to attend a meeting +where a planned membership decision is being made, then their consent +is assumed. + +No more than 1/3 of the WG members may be affiliated with the same +employer. If removal or resignation of a WG member, or a change of +employment by a WG member, creates a situation where more than 1/3 of +the WG membership shares an employer, then the situation must be +immediately remedied by the resignation or removal of one or more WG +members affiliated with the over-represented employer(s). + +### WG Meetings + +The WG meets occasionally on a Google Hangout On Air. A designated moderator +approved by the WG runs the meeting. Each meeting should be +published to YouTube. + +Items are added to the WG agenda that are considered contentious or +are modifications of governance, contribution policy, WG membership, +or release process. + +The intention of the agenda is not to approve or review all patches; +that should happen continuously on GitHub and be handled by the larger +group of Collaborators. + +Any community member or contributor can ask that something be added to +the next meeting's agenda by logging a GitHub Issue. Any Collaborator, +WG member or the moderator can add the item to the agenda by adding +the ***WG-agenda*** tag to the issue. + +Prior to each WG meeting the moderator will share the Agenda with +members of the WG. WG members can add any items they like to the +agenda at the beginning of each meeting. The moderator and the WG +cannot veto or remove items. + +The WG may invite persons or representatives from certain projects to +participate in a non-voting capacity. + +The moderator is responsible for summarizing the discussion of each +agenda item and sends it as a pull request after the meeting. + +### Consensus Seeking Process + +The WG follows a +[Consensus +Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) +decision-making model. + +When an agenda item has appeared to reach a consensus the moderator +will ask "Does anyone object?" as a final call for dissent from the +consensus. + +If an agenda item cannot reach a consensus a WG member can call for +either a closing vote or a vote to table the issue to the next +meeting. The call for a vote must be seconded by a majority of the WG +or else the discussion will continue. Simple majority wins. + +Note that changes to WG membership require a majority consensus. See +"WG Membership" above. diff --git a/node_modules/stream-iterate/node_modules/readable-stream/LICENSE b/node_modules/stream-iterate/node_modules/readable-stream/LICENSE new file mode 100644 index 0000000000000..2873b3b2e5950 --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/LICENSE @@ -0,0 +1,47 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/stream-iterate/node_modules/readable-stream/README.md b/node_modules/stream-iterate/node_modules/readable-stream/README.md new file mode 100644 index 0000000000000..23fe3f3e3009a --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/README.md @@ -0,0 +1,58 @@ +# readable-stream + +***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) + + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) + +```bash +npm install --save readable-stream +``` + +***Node-core streams for userland*** + +This package is a mirror of the Streams2 and Streams3 implementations in +Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html). + +If you want to guarantee a stable streams base, regardless of what version of +Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). + +As of version 2.0.0 **readable-stream** uses semantic versioning. + +# Streams Working Group + +`readable-stream` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + + +## Team Members + +* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> + - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B +* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> + - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 +* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> + - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D +* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> +* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> +* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> +* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) <matteo.collina@gmail.com> + - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E +* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) <shestak.irina@gmail.com> diff --git a/node_modules/stream-iterate/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/node_modules/stream-iterate/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md new file mode 100644 index 0000000000000..83275f192e407 --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md @@ -0,0 +1,60 @@ +# streams WG Meeting 2015-01-30 + +## Links + +* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg +* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106 +* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/ + +## Agenda + +Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting. + +* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105) +* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101) +* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102) +* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99) + +## Minutes + +### adopt a charter + +* group: +1's all around + +### What versioning scheme should be adopted? +* group: +1’s 3.0.0 +* domenic+group: pulling in patches from other sources where appropriate +* mikeal: version independently, suggesting versions for io.js +* mikeal+domenic: work with TC to notify in advance of changes +simpler stream creation + +### streamline creation of streams +* sam: streamline creation of streams +* domenic: nice simple solution posted + but, we lose the opportunity to change the model + may not be backwards incompatible (double check keys) + + **action item:** domenic will check + +### remove implicit flowing of streams on(‘data’) +* add isFlowing / isPaused +* mikeal: worrying that we’re documenting polyfill methods – confuses users +* domenic: more reflective API is probably good, with warning labels for users +* new section for mad scientists (reflective stream access) +* calvin: name the “third state” +* mikeal: maybe borrow the name from whatwg? +* domenic: we’re missing the “third state” +* consensus: kind of difficult to name the third state +* mikeal: figure out differences in states / compat +* mathias: always flow on data – eliminates third state + * explore what it breaks + +**action items:** +* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream) +* ask rod/build for infrastructure +* **chris**: explore the “flow on data” approach +* add isPaused/isFlowing +* add new docs section +* move isPaused to that section + + diff --git a/node_modules/stream-iterate/node_modules/readable-stream/duplex-browser.js b/node_modules/stream-iterate/node_modules/readable-stream/duplex-browser.js new file mode 100644 index 0000000000000..f8b2db83dbe73 --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/duplex-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_duplex.js'); diff --git a/node_modules/stream-iterate/node_modules/readable-stream/duplex.js b/node_modules/stream-iterate/node_modules/readable-stream/duplex.js new file mode 100644 index 0000000000000..46924cbfdf538 --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require('./readable').Duplex diff --git a/node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 0000000000000..a1ca813e5acbd --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,131 @@ +// 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. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; \ No newline at end of file diff --git a/node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 0000000000000..a9c835884828d --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,47 @@ +// 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. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; \ No newline at end of file diff --git a/node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 0000000000000..bf34ac65e1108 --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,1019 @@ +// 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. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); +var destroyImpl = require('./internal/streams/destroy'); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, unpipeInfo); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} \ No newline at end of file diff --git a/node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 0000000000000..5d1f8b876d98c --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,214 @@ +// 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. + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} \ No newline at end of file diff --git a/node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 0000000000000..b3f4e85a2f6e3 --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,687 @@ +// 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. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = require('./internal/streams/destroy'); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // has it been destroyed + this.destroyed = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; \ No newline at end of file diff --git a/node_modules/stream-iterate/node_modules/readable-stream/lib/internal/streams/BufferList.js b/node_modules/stream-iterate/node_modules/readable-stream/lib/internal/streams/BufferList.js new file mode 100644 index 0000000000000..aefc68bd90b9c --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/lib/internal/streams/BufferList.js @@ -0,0 +1,79 @@ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Buffer = require('safe-buffer').Buffer; +var util = require('util'); + +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} + +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; +}(); + +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} \ No newline at end of file diff --git a/node_modules/stream-iterate/node_modules/readable-stream/lib/internal/streams/destroy.js b/node_modules/stream-iterate/node_modules/readable-stream/lib/internal/streams/destroy.js new file mode 100644 index 0000000000000..5a0a0d88cec6f --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/lib/internal/streams/destroy.js @@ -0,0 +1,74 @@ +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; \ No newline at end of file diff --git a/node_modules/stream-iterate/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/node_modules/stream-iterate/node_modules/readable-stream/lib/internal/streams/stream-browser.js new file mode 100644 index 0000000000000..9332a3fdae706 --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/lib/internal/streams/stream-browser.js @@ -0,0 +1 @@ +module.exports = require('events').EventEmitter; diff --git a/node_modules/stream-iterate/node_modules/readable-stream/lib/internal/streams/stream.js b/node_modules/stream-iterate/node_modules/readable-stream/lib/internal/streams/stream.js new file mode 100644 index 0000000000000..ce2ad5b6ee57f --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/lib/internal/streams/stream.js @@ -0,0 +1 @@ +module.exports = require('stream'); diff --git a/node_modules/stream-iterate/node_modules/readable-stream/package.json b/node_modules/stream-iterate/node_modules/readable-stream/package.json new file mode 100644 index 0000000000000..2d5b4eae1d900 --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/package.json @@ -0,0 +1,81 @@ +{ + "_from": "readable-stream@^2.1.5", + "_id": "readable-stream@2.3.6", + "_inBundle": false, + "_integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "_location": "/stream-iterate/readable-stream", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "readable-stream@^2.1.5", + "name": "readable-stream", + "escapedName": "readable-stream", + "rawSpec": "^2.1.5", + "saveSpec": null, + "fetchSpec": "^2.1.5" + }, + "_requiredBy": [ + "/stream-iterate" + ], + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "_shasum": "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf", + "_spec": "readable-stream@^2.1.5", + "_where": "/Users/aeschright/code/cli/node_modules/stream-iterate", + "browser": { + "util": false, + "./readable.js": "./readable-browser.js", + "./writable.js": "./writable-browser.js", + "./duplex.js": "./duplex-browser.js", + "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js" + }, + "bugs": { + "url": "https://github.com/nodejs/readable-stream/issues" + }, + "bundleDependencies": false, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "deprecated": false, + "description": "Streams3, a user-land copy of the stream library from Node.js", + "devDependencies": { + "assert": "^1.4.0", + "babel-polyfill": "^6.9.1", + "buffer": "^4.9.0", + "lolex": "^2.3.2", + "nyc": "^6.4.0", + "tap": "^0.7.0", + "tape": "^4.8.0" + }, + "homepage": "https://github.com/nodejs/readable-stream#readme", + "keywords": [ + "readable", + "stream", + "pipe" + ], + "license": "MIT", + "main": "readable.js", + "name": "readable-stream", + "nyc": { + "include": [ + "lib/**.js" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/nodejs/readable-stream.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "cover": "nyc npm test", + "report": "nyc report --reporter=lcov", + "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js" + }, + "version": "2.3.6" +} diff --git a/node_modules/stream-iterate/node_modules/readable-stream/passthrough.js b/node_modules/stream-iterate/node_modules/readable-stream/passthrough.js new file mode 100644 index 0000000000000..ffd791d7ff275 --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require('./readable').PassThrough diff --git a/node_modules/stream-iterate/node_modules/readable-stream/readable-browser.js b/node_modules/stream-iterate/node_modules/readable-stream/readable-browser.js new file mode 100644 index 0000000000000..e50372592ee6c --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/readable-browser.js @@ -0,0 +1,7 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); diff --git a/node_modules/stream-iterate/node_modules/readable-stream/readable.js b/node_modules/stream-iterate/node_modules/readable-stream/readable.js new file mode 100644 index 0000000000000..ec89ec5330649 --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/readable.js @@ -0,0 +1,19 @@ +var Stream = require('stream'); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; + exports = module.exports = Stream.Readable; + exports.Readable = Stream.Readable; + exports.Writable = Stream.Writable; + exports.Duplex = Stream.Duplex; + exports.Transform = Stream.Transform; + exports.PassThrough = Stream.PassThrough; + exports.Stream = Stream; +} else { + exports = module.exports = require('./lib/_stream_readable.js'); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = require('./lib/_stream_writable.js'); + exports.Duplex = require('./lib/_stream_duplex.js'); + exports.Transform = require('./lib/_stream_transform.js'); + exports.PassThrough = require('./lib/_stream_passthrough.js'); +} diff --git a/node_modules/stream-iterate/node_modules/readable-stream/transform.js b/node_modules/stream-iterate/node_modules/readable-stream/transform.js new file mode 100644 index 0000000000000..b1baba26da03d --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require('./readable').Transform diff --git a/node_modules/stream-iterate/node_modules/readable-stream/writable-browser.js b/node_modules/stream-iterate/node_modules/readable-stream/writable-browser.js new file mode 100644 index 0000000000000..ebdde6a85dcb1 --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/writable-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_writable.js'); diff --git a/node_modules/stream-iterate/node_modules/readable-stream/writable.js b/node_modules/stream-iterate/node_modules/readable-stream/writable.js new file mode 100644 index 0000000000000..3211a6f80d1ab --- /dev/null +++ b/node_modules/stream-iterate/node_modules/readable-stream/writable.js @@ -0,0 +1,8 @@ +var Stream = require("stream") +var Writable = require("./lib/_stream_writable.js") + +if (process.env.READABLE_STREAM === 'disable') { + module.exports = Stream && Stream.Writable || Writable +} else { + module.exports = Writable +} diff --git a/node_modules/stream-iterate/node_modules/string_decoder/.travis.yml b/node_modules/stream-iterate/node_modules/string_decoder/.travis.yml new file mode 100644 index 0000000000000..3347a72546505 --- /dev/null +++ b/node_modules/stream-iterate/node_modules/string_decoder/.travis.yml @@ -0,0 +1,50 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test diff --git a/node_modules/stream-iterate/node_modules/string_decoder/LICENSE b/node_modules/stream-iterate/node_modules/string_decoder/LICENSE new file mode 100644 index 0000000000000..778edb20730ef --- /dev/null +++ b/node_modules/stream-iterate/node_modules/string_decoder/LICENSE @@ -0,0 +1,48 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/stream-iterate/node_modules/string_decoder/README.md b/node_modules/stream-iterate/node_modules/string_decoder/README.md new file mode 100644 index 0000000000000..5fd58315ed588 --- /dev/null +++ b/node_modules/stream-iterate/node_modules/string_decoder/README.md @@ -0,0 +1,47 @@ +# string_decoder + +***Node-core v8.9.4 string_decoder for userland*** + + +[![NPM](https://nodei.co/npm/string_decoder.png?downloads=true&downloadRank=true)](https://nodei.co/npm/string_decoder/) +[![NPM](https://nodei.co/npm-dl/string_decoder.png?&months=6&height=3)](https://nodei.co/npm/string_decoder/) + + +```bash +npm install --save string_decoder +``` + +***Node-core string_decoder for userland*** + +This package is a mirror of the string_decoder implementation in Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.9.4/docs/api/). + +As of version 1.0.0 **string_decoder** uses semantic versioning. + +## Previous versions + +Previous version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. + +## Update + +The *build/* directory contains a build script that will scrape the source from the [nodejs/node](https://github.com/nodejs/node) repo given a specific Node version. + +## Streams Working Group + +`string_decoder` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + +See [readable-stream](https://github.com/nodejs/readable-stream) for +more details. diff --git a/node_modules/stream-iterate/node_modules/string_decoder/lib/string_decoder.js b/node_modules/stream-iterate/node_modules/string_decoder/lib/string_decoder.js new file mode 100644 index 0000000000000..2e89e63f7933e --- /dev/null +++ b/node_modules/stream-iterate/node_modules/string_decoder/lib/string_decoder.js @@ -0,0 +1,296 @@ +// 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. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} \ No newline at end of file diff --git a/node_modules/stream-iterate/node_modules/string_decoder/package.json b/node_modules/stream-iterate/node_modules/string_decoder/package.json new file mode 100644 index 0000000000000..e8bac87784557 --- /dev/null +++ b/node_modules/stream-iterate/node_modules/string_decoder/package.json @@ -0,0 +1,59 @@ +{ + "_from": "string_decoder@~1.1.1", + "_id": "string_decoder@1.1.1", + "_inBundle": false, + "_integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "_location": "/stream-iterate/string_decoder", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "string_decoder@~1.1.1", + "name": "string_decoder", + "escapedName": "string_decoder", + "rawSpec": "~1.1.1", + "saveSpec": null, + "fetchSpec": "~1.1.1" + }, + "_requiredBy": [ + "/stream-iterate/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "_shasum": "9cf1611ba62685d7030ae9e4ba34149c3af03fc8", + "_spec": "string_decoder@~1.1.1", + "_where": "/Users/aeschright/code/cli/node_modules/stream-iterate/node_modules/readable-stream", + "bugs": { + "url": "https://github.com/nodejs/string_decoder/issues" + }, + "bundleDependencies": false, + "dependencies": { + "safe-buffer": "~5.1.0" + }, + "deprecated": false, + "description": "The string_decoder module from Node core", + "devDependencies": { + "babel-polyfill": "^6.23.0", + "core-util-is": "^1.0.2", + "inherits": "^2.0.3", + "tap": "~0.4.8" + }, + "homepage": "https://github.com/nodejs/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT", + "main": "lib/string_decoder.js", + "name": "string_decoder", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/string_decoder.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "test": "tap test/parallel/*.js && node test/verify-dependencies" + }, + "version": "1.1.1" +} diff --git a/node_modules/string_decoder/package.json b/node_modules/string_decoder/package.json index e98874b555528..0b704d99a1bf5 100644 --- a/node_modules/string_decoder/package.json +++ b/node_modules/string_decoder/package.json @@ -1,27 +1,27 @@ { - "_from": "string_decoder@~1.1.1", - "_id": "string_decoder@1.1.1", + "_from": "string_decoder@^1.1.1", + "_id": "string_decoder@1.2.0", "_inBundle": false, - "_integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "_integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", "_location": "/string_decoder", "_phantomChildren": {}, "_requested": { "type": "range", "registry": true, - "raw": "string_decoder@~1.1.1", + "raw": "string_decoder@^1.1.1", "name": "string_decoder", "escapedName": "string_decoder", - "rawSpec": "~1.1.1", + "rawSpec": "^1.1.1", "saveSpec": null, - "fetchSpec": "~1.1.1" + "fetchSpec": "^1.1.1" }, "_requiredBy": [ "/readable-stream" ], - "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "_shasum": "9cf1611ba62685d7030ae9e4ba34149c3af03fc8", - "_spec": "string_decoder@~1.1.1", - "_where": "/Users/rebecca/code/npm/node_modules/readable-stream", + "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "_shasum": "fe86e738b19544afe70469243b2a1ee9240eae8d", + "_spec": "string_decoder@^1.1.1", + "_where": "/Users/aeschright/code/cli/node_modules/readable-stream", "bugs": { "url": "https://github.com/nodejs/string_decoder/issues" }, @@ -37,6 +37,9 @@ "inherits": "^2.0.3", "tap": "~0.4.8" }, + "files": [ + "lib" + ], "homepage": "https://github.com/nodejs/string_decoder", "keywords": [ "string", @@ -55,5 +58,5 @@ "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", "test": "tap test/parallel/*.js && node test/verify-dependencies" }, - "version": "1.1.1" + "version": "1.2.0" } diff --git a/node_modules/through2/node_modules/readable-stream/.travis.yml b/node_modules/through2/node_modules/readable-stream/.travis.yml new file mode 100644 index 0000000000000..40992555bf5cc --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/.travis.yml @@ -0,0 +1,55 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test +script: "npm run $TASK" +env: + global: + - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc= + - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI= diff --git a/node_modules/through2/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/through2/node_modules/readable-stream/CONTRIBUTING.md new file mode 100644 index 0000000000000..f478d58dca85b --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/CONTRIBUTING.md @@ -0,0 +1,38 @@ +# Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +* (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +* (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +* (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +* (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +## Moderation Policy + +The [Node.js Moderation Policy] applies to this WG. + +## Code of Conduct + +The [Node.js Code of Conduct][] applies to this WG. + +[Node.js Code of Conduct]: +https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md +[Node.js Moderation Policy]: +https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md diff --git a/node_modules/through2/node_modules/readable-stream/GOVERNANCE.md b/node_modules/through2/node_modules/readable-stream/GOVERNANCE.md new file mode 100644 index 0000000000000..16ffb93f24bec --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/GOVERNANCE.md @@ -0,0 +1,136 @@ +### Streams Working Group + +The Node.js Streams is jointly governed by a Working Group +(WG) +that is responsible for high-level guidance of the project. + +The WG has final authority over this project including: + +* Technical direction +* Project governance and process (including this policy) +* Contribution policy +* GitHub repository hosting +* Conduct guidelines +* Maintaining the list of additional Collaborators + +For the current list of WG members, see the project +[README.md](./README.md#current-project-team-members). + +### Collaborators + +The readable-stream GitHub repository is +maintained by the WG and additional Collaborators who are added by the +WG on an ongoing basis. + +Individuals making significant and valuable contributions are made +Collaborators and given commit-access to the project. These +individuals are identified by the WG and their addition as +Collaborators is discussed during the WG meeting. + +_Note:_ If you make a significant contribution and are not considered +for commit-access log an issue or contact a WG member directly and it +will be brought up in the next WG meeting. + +Modifications of the contents of the readable-stream repository are +made on +a collaborative basis. Anybody with a GitHub account may propose a +modification via pull request and it will be considered by the project +Collaborators. All pull requests must be reviewed and accepted by a +Collaborator with sufficient expertise who is able to take full +responsibility for the change. In the case of pull requests proposed +by an existing Collaborator, an additional Collaborator is required +for sign-off. Consensus should be sought if additional Collaborators +participate and there is disagreement around a particular +modification. See _Consensus Seeking Process_ below for further detail +on the consensus model used for governance. + +Collaborators may opt to elevate significant or controversial +modifications, or modifications that have not found consensus to the +WG for discussion by assigning the ***WG-agenda*** tag to a pull +request or issue. The WG should serve as the final arbiter where +required. + +For the current list of Collaborators, see the project +[README.md](./README.md#members). + +### WG Membership + +WG seats are not time-limited. There is no fixed size of the WG. +However, the expected target is between 6 and 12, to ensure adequate +coverage of important areas of expertise, balanced with the ability to +make decisions efficiently. + +There is no specific set of requirements or qualifications for WG +membership beyond these rules. + +The WG may add additional members to the WG by unanimous consensus. + +A WG member may be removed from the WG by voluntary resignation, or by +unanimous consensus of all other WG members. + +Changes to WG membership should be posted in the agenda, and may be +suggested as any other agenda item (see "WG Meetings" below). + +If an addition or removal is proposed during a meeting, and the full +WG is not in attendance to participate, then the addition or removal +is added to the agenda for the subsequent meeting. This is to ensure +that all members are given the opportunity to participate in all +membership decisions. If a WG member is unable to attend a meeting +where a planned membership decision is being made, then their consent +is assumed. + +No more than 1/3 of the WG members may be affiliated with the same +employer. If removal or resignation of a WG member, or a change of +employment by a WG member, creates a situation where more than 1/3 of +the WG membership shares an employer, then the situation must be +immediately remedied by the resignation or removal of one or more WG +members affiliated with the over-represented employer(s). + +### WG Meetings + +The WG meets occasionally on a Google Hangout On Air. A designated moderator +approved by the WG runs the meeting. Each meeting should be +published to YouTube. + +Items are added to the WG agenda that are considered contentious or +are modifications of governance, contribution policy, WG membership, +or release process. + +The intention of the agenda is not to approve or review all patches; +that should happen continuously on GitHub and be handled by the larger +group of Collaborators. + +Any community member or contributor can ask that something be added to +the next meeting's agenda by logging a GitHub Issue. Any Collaborator, +WG member or the moderator can add the item to the agenda by adding +the ***WG-agenda*** tag to the issue. + +Prior to each WG meeting the moderator will share the Agenda with +members of the WG. WG members can add any items they like to the +agenda at the beginning of each meeting. The moderator and the WG +cannot veto or remove items. + +The WG may invite persons or representatives from certain projects to +participate in a non-voting capacity. + +The moderator is responsible for summarizing the discussion of each +agenda item and sends it as a pull request after the meeting. + +### Consensus Seeking Process + +The WG follows a +[Consensus +Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) +decision-making model. + +When an agenda item has appeared to reach a consensus the moderator +will ask "Does anyone object?" as a final call for dissent from the +consensus. + +If an agenda item cannot reach a consensus a WG member can call for +either a closing vote or a vote to table the issue to the next +meeting. The call for a vote must be seconded by a majority of the WG +or else the discussion will continue. Simple majority wins. + +Note that changes to WG membership require a majority consensus. See +"WG Membership" above. diff --git a/node_modules/through2/node_modules/readable-stream/LICENSE b/node_modules/through2/node_modules/readable-stream/LICENSE new file mode 100644 index 0000000000000..2873b3b2e5950 --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/LICENSE @@ -0,0 +1,47 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/through2/node_modules/readable-stream/README.md b/node_modules/through2/node_modules/readable-stream/README.md new file mode 100644 index 0000000000000..23fe3f3e3009a --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/README.md @@ -0,0 +1,58 @@ +# readable-stream + +***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) + + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) + +```bash +npm install --save readable-stream +``` + +***Node-core streams for userland*** + +This package is a mirror of the Streams2 and Streams3 implementations in +Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html). + +If you want to guarantee a stable streams base, regardless of what version of +Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). + +As of version 2.0.0 **readable-stream** uses semantic versioning. + +# Streams Working Group + +`readable-stream` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + + +## Team Members + +* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> + - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B +* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> + - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 +* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> + - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D +* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> +* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> +* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> +* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) <matteo.collina@gmail.com> + - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E +* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) <shestak.irina@gmail.com> diff --git a/node_modules/through2/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/node_modules/through2/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md new file mode 100644 index 0000000000000..83275f192e407 --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md @@ -0,0 +1,60 @@ +# streams WG Meeting 2015-01-30 + +## Links + +* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg +* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106 +* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/ + +## Agenda + +Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting. + +* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105) +* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101) +* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102) +* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99) + +## Minutes + +### adopt a charter + +* group: +1's all around + +### What versioning scheme should be adopted? +* group: +1’s 3.0.0 +* domenic+group: pulling in patches from other sources where appropriate +* mikeal: version independently, suggesting versions for io.js +* mikeal+domenic: work with TC to notify in advance of changes +simpler stream creation + +### streamline creation of streams +* sam: streamline creation of streams +* domenic: nice simple solution posted + but, we lose the opportunity to change the model + may not be backwards incompatible (double check keys) + + **action item:** domenic will check + +### remove implicit flowing of streams on(‘data’) +* add isFlowing / isPaused +* mikeal: worrying that we’re documenting polyfill methods – confuses users +* domenic: more reflective API is probably good, with warning labels for users +* new section for mad scientists (reflective stream access) +* calvin: name the “third state” +* mikeal: maybe borrow the name from whatwg? +* domenic: we’re missing the “third state” +* consensus: kind of difficult to name the third state +* mikeal: figure out differences in states / compat +* mathias: always flow on data – eliminates third state + * explore what it breaks + +**action items:** +* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream) +* ask rod/build for infrastructure +* **chris**: explore the “flow on data” approach +* add isPaused/isFlowing +* add new docs section +* move isPaused to that section + + diff --git a/node_modules/through2/node_modules/readable-stream/duplex-browser.js b/node_modules/through2/node_modules/readable-stream/duplex-browser.js new file mode 100644 index 0000000000000..f8b2db83dbe73 --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/duplex-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_duplex.js'); diff --git a/node_modules/through2/node_modules/readable-stream/duplex.js b/node_modules/through2/node_modules/readable-stream/duplex.js new file mode 100644 index 0000000000000..46924cbfdf538 --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require('./readable').Duplex diff --git a/node_modules/through2/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/through2/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 0000000000000..a1ca813e5acbd --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,131 @@ +// 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. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; \ No newline at end of file diff --git a/node_modules/through2/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/through2/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 0000000000000..a9c835884828d --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,47 @@ +// 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. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; \ No newline at end of file diff --git a/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 0000000000000..bf34ac65e1108 --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,1019 @@ +// 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. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); +var destroyImpl = require('./internal/streams/destroy'); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, unpipeInfo); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} \ No newline at end of file diff --git a/node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 0000000000000..5d1f8b876d98c --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,214 @@ +// 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. + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} \ No newline at end of file diff --git a/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 0000000000000..b3f4e85a2f6e3 --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,687 @@ +// 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. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = require('./internal/streams/destroy'); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // has it been destroyed + this.destroyed = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; \ No newline at end of file diff --git a/node_modules/through2/node_modules/readable-stream/lib/internal/streams/BufferList.js b/node_modules/through2/node_modules/readable-stream/lib/internal/streams/BufferList.js new file mode 100644 index 0000000000000..aefc68bd90b9c --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/lib/internal/streams/BufferList.js @@ -0,0 +1,79 @@ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Buffer = require('safe-buffer').Buffer; +var util = require('util'); + +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} + +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; +}(); + +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} \ No newline at end of file diff --git a/node_modules/through2/node_modules/readable-stream/lib/internal/streams/destroy.js b/node_modules/through2/node_modules/readable-stream/lib/internal/streams/destroy.js new file mode 100644 index 0000000000000..5a0a0d88cec6f --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/lib/internal/streams/destroy.js @@ -0,0 +1,74 @@ +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; \ No newline at end of file diff --git a/node_modules/through2/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/node_modules/through2/node_modules/readable-stream/lib/internal/streams/stream-browser.js new file mode 100644 index 0000000000000..9332a3fdae706 --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/lib/internal/streams/stream-browser.js @@ -0,0 +1 @@ +module.exports = require('events').EventEmitter; diff --git a/node_modules/through2/node_modules/readable-stream/lib/internal/streams/stream.js b/node_modules/through2/node_modules/readable-stream/lib/internal/streams/stream.js new file mode 100644 index 0000000000000..ce2ad5b6ee57f --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/lib/internal/streams/stream.js @@ -0,0 +1 @@ +module.exports = require('stream'); diff --git a/node_modules/through2/node_modules/readable-stream/package.json b/node_modules/through2/node_modules/readable-stream/package.json new file mode 100644 index 0000000000000..d97bcfa712aec --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/package.json @@ -0,0 +1,81 @@ +{ + "_from": "readable-stream@^2.1.5", + "_id": "readable-stream@2.3.6", + "_inBundle": false, + "_integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "_location": "/through2/readable-stream", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "readable-stream@^2.1.5", + "name": "readable-stream", + "escapedName": "readable-stream", + "rawSpec": "^2.1.5", + "saveSpec": null, + "fetchSpec": "^2.1.5" + }, + "_requiredBy": [ + "/through2" + ], + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "_shasum": "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf", + "_spec": "readable-stream@^2.1.5", + "_where": "/Users/aeschright/code/cli/node_modules/through2", + "browser": { + "util": false, + "./readable.js": "./readable-browser.js", + "./writable.js": "./writable-browser.js", + "./duplex.js": "./duplex-browser.js", + "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js" + }, + "bugs": { + "url": "https://github.com/nodejs/readable-stream/issues" + }, + "bundleDependencies": false, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "deprecated": false, + "description": "Streams3, a user-land copy of the stream library from Node.js", + "devDependencies": { + "assert": "^1.4.0", + "babel-polyfill": "^6.9.1", + "buffer": "^4.9.0", + "lolex": "^2.3.2", + "nyc": "^6.4.0", + "tap": "^0.7.0", + "tape": "^4.8.0" + }, + "homepage": "https://github.com/nodejs/readable-stream#readme", + "keywords": [ + "readable", + "stream", + "pipe" + ], + "license": "MIT", + "main": "readable.js", + "name": "readable-stream", + "nyc": { + "include": [ + "lib/**.js" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/nodejs/readable-stream.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "cover": "nyc npm test", + "report": "nyc report --reporter=lcov", + "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js" + }, + "version": "2.3.6" +} diff --git a/node_modules/through2/node_modules/readable-stream/passthrough.js b/node_modules/through2/node_modules/readable-stream/passthrough.js new file mode 100644 index 0000000000000..ffd791d7ff275 --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require('./readable').PassThrough diff --git a/node_modules/through2/node_modules/readable-stream/readable-browser.js b/node_modules/through2/node_modules/readable-stream/readable-browser.js new file mode 100644 index 0000000000000..e50372592ee6c --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/readable-browser.js @@ -0,0 +1,7 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); diff --git a/node_modules/through2/node_modules/readable-stream/readable.js b/node_modules/through2/node_modules/readable-stream/readable.js new file mode 100644 index 0000000000000..ec89ec5330649 --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/readable.js @@ -0,0 +1,19 @@ +var Stream = require('stream'); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; + exports = module.exports = Stream.Readable; + exports.Readable = Stream.Readable; + exports.Writable = Stream.Writable; + exports.Duplex = Stream.Duplex; + exports.Transform = Stream.Transform; + exports.PassThrough = Stream.PassThrough; + exports.Stream = Stream; +} else { + exports = module.exports = require('./lib/_stream_readable.js'); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = require('./lib/_stream_writable.js'); + exports.Duplex = require('./lib/_stream_duplex.js'); + exports.Transform = require('./lib/_stream_transform.js'); + exports.PassThrough = require('./lib/_stream_passthrough.js'); +} diff --git a/node_modules/through2/node_modules/readable-stream/transform.js b/node_modules/through2/node_modules/readable-stream/transform.js new file mode 100644 index 0000000000000..b1baba26da03d --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require('./readable').Transform diff --git a/node_modules/through2/node_modules/readable-stream/writable-browser.js b/node_modules/through2/node_modules/readable-stream/writable-browser.js new file mode 100644 index 0000000000000..ebdde6a85dcb1 --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/writable-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_writable.js'); diff --git a/node_modules/through2/node_modules/readable-stream/writable.js b/node_modules/through2/node_modules/readable-stream/writable.js new file mode 100644 index 0000000000000..3211a6f80d1ab --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/writable.js @@ -0,0 +1,8 @@ +var Stream = require("stream") +var Writable = require("./lib/_stream_writable.js") + +if (process.env.READABLE_STREAM === 'disable') { + module.exports = Stream && Stream.Writable || Writable +} else { + module.exports = Writable +} diff --git a/node_modules/through2/node_modules/string_decoder/.travis.yml b/node_modules/through2/node_modules/string_decoder/.travis.yml new file mode 100644 index 0000000000000..3347a72546505 --- /dev/null +++ b/node_modules/through2/node_modules/string_decoder/.travis.yml @@ -0,0 +1,50 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test diff --git a/node_modules/through2/node_modules/string_decoder/LICENSE b/node_modules/through2/node_modules/string_decoder/LICENSE new file mode 100644 index 0000000000000..778edb20730ef --- /dev/null +++ b/node_modules/through2/node_modules/string_decoder/LICENSE @@ -0,0 +1,48 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/node_modules/through2/node_modules/string_decoder/README.md b/node_modules/through2/node_modules/string_decoder/README.md new file mode 100644 index 0000000000000..5fd58315ed588 --- /dev/null +++ b/node_modules/through2/node_modules/string_decoder/README.md @@ -0,0 +1,47 @@ +# string_decoder + +***Node-core v8.9.4 string_decoder for userland*** + + +[![NPM](https://nodei.co/npm/string_decoder.png?downloads=true&downloadRank=true)](https://nodei.co/npm/string_decoder/) +[![NPM](https://nodei.co/npm-dl/string_decoder.png?&months=6&height=3)](https://nodei.co/npm/string_decoder/) + + +```bash +npm install --save string_decoder +``` + +***Node-core string_decoder for userland*** + +This package is a mirror of the string_decoder implementation in Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.9.4/docs/api/). + +As of version 1.0.0 **string_decoder** uses semantic versioning. + +## Previous versions + +Previous version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. + +## Update + +The *build/* directory contains a build script that will scrape the source from the [nodejs/node](https://github.com/nodejs/node) repo given a specific Node version. + +## Streams Working Group + +`string_decoder` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + +See [readable-stream](https://github.com/nodejs/readable-stream) for +more details. diff --git a/node_modules/through2/node_modules/string_decoder/lib/string_decoder.js b/node_modules/through2/node_modules/string_decoder/lib/string_decoder.js new file mode 100644 index 0000000000000..2e89e63f7933e --- /dev/null +++ b/node_modules/through2/node_modules/string_decoder/lib/string_decoder.js @@ -0,0 +1,296 @@ +// 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. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} \ No newline at end of file diff --git a/node_modules/through2/node_modules/string_decoder/package.json b/node_modules/through2/node_modules/string_decoder/package.json new file mode 100644 index 0000000000000..617fff7d1226b --- /dev/null +++ b/node_modules/through2/node_modules/string_decoder/package.json @@ -0,0 +1,59 @@ +{ + "_from": "string_decoder@~1.1.1", + "_id": "string_decoder@1.1.1", + "_inBundle": false, + "_integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "_location": "/through2/string_decoder", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "string_decoder@~1.1.1", + "name": "string_decoder", + "escapedName": "string_decoder", + "rawSpec": "~1.1.1", + "saveSpec": null, + "fetchSpec": "~1.1.1" + }, + "_requiredBy": [ + "/through2/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "_shasum": "9cf1611ba62685d7030ae9e4ba34149c3af03fc8", + "_spec": "string_decoder@~1.1.1", + "_where": "/Users/aeschright/code/cli/node_modules/through2/node_modules/readable-stream", + "bugs": { + "url": "https://github.com/nodejs/string_decoder/issues" + }, + "bundleDependencies": false, + "dependencies": { + "safe-buffer": "~5.1.0" + }, + "deprecated": false, + "description": "The string_decoder module from Node core", + "devDependencies": { + "babel-polyfill": "^6.23.0", + "core-util-is": "^1.0.2", + "inherits": "^2.0.3", + "tap": "~0.4.8" + }, + "homepage": "https://github.com/nodejs/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT", + "main": "lib/string_decoder.js", + "name": "string_decoder", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/string_decoder.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "test": "tap test/parallel/*.js && node test/verify-dependencies" + }, + "version": "1.1.1" +} diff --git a/package-lock.json b/package-lock.json index fbf6f94347867..8a994dcef7a6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -167,6 +167,30 @@ "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "argparse": { @@ -686,6 +710,30 @@ "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "config-chain": { @@ -1020,6 +1068,30 @@ "inherits": "^2.0.1", "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "ecc-jsbn": { @@ -1570,6 +1642,30 @@ "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.4" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "foreground-child": { @@ -1616,6 +1712,30 @@ "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "fs-access": { @@ -1666,6 +1786,28 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } } } }, @@ -6093,6 +6235,30 @@ "cyclist": "~0.2.2", "inherits": "^2.0.3", "readable-stream": "^2.1.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "parse-json": { @@ -6513,17 +6679,13 @@ } }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", + "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "readdir-scoped-modules": { @@ -6735,6 +6897,30 @@ "requires": { "graceful-fs": "^4.1.2", "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "shebang-command": { @@ -7041,6 +7227,30 @@ "requires": { "readable-stream": "^2.1.5", "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "stream-shift": { @@ -7083,9 +7293,9 @@ } }, "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", "requires": { "safe-buffer": "~5.1.0" } @@ -7355,6 +7565,32 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "tap-parser": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", @@ -7439,6 +7675,30 @@ "requires": { "readable-stream": "^2.1.5", "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "timed-out": { diff --git a/package.json b/package.json index f61730031c851..5666c1f55ffe6 100644 --- a/package.json +++ b/package.json @@ -115,7 +115,7 @@ "read-installed": "~4.0.3", "read-package-json": "^2.0.13", "read-package-tree": "^5.2.1", - "readable-stream": "^2.3.6", + "readable-stream": "^3.1.1", "request": "^2.88.0", "retry": "^0.12.0", "rimraf": "^2.6.3", From 887e94386f42cb59a5628e7762b3662d084b23c8 Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Tue, 8 Jan 2019 13:35:55 -0800 Subject: [PATCH 85/97] lru-cache@4.1.5 --- node_modules/lru-cache/index.js | 5 +-- node_modules/lru-cache/package.json | 48 +++++++++++++---------------- package-lock.json | 6 ++-- package.json | 2 +- 4 files changed, 28 insertions(+), 33 deletions(-) diff --git a/node_modules/lru-cache/index.js b/node_modules/lru-cache/index.js index 3f047f8ca78ae..bd35b53589381 100644 --- a/node_modules/lru-cache/index.js +++ b/node_modules/lru-cache/index.js @@ -11,7 +11,7 @@ var util = require('util') var Yallist = require('yallist') // use symbols if possible, otherwise just _props -var hasSymbol = typeof Symbol === 'function' +var hasSymbol = typeof Symbol === 'function' && process.env._nodeLRUCacheForceNoSymbol !== '1' var makeSymbol if (hasSymbol) { makeSymbol = function (key) { @@ -221,6 +221,7 @@ LRUCache.prototype.dumpLru = function () { return this[LRU_LIST] } +/* istanbul ignore next */ LRUCache.prototype.inspect = function (n, opts) { var str = 'LRUCache {' var extras = false @@ -434,7 +435,7 @@ function isStale (self, hit) { function trim (self) { if (self[LENGTH] > self[MAX]) { for (var walker = self[LRU_LIST].tail; - self[LENGTH] > self[MAX] && walker !== null;) { + self[LENGTH] > self[MAX] && walker !== null;) { // We know that we're about to delete this one, and also // what the next least recently used key will be, so just // go ahead and set it now. diff --git a/node_modules/lru-cache/package.json b/node_modules/lru-cache/package.json index 238a6894e929f..14760df46579f 100644 --- a/node_modules/lru-cache/package.json +++ b/node_modules/lru-cache/package.json @@ -1,43 +1,32 @@ { - "_args": [ - [ - "lru-cache@4.1.3", - "/Users/rebecca/code/npm" - ] - ], - "_from": "lru-cache@4.1.3", - "_id": "lru-cache@4.1.3", + "_from": "lru-cache@4.1.5", + "_id": "lru-cache@4.1.5", "_inBundle": false, - "_integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "_integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "_location": "/lru-cache", "_phantomChildren": {}, "_requested": { "type": "version", "registry": true, - "raw": "lru-cache@4.1.3", + "raw": "lru-cache@4.1.5", "name": "lru-cache", "escapedName": "lru-cache", - "rawSpec": "4.1.3", + "rawSpec": "4.1.5", "saveSpec": null, - "fetchSpec": "4.1.3" + "fetchSpec": "4.1.5" }, "_requiredBy": [ + "#USER", "/", - "/cacache", "/cross-spawn", "/foreground-child/cross-spawn", - "/libnpmhook/npm-registry-fetch", "/make-fetch-happen", - "/npm-profile/cacache", - "/npm-profile/make-fetch-happen", - "/npm-registry-fetch", - "/npm-registry-fetch/cacache", - "/npm-registry-fetch/make-fetch-happen", - "/pacote" + "/npm-registry-fetch" ], - "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "_spec": "4.1.3", - "_where": "/Users/rebecca/code/npm", + "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "_shasum": "8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd", + "_spec": "lru-cache@4.1.5", + "_where": "/Users/aeschright/code/cli", "author": { "name": "Isaac Z. Schlueter", "email": "i@izs.me" @@ -45,15 +34,17 @@ "bugs": { "url": "https://github.com/isaacs/node-lru-cache/issues" }, + "bundleDependencies": false, "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" }, + "deprecated": false, "description": "A cache object that deletes the least-recently-used items.", "devDependencies": { "benchmark": "^2.1.4", - "standard": "^5.4.1", - "tap": "^11.1.4" + "standard": "^12.0.1", + "tap": "^12.1.0" }, "files": [ "index.js" @@ -72,11 +63,14 @@ "url": "git://github.com/isaacs/node-lru-cache.git" }, "scripts": { + "coveragerport": "tap --coverage-report=html", + "lintfix": "standard --fix test/*.js index.js", "postpublish": "git push origin --all; git push origin --tags", "posttest": "standard test/*.js index.js", - "postversion": "npm publish", + "postversion": "npm publish --tag=legacy", "preversion": "npm test", + "snap": "TAP_SNAPSHOT=1 tap test/*.js -J", "test": "tap test/*.js --100 -J" }, - "version": "4.1.3" + "version": "4.1.5" } diff --git a/package-lock.json b/package-lock.json index 8a994dcef7a6b..fcb18385719d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2923,9 +2923,9 @@ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" diff --git a/package.json b/package.json index 5666c1f55ffe6..3832f902f0cd0 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "lodash.union": "~4.6.0", "lodash.uniq": "~4.5.0", "lodash.without": "~4.4.0", - "lru-cache": "^4.1.3", + "lru-cache": "^4.1.5", "meant": "~1.0.1", "mississippi": "^3.0.0", "mkdirp": "~0.5.1", From 41f15524c58c59d206c4b1d25ae9e0f22745213b Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Tue, 8 Jan 2019 17:06:22 -0800 Subject: [PATCH 86/97] deps: updating semver docs --- doc/misc/semver.md | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/doc/misc/semver.md b/doc/misc/semver.md index 1c2dbf55b8d2f..2c856d8009427 100644 --- a/doc/misc/semver.md +++ b/doc/misc/semver.md @@ -29,8 +29,6 @@ As a command-line utility: ``` $ semver -h -SemVer 5.3.0 - A JavaScript implementation of the http://semver.org/ specification Copyright Isaac Z. Schlueter @@ -54,6 +52,9 @@ Options: -l --loose Interpret versions and ranges loosely +-p --include-prerelease + Always include prerelease versions in range matching + -c --coerce Coerce a string into SemVer if possible (does not imply --loose) @@ -289,9 +290,19 @@ part ::= nr | [-0-9A-Za-z]+ ## Functions -All methods and classes take a final `loose` 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. +All methods and classes take a final `options` object argument. All +options in this object are `false` by default. The options supported +are: + +- `loose` Be more forgiving about not-quite-valid semver strings. + (Any resulting output will always be 100% strict compliant, of + course.) For backwards compatibility reasons, if the `options` + argument is a boolean value instead of an object, it is interpreted + to be the `loose` param. +- `includePrerelease` Set to suppress the [default + behavior](https://github.com/npm/node-semver#prerelease-tags) of + excluding prerelease tagged versions from ranges unless they are + explicitly opted into. Strict-mode Comparators and Ranges will be strict about the SemVer strings that they parse. From c5b6056b6b35eefb81ae5fb00a5c7681c5318c22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20W=C3=BCrbach?= Date: Wed, 9 Jan 2019 02:43:17 +0100 Subject: [PATCH 87/97] Handle git branch references correctly (#123) PR-URL: https://github.com/npm/cli/pull/123 Credit: @johanneswuerbach Reviewed-By: @aeschright --- lib/shrinkwrap.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/shrinkwrap.js b/lib/shrinkwrap.js index 90a4426523cab..dbb12b5bd4fba 100644 --- a/lib/shrinkwrap.js +++ b/lib/shrinkwrap.js @@ -167,6 +167,8 @@ function childVersion (top, child, req) { function childRequested (top, child, requested) { if (requested.type === 'directory' || requested.type === 'file') { return 'file:' + unixFormatPath(path.relative(top.path, child.package._resolved || requested.fetchSpec)) + } else if (requested.type === 'git' && child.package._from) { + return child.package._from } else if (!isRegistry(requested) && !child.fromBundle) { return child.package._resolved || requested.saveSpec || requested.rawSpec } else if (requested.type === 'tag') { From f58b43ef2c5e3dea2094340a0cf264b2d11a5da4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kat=20March=C3=A1n?= Date: Wed, 9 Jan 2019 11:48:44 -0800 Subject: [PATCH 88/97] audit: report any errors above 400 as potentially not supporting audit (#128) PR-URL: https://github.com/npm/cli/pull/128 Fixes: https://npm.community/t/npm-audit-fails-with-enoaudit-on-500-response/3629 Fixes: https://npm.community/t/npm-audit-error-messaging-update-for-401s/3983 Credit: @zkat Reviewed-By: @aeschright --- lib/audit.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/audit.js b/lib/audit.js index 076ca256b7c72..2cabef9d27d0d 100644 --- a/lib/audit.js +++ b/lib/audit.js @@ -189,8 +189,16 @@ function auditCmd (args, cb) { }).then((auditReport) => { return audit.submitForFullReport(auditReport) }).catch((err) => { - if (err.statusCode === 404 || err.statusCode >= 500) { - const ne = new Error(`Your configured registry (${opts.registry}) does not support audit requests.`) + if (err.statusCode >= 400) { + let msg + if (err.statusCode === 401) { + msg = `Either your login credentials are invalid or your registry (${opts.registry}) does not support audit.` + } else if (err.statusCode === 404) { + msg = `Your configured registry (${opts.registry}) does not support audit requests.` + } else { + msg = `Your configured registry (${opts.registry}) does not support audit requests, or the audit endpoint is temporarily unavailable.` + } + const ne = new Error(msg) ne.code = 'ENOAUDIT' ne.wrapped = err throw ne From a5c9e6f35a591a6e2d4b6ace5c01bc03f2b75fdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C6=87=CA=98=C6=81=CC=86=C4=85=C6=87=CC=81?= Date: Wed, 9 Jan 2019 20:57:14 +0100 Subject: [PATCH 89/97] cli,outdated: default homepage to an empty string (#124) PR-URL: https://github.com/npm/cli/pull/124 Credit: @anchnk Reviewed-By: @aeschright --- lib/outdated.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/outdated.js b/lib/outdated.js index ea923a0e8efd3..ebd67fb6b37d5 100644 --- a/lib/outdated.js +++ b/lib/outdated.js @@ -143,7 +143,7 @@ function makePretty (p, opts) { var latest = p[4] var type = p[6] var deppath = p[7] - var homepage = p[0].package.homepage + var homepage = p[0].package.homepage || '' var columns = [ depname, has || 'MISSING', From 5d076351d7ec1d3585942a9289548166a7fbbd4c Mon Sep 17 00:00:00 2001 From: Lars Willighagen Date: Wed, 9 Jan 2019 22:55:40 +0100 Subject: [PATCH 90/97] doc: fix npm-prefix description (#116) PR-URL: https://github.com/npm/cli/pull/116 Fixes: https://npm.community/t/4054 Credit: @larsgw Reviewed-By: @aeschright --- doc/cli/npm-prefix.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/cli/npm-prefix.md b/doc/cli/npm-prefix.md index f262a36a752b5..d36e538132fb2 100644 --- a/doc/cli/npm-prefix.md +++ b/doc/cli/npm-prefix.md @@ -8,7 +8,8 @@ npm-prefix(1) -- Display prefix ## DESCRIPTION Print the local prefix to standard out. This is the closest parent directory -to contain a package.json file unless `-g` is also specified. +to contain a `package.json` file or `node_modules` directory, 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. From c665f35aacdb8afdbe35f3dd7ccb62f55ff6b896 Mon Sep 17 00:00:00 2001 From: Daijiro Wachi Date: Thu, 10 Jan 2019 07:07:46 +0900 Subject: [PATCH 91/97] chore: replace var with const/let in lib/repo.js (#119) PR-URL: https://github.com/npm/cli/pull/119 Credit: @watilde Reviewed-By: @aeschright --- lib/repo.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/repo.js b/lib/repo.js index d5aa81a6a00eb..b930402aedf95 100644 --- a/lib/repo.js +++ b/lib/repo.js @@ -2,10 +2,10 @@ module.exports = repo repo.usage = 'npm repo []' -var openUrl = require('./utils/open-url') -var hostedGitInfo = require('hosted-git-info') -var url_ = require('url') -var fetchPackageMetadata = require('./fetch-package-metadata.js') +const openUrl = require('./utils/open-url') +const hostedGitInfo = require('hosted-git-info') +const url_ = require('url') +const fetchPackageMetadata = require('./fetch-package-metadata.js') repo.completion = function (opts, cb) { // FIXME: there used to be registry completion here, but it stopped making @@ -14,7 +14,7 @@ repo.completion = function (opts, cb) { } function repo (args, cb) { - var n = args.length ? args[0] : '.' + const n = args.length ? args[0] : '.' fetchPackageMetadata(n, '.', {fullMetadata: true}, function (er, d) { if (er) return cb(er) getUrlAndOpen(d, cb) @@ -22,12 +22,12 @@ function repo (args, cb) { } function getUrlAndOpen (d, cb) { - var r = d.repository + const 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 - var info = hostedGitInfo.fromUrl(r.url) - var url = info ? info.browse() : unknownHostedUrl(r.url) + const info = hostedGitInfo.fromUrl(r.url) + const url = info ? info.browse() : unknownHostedUrl(r.url) if (!url) return cb(new Error('no repository: could not get url')) @@ -36,12 +36,12 @@ function getUrlAndOpen (d, cb) { function unknownHostedUrl (url) { try { - var idx = url.indexOf('@') + const idx = url.indexOf('@') if (idx !== -1) { url = url.slice(idx + 1).replace(/:([^\d]+)/, '/$1') } url = url_.parse(url) - var protocol = url.protocol === 'https:' + const protocol = url.protocol === 'https:' ? 'https:' : 'http:' return protocol + '//' + (url.host || '') + From 371442f49823f5577c7d1bc715dae2a8724dfd7a Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Wed, 9 Jan 2019 17:40:09 -0800 Subject: [PATCH 92/97] doc: update changelog for npm@6.6.0 --- CHANGELOG.md | 131 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 125 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4b1c9a25de62..7c5acbd499334 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## v6.6.0 (2018-12-12): +## v6.6.0 (2019-01-09): ### REFACTORING OUT npm-REGISTRY-CLIENT @@ -71,11 +71,15 @@ curious about details: [#65](https://github.com/npm/cli/pull/65) Add support for `IBM i`. ([@dmabupt](https://github.com/dmabupt)) +* [`a22e6f5fc`](https://github.com/npm/cli/commit/a22e6f5fc3e91350d3c64dcc88eabbe0efbca759) + [#131](https://github.com/npm/cli/pull/131) + Update profile to support new npm-profile API. + ([@zkat](https://github.com/zkat)) ### BUGFIXES * [`890a74458`](https://github.com/npm/cli/commit/890a74458dd4a55e2d85f3eba9dbf125affa4206) - [npm.community#3278](https://npm.community/t/https://npm.community/t/3278) + [npm.community#3278](https://npm.community/t/3278) Fix support for passing git binary path config with `--git`. ([@larsgw](https://github.com/larsgw)) * [`90e55a143`](https://github.com/npm/cli/commit/90e55a143ed1de8678d65c17bc3c2b103a15ddac) @@ -83,6 +87,30 @@ curious about details: Check for `npm.config`'s existence in `error-handler.js` to prevent weird errors when failures happen before config object is loaded. ([@BeniCheni](https://github.com/BeniCheni)) +* [`134207174`](https://github.com/npm/cli/commit/134207174652e1eb6d7b0f44fd9858a0b6a0cd6c) + [npm.community#2569](https://npm.community/t/2569) + Fix checking for optional dependencies. + ([@larsgw](https://github.com/larsgw)) +* [`7a2f6b05d`](https://github.com/npm/cli/commit/7a2f6b05d27f3bcf47a48230db62e86afa41c9d3) + [npm.community#4172](https://npm.community/t/4172) + Remove tink experiments. + ([@larsgw](https://github.com/larsgw)) +* [`c5b6056b6`](https://github.com/npm/cli/commit/c5b6056b6b35eefb81ae5fb00a5c7681c5318c22) + [#123](https://github.com/npm/cli/pull/123) + Handle git branch references correctly. + ([@johanneswuerbach](https://github.com/johanneswuerbach)) +* [`f58b43ef2`](https://github.com/npm/cli/commit/f58b43ef2c5e3dea2094340a0cf264b2d11a5da4) + [npm.community#3983](https://npm.community/t/npm-audit-error-messaging-update-for-401s/3983) + Report any errors above 400 as potentially not supporting audit. + ([@zkat](https://github.com/zkat)) +* [`a5c9e6f35`](https://github.com/npm/cli/commit/a5c9e6f35a591a6e2d4b6ace5c01bc03f2b75fdc) + [#124](https://github.com/npm/cli/pull/124) + Set default homepage to an empty string. + ([@anchnk](https://github.com/anchnk)) +* [`5d076351d`](https://github.com/npm/cli/commit/5d076351d7ec1d3585942a9289548166a7fbbd4c) + [npm.community#4054](https://npm.community/t/4054) + Fix npm-prefix description. + ([@larsgw](https://github.com/larsgw)) ### DOCS @@ -90,10 +118,12 @@ curious about details: [#71](https://github.com/npm/cli/pull/71) Fix typo in npm-token documentation. ([@GeorgeTaveras1231](https://github.com/GeorgeTaveras1231)) +* [`2401b7592`](https://github.com/npm/cli/commit/2401b7592c6ee114e6db7077ebf8c072b7bfe427) + Correct docs for fake-registry interface. + ([@iarna](https://github.com/iarna)) ### DEPENDENCIES - * [`9cefcdc1d`](https://github.com/npm/cli/commit/9cefcdc1d2289b56f9164d14d7e499e115cfeaee) `npm-registry-fetch@3.8.0` ([@zkat](https://github.com/zkat)) @@ -130,6 +160,95 @@ curious about details: * [`a3ba0ccf1`](https://github.com/npm/cli/commit/a3ba0ccf1fa86aec56b1ad49883abf28c1f56b3c) move rimraf to prod deps ([@zkat](https://github.com/zkat)) +* [`f63a0d6cf`](https://github.com/npm/cli/commit/f63a0d6cf0b7db3dcc80e72e1383c3df723c8119) + `spdx-license-ids@3.0.3`: + Ref: https://github.com/npm/cli/pull/121 + ([@zkat](https://github.com/zkat)) +* [`f350e714f`](https://github.com/npm/cli/commit/f350e714f66a77f71a7ebe17daeea2ea98179a1a) + `aproba@2.0.0` + ([@aeschright](https://github.com/aeschright)) +* [`a67e4d8b2`](https://github.com/npm/cli/commit/a67e4d8b214e58ede037c3854961acb33fd889da) + `byte-size@5.0.1` + ([@aeschright](https://github.com/aeschright)) +* [`8bea4efa3`](https://github.com/npm/cli/commit/8bea4efa34857c4e547904b3630dd442def241de) + `cacache@11.3.2` + ([@aeschright](https://github.com/aeschright)) +* [`9d4776836`](https://github.com/npm/cli/commit/9d4776836a4eaa4b19701b4e4f00cd64578bf078) + `chownr@1.1.1` + ([@aeschright](https://github.com/aeschright)) +* [`70da139e9`](https://github.com/npm/cli/commit/70da139e97ed1660c216e2d9b3f9cfb986bfd4a4) + `ci-info@2.0.0` + ([@aeschright](https://github.com/aeschright)) +* [`bcdeddcc3`](https://github.com/npm/cli/commit/bcdeddcc3d4dc242f42404223dafe4afdc753b32) + `cli-table3@0.5.1` + ([@aeschright](https://github.com/aeschright)) +* [`63aab82c7`](https://github.com/npm/cli/commit/63aab82c7bfca4f16987cf4156ddebf8d150747c) + `is-cidr@3.0.0` + ([@aeschright](https://github.com/aeschright)) +* [`d522bd90c`](https://github.com/npm/cli/commit/d522bd90c3b0cb08518f249ae5b90bd609fff165) + `JSONStream@1.3.5` + ([@aeschright](https://github.com/aeschright)) +* [`2a59bfc79`](https://github.com/npm/cli/commit/2a59bfc7989bd5575d8cbba912977c6d1ba92567) + `libnpmhook@5.0.2` + ([@aeschright](https://github.com/aeschright)) +* [`66d60e394`](https://github.com/npm/cli/commit/66d60e394e5a96330f90e230505758f19a3643ac) + `marked@0.6.0` + ([@aeschright](https://github.com/aeschright)) +* [`8213def9a`](https://github.com/npm/cli/commit/8213def9aa9b6e702887e4f2ed7654943e1e4154) + `npm-packlist@1.2.0` + ([@aeschright](https://github.com/aeschright)) +* [`e4ffc6a2b`](https://github.com/npm/cli/commit/e4ffc6a2bfb8d0b7047cb6692030484760fc8c91) + `unique-filename@1.1.1` + ([@aeschright](https://github.com/aeschright)) +* [`09a5c2fab`](https://github.com/npm/cli/commit/09a5c2fabe0d1c00ec8c99f328f6d28a3495eb0b) + `semver@5.6.0` + ([@aeschright](https://github.com/aeschright)) +* [`740e79e17`](https://github.com/npm/cli/commit/740e79e17a78247f73349525043c9388ce94459a) + `rimraf@2.6.3` + ([@aeschright](https://github.com/aeschright)) +* [`455476c8d`](https://github.com/npm/cli/commit/455476c8d148ca83a4e030e96e93dcf1c7f0ff5f) + `require-inject@1.4.4` + ([@aeschright](https://github.com/aeschright)) +* [`3f40251c5`](https://github.com/npm/cli/commit/3f40251c5868feaacbcdbcb1360877ce76998f5e) + `npm-pick-manifest@2.2.3` + ([@aeschright](https://github.com/aeschright)) +* [`4ffa8a8e9`](https://github.com/npm/cli/commit/4ffa8a8e9e80e5562898dd76fe5a49f5694f38c8) + `query-string@6.2.0` + ([@aeschright](https://github.com/aeschright)) +* [`a0a0ca9ec`](https://github.com/npm/cli/commit/a0a0ca9ec2a962183d420fa751f4139969760f18) + `pacote@9.3.0` + ([@aeschright](https://github.com/aeschright)) +* [`5777ea8ad`](https://github.com/npm/cli/commit/5777ea8ad2058be3166a6dad2d31d2d393c9f778) + `readable-stream@3.1.1` + ([@aeschright](https://github.com/aeschright)) +* [`887e94386`](https://github.com/npm/cli/commit/887e94386f42cb59a5628e7762b3662d084b23c8) + `lru-cache@4.1.5` + ([@aeschright](https://github.com/aeschright)) +* [`41f15524c`](https://github.com/npm/cli/commit/41f15524c58c59d206c4b1d25ae9e0f22745213b) + Updating semver docs. + ([@aeschright](https://github.com/aeschright)) +* [`fb3bbb72d`](https://github.com/npm/cli/commit/fb3bbb72d448ac37a465b31233b21381917422f3) + `npm-audit-report@1.3.2`: + ([@melkikh](https://github.com/melkikh)) + +### TESTING + +* [`f1edffba9`](https://github.com/npm/cli/commit/f1edffba90ebd96cf88675d2e18ebc48954ba50e) + Modernize maketest script. + ([@iarna](https://github.com/iarna)) +* [`ae263473d`](https://github.com/npm/cli/commit/ae263473d92a896b482830d4019a04b5dbd1e9d7) + maketest: Use promise based example common.npm call. + ([@iarna](https://github.com/iarna)) +* [`d9970da5e`](https://github.com/npm/cli/commit/d9970da5ee97a354eab01cbf16f9101693a15d2d) + maketest: Use newEnv for env production. + ([@iarna](https://github.com/iarna)) + +### MISCELLANEOUS + +* [`c665f35aa`](https://github.com/npm/cli/commit/c665f35aacdb8afdbe35f3dd7ccb62f55ff6b896) + [#119](https://github.com/npm/cli/pull/119) + Replace var with const/let in lib/repo.js. + ([@watilde](https://github.com/watilde)) ## v6.5.0 (2018-11-28): @@ -146,7 +265,7 @@ curious about details: ### BUGFIXES * [`89652cb9b`](https://github.com/npm/cli/commit/89652cb9b810f929f5586fc90cc6794d076603fb) - [npm.community#1661](https://npm.community/t/https://npm.community/t/1661) + [npm.community#1661](https://npm.community/t/1661) Fix sign-git-commit options. They were previously totally wrong. ([@zkat](https://github.com/zkat)) * [`414f2d1a1`](https://github.com/npm/cli/commit/414f2d1a1bdffc02ed31ebb48a43216f284c21d4) @@ -300,7 +419,7 @@ curious about details: circular dependency fix, as well as adding a proper LICENSE file. ([@isaacs](https://github.com/isaacs)) * [`e8d5f4418`](https://github.com/npm/cli/commit/e8d5f441821553a31fc8cd751670663699d2c8ce) - [npm.community#632](https://npm.community/t/https://npm.community/t/using-npm-ci-does-not-run-prepare-script-for-git-modules/632) + [npm.community#632](https://npm.community/t/using-npm-ci-does-not-run-prepare-script-for-git-modules/632) `libcipm@2.0.2`: Fixes issue where `npm ci` wasn't running the `prepare` lifecycle script when installing git dependencies @@ -437,7 +556,7 @@ Thanks, [@rvagg](https://github.com/rvagg)! * [`af98e76ed`](https://github.com/npm/cli/commit/af98e76ed96af780b544962aa575585b3fa17b9a) [npm/cli#34](https://github.com/npm/cli/pull/34) - Remove `npm publish` from list of commands not affected by `--dry-run`. + Remove `npm publish` from list of commands not affected by `--dry-run`. ([@joebowbeer](https://github.com/joebowbeer)) * [`e2b0f0921`](https://github.com/npm/cli/commit/e2b0f092193c08c00f12a6168ad2bd9d6e16f8ce) [npm/cli#36](https://github.com/npm/cli/pull/36) From b9d4dcb1e8a0ae67573480c6869a86979193e725 Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Thu, 10 Jan 2019 11:49:53 -0800 Subject: [PATCH 93/97] update AUTHORS --- AUTHORS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS b/AUTHORS index aad5087f038c0..a011b51d6a036 100644 --- a/AUTHORS +++ b/AUTHORS @@ -616,3 +616,6 @@ Audrey Eschright Xu Meng George Beni von Cheni +Frédéric Harper +Johannes Würbach +ƇʘƁ̆ąƇ́ From 6c89adbc12a267b28704478f175e66c92132d158 Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Thu, 10 Jan 2019 11:49:53 -0800 Subject: [PATCH 94/97] 6.6.0-next.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index fcb18385719d6..6fa445aed650e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "npm", - "version": "6.6.0-next.0", + "version": "6.6.0-next.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 3832f902f0cd0..1a0ae526d78a6 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "6.6.0-next.0", + "version": "6.6.0-next.1", "name": "npm", "description": "a package manager for JavaScript", "keywords": [ From 46639ba9f04ea729502f1af28b02eb67fb6dcb66 Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Fri, 11 Jan 2019 11:50:04 -0800 Subject: [PATCH 95/97] chore: Update package-lock.json for https tarball URLs --- package-lock.json | 62 +++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6fa445aed650e..836976ba6cbe6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,7 +65,7 @@ }, "acorn-jsx": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { @@ -74,7 +74,7 @@ "dependencies": { "acorn": { "version": "3.3.0", - "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", "dev": true } @@ -123,7 +123,7 @@ }, "ansi-escapes": { "version": "3.1.0", - "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, @@ -204,7 +204,7 @@ "dependencies": { "sprintf-js": { "version": "1.0.3", - "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true } @@ -278,7 +278,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -473,7 +473,7 @@ }, "callsites": { "version": "0.2.0", - "resolved": "http://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, @@ -859,7 +859,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -918,7 +918,7 @@ }, "debug-log": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", "dev": true }, @@ -1215,7 +1215,7 @@ }, "eslint": { "version": "4.18.2", - "resolved": "http://registry.npmjs.org/eslint/-/eslint-4.18.2.tgz", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.18.2.tgz", "integrity": "sha512-qy4i3wODqKMYfz9LUI8N2qYDkHkoieTbiHpMrYUI/WbjhXJQr7lI4VngixTgaG+yHX+NBCv7nW4hA0ShbvaNKw==", "dev": true, "requires": { @@ -1277,13 +1277,13 @@ }, "eslint-config-standard": { "version": "11.0.0", - "resolved": "http://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz", "integrity": "sha512-oDdENzpViEe5fwuRCWla7AXQd++/oyIp8zP+iP9jiUPG6NBj3SHgdgtl/kTn00AjeN+1HNvavTKmYbMo+xMOlw==", "dev": true }, "eslint-config-standard-jsx": { "version": "5.0.0", - "resolved": "http://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-5.0.0.tgz", "integrity": "sha512-rLToPAEqLMPBfWnYTu6xRhm2OWziS2n40QFqJ8jAM8NSVzeVKTa3nclhsU4DpPJQRY60F34Oo1wi/71PN/eITg==", "dev": true }, @@ -1343,7 +1343,7 @@ }, "eslint-plugin-import": { "version": "2.9.0", - "resolved": "http://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.9.0.tgz", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.9.0.tgz", "integrity": "sha1-JgAu+/ylmJtyiKwEdQi9JPIXsWk=", "dev": true, "requires": { @@ -1370,7 +1370,7 @@ }, "doctrine": { "version": "1.5.0", - "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { @@ -1388,7 +1388,7 @@ }, "eslint-plugin-node": { "version": "6.0.1", - "resolved": "http://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz", "integrity": "sha512-Q/Cc2sW1OAISDS+Ji6lZS2KV4b7ueA/WydVWd1BECTQwVvfQy5JAi3glhINoKzoMnfnuRgNP+ZWKrGAbp3QDxw==", "dev": true, "requires": { @@ -1400,13 +1400,13 @@ }, "eslint-plugin-promise": { "version": "3.7.0", - "resolved": "http://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.7.0.tgz", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.7.0.tgz", "integrity": "sha512-2WO+ZFh7vxUKRfR0cOIMrWgYKdR6S1AlOezw6pC52B6oYpd5WFghN+QHxvrRdZMtbo8h3dfUZ2o1rWb0UPbKtg==", "dev": true }, "eslint-plugin-react": { "version": "7.7.0", - "resolved": "http://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.7.0.tgz", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.7.0.tgz", "integrity": "sha512-KC7Snr4YsWZD5flu6A5c0AcIZidzW3Exbqp7OT67OaD2AppJtlBr/GuPrW/vaQM/yfZotEvKAdrxrO+v8vwYJA==", "dev": true, "requires": { @@ -1440,7 +1440,7 @@ }, "espree": { "version": "3.5.4", - "resolved": "http://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, "requires": { @@ -1518,7 +1518,7 @@ }, "external-editor": { "version": "2.2.0", - "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { @@ -1670,7 +1670,7 @@ }, "foreground-child": { "version": "1.5.6", - "resolved": "http://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", "dev": true, "requires": { @@ -2076,7 +2076,7 @@ }, "http-proxy": { "version": "0.8.7", - "resolved": "http://registry.npmjs.org/http-proxy/-/http-proxy-0.8.7.tgz", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-0.8.7.tgz", "integrity": "sha1-p7xThhgJLNJu0ZHkYlkzuu9t6A4=", "dev": true, "requires": { @@ -2087,7 +2087,7 @@ "dependencies": { "colors": { "version": "0.6.2", - "resolved": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", "dev": true } @@ -2774,7 +2774,7 @@ }, "load-json-file": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { @@ -2786,7 +2786,7 @@ "dependencies": { "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } @@ -2878,7 +2878,7 @@ }, "lodash.isempty": { "version": "4.4.0", - "resolved": "http://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=", "dev": true }, @@ -2974,7 +2974,7 @@ "dependencies": { "marked": { "version": "0.3.19", - "resolved": "http://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", "dev": true } @@ -3314,7 +3314,7 @@ "dependencies": { "semver": { "version": "4.3.6", - "resolved": "http://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", "dev": true } @@ -6313,7 +6313,7 @@ "dependencies": { "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } @@ -6764,7 +6764,7 @@ }, "require-uncached": { "version": "1.0.3", - "resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { @@ -7170,7 +7170,7 @@ }, "standard": { "version": "11.0.1", - "resolved": "http://registry.npmjs.org/standard/-/standard-11.0.1.tgz", + "resolved": "https://registry.npmjs.org/standard/-/standard-11.0.1.tgz", "integrity": "sha512-nu0jAcHiSc8H+gJCXeiziMVZNDYi8MuqrYJKxTgjP4xKXZMKm311boqQIzDrYI/ktosltxt2CbDjYQs9ANC8IA==", "dev": true, "requires": { @@ -7187,7 +7187,7 @@ }, "standard-engine": { "version": "8.0.1", - "resolved": "http://registry.npmjs.org/standard-engine/-/standard-engine-8.0.1.tgz", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-8.0.1.tgz", "integrity": "sha512-LA531C3+nljom/XRvdW/hGPXwmilRkaRkENhO3FAGF1Vtq/WtCXzgmnc5S6vUHHsgv534MRy02C1ikMwZXC+tw==", "dev": true, "requires": { @@ -7199,7 +7199,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } From f277bce7b31e726a8d4798af6f1247d898a1a7b1 Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Thu, 17 Jan 2019 13:59:35 -0800 Subject: [PATCH 96/97] doc: update changelog for npm@6.6.0 --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c5acbd499334..4c0192aee1e31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## v6.6.0 (2019-01-09): +## v6.6.0 (2019-01-17): ### REFACTORING OUT npm-REGISTRY-CLIENT @@ -249,6 +249,9 @@ curious about details: [#119](https://github.com/npm/cli/pull/119) Replace var with const/let in lib/repo.js. ([@watilde](https://github.com/watilde)) +* [`46639ba9f`](https://github.com/npm/cli/commit/46639ba9f04ea729502f1af28b02eb67fb6dcb66) + Update package-lock.json for https tarball URLs + ([@aeschright](https://github.com/aeschright)) ## v6.5.0 (2018-11-28): From bb8688d5aba998bcdbcd33ee0508dad8a9ec2278 Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Thu, 17 Jan 2019 14:01:14 -0800 Subject: [PATCH 97/97] 6.6.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 836976ba6cbe6..deee5e1ae4c31 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "npm", - "version": "6.6.0-next.1", + "version": "6.6.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1a0ae526d78a6..f2c1fbb21d403 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "6.6.0-next.1", + "version": "6.6.0", "name": "npm", "description": "a package manager for JavaScript", "keywords": [