From b528e18b50a7ac067379f414e17d9f4f9134dcb7 Mon Sep 17 00:00:00 2001 From: Nevill Date: Sat, 21 Jul 2018 18:29:17 +0800 Subject: [PATCH 01/34] Bump v0.4.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6b100c0f..35e59ef6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "zongji", - "version": "0.4.5", + "version": "0.4.6", "description": "A mysql binlog listener running on Node.js", "main": "index.js", "directories": { From ffb86301925b087cd9b111f66fe6344957c3e626 Mon Sep 17 00:00:00 2001 From: Norman Rzepka Date: Sat, 1 Sep 2018 22:14:16 +0200 Subject: [PATCH 02/34] Fix passing Pool to Zongji constructor --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 16ab104e..b937d7cc 100644 --- a/index.js +++ b/index.js @@ -21,7 +21,7 @@ function ZongJi(dsn, options) { // one connection to send table info query // Check first argument against possible connection objects for (var i = 0; i < alternateDsn.length; i++) { - if (dsn instanceof alternateDsn[i].type) { + if (dsn.constructor.name === alternateDsn[i].type.name) { this.ctrlConnection = dsn; this.ctrlConnectionOwner = false; binlogDsn = cloneObjectSimple(alternateDsn[i].config(dsn)); From 6386d7e4918575737526035ebcb695ef83141f47 Mon Sep 17 00:00:00 2001 From: Nevill Date: Thu, 22 Nov 2018 16:19:22 +0800 Subject: [PATCH 03/34] Bump v0.4.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 35e59ef6..9c9eff92 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "zongji", - "version": "0.4.6", + "version": "0.4.7", "description": "A mysql binlog listener running on Node.js", "main": "index.js", "directories": { From bf6f533e80b6544e208924e430544524b1fbdefc Mon Sep 17 00:00:00 2001 From: Nevill Date: Mon, 13 May 2019 00:08:04 +0800 Subject: [PATCH 04/34] - Require node >= 6.0 to run - Update packages mysql -> 2.17.1 iconv-lite -> 0.4.24 nodeunit -> 0.11.3 eslint -> 5.16.0 --- .travis.yml | 2 +- package-lock.json | 2831 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 11 +- 3 files changed, 2839 insertions(+), 5 deletions(-) create mode 100644 package-lock.json diff --git a/.travis.yml b/.travis.yml index 4756ac35..fdad5027 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ language: node_js sudo: required dist: trusty node_js: - - "4" + - "6" - "8" services: - mysql diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..be3f96e3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2831 @@ +{ + "name": "zongji", + "version": "0.4.7", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", + "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", + "dev": true + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", + "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + }, + "acorn-jsx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "dev": true + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "arg": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", + "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" + }, + "bind-obj-methods": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-2.0.0.tgz", + "integrity": "sha512-3/qRXczDi2Cdbz6jE+W3IflJOutRVica8frpBn14de1mBOkzDo+6tY33kNhvkw54Kn3PzRRD2VnGbGPcTAk4sw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "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 + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "caching-transform": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", + "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "dev": true, + "requires": { + "hasha": "^3.0.0", + "make-dir": "^2.0.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.4.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "clean-yaml-object": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", + "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true, + "optional": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "coveralls": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.3.tgz", + "integrity": "sha512-viNfeGlda2zJr8Gj1zqXpDMRjw9uM54p7wzZdvLRyOgnAfCe974Dq4veZkjJdxQXbmdppu6flEajFYseHYaUhg==", + "dev": true, + "requires": { + "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.86.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "cp-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", + "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "make-dir": "^2.0.0", + "nested-error-stacks": "^2.0.0", + "pify": "^4.0.1", + "safe-buffer": "^5.0.1" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "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 + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "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" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "esm": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.22.tgz", + "integrity": "sha512-z8YG7U44L82j1XrdEJcqZOLUnjxco8pO453gKOlaMD1/md1n/5QrscAmYG+oKUspsmDLuBFZrpbxI6aQ67yRxA==", + "dev": true + }, + "espree": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "esprima": { + "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": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "events-to-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", + "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.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" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", + "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", + "dev": true + }, + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "dev": true, + "requires": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + } + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-exists-cached": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", + "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-loop": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.2.tgz", + "integrity": "sha512-Iw4MzMfS3udk/rqxTiDDCllhGwlOrsr50zViTOO/W6lS/9y6B1J0BD2VZzrnWUYBJsl3aeqjgR5v7bWWhZSYbA==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "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": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "hasha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", + "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", + "dev": true, + "requires": { + "is-stream": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", + "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", + "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.11", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.4.tgz", + "integrity": "sha512-QCHGyZEK0bfi9GR215QSm+NJwFKEShbtc7tfbUdLAEzn3kKhLDDZqvljn8rPZM9v8CEOhzL1nlYoO4r1ryl67w==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + } + } + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "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" + }, + "dependencies": { + "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 + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "mysql": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.17.1.tgz", + "integrity": "sha512-7vMqHQ673SAk5C8fOzTG2LpPcf3bNt0oL3sFpxPEEFp1mdlDcrLK0On7z8ZYKaaHrHwNcQ/MTUz7/oobZ2OyyA==", + "requires": { + "bignumber.js": "7.2.1", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "neo-async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "dev": true + }, + "nested-error-stacks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", + "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "nodeunit": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/nodeunit/-/nodeunit-0.11.3.tgz", + "integrity": "sha512-gDNxrDWpx07BxYNO/jn1UrGI1vNhDQZrIFphbHMcTCDc5mrrqQBWfQMXPHJ5WSgbFwD1D6bv4HOsqtTrPG03AA==", + "dev": true, + "requires": { + "ejs": "^2.5.2", + "tap": "^12.0.1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nyc": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", + "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "caching-transform": "^3.0.2", + "convert-source-map": "^1.6.0", + "cp-file": "^6.2.0", + "find-cache-dir": "^2.1.0", + "find-up": "^3.0.0", + "foreground-child": "^1.5.6", + "glob": "^7.1.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "merge-source-map": "^1.1.0", + "resolve-from": "^4.0.0", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.2", + "spawn-wrap": "^1.4.2", + "test-exclude": "^5.2.3", + "uuid": "^3.3.2", + "yargs": "^13.2.2", + "yargs-parser": "^13.0.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "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": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "own-or": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", + "integrity": "sha1-Tod/vtqaLsgAD7wLyuOWRe6L+Nw=", + "dev": true + }, + "own-or-env": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.1.tgz", + "integrity": "sha512-y8qULRbRAlL6x2+M0vIe7jJbJx/kmUTzYonRAa2ayesR2qWLswninkVyeJe4x3IEXhdgoNodzjQRKAoEs6Fmrw==", + "dev": true, + "requires": { + "own-or": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", + "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "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": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "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" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "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": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", + "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "rxjs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "spawn-wrap": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", + "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", + "dev": true, + "requires": { + "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": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "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-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "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" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/table/-/table-5.3.3.tgz", + "integrity": "sha512-3wUNCgdWX6PNpOe3amTTPWPuF6VGvgzjKCaO1snFj0z7Y3mUPWf5+zDtxUVGispJkDECPmR29wbzh6bVMOHbcw==", + "dev": true, + "requires": { + "ajv": "^6.9.1", + "lodash": "^4.17.11", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "tap": { + "version": "12.7.0", + "resolved": "https://registry.npmjs.org/tap/-/tap-12.7.0.tgz", + "integrity": "sha512-SjglJmRv0pqrQQ7d5ZBEY8ZOqv3nYDBXEX51oyycOH7piuhn82JKT/yDNewwmOsodTD/RZL9MccA96EjDgK+Eg==", + "dev": true, + "requires": { + "bind-obj-methods": "^2.0.0", + "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.2", + "domain-browser": "^1.2.0", + "esm": "^3.2.5", + "foreground-child": "^1.3.3", + "fs-exists-cached": "^1.0.0", + "function-loop": "^1.0.1", + "glob": "^7.1.3", + "isexe": "^2.0.0", + "js-yaml": "^3.13.1", + "minipass": "^2.3.5", + "mkdirp": "^0.5.1", + "nyc": "^14.0.0", + "opener": "^1.5.1", + "os-homedir": "^1.0.2", + "own-or": "^1.0.0", + "own-or-env": "^1.0.1", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.0", + "source-map-support": "^0.5.10", + "stack-utils": "^1.0.2", + "tap-mocha-reporter": "^3.0.9", + "tap-parser": "^7.0.0", + "tmatch": "^4.0.0", + "trivial-deferred": "^1.0.1", + "ts-node": "^8.0.2", + "tsame": "^2.0.1", + "typescript": "^3.3.3", + "write-file-atomic": "^2.4.2", + "yapool": "^1.0.0" + } + }, + "tap-mocha-reporter": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-3.0.9.tgz", + "integrity": "sha512-VO07vhC9EG27EZdOe7bWBj1ldbK+DL9TnRadOgdQmiQOVZjFpUEQuuqO7+rNSO2kfmkq5hWeluYXDWNG/ytXTQ==", + "dev": true, + "requires": { + "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", + "readable-stream": "^2.1.5", + "tap-parser": "^5.1.0", + "unicode-length": "^1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "tap-parser": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", + "integrity": "sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA==", + "dev": true, + "requires": { + "events-to-array": "^1.0.1", + "js-yaml": "^3.2.7", + "readable-stream": "^2" + } + } + } + }, + "tap-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-7.0.0.tgz", + "integrity": "sha512-05G8/LrzqOOFvZhhAk32wsGiPZ1lfUrl+iV7+OkKgfofZxiceZWMHkKmow71YsyVQ8IvGBP2EjcIjE5gL4l5lA==", + "dev": true, + "requires": { + "events-to-array": "^1.0.1", + "js-yaml": "^3.2.7", + "minipass": "^2.2.0" + } + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmatch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-4.0.0.tgz", + "integrity": "sha512-Ynn2Gsp+oCvYScQXeV+cCs7citRDilq0qDXA6tuvFwDgiYyyaq7D5vKUlAPezzZR5NDobc/QMeN6e5guOYmvxg==", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "trivial-deferred": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", + "integrity": "sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=", + "dev": true + }, + "ts-node": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.1.0.tgz", + "integrity": "sha512-34jpuOrxDuf+O6iW1JpgTRDFynUZ1iEqtYruBqh35gICNjN8x+LpVcPAcwzLPi9VU6mdA3ym+x233nZmZp445A==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + }, + "dependencies": { + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + } + } + }, + "tsame": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tsame/-/tsame-2.0.1.tgz", + "integrity": "sha512-jxyxgKVKa4Bh5dPcO42TJL22lIvfd9LOVJwdovKOnJa4TLLrHxquK+DlGm4rkGmrcur+GRx+x4oW00O2pY/fFw==", + "dev": true + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "typescript": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", + "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", + "dev": true + }, + "uglify-js": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.12.tgz", + "integrity": "sha512-KeQesOpPiZNgVwJj8Ge3P4JYbQHUdZzpx6Fahy6eKAYRSV4zhVmLXoC+JtOeYxcHCHTve8RG1ZGdTvpeOUM26Q==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "unicode-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz", + "integrity": "sha1-Wtp6f+1RhBpBijKM8UlHisg1irs=", + "dev": true, + "requires": { + "punycode": "^1.3.2", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", + "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yapool": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz", + "integrity": "sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o=", + "dev": true + }, + "yargs": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", + "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.0.tgz", + "integrity": "sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz", + "integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==", + "dev": true + } + } +} diff --git a/package.json b/package.json index 9c9eff92..942d018a 100644 --- a/package.json +++ b/package.json @@ -28,12 +28,15 @@ "url": "https://github.com/nevill/zongji/issues" }, "homepage": "https://github.com/nevill/zongji", + "engines": { + "node": ">= 6.0" + }, "devDependencies": { - "eslint": "2.13.1", - "nodeunit": "~0.9.1" + "eslint": "5.16.0", + "nodeunit": "0.11.3" }, "dependencies": { - "iconv-lite": "^0.4.13", - "mysql": "2.15.0" + "iconv-lite": "0.4.24", + "mysql": "2.17.1" } } From ecce01c20fe026a87912fd3be84272db137735e1 Mon Sep 17 00:00:00 2001 From: Nevill Date: Mon, 13 May 2019 00:54:00 +0800 Subject: [PATCH 05/34] Running tests on node v6, v8, v10, v12 --- docker-test.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docker-test.sh b/docker-test.sh index 0c4b3cbd..2d501219 100755 --- a/docker-test.sh +++ b/docker-test.sh @@ -2,6 +2,12 @@ MYSQL_HOSTS="mysql55 mysql56 mysql57" for hostname in ${MYSQL_HOSTS}; do - echo $hostname + echo $hostname + node 6 + docker run -it --network=zongji_default -e MYSQL_HOST=$hostname -w /build -v $PWD:/build node:6 npm test + echo $hostname + node 8 docker run -it --network=zongji_default -e MYSQL_HOST=$hostname -w /build -v $PWD:/build node:8 npm test + echo $hostname + node 10 + docker run -it --network=zongji_default -e MYSQL_HOST=$hostname -w /build -v $PWD:/build node:10 npm test + echo $hostname + node 12 + docker run -it --network=zongji_default -e MYSQL_HOST=$hostname -w /build -v $PWD:/build node:12 npm test done From d2d1b1dd7a01d907024128aee7ba92a2ce179d6e Mon Sep 17 00:00:00 2001 From: Nevill Date: Mon, 13 May 2019 20:31:10 +0800 Subject: [PATCH 06/34] Refactor - ZongJi#_skipEvent is called in BinlogHeader#getEvent, when parsing completed - explicitly pass a ZongJi instance to BinlogHeader, as well as all the binlog event classes --- index.js | 6 ++--- lib/binlog_event.js | 4 +++- lib/capture.js | 43 ------------------------------------ lib/packet/binlog_header.js | 44 ++++++++++++++++++------------------- lib/packet/index.js | 6 ++--- lib/rows_event.js | 2 +- lib/sequence/binlog.js | 24 ++++++++++---------- 7 files changed, 44 insertions(+), 85 deletions(-) delete mode 100644 lib/capture.js diff --git a/index.js b/index.js index b937d7cc..51d5a0f4 100644 --- a/index.js +++ b/index.js @@ -69,9 +69,7 @@ util.inherits(ZongJi, EventEmitter); ZongJi.prototype._init = function() { var self = this; - var binlogOptions = { - tableMap: self.tableMap, - }; + var binlogOptions = {}; var asyncMethods = [ { @@ -119,7 +117,7 @@ ZongJi.prototype._init = function() { binlogOptions.position = self.options.binlogNextPos; } - self.binlog = generateBinlog.call(self, binlogOptions); + self.binlog = generateBinlog(self, binlogOptions); self.ready = true; self._executeCtrlCallbacks(); }; diff --git a/lib/binlog_event.js b/lib/binlog_event.js index 395dfcb2..ae14c686 100644 --- a/lib/binlog_event.js +++ b/lib/binlog_event.js @@ -1,6 +1,8 @@ var util = require('util'); var Common = require('./common'); +//TODO get rid parser from binlog event class +// probably a factory to create them function BinlogEvent(parser, options) { this.timestamp = options.timestamp; this.nextPosition = options.nextPosition; @@ -141,7 +143,7 @@ IntVar.prototype.dump = function() { function TableMap(parser, options, zongji) { BinlogEvent.apply(this, arguments); - this.tableMap = options.tableMap; + this.tableMap = zongji.tableMap; // post-header this._readTableId(parser); diff --git a/lib/capture.js b/lib/capture.js deleted file mode 100644 index 37c16186..00000000 --- a/lib/capture.js +++ /dev/null @@ -1,43 +0,0 @@ -var mysql = require('mysql'); - -var query = mysql.createQuery('select 1', function() {}); - -var Query = query.constructor; -// `super_` is set by calling util.inherits -// see http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor -var Sequence = Query.super_; - -var QueryPrototype = Object.getPrototypeOf(query); -var SequencePrototype = Object.getPrototypeOf(QueryPrototype); - -var classes = { - Query: Query, - Sequence: Sequence, - QueryPrototype: QueryPrototype, - SequencePrototype: SequencePrototype -}; - -var captured = false; - - -var captureIt = function(connection) { - var ConnectionPrototype = Object.getPrototypeOf(connection); - ConnectionPrototype._patch = function() { - classes.ProtocolPrototype = Object.getPrototypeOf(this._protocol); - classes.ConnectionPrototype = ConnectionPrototype; - classes.Connection = connection.constructor; - classes.Protocol = this._protocol.constructor; - captured = true; - }; - - connection._patch(); - delete ConnectionPrototype._patch; -}; - -// connection {Connection} an instance created by mysql.createConnection -module.exports = function(connection) { - if (!captured) { - captureIt(connection); - } - return classes; -}; diff --git a/lib/packet/binlog_header.js b/lib/packet/binlog_header.js index 40cc9478..463bd539 100644 --- a/lib/packet/binlog_header.js +++ b/lib/packet/binlog_header.js @@ -1,12 +1,18 @@ var getEventClass = require('../code_map').getEventClass; -module.exports = function generateBinlogHeader(options) { - var zongji = this; - var tableMap = options.tableMap; - var useChecksum = options.useChecksum; +//TODO Don't depend on zongji instance here +module.exports = function initBinlogHeaderClass(zongji) { function BinlogHeader() {} + // header length doesn't count marker + BinlogHeader.Length = 19; + + if (zongji.useChecksum) { + BinlogHeader.Length = 19 + 4; + } + + // interface will be called, see mysql/lib/protocol/Protocol BinlogHeader.prototype.parse = function(parser) { // uint8_t marker; // always 0 or 0xFF // uint32_t timestamp; @@ -24,37 +30,31 @@ module.exports = function generateBinlogHeader(options) { var nextPosition = parser.parseUnsignedNumber(4); var flags = parser.parseUnsignedNumber(2); // eslint-disable-line - // headerLength doesn't count marker - var headerLength = 19; - // for MySQL 5.6 and binlog-checksum = CRC32 - if (useChecksum) { - headerLength += 4; - } - var eventSize = eventLength - headerLength; - var options = { timestamp: timestamp, nextPosition: nextPosition, - size: eventSize, + size: eventLength - BinlogHeader.Length, eventType: eventType, - tableMap: tableMap, }; var EventClass = getEventClass(eventType); - // Check event filtering - if (!zongji._skipEvent(EventClass.name.toLowerCase())) { - try { - this._event = new EventClass(parser, options, zongji); - } catch (err) { - // Record error occurence but suppress until handled - this._error = err; - } + this.eventName = EventClass.name; + try { + this._event = new EventClass(parser, options, zongji); + } catch (err) { + // Record error occurence but suppress until handled + this._error = err; } }; BinlogHeader.prototype.getEvent = function() { // Ready to handle the error now if (this._error) throw this._error; + + // Check event filtering + if (zongji._skipEvent(this.eventName.toLowerCase())) { + delete this._event; + } return this._event; }; diff --git a/lib/packet/index.js b/lib/packet/index.js index 44db2d32..ecf9c118 100644 --- a/lib/packet/index.js +++ b/lib/packet/index.js @@ -60,7 +60,7 @@ ErrorPacket.prototype.write = function(writer) { writer.writeString(this.message); }; -exports.Eof = EofPacket; -exports.Error = ErrorPacket; +exports.EofPacket = EofPacket; +exports.ErrorPacket = ErrorPacket; exports.ComBinlog = require('./combinlog'); -exports.initBinlogHeader = require('./binlog_header'); +exports.initBinlogHeaderClass = require('./binlog_header'); diff --git a/lib/rows_event.js b/lib/rows_event.js index 68960fea..af70c895 100644 --- a/lib/rows_event.js +++ b/lib/rows_event.js @@ -35,7 +35,7 @@ function RowsEvent(parser, options, zongji) { // Body this.numberOfColumns = parser.parseLengthCodedNumber(); - this.tableMap = options.tableMap; + this.tableMap = zongji.tableMap; var tableData = this.tableMap[this.tableId]; if (tableData === undefined) { diff --git a/lib/sequence/binlog.js b/lib/sequence/binlog.js index dde26625..f339ac14 100644 --- a/lib/sequence/binlog.js +++ b/lib/sequence/binlog.js @@ -1,30 +1,32 @@ -var Util = require('util'); -var Packet = require('../packet'); -var capture = require('../capture'); +const Util = require('util'); +const { EofPacket, ErrorPacket, ComBinlog, initBinlogHeaderClass } = require('../packet'); +const Sequence = require('mysql/lib/protocol/sequences').Sequence; -module.exports = function(options) { - var self = this; // ZongJi instance - var Sequence = capture(self.connection).Sequence; - var BinlogHeader = Packet.initBinlogHeader.call(self, options); +module.exports = function(zongji, options) { + // options include: tableMap / useChecksum + var BinlogHeaderPacket = initBinlogHeaderClass(zongji); + var binlogOptions = options; function Binlog(callback) { Sequence.call(this, callback); + this.binlogOptions = binlogOptions; } Util.inherits(Binlog, Sequence); Binlog.prototype.start = function() { - this.emit('packet', new Packet.ComBinlog(options)); + // options include: position / nonBlock / serverId / filename + this.emit('packet', new ComBinlog(this.binlogOptions)); }; Binlog.prototype.determinePacket = function(firstByte) { switch (firstByte) { case 0xfe: - return Packet.Eof; + return EofPacket; case 0xff: - return Packet.Error; + return ErrorPacket; default: - return BinlogHeader; + return BinlogHeaderPacket; } }; From 42c7b6c08693669a4f7ef64c688cd25051b43f77 Mon Sep 17 00:00:00 2001 From: Nevill Date: Thu, 16 May 2019 11:32:44 +0800 Subject: [PATCH 07/34] Refactor on class ZongJi - clone object with Object.assign - rename variable self.binlog to self.BinlogClass - make some variables as const - extract out a method named '_establishConnection' - establish mysql connection on demand - callback of _isChecksumEnabled, _findBinlogEnd should return error instead of throwing --- index.js | 277 +++++++++++++++++++++++++++---------------------------- 1 file changed, 135 insertions(+), 142 deletions(-) diff --git a/index.js b/index.js index 51d5a0f4..dac8b6ef 100644 --- a/index.js +++ b/index.js @@ -1,50 +1,24 @@ -var mysql = require('mysql'); -var Connection = require('mysql/lib/Connection'); -var Pool = require('mysql/lib/Pool'); - -var util = require('util'); -var EventEmitter = require('events').EventEmitter; -var generateBinlog = require('./lib/sequence/binlog'); +const mysql = require('mysql'); +const util = require('util'); +const EventEmitter = require('events').EventEmitter; +const initBinlogClass = require('./lib/sequence/binlog'); + +const ConnectionConfigMap = { + 'Connection': obj => obj.config, + 'Pool': obj => obj.config.connectionConfig, +}; -var alternateDsn = [ - { type: Connection, config: function(obj) { return obj.config; } }, - { type: Pool, config: function(obj) { return obj.config.connectionConfig; } } -]; +const TableInfoQueryTemplate = 'SELECT ' + + 'COLUMN_NAME, COLLATION_NAME, CHARACTER_SET_NAME, ' + + 'COLUMN_COMMENT, COLUMN_TYPE ' + + 'FROM information_schema.columns ' + "WHERE table_schema='%s' AND table_name='%s'"; function ZongJi(dsn, options) { this.set(options); EventEmitter.call(this); - var binlogDsn; - - // one connection to send table info query - // Check first argument against possible connection objects - for (var i = 0; i < alternateDsn.length; i++) { - if (dsn.constructor.name === alternateDsn[i].type.name) { - this.ctrlConnection = dsn; - this.ctrlConnectionOwner = false; - binlogDsn = cloneObjectSimple(alternateDsn[i].config(dsn)); - } - } - - if (!binlogDsn) { - // assuming that the object passed is the connection settings - var ctrlDsn = cloneObjectSimple(dsn); - this.ctrlConnection = mysql.createConnection(ctrlDsn); - this.ctrlConnection.on('error', this._emitError.bind(this)); - this.ctrlConnection.on('unhandledError', this._emitError.bind(this)); - this.ctrlConnection.connect(); - this.ctrlConnectionOwner = true; - - binlogDsn = dsn; - } this.ctrlCallbacks = []; - - this.connection = mysql.createConnection(binlogDsn); - this.connection.on('error', this._emitError.bind(this)); - this.connection.on('unhandledError', this._emitError.bind(this)); - this.tableMap = {}; this.ready = false; this.useChecksum = false; @@ -52,125 +26,154 @@ function ZongJi(dsn, options) { this.binlogName = null; this.binlogNextPos = null; + this._establishConnection(dsn); this._init(); } -var cloneObjectSimple = function(obj) { - var out = {}; - for (var i in obj) { - if (obj.hasOwnProperty(i)) { - out[i] = obj[i]; - } +util.inherits(ZongJi, EventEmitter); + +// dsn - can be one instance of Connection or Pool / object / url string +ZongJi.prototype._establishConnection = function(dsn) { + let binlogDsn; + let configFunc = ConnectionConfigMap[dsn.constructor.name]; + + if (typeof dsn === 'object' && configFunc) { + let conn = dsn; + // reuse as ctrlConnection + this.ctrlConnection = conn; + this.ctrlConnectionOwner = false; + binlogDsn = Object.assign({}, configFunc(conn)); } - return out; -}; -util.inherits(ZongJi, EventEmitter); + let createConnection = (options) => { + let connection = mysql.createConnection(options); + connection.on('error', this.emit.bind(this, 'error')); + connection.on('unhandledError', this.emit.bind(this, 'error')); + // don't need to call connection.connect() here + // we use implicitly established connection + // see https://github.com/mysqljs/mysql#establishing-connections + return connection; + }; + + if (!binlogDsn) { + // assuming that the object passed is the connection settings + this.ctrlConnectionOwner = true; + this.ctrlConnection = createConnection(dsn); + binlogDsn = dsn; + } + + this.connection = createConnection(binlogDsn); +}; ZongJi.prototype._init = function() { - var self = this; - var binlogOptions = {}; + let binlogOptions = {}; - var asyncMethods = [ - { - name: '_isChecksumEnabled', - callback: function(checksumEnabled) { - self.useChecksum = checksumEnabled; - binlogOptions.useChecksum = checksumEnabled; - } - }, - { - name: '_findBinlogEnd', - callback: function(result) { - if (result && self.options.startAtEnd) { - binlogOptions.filename = result.Log_name; - binlogOptions.position = result.File_size; - } - } + let ready = () => { + // Run asynchronously from _init(), as serverId option set in start() + if (this.options.serverId !== undefined) { + binlogOptions.serverId = this.options.serverId; + } + + if (('binlogName' in this.options) && ('binlogNextPos' in this.options)) { + binlogOptions.filename = this.options.binlogName; + binlogOptions.position = this.options.binlogNextPos; } - ]; - - var methodIndex = 0; - var nextMethod = function() { - var method = asyncMethods[methodIndex]; - self[method.name](function(/* args */) { - method.callback.apply(this, arguments); - methodIndex++; - if (methodIndex < asyncMethods.length) { - nextMethod(); + + this.BinlogClass = initBinlogClass(this, binlogOptions); + this.ready = true; + this._executeCtrlCallbacks(); + }; + + let testChecksum = new Promise((resolve, reject) => { + this._isChecksumEnabled((err, checksumEnabled) => { + if (err) { + reject(err); } else { - ready(); + this.useChecksum = checksumEnabled; + binlogOptions.useChecksum = checksumEnabled; + resolve(); } }); - }; - nextMethod(); + }); - var ready = function() { - // Run asynchronously from _init(), as serverId option set in start() - if (self.options.serverId !== undefined) { - binlogOptions.serverId = self.options.serverId; - } + let findBinlogEnd = new Promise((resolve, reject) => { + this._findBinlogEnd((err, result) => { + if (err) { + return reject(err); + } - if (('binlogName' in self.options) && ('binlogNextPos' in self.options)) { - binlogOptions.filename = self.options.binlogName; - binlogOptions.position = self.options.binlogNextPos; - } + if (result && this.options.startAtEnd) { + binlogOptions.filename = result.Log_name; + binlogOptions.position = result.File_size; + } - self.binlog = generateBinlog(self, binlogOptions); - self.ready = true; - self._executeCtrlCallbacks(); - }; + resolve(); + }); + }); + + Promise.all([testChecksum, findBinlogEnd]) + .then(ready) + .catch(err => { + this.emit('error', err); + }); }; ZongJi.prototype._isChecksumEnabled = function(next) { - var self = this; - var sql = 'select @@GLOBAL.binlog_checksum as checksum'; - var ctrlConnection = self.ctrlConnection; - var connection = self.connection; - - ctrlConnection.query(sql, function(err, rows) { - if (err) { - if (err.toString().match(/ER_UNKNOWN_SYSTEM_VARIABLE/)) { - // MySQL < 5.6.2 does not support @@GLOBAL.binlog_checksum - return next(false); - } else { - // Any other errors should be emitted - self.emit('error', err); - return; + const SelectChecksumParamSql = 'select @@GLOBAL.binlog_checksum as checksum'; + const SetChecksumSql = 'set @master_binlog_checksum=@@global.binlog_checksum'; + + let query = (conn, sql) => { + return new Promise( + (resolve, reject) => { + conn.query(sql, (err, result) => { + if (err) { + reject(err); + } + else { + resolve(result); + } + }); } - } + ); + }; - var checksumEnabled = true; - if (rows[0].checksum === 'NONE') { - checksumEnabled = false; - } + let checksumEnabled = true; - var setChecksumSql = 'set @master_binlog_checksum=@@global.binlog_checksum'; - if (checksumEnabled) { - connection.query(setChecksumSql, function(err) { - if (err) { - // Errors should be emitted - self.emit('error', err); - return; - } - next(checksumEnabled); - }); - } else { - next(checksumEnabled); - } - }); + query(this.ctrlConnection, SelectChecksumParamSql) + .then(rows => { + if (rows[0].checksum === 'NONE') { + checksumEnabled = false; + } + + if (checksumEnabled) { + return query(this.connection, SetChecksumSql); + } + }) + .catch(err => { + if (err.toString().match(/ER_UNKNOWN_SYSTEM_VARIABLE/)) { + checksumEnabled = false; + // a simple query to open this.connection + return query(this.connection, 'SELECT 1'); + } + else { + next(err); + } + }) + .then(() => { + next(null, checksumEnabled); + }); }; ZongJi.prototype._findBinlogEnd = function(next) { - var self = this; - self.ctrlConnection.query('SHOW BINARY LOGS', function(err, rows) { + this.ctrlConnection.query('SHOW BINARY LOGS', function(err, rows) { if (err) { // Errors should be emitted - self.emit('error', err); - return; + next(err); + } + else { + next(null, rows.length > 0 ? rows[rows.length - 1] : null); } - next(rows.length > 0 ? rows[rows.length - 1] : null); }); }; @@ -182,14 +185,9 @@ ZongJi.prototype._executeCtrlCallbacks = function() { } }; -var tableInfoQueryTemplate = 'SELECT ' + - 'COLUMN_NAME, COLLATION_NAME, CHARACTER_SET_NAME, ' + - 'COLUMN_COMMENT, COLUMN_TYPE ' + - 'FROM information_schema.columns ' + "WHERE table_schema='%s' AND table_name='%s'"; - ZongJi.prototype._fetchTableInfo = function(tableMapEvent, next) { var self = this; - var sql = util.format(tableInfoQueryTemplate, + var sql = util.format(TableInfoQueryTemplate, tableMapEvent.schemaName, tableMapEvent.tableName); this.ctrlConnection.query(sql, function(err, rows) { @@ -229,8 +227,7 @@ ZongJi.prototype.start = function(options) { self.set(options); var _start = function() { - self.connection._implyConnect(); - self.connection._protocol._enqueue(new self.binlog(function(error, event) { + self.connection._protocol._enqueue(new self.BinlogClass(function(error, event) { if (error) return self.emit('error', error); // Do not emit events that have been filtered out if (event === undefined || event._filtered === true) return; @@ -309,8 +306,4 @@ ZongJi.prototype._skipSchema = function(database, table) { exclude[database].indexOf(table) === -1)))))); }; -ZongJi.prototype._emitError = function(error) { - this.emit('error', error); -}; - module.exports = ZongJi; From e11565906d87eb2bee96fa263383b4146072127d Mon Sep 17 00:00:00 2001 From: Nevill Date: Tue, 21 May 2019 23:45:00 +0800 Subject: [PATCH 08/34] Update .eslintrc, to support es6 syntax --- .eslintrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.eslintrc b/.eslintrc index c07a4ea1..e050ac21 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,6 +1,7 @@ { "env": { - "node": true + "node": true, + "es6": true }, "extends": "eslint:recommended", "rules": { From 08a027f2b50e789274ff66c53f98ba0754b792bd Mon Sep 17 00:00:00 2001 From: Nevill Date: Sat, 25 May 2019 19:53:24 +0800 Subject: [PATCH 09/34] Refactor - Rename, binlogName => filename, binlogNextPos => position - Add a new method ZongJi#get - Only pass ZongJi instance when init binglog class --- README.md | 6 ++-- index.js | 77 ++++++++++++++++++++++++++--------------- lib/packet/combinlog.js | 11 +++--- lib/sequence/binlog.js | 10 +++--- test/errors.js | 8 ++--- 5 files changed, 67 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index def570d5..ce7c0995 100644 --- a/README.md +++ b/README.md @@ -81,8 +81,8 @@ Option Name | Type | Description ------------|------|------------------------------- `serverId` | `integer` | [Unique number (1 - 232)](http://dev.mysql.com/doc/refman/5.0/en/replication-options.html#option_mysqld_server-id) to identify this replication slave instance. Must be specified if running more than one instance of ZongJi. Must be used in `start()` method for effect.
**Default:** `1` `startAtEnd` | `boolean` | Pass `true` to only emit binlog events that occur after ZongJi's instantiation. Must be used in `start()` method for effect.
**Default:** `false` -`binlogName` | `string` | Begin reading events from this binlog file. If specified together with `binlogNextPos`, will take precedence over `startAtEnd`. -`binlogNextPos` | `integer` | Begin reading events from this position. Must be included with `binlogName`. +`filename` | `string` | Begin reading events from this binlog file. If specified together with `position`, will take precedence over `startAtEnd`. +`position` | `integer` | Begin reading events from this position. Must be included with `filename`. `includeEvents` | `[string]` | Array of event names to include
**Example:** `['writerows', 'updaterows', 'deleterows']` `excludeEvents` | `[string]` | Array of event names to exclude
**Example:** `['rotate', 'tablemap']` `includeSchema` | `object` | Object describing which databases and tables to include (Only for row events). Use database names as the key and pass an array of table names or `true` (for the entire database).
**Example:** ```{ 'my_database': ['allow_table', 'another_table'], 'another_db': true }``` @@ -98,7 +98,7 @@ Event name | Description `unknown` | Catch any other events `query` | [Insert/Update/Delete Query](http://dev.mysql.com/doc/internals/en/query-event.html) `intvar` | [Autoincrement and LAST_INSERT_ID](https://dev.mysql.com/doc/internals/en/intvar-event.html) -`rotate` | [New Binlog file](http://dev.mysql.com/doc/internals/en/rotate-event.html) Not required to be included to rotate to new files, but it is required to be included in order to keep the `binlogName` and `binlogNextPos` properties updated with current values for [graceful restarting on errors](https://gist.github.com/numtel/5b37b2a7f47b380c1a099596c6f3db2f). +`rotate` | [New Binlog file](http://dev.mysql.com/doc/internals/en/rotate-event.html) Not required to be included to rotate to new files, but it is required to be included in order to keep the `filename` and `position` properties updated with current values for [graceful restarting on errors](https://gist.github.com/numtel/5b37b2a7f47b380c1a099596c6f3db2f). `format` | [Format Description](http://dev.mysql.com/doc/internals/en/format-description-event.html) `xid` | [Transaction ID](http://dev.mysql.com/doc/internals/en/xid-event.html) `tablemap` | Before any row event (must be included for any other row events) diff --git a/index.js b/index.js index dac8b6ef..c4ab9cfe 100644 --- a/index.js +++ b/index.js @@ -22,9 +22,6 @@ function ZongJi(dsn, options) { this.tableMap = {}; this.ready = false; this.useChecksum = false; - // Include 'rotate' events to keep these properties updated - this.binlogName = null; - this.binlogNextPos = null; this._establishConnection(dsn); this._init(); @@ -66,20 +63,9 @@ ZongJi.prototype._establishConnection = function(dsn) { }; ZongJi.prototype._init = function() { - let binlogOptions = {}; let ready = () => { - // Run asynchronously from _init(), as serverId option set in start() - if (this.options.serverId !== undefined) { - binlogOptions.serverId = this.options.serverId; - } - - if (('binlogName' in this.options) && ('binlogNextPos' in this.options)) { - binlogOptions.filename = this.options.binlogName; - binlogOptions.position = this.options.binlogNextPos; - } - - this.BinlogClass = initBinlogClass(this, binlogOptions); + this.BinlogClass = initBinlogClass(this); this.ready = true; this._executeCtrlCallbacks(); }; @@ -91,7 +77,6 @@ ZongJi.prototype._init = function() { } else { this.useChecksum = checksumEnabled; - binlogOptions.useChecksum = checksumEnabled; resolve(); } }); @@ -104,8 +89,10 @@ ZongJi.prototype._init = function() { } if (result && this.options.startAtEnd) { - binlogOptions.filename = result.Log_name; - binlogOptions.position = result.File_size; + Object.assign(this.options, { + filename: result.Log_name, + position: result.File_size, + }); } resolve(); @@ -218,8 +205,43 @@ ZongJi.prototype._fetchTableInfo = function(tableMapEvent, next) { }); }; -ZongJi.prototype.set = function(options) { - this.options = options || {}; +const AVAILABLE_OPTIONS = [ + 'includeEvents', + 'excludeEvents', + 'includeSchema', + 'excludeSchema', + 'serverId', + 'filename', + 'position', + 'startAtEnd', +]; + +ZongJi.prototype.set = function(options = {}) { + this.options = {}; + + for (const key of AVAILABLE_OPTIONS) { + if (options[key]) { + this.options[key] = options[key]; + } + } +}; + +ZongJi.prototype.get = function(name) { + let result; + if (typeof name === 'string') { + result = this.options[name]; + } + else if (Array.isArray(name)) { + result = name.reduce( + (acc, cur) => { + acc[cur] = this.options[cur]; + return acc; + }, + {} + ); + } + + return result; }; ZongJi.prototype.start = function(options) { @@ -248,12 +270,12 @@ ZongJi.prototype.start = function(options) { } break; case 'Rotate': - if (self.binlogName !== event.binlogName) { - self.binlogName = event.binlogName; + if (self.options.filename !== event.binlogName) { + self.options.filename = event.binlogName; } break; } - self.binlogNextPos = event.nextPosition; + self.options.position = event.nextPosition; self.emit('binlog', event); })); }; @@ -280,8 +302,8 @@ ZongJi.prototype.stop = function() { }; ZongJi.prototype._skipEvent = function(eventName) { - var include = this.options.includeEvents; - var exclude = this.options.excludeEvents; + var include = this.get('includeEvents'); + var exclude = this.get('excludeEvents'); return !( (include === undefined || (include instanceof Array && include.indexOf(eventName) !== -1)) && @@ -290,8 +312,9 @@ ZongJi.prototype._skipEvent = function(eventName) { }; ZongJi.prototype._skipSchema = function(database, table) { - var include = this.options.includeSchema; - var exclude = this.options.excludeSchema; + var include = this.get('includeSchema'); + var exclude = this.get('excludeSchema'); + return !( (include === undefined || (database !== undefined && (database in include) && diff --git a/lib/packet/combinlog.js b/lib/packet/combinlog.js index 3ab42e03..f6d7361a 100644 --- a/lib/packet/combinlog.js +++ b/lib/packet/combinlog.js @@ -1,14 +1,13 @@ -function ComBinlog(options) { - options = options || {}; +function ComBinlog({ serverId, nonBlock, filename, position }) { this.command = 0x12; - this.position = options.position || 4; + this.position = position || 4; // will send eof package if there is no more binlog event // https://dev.mysql.com/doc/internals/en/com-binlog-dump.html#binlog-dump-non-block - this.flags = options.nonBlock ? 1 : 0; + this.flags = nonBlock ? 1 : 0; - this.serverId = options.serverId || 1; - this.filename = options.filename || ''; + this.serverId = serverId || 1; + this.filename = filename || ''; } ComBinlog.prototype.write = function(writer) { diff --git a/lib/sequence/binlog.js b/lib/sequence/binlog.js index f339ac14..233e1e94 100644 --- a/lib/sequence/binlog.js +++ b/lib/sequence/binlog.js @@ -2,21 +2,21 @@ const Util = require('util'); const { EofPacket, ErrorPacket, ComBinlog, initBinlogHeaderClass } = require('../packet'); const Sequence = require('mysql/lib/protocol/sequences').Sequence; -module.exports = function(zongji, options) { - // options include: tableMap / useChecksum +module.exports = function(zongji) { var BinlogHeaderPacket = initBinlogHeaderClass(zongji); - var binlogOptions = options; function Binlog(callback) { Sequence.call(this, callback); - this.binlogOptions = binlogOptions; } Util.inherits(Binlog, Sequence); Binlog.prototype.start = function() { // options include: position / nonBlock / serverId / filename - this.emit('packet', new ComBinlog(this.binlogOptions)); + let options = zongji.get([ + 'serverId', 'position', 'filename', 'nonBlock', + ]); + this.emit('packet', new ComBinlog(options)); }; Binlog.prototype.determinePacket = function(firstByte) { diff --git a/test/errors.js b/test/errors.js index 9514bcaf..33854f5c 100644 --- a/test/errors.js +++ b/test/errors.js @@ -76,7 +76,7 @@ module.exports = { reconnect_at_pos: function(test) { // Test that binlog events come through in correct sequence after - // reconnect using the binlogName and binlogNextPos properties + // reconnect using the filename and position properties var NEW_INST_TIMEOUT = 1000; var UPDATE_INTERVAL = 300; var UPDATE_COUNT = 5; @@ -94,7 +94,7 @@ module.exports = { opts[setKey] = options[setKey]; return opts; }, { - // Must include rotate events for binlogName and binlogNextPos properties + // Must include rotate events for filename and position properties includeEvents: ['rotate', 'tablemap', 'writerows', 'updaterows', 'deleterows'] })); zongji.on('binlog', function(event) { @@ -130,8 +130,8 @@ module.exports = { firstZongJi.stop(); secondZongJi = startNewZongJi({ serverId: 16, - binlogName: firstZongJi.binlogName, - binlogNextPos: firstZongJi.binlogNextPos + filename: firstZongJi.get('filename'), + position: firstZongJi.get('position'), }); }, NEW_INST_TIMEOUT); From 48b6f1200a44801bb7688d7ebfcf19935866ef9d Mon Sep 17 00:00:00 2001 From: Nevill Date: Sat, 25 May 2019 20:32:56 +0800 Subject: [PATCH 10/34] Fix on tests - Execute querySequence right after startNewZongJi - Use unary increments like `updateEvents++` in a single line --- test/errors.js | 49 ++++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/test/errors.js b/test/errors.js index 33854f5c..bbd8182d 100644 --- a/test/errors.js +++ b/test/errors.js @@ -84,6 +84,9 @@ module.exports = { var updatesSent = 0, updateEvents = 0; + var firstZongJi; + var secondZongJi; + // Create a new ZongJi instance using some default options that will count // using the values in the new rows inserted function startNewZongJi(options) { @@ -99,9 +102,13 @@ module.exports = { })); zongji.on('binlog', function(event) { if (event.getTypeName() === 'WriteRows') { - if (updateEvents++ !== event.rows[0].col) { + if (updateEvents !== event.rows[0].col) { exitTest('Events in the wrong order'); - } else if (updateEvents === UPDATE_COUNT) { + } + + updateEvents++; + + if (updateEvents === UPDATE_COUNT) { exitTest(); } } @@ -109,8 +116,12 @@ module.exports = { return zongji; } - var firstZongJi; - var secondZongJi; + function exitTest(error) { + test.ifError(error); + firstZongJi.stop && firstZongJi.stop(); + secondZongJi.stop && secondZongJi.stop(); + test.done(); + } querySequence(conn.db, [ 'DROP TABLE IF EXISTS ' + conn.escId(TEST_TABLE), @@ -125,6 +136,17 @@ module.exports = { startAtEnd: true }); + var updateInterval = setInterval(function() { + if (updatesSent < UPDATE_COUNT) { + updatesSent++; + querySequence(conn.db, [ + 'INSERT INTO ' + conn.escId(TEST_TABLE) + ' (col) VALUES (' + updateEvents + ')', + ], function(error) { error && exitTest(error); }); + } else { + clearInterval(updateInterval); + } + }, UPDATE_INTERVAL); + setTimeout(function() { // Start new ZongJi instance where the previous was when stopped firstZongJi.stop(); @@ -133,27 +155,8 @@ module.exports = { filename: firstZongJi.get('filename'), position: firstZongJi.get('position'), }); - }, NEW_INST_TIMEOUT); }); - - function exitTest(error) { - test.ifError(error); - firstZongJi.stop && firstZongJi.stop(); - secondZongJi.stop && secondZongJi.stop(); - test.done(); - } - - var updateInterval = setInterval(function() { - if (updatesSent++ < UPDATE_COUNT) { - querySequence(conn.db, [ - 'INSERT INTO ' + conn.escId(TEST_TABLE) + ' (col) VALUES (' + updateEvents + ')', - ], function(error) { error && exitTest(error); }); - } else { - clearInterval(updateInterval); - } - }, UPDATE_INTERVAL); - }, invalid_host: function(test) { From b7b5555a3b0c1e8450cda16f2aa2550b48a3759b Mon Sep 17 00:00:00 2001 From: Nevill Date: Sun, 26 May 2019 20:35:14 +0800 Subject: [PATCH 11/34] Emit a ready event during ZongJi#_init --- index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/index.js b/index.js index c4ab9cfe..9507239f 100644 --- a/index.js +++ b/index.js @@ -67,6 +67,7 @@ ZongJi.prototype._init = function() { let ready = () => { this.BinlogClass = initBinlogClass(this); this.ready = true; + this.emit('ready'); this._executeCtrlCallbacks(); }; From 3b8a1710a11fdab4228a97a248c42eb4cbcde91c Mon Sep 17 00:00:00 2001 From: Nevill Date: Mon, 27 May 2019 13:12:02 +0800 Subject: [PATCH 12/34] Rewrite test reconnect_at_pos, to deal with async function calls --- .travis.yml | 1 - test/errors.js | 125 +++++++++++++++++++++++++++++-------------------- 2 files changed, 75 insertions(+), 51 deletions(-) diff --git a/.travis.yml b/.travis.yml index fdad5027..d09a457e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,6 @@ node_js: - "6" - "8" services: - - mysql - docker before_script: - npm run lint diff --git a/test/errors.js b/test/errors.js index bbd8182d..79831c89 100644 --- a/test/errors.js +++ b/test/errors.js @@ -77,38 +77,38 @@ module.exports = { reconnect_at_pos: function(test) { // Test that binlog events come through in correct sequence after // reconnect using the filename and position properties - var NEW_INST_TIMEOUT = 1000; - var UPDATE_INTERVAL = 300; - var UPDATE_COUNT = 5; - var TEST_TABLE = 'reconnect_at_pos'; + const NEW_INST_TIMEOUT = 1000; + const UPDATE_INTERVAL = 300; + const UPDATE_COUNT = 5; + const TEST_TABLE = 'reconnect_at_pos'; - var updatesSent = 0, updateEvents = 0; + let first; + let second; - var firstZongJi; - var secondZongJi; + let result = []; // Create a new ZongJi instance using some default options that will count // using the values in the new rows inserted function startNewZongJi(options) { - var zongji = new ZongJi(settings.connection); - - zongji.start(Object.keys(options || {}).reduce(function(opts, setKey) { - // Object.assign-like to support node 0.10 - opts[setKey] = options[setKey]; - return opts; - }, { - // Must include rotate events for filename and position properties - includeEvents: ['rotate', 'tablemap', 'writerows', 'updaterows', 'deleterows'] - })); + let zongji = new ZongJi(settings.connection); + + zongji.start( + Object.assign( + { + // Must include rotate events for filename and position properties + includeEvents: [ + 'rotate', 'tablemap', 'writerows', 'updaterows', 'deleterows' + ] + }, + options + ) + ); + zongji.on('binlog', function(event) { if (event.getTypeName() === 'WriteRows') { - if (updateEvents !== event.rows[0].col) { - exitTest('Events in the wrong order'); - } + result.push(event.rows[0].col); - updateEvents++; - - if (updateEvents === UPDATE_COUNT) { + if (result.length === UPDATE_COUNT) { exitTest(); } } @@ -116,46 +116,71 @@ module.exports = { return zongji; } - function exitTest(error) { - test.ifError(error); - firstZongJi.stop && firstZongJi.stop(); - secondZongJi.stop && secondZongJi.stop(); + function exitTest() { + first.stop && first.stop(); + second.stop && second.stop(); + + test.deepEqual( + result, + Array.from({length: UPDATE_COUNT}, (_, i) => i) + ); test.done(); } + function startPeriodicallyWriting() { + const INSERT_QUERY = 'INSERT INTO ' + conn.escId(TEST_TABLE) + ' (col) VALUES '; + let sequences = Array.from( + {length: UPDATE_COUNT}, + (_, i) => INSERT_QUERY + `(${i})` + ); + let updateInterval; + + let doInsert = () => { + querySequence(conn.db, [sequences.shift()], error => { + if (error) { + clearInterval(updateInterval); + test.done(error); + } + }); + + if (sequences.length === 0) { + clearInterval(updateInterval); + } + }; + + updateInterval = setInterval(doInsert, UPDATE_INTERVAL); + } + + function killFirstWhenTimeout() { + setTimeout(function() { + // Start new ZongJi instance where the previous was when stopped + first.stop(); + second = startNewZongJi({ + serverId: 16, + filename: first.get('filename'), + position: first.get('position'), + }); + }, NEW_INST_TIMEOUT); + } + querySequence(conn.db, [ 'DROP TABLE IF EXISTS ' + conn.escId(TEST_TABLE), 'CREATE TABLE ' + conn.escId(TEST_TABLE) + ' (col INT UNSIGNED)', 'INSERT INTO ' + conn.escId(TEST_TABLE) + ' (col) VALUES (10)', ], function(error) { - if (error) - return exitTest(error); + if (error) { + return test.done(error); + } - firstZongJi = startNewZongJi({ + first = startNewZongJi({ serverId: 14, startAtEnd: true }); - var updateInterval = setInterval(function() { - if (updatesSent < UPDATE_COUNT) { - updatesSent++; - querySequence(conn.db, [ - 'INSERT INTO ' + conn.escId(TEST_TABLE) + ' (col) VALUES (' + updateEvents + ')', - ], function(error) { error && exitTest(error); }); - } else { - clearInterval(updateInterval); - } - }, UPDATE_INTERVAL); - - setTimeout(function() { - // Start new ZongJi instance where the previous was when stopped - firstZongJi.stop(); - secondZongJi = startNewZongJi({ - serverId: 16, - filename: firstZongJi.get('filename'), - position: firstZongJi.get('position'), - }); - }, NEW_INST_TIMEOUT); + first.on('ready', () => { + startPeriodicallyWriting(); + killFirstWhenTimeout(); + }); }); }, From 6ae66816d4f98db0e1693569245f9fa8ed17efbf Mon Sep 17 00:00:00 2001 From: Nevill Date: Mon, 27 May 2019 13:25:00 +0800 Subject: [PATCH 13/34] Update README --- README.md | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ce7c0995..f3ce10d9 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,17 @@ A MySQL binlog listener running on Node.js. ZongJi (踪迹) is pronounced as `zōng jì` in Chinese. -This package is a "pure JS" implementation based on [`node-mysql`](https://github.com/felixge/node-mysql). Since v0.2.0, The native part (which was written in C++) has been dropped. +This package is a "pure JS" implementation based on [`mysql`](https://github.com/mysqljs/mysql). Since v0.2.0, The native part (which was written in C++) has been dropped. This package has been tested to work in MySQL 5.5, 5.6, and 5.7. + +# Upcoming Release + +v0.4.7 is the last release which supports Node.js v4.x. + +The next release will be v0.5, only supports Node.js from v6.x. It uses a lot Ecmascript 6 features. + ## Quick Start ```javascript @@ -27,7 +34,7 @@ For a complete implementation see [`example.js`](example.js)... ## Installation -* Requires Node.js v4+ +* Requires Node.js v6+ ```bash $ npm install zongji @@ -59,12 +66,12 @@ For a complete implementation see [`example.js`](example.js)... The `ZongJi` constructor accepts one argument of either: -* An object containing MySQL connection details in the same format as used by `node-mysql` -* Or, a `node-mysql` `Connection` or `Pool` object that will be used for querying column information. +* An object containing MySQL connection details in the same format as used by [package mysql](https://npm.im/mysql) +* Or, a [mysql](https://npm.im/mysql) `Connection` or `Pool` object that will be used for querying column information. If a `Connection` or `Pool` object is passed to the constructor, it will not be destroyed/ended by Zongji's `stop()` method. -If there is a `dateStrings` `node-mysql` configuration option in the connection details or connection, `ZongJi` will follow it. +If there is a `dateStrings` `mysql` configuration option in the connection details or connection, `ZongJi` will follow it. Each instance includes the following methods: @@ -117,7 +124,7 @@ Name | Description ## Important Notes -* :star2: [All types allowed by `node-mysql`](https://github.com/felixge/node-mysql#type-casting) are supported by this package. +* :star2: [All types allowed by `mysql`](https://github.com/mysqljs/mysql#type-casting) are supported by this package. * :speak_no_evil: While 64-bit integers in MySQL (`BIGINT` type) allow values in the range of 264 (± ½ × 264 for signed values), Javascript's internal storage of numbers limits values to 253, making the allowed range of `BIGINT` fields only `-9007199254740992` to `9007199254740992`. Unsigned 64-bit integers must also not exceed `9007199254740992`. * :point_right: `TRUNCATE` statement does not cause corresponding `DeleteRows` event. Use unqualified `DELETE FROM` for same effect. * When using fractional seconds with `DATETIME` and `TIMESTAMP` data types in MySQL > 5.6.4, only millisecond precision is available due to the limit of Javascript's `Date` object. @@ -131,7 +138,7 @@ Name | Description I learnt many things from following resources while making ZongJi. -* https://github.com/felixge/node-mysql +* https://github.com/mysqljs/mysql * https://github.com/felixge/faster-than-c/ * http://intuitive-search.blogspot.co.uk/2011/07/binary-log-api-and-replication-listener.html * https://github.com/Sannis/node-mysql-libmysqlclient From e66344d3111152abc9237d0ba679299499935904 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 13 Jul 2019 12:24:32 +0000 Subject: [PATCH 14/34] Bump lodash from 4.17.11 to 4.17.14 Bumps [lodash](https://github.com/lodash/lodash) from 4.17.11 to 4.17.14. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.11...4.17.14) Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index be3f96e3..bce081c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1368,9 +1368,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", + "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==", "dev": true }, "lodash.flattendeep": { From 19ca021d458256dd1648da3ea9d297ef2f327889 Mon Sep 17 00:00:00 2001 From: Nevill Date: Fri, 9 Aug 2019 11:27:23 +0800 Subject: [PATCH 15/34] Refactor, rename class BinlogHeader to BinlogPacket --- lib/packet/binlog.js | 64 +++++++++++++++++++++++++++++++++++++ lib/packet/binlog_header.js | 63 ------------------------------------ lib/packet/index.js | 2 +- lib/sequence/binlog.js | 8 ++--- 4 files changed, 69 insertions(+), 68 deletions(-) create mode 100644 lib/packet/binlog.js delete mode 100644 lib/packet/binlog_header.js diff --git a/lib/packet/binlog.js b/lib/packet/binlog.js new file mode 100644 index 00000000..dfb55b8e --- /dev/null +++ b/lib/packet/binlog.js @@ -0,0 +1,64 @@ +var getEventClass = require('../code_map').getEventClass; + +//TODO Don't depend on zongji instance here +module.exports = function initBinlogPacketClass(zongji) { + + class BinlogPacket { + // interface will be called, see mysql/lib/protocol/Protocol + parse(parser) { + // uint8_t marker; // always 0 or 0xFF + // uint32_t timestamp; + // uint8_t type_code; + // uint32_t server_id; + // uint32_t event_length; + // uint32_t next_position; + // uint16_t flags; + parser.parseUnsignedNumber(1); + + var timestamp = parser.parseUnsignedNumber(4) * 1000; + var eventType = parser.parseUnsignedNumber(1); + parser.parseUnsignedNumber(4); // serverId + var eventLength = parser.parseUnsignedNumber(4); + var nextPosition = parser.parseUnsignedNumber(4); + parser.parseUnsignedNumber(2); // flags + + var options = { + timestamp: timestamp, + nextPosition: nextPosition, + size: eventLength - BinlogPacket.Length, + eventType: eventType, + }; + + var EventClass = getEventClass(eventType); + this.eventName = EventClass.name; + + //TODO use generator to split this step, if it's a event to be filtered, shouldn't continue + try { + this._event = new EventClass(parser, options, zongji); + } catch (err) { + // Record error occurence but suppress until handled + this._error = err; + } + } + + getEvent() { + // Ready to handle the error now + if (this._error) throw this._error; + + // Check event filtering + if (zongji._skipEvent(this.eventName.toLowerCase())) { + delete this._event; + } + return this._event; + } + } + + // header length doesn't count marker + BinlogPacket.Length = 19; + + if (zongji.useChecksum) { + BinlogPacket.Length = 19 + 4; + } + + return BinlogPacket; +}; diff --git a/lib/packet/binlog_header.js b/lib/packet/binlog_header.js deleted file mode 100644 index 463bd539..00000000 --- a/lib/packet/binlog_header.js +++ /dev/null @@ -1,63 +0,0 @@ -var getEventClass = require('../code_map').getEventClass; - -//TODO Don't depend on zongji instance here -module.exports = function initBinlogHeaderClass(zongji) { - - function BinlogHeader() {} - - // header length doesn't count marker - BinlogHeader.Length = 19; - - if (zongji.useChecksum) { - BinlogHeader.Length = 19 + 4; - } - - // interface will be called, see mysql/lib/protocol/Protocol - BinlogHeader.prototype.parse = function(parser) { - // uint8_t marker; // always 0 or 0xFF - // uint32_t timestamp; - // uint8_t type_code; - // uint32_t server_id; - // uint32_t event_length; - // uint32_t next_position; - // uint16_t flags; - parser.parseUnsignedNumber(1); - - var timestamp = parser.parseUnsignedNumber(4) * 1000; - var eventType = parser.parseUnsignedNumber(1); - var serverId = parser.parseUnsignedNumber(4); // eslint-disable-line - var eventLength = parser.parseUnsignedNumber(4); - var nextPosition = parser.parseUnsignedNumber(4); - var flags = parser.parseUnsignedNumber(2); // eslint-disable-line - - var options = { - timestamp: timestamp, - nextPosition: nextPosition, - size: eventLength - BinlogHeader.Length, - eventType: eventType, - }; - - var EventClass = getEventClass(eventType); - this.eventName = EventClass.name; - try { - this._event = new EventClass(parser, options, zongji); - } catch (err) { - // Record error occurence but suppress until handled - this._error = err; - } - }; - - BinlogHeader.prototype.getEvent = function() { - // Ready to handle the error now - if (this._error) throw this._error; - - // Check event filtering - if (zongji._skipEvent(this.eventName.toLowerCase())) { - delete this._event; - } - return this._event; - }; - - return BinlogHeader; -}; - diff --git a/lib/packet/index.js b/lib/packet/index.js index ecf9c118..3f9f7da4 100644 --- a/lib/packet/index.js +++ b/lib/packet/index.js @@ -63,4 +63,4 @@ ErrorPacket.prototype.write = function(writer) { exports.EofPacket = EofPacket; exports.ErrorPacket = ErrorPacket; exports.ComBinlog = require('./combinlog'); -exports.initBinlogHeaderClass = require('./binlog_header'); +exports.initBinlogPacketClass = require('./binlog'); diff --git a/lib/sequence/binlog.js b/lib/sequence/binlog.js index 233e1e94..1d63b77d 100644 --- a/lib/sequence/binlog.js +++ b/lib/sequence/binlog.js @@ -1,9 +1,9 @@ const Util = require('util'); -const { EofPacket, ErrorPacket, ComBinlog, initBinlogHeaderClass } = require('../packet'); +const { EofPacket, ErrorPacket, ComBinlog, initBinlogPacketClass } = require('../packet'); const Sequence = require('mysql/lib/protocol/sequences').Sequence; module.exports = function(zongji) { - var BinlogHeaderPacket = initBinlogHeaderClass(zongji); + var BinlogPacket = initBinlogPacketClass(zongji); function Binlog(callback) { Sequence.call(this, callback); @@ -26,7 +26,7 @@ module.exports = function(zongji) { case 0xff: return ErrorPacket; default: - return BinlogHeaderPacket; + return BinlogPacket; } }; @@ -34,7 +34,7 @@ module.exports = function(zongji) { console.log('Received one OkPacket ...'); }; - Binlog.prototype['BinlogHeader'] = function(packet) { + Binlog.prototype['BinlogPacket'] = function(packet) { if (this._callback) { var event, error; try { From f2b8c6930693d91656a467952b8ff002f8e617f9 Mon Sep 17 00:00:00 2001 From: Nevill Date: Fri, 9 Aug 2019 12:16:01 +0800 Subject: [PATCH 16/34] Refactor, using generator to split #parse() into two steps, filter the event after first step finished --- lib/packet/binlog.js | 19 +++++++++++-------- lib/sequence/binlog.js | 6 ++++++ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/lib/packet/binlog.js b/lib/packet/binlog.js index dfb55b8e..aff95dd3 100644 --- a/lib/packet/binlog.js +++ b/lib/packet/binlog.js @@ -4,8 +4,8 @@ var getEventClass = require('../code_map').getEventClass; module.exports = function initBinlogPacketClass(zongji) { class BinlogPacket { - // interface will be called, see mysql/lib/protocol/Protocol - parse(parser) { + + *_process(parser) { // uint8_t marker; // always 0 or 0xFF // uint32_t timestamp; // uint8_t type_code; @@ -32,7 +32,8 @@ module.exports = function initBinlogPacketClass(zongji) { var EventClass = getEventClass(eventType); this.eventName = EventClass.name; - //TODO use generator to split this step, if it's a event to be filtered, shouldn't continue + yield; + try { this._event = new EventClass(parser, options, zongji); } catch (err) { @@ -41,14 +42,16 @@ module.exports = function initBinlogPacketClass(zongji) { } } + // interface will be called, see mysql/lib/protocol/Protocol + parse(parser) { + this._processor = this._process(parser); + this._processor.next(); + } + getEvent() { + this._processor.next(); // Ready to handle the error now if (this._error) throw this._error; - - // Check event filtering - if (zongji._skipEvent(this.eventName.toLowerCase())) { - delete this._event; - } return this._event; } } diff --git a/lib/sequence/binlog.js b/lib/sequence/binlog.js index 1d63b77d..0ecf2d6f 100644 --- a/lib/sequence/binlog.js +++ b/lib/sequence/binlog.js @@ -36,6 +36,12 @@ module.exports = function(zongji) { Binlog.prototype['BinlogPacket'] = function(packet) { if (this._callback) { + + // Check event filtering + if (zongji._skipEvent(packet.eventName.toLowerCase())) { + return this._callback.call(this); + } + var event, error; try { event = packet.getEvent(); From 63671f3827f35667f482aabca613ed5f0f7fb53d Mon Sep 17 00:00:00 2001 From: Nevill Date: Tue, 15 Oct 2019 22:48:25 +0800 Subject: [PATCH 17/34] Use Buffer.alloc to init a new buffer --- lib/common.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/common.js b/lib/common.js index 355cdae1..9856c37d 100644 --- a/lib/common.js +++ b/lib/common.js @@ -432,8 +432,8 @@ exports.readMysqlValue = function( var def = columnSchema.COLUMN_TYPE; var defPrefix = def.substr(0, 6); if (defPrefix === 'binary') { - result = new Buffer(parseInt(def.substr(7, def.length - 2), 10)); - result.fill(0); + var bufsize = parseInt(def.substr(7, def.length - 2), 10); + result = Buffer.alloc(bufsize, 0); parser.parseBuffer(size).copy(result); } else if (defPrefix === 'varbin') { result = parser.parseBuffer(size); From 42f43d54bd6ec3f8a47d8eb52cc1cbcbc3077b0a Mon Sep 17 00:00:00 2001 From: Nevill Date: Wed, 23 Oct 2019 19:50:24 +0800 Subject: [PATCH 18/34] Use more ES6 syntax - Force to use let / const to declare variables - Use arrow function to avoid passing this, like `self = this` --- .eslintrc | 1 + example.js | 4 +- index.js | 79 +++++++------- lib/binlog_event.js | 38 +++---- lib/code_map.js | 8 +- lib/common.js | 187 ++++++++++++++++++---------------- lib/datetime_decode.js | 14 +-- lib/json_decode.js | 155 ++++++++++++++-------------- lib/packet/binlog.js | 14 +-- lib/reader.js | 58 +++++------ lib/rows_event.js | 28 ++--- lib/sequence/binlog.js | 4 +- test/errors.js | 22 ++-- test/events.js | 48 ++++----- test/filtering.js | 22 ++-- test/helpers/connector.js | 41 ++++---- test/helpers/expectEvents.js | 6 +- test/helpers/querySequence.js | 4 +- test/helpers/strRepeat.js | 4 +- test/types.js | 50 ++++----- 20 files changed, 400 insertions(+), 387 deletions(-) diff --git a/.eslintrc b/.eslintrc index e050ac21..21d85b3a 100644 --- a/.eslintrc +++ b/.eslintrc @@ -11,6 +11,7 @@ "no-console": "off", "no-trailing-spaces": ["error", { "skipBlankLines": true }], "no-unused-vars": "warn", + "no-var": "warn", "quotes": ["warn", "single", "avoid-escape"], "semi": ["error", "always"], "space-before-blocks": "error" diff --git a/example.js b/example.js index 636dfcf6..361e11f5 100644 --- a/example.js +++ b/example.js @@ -1,7 +1,7 @@ // Client code -var ZongJi = require('./'); +const ZongJi = require('./'); -var zongji = new ZongJi({ +const zongji = new ZongJi({ host : 'localhost', user : 'zongji', password : 'zongji', diff --git a/index.js b/index.js index 9507239f..cc332e37 100644 --- a/index.js +++ b/index.js @@ -32,7 +32,7 @@ util.inherits(ZongJi, EventEmitter); // dsn - can be one instance of Connection or Pool / object / url string ZongJi.prototype._establishConnection = function(dsn) { let binlogDsn; - let configFunc = ConnectionConfigMap[dsn.constructor.name]; + const configFunc = ConnectionConfigMap[dsn.constructor.name]; if (typeof dsn === 'object' && configFunc) { let conn = dsn; @@ -42,7 +42,7 @@ ZongJi.prototype._establishConnection = function(dsn) { binlogDsn = Object.assign({}, configFunc(conn)); } - let createConnection = (options) => { + const createConnection = (options) => { let connection = mysql.createConnection(options); connection.on('error', this.emit.bind(this, 'error')); connection.on('unhandledError', this.emit.bind(this, 'error')); @@ -64,14 +64,14 @@ ZongJi.prototype._establishConnection = function(dsn) { ZongJi.prototype._init = function() { - let ready = () => { + const ready = () => { this.BinlogClass = initBinlogClass(this); this.ready = true; this.emit('ready'); this._executeCtrlCallbacks(); }; - let testChecksum = new Promise((resolve, reject) => { + const testChecksum = new Promise((resolve, reject) => { this._isChecksumEnabled((err, checksumEnabled) => { if (err) { reject(err); @@ -83,7 +83,7 @@ ZongJi.prototype._init = function() { }); }); - let findBinlogEnd = new Promise((resolve, reject) => { + const findBinlogEnd = new Promise((resolve, reject) => { this._findBinlogEnd((err, result) => { if (err) { return reject(err); @@ -111,7 +111,7 @@ ZongJi.prototype._isChecksumEnabled = function(next) { const SelectChecksumParamSql = 'select @@GLOBAL.binlog_checksum as checksum'; const SetChecksumSql = 'set @master_binlog_checksum=@@global.binlog_checksum'; - let query = (conn, sql) => { + const query = (conn, sql) => { return new Promise( (resolve, reject) => { conn.query(sql, (err, result) => { @@ -154,7 +154,7 @@ ZongJi.prototype._isChecksumEnabled = function(next) { }; ZongJi.prototype._findBinlogEnd = function(next) { - this.ctrlConnection.query('SHOW BINARY LOGS', function(err, rows) { + this.ctrlConnection.query('SHOW BINARY LOGS', (err, rows) => { if (err) { // Errors should be emitted next(err); @@ -167,28 +167,27 @@ ZongJi.prototype._findBinlogEnd = function(next) { ZongJi.prototype._executeCtrlCallbacks = function() { if (this.ctrlCallbacks.length > 0) { - this.ctrlCallbacks.forEach(function(cb) { + this.ctrlCallbacks.forEach(cb => { setImmediate(cb); }); } }; ZongJi.prototype._fetchTableInfo = function(tableMapEvent, next) { - var self = this; - var sql = util.format(TableInfoQueryTemplate, + const sql = util.format(TableInfoQueryTemplate, tableMapEvent.schemaName, tableMapEvent.tableName); - this.ctrlConnection.query(sql, function(err, rows) { + this.ctrlConnection.query(sql, (err, rows) => { if (err) { // Errors should be emitted - self.emit('error', err); + this.emit('error', err); // This is a fatal error, no additional binlog events will be // processed since next() will never be called return; } if (rows.length === 0) { - self.emit('error', new Error( + this.emit('error', new Error( 'Insufficient permissions to access: ' + tableMapEvent.schemaName + '.' + tableMapEvent.tableName)); // This is a fatal error, no additional binlog events will be @@ -196,7 +195,7 @@ ZongJi.prototype._fetchTableInfo = function(tableMapEvent, next) { return; } - self.tableMap[tableMapEvent.tableId] = { + this.tableMap[tableMapEvent.tableId] = { columnSchemas: rows, parentSchema: tableMapEvent.schemaName, tableName: tableMapEvent.tableName @@ -246,38 +245,37 @@ ZongJi.prototype.get = function(name) { }; ZongJi.prototype.start = function(options) { - var self = this; - self.set(options); + this.set(options); - var _start = function() { - self.connection._protocol._enqueue(new self.BinlogClass(function(error, event) { - if (error) return self.emit('error', error); + const _start = () => { + this.connection._protocol._enqueue(new this.BinlogClass((error, event) => { + if (error) return this.emit('error', error); // Do not emit events that have been filtered out if (event === undefined || event._filtered === true) return; switch (event.getTypeName()) { - case 'TableMap': - var tableMap = self.tableMap[event.tableId]; - + case 'TableMap': { + const tableMap = this.tableMap[event.tableId]; if (!tableMap) { - self.connection.pause(); - self._fetchTableInfo(event, function() { + this.connection.pause(); + this._fetchTableInfo(event, () => { // merge the column info with metadata event.updateColumnInfo(); - self.emit('binlog', event); - self.connection.resume(); + this.emit('binlog', event); + this.connection.resume(); }); return; } break; + } case 'Rotate': - if (self.options.filename !== event.binlogName) { - self.options.filename = event.binlogName; + if (this.options.filename !== event.binlogName) { + this.options.filename = event.binlogName; } break; } - self.options.position = event.nextPosition; - self.emit('binlog', event); + this.options.position = event.nextPosition; + this.emit('binlog', event); })); }; @@ -290,21 +288,20 @@ ZongJi.prototype.start = function(options) { }; ZongJi.prototype.stop = function() { - var self = this; // Binary log connection does not end with destroy() - self.connection.destroy(); - self.ctrlConnection.query( - 'KILL ' + self.connection.threadId, - function() { - if (self.ctrlConnectionOwner) - self.ctrlConnection.destroy(); + this.connection.destroy(); + this.ctrlConnection.query( + 'KILL ' + this.connection.threadId, + () => { + if (this.ctrlConnectionOwner) + this.ctrlConnection.destroy(); } ); }; ZongJi.prototype._skipEvent = function(eventName) { - var include = this.get('includeEvents'); - var exclude = this.get('excludeEvents'); + const include = this.get('includeEvents'); + const exclude = this.get('excludeEvents'); return !( (include === undefined || (include instanceof Array && include.indexOf(eventName) !== -1)) && @@ -313,8 +310,8 @@ ZongJi.prototype._skipEvent = function(eventName) { }; ZongJi.prototype._skipSchema = function(database, table) { - var include = this.get('includeSchema'); - var exclude = this.get('excludeSchema'); + const include = this.get('includeSchema'); + const exclude = this.get('excludeSchema'); return !( (include === undefined || diff --git a/lib/binlog_event.js b/lib/binlog_event.js index ae14c686..1a905219 100644 --- a/lib/binlog_event.js +++ b/lib/binlog_event.js @@ -1,5 +1,5 @@ -var util = require('util'); -var Common = require('./common'); +const util = require('util'); +const Common = require('./common'); //TODO get rid parser from binlog event class // probably a factory to create them @@ -120,7 +120,7 @@ function IntVar(parser) { } util.inherits(IntVar, BinlogEvent); -var INTVAR_TYPES = ['INVALID_INT', 'LAST_INSERT_ID', 'INSERT_ID']; +const INTVAR_TYPES = ['INVALID_INT', 'LAST_INSERT_ID', 'INSERT_ID']; IntVar.prototype.getIntTypeName = function() { return INTVAR_TYPES[this.type] || 'INVALID_INT'; }; @@ -150,11 +150,11 @@ function TableMap(parser, options, zongji) { this.flags = parser.parseUnsignedNumber(2); // payload - var schemaNameLength = parser.parseUnsignedNumber(1); + const schemaNameLength = parser.parseUnsignedNumber(1); this.schemaName = parser.parseString(schemaNameLength); parser.parseUnsignedNumber(1); - var tableNameLength = parser.parseUnsignedNumber(1); + const tableNameLength = parser.parseUnsignedNumber(1); this.tableName = parser.parseString(tableNameLength); if (zongji._skipSchema(this.schemaName, this.tableName)) { @@ -179,18 +179,18 @@ function TableMap(parser, options, zongji) { util.inherits(TableMap, BinlogEvent); TableMap.prototype.updateColumnInfo = function() { - var columnsMetadata = this.columnsMetadata; - for (var i = 0; i < this.columnCount; i++) { + const columnsMetadata = this.columnsMetadata; + for (let i = 0; i < this.columnCount; i++) { if (columnsMetadata[i] && columnsMetadata[i].type) { this.columnTypes[i] = columnsMetadata[i].type; delete columnsMetadata[i].type; } } - var tableMap = this.tableMap[this.tableId]; + const tableMap = this.tableMap[this.tableId]; - var columnSchemas = tableMap.columnSchemas; - var columns = []; - for (var j = 0; j < this.columnCount; j++) { + const columnSchemas = tableMap.columnSchemas; + const columns = []; + for (let j = 0; j < this.columnCount; j++) { columns.push({ name: columnSchemas[j].COLUMN_NAME, charset: columnSchemas[j].CHARACTER_SET_NAME, @@ -205,7 +205,7 @@ TableMap.prototype.updateColumnInfo = function() { TableMap.prototype._readColumnMetadata = function(parser) { this.columnsMetadata = this.columnTypes.map(function(code) { - var result; + let result; switch (code) { case Common.MysqlTypes.FLOAT: @@ -219,13 +219,14 @@ TableMap.prototype._readColumnMetadata = function(parser) { 'max_length': parser.parseUnsignedNumber(2) }; break; - case Common.MysqlTypes.BIT: - var bits = parser.parseUnsignedNumber(1); - var bytes = parser.parseUnsignedNumber(1); + case Common.MysqlTypes.BIT: { + const bits = parser.parseUnsignedNumber(1); + const bytes = parser.parseUnsignedNumber(1); result = { bits: bytes * 8 + bits }; break; + } case Common.MysqlTypes.NEWDECIMAL: result = { precision: parser.parseUnsignedNumber(1), @@ -240,14 +241,14 @@ TableMap.prototype._readColumnMetadata = function(parser) { }; break; case Common.MysqlTypes.STRING: - case Common.MysqlTypes.VAR_STRING: + case Common.MysqlTypes.VAR_STRING: { // The STRING type sets a 'real_type' field to indicate the // actual type which is fundamentally incompatible with STRING // parsing. Setting a 'type' key in this hash will cause // TableMap event to override the main field 'type' with the // provided 'type' here. - var metadata = (parser.parseUnsignedNumber(1) << 8) + parser.parseUnsignedNumber(1); - var realType = metadata >> 8; + const metadata = (parser.parseUnsignedNumber(1) << 8) + parser.parseUnsignedNumber(1); + const realType = metadata >> 8; if (realType === Common.MysqlTypes.ENUM || realType === Common.MysqlTypes.SET) { result = { @@ -261,6 +262,7 @@ TableMap.prototype._readColumnMetadata = function(parser) { }; } break; + } case Common.MysqlTypes.TIMESTAMP2: case Common.MysqlTypes.DATETIME2: case Common.MysqlTypes.TIME2: diff --git a/lib/code_map.js b/lib/code_map.js index ac80d60b..1e66b884 100644 --- a/lib/code_map.js +++ b/lib/code_map.js @@ -1,7 +1,7 @@ -var events = require('./binlog_event'); -var rowsEvents = require('./rows_event'); +const events = require('./binlog_event'); +const rowsEvents = require('./rows_event'); -var CodeEvent = [ +const CodeEvent = [ 'UNKNOWN_EVENT', 'START_EVENT_V3', 'QUERY_EVENT', @@ -40,7 +40,7 @@ var CodeEvent = [ 'PREVIOUS_GTIDS_LOG_EVENT' ]; -var EventClass = { +const EventClass = { UNKNOWN_EVENT: events.Unknown, QUERY_EVENT: events.Query, INTVAR_EVENT: events.IntVar, diff --git a/lib/common.js b/lib/common.js index 9856c37d..92bf4ad9 100644 --- a/lib/common.js +++ b/lib/common.js @@ -1,8 +1,8 @@ -var iconv = require('iconv-lite'); -var decodeJson = require('./json_decode'); -var dtDecode = require('./datetime_decode'); +const iconv = require('iconv-lite'); +const decodeJson = require('./json_decode'); +const dtDecode = require('./datetime_decode'); -var MysqlTypes = exports.MysqlTypes = { +const MysqlTypes = exports.MysqlTypes = { DECIMAL: 0, TINY: 1, SHORT: 2, @@ -39,8 +39,8 @@ var MysqlTypes = exports.MysqlTypes = { }; exports.parseUInt64 = function(parser) { - var low = parser.parseUnsignedNumber(4); - var high = parser.parseUnsignedNumber(4); + const low = parser.parseUnsignedNumber(4); + const high = parser.parseUnsignedNumber(4); if (this) { // Pass extra output to context @@ -52,20 +52,20 @@ exports.parseUInt64 = function(parser) { }; exports.parseUInt48 = function(parser) { - var low = parser.parseUnsignedNumber(4); - var high = parser.parseUnsignedNumber(2); + const low = parser.parseUnsignedNumber(4); + const high = parser.parseUnsignedNumber(2); return (high * Math.pow(2, 32)) + low; }; exports.parseUInt24 = function(parser) { - var low = parser.parseUnsignedNumber(2); - var high = parser.parseUnsignedNumber(1); + const low = parser.parseUnsignedNumber(2); + const high = parser.parseUnsignedNumber(1); return (high << 16) + low; }; exports.parseBytesArray = function(parser, length) { - var result = new Array(length); - for (var i = 0; i < length; i++) { + const result = new Array(length); + for (let i = 0; i < length; i++) { result[i] = parser.parseUnsignedNumber(1); } return result; @@ -75,7 +75,7 @@ exports.parseBytesArray = function(parser, length) { // @param type String Definition of column 'set(...)' or 'enum(...)' // @param prefixLen Integer Number of characters before list starts // (e.g. 'set(': 4, 'enum(': 5) -var parseSetEnumTypeDef = function(type, prefixLen) { +const parseSetEnumTypeDef = function(type, prefixLen) { // listed distinct elements should not include commas return type.substr(prefixLen, type.length - prefixLen - 1) .split(',').map(function(opt) { @@ -84,15 +84,15 @@ var parseSetEnumTypeDef = function(type, prefixLen) { }); }; -var zeroPad = exports.zeroPad = function(num, size) { +const zeroPad = exports.zeroPad = function(num, size) { // Max 32 digits - var s = '00000000000000000000000000000000' + num; + const s = '00000000000000000000000000000000' + num; return s.substr(s.length-size); }; -var sliceBits = exports.sliceBits = function(input, start, end) { +const sliceBits = exports.sliceBits = function(input, start, end) { // ex: start: 10, end: 15 = "111110000000000" - var match = (((1 << end) - 1) ^ ((1 << start) - 1)); + const match = (((1 << end) - 1) ^ ((1 << start) - 1)); return (input & match) >> start; }; @@ -100,8 +100,8 @@ var sliceBits = exports.sliceBits = function(input, start, end) { // http://www.h-schmidt.net/FloatConverter/IEEE754.html // http://babbage.cs.qc.cuny.edu/IEEE-754.old/64bit.html // Pass only high for 32-bit float, pass high and low for 64-bit double -var parseIEEE754Float = exports.parseIEEE754Float = function(high, low) { - var lastSignificantBit, sigFigs, expLeading; +const parseIEEE754Float = exports.parseIEEE754Float = function(high, low) { + let lastSignificantBit, sigFigs, expLeading; if (low !== undefined) { // 64-bit: 1 sign, 11 exponent, 52 significand lastSignificantBit = 20; @@ -114,19 +114,19 @@ var parseIEEE754Float = exports.parseIEEE754Float = function(high, low) { expLeading = 127; // 2^(8-1) - 1 } - var sign = (high & (1 << 31)) !== 0 ? -1 : 1; - var exponent = sliceBits(high, lastSignificantBit, 31) - expLeading; - var significandBits = sliceBits(high, 0, lastSignificantBit); - var significand = 1; // Becomes value between 1, 2 + const sign = (high & (1 << 31)) !== 0 ? -1 : 1; + const exponent = sliceBits(high, lastSignificantBit, 31) - expLeading; + const significandBits = sliceBits(high, 0, lastSignificantBit); + let significand = 1; // Becomes value between 1, 2 - for (var i = 0; i < lastSignificantBit; i++) { + for (let i = 0; i < lastSignificantBit; i++) { if (significandBits & (1 << i)) { significand += 1 / (1 << (sigFigs - i)); } } if (low !== undefined) { - for (var j = 0; j < 32; j++) { + for (let j = 0; j < 32; j++) { if (low & (1 << j)) { // Bitwise operators only work on up to 32 bits significand += 1 / Math.pow(2, sigFigs - j); @@ -137,14 +137,14 @@ var parseIEEE754Float = exports.parseIEEE754Float = function(high, low) { return sign * Math.pow(2, exponent) * significand; }; -var getUInt32Value = exports.getUInt32Value = function(input) { +const getUInt32Value = exports.getUInt32Value = function(input) { // Last bit is not sign, it is part of value! if (input & (1 << 31)) return Math.pow(2, 31) + (input & ((1 << 31) -1)); else return input; }; -var parseAnyInt = function(parser, column, columnSchema) { - var result, int64, size; +const parseAnyInt = function(parser, column, columnSchema) { + let result, int64, size; switch (column.type) { case MysqlTypes.TINY: size = 1; @@ -169,28 +169,28 @@ var parseAnyInt = function(parser, column, columnSchema) { break; } if (columnSchema.COLUMN_TYPE.indexOf('unsigned') === -1) { - var length = size * 8; + const length = size * 8; // Flip bits on negative signed integer if (!int64 && (result & (1 << (length - 1)))) { result = ((result ^ (Math.pow(2, length) - 1)) * -1) - 1; } else if (int64 && (int64.high & (1 << 31))) { // Javascript integers only support 2^53 not 2^64, must trim bits! // 64-53 = 11, 32-11 = 21, so grab first 21 bits of high word only - var mask = Math.pow(2, 32) - 1; - var high = sliceBits(int64.high ^ mask, 0, 21); - var low = int64.low ^ mask; + const mask = Math.pow(2, 32) - 1; + const high = sliceBits(int64.high ^ mask, 0, 21); + const low = int64.low ^ mask; result = ((high * Math.pow(2, 32)) * - 1) - getUInt32Value(low) - 1; } } return result; }; -var readInt24BE = function(buf, offset, noAssert) { +const readInt24BE = function(buf, offset, noAssert) { return (buf.readInt8(offset, noAssert) << 16) + buf.readUInt16BE(offset + 1, noAssert); }; -var readIntBE = function(buf, offset, length, noAssert) { +const readIntBE = function(buf, offset, length, noAssert) { switch (length) { case 1: return buf.readInt8(offset, noAssert); case 2: return buf.readInt16BE(offset, noAssert); @@ -203,26 +203,27 @@ var readIntBE = function(buf, offset, length, noAssert) { // https://github.com/jeremycole/mysql_binlog/blob/master/lib/mysql_binlog/binlog_field_parser.rb // Some more information about DECIMAL types: // http://dev.mysql.com/doc/refman/5.5/en/precision-math-decimal-characteristics.html -var parseNewDecimal = function(parser, column) { +const parseNewDecimal = function(parser, column) { // Constants of format - var digitsPerInteger = 9; - var compressedBytes = [0, 1, 1, 2, 2, 3, 3, 4, 4, 4]; + const digitsPerInteger = 9; + const compressedBytes = [0, 1, 1, 2, 2, 3, 3, 4, 4, 4]; - var scale = column.metadata.decimals; - var integral = column.metadata.precision - scale; - var uncompIntegral = Math.floor(integral / digitsPerInteger); - var uncompFractional = Math.floor(scale / digitsPerInteger); - var compIntegral = integral - (uncompIntegral * digitsPerInteger); - var compFractional = scale - (uncompFractional * digitsPerInteger); + const scale = column.metadata.decimals; + const integral = column.metadata.precision - scale; + const uncompIntegral = Math.floor(integral / digitsPerInteger); + const uncompFractional = Math.floor(scale / digitsPerInteger); + const compIntegral = integral - (uncompIntegral * digitsPerInteger); + const compFractional = scale - (uncompFractional * digitsPerInteger); // Grab buffer portion - var size = (uncompIntegral * 4) + compressedBytes[compIntegral] + + const size = (uncompIntegral * 4) + compressedBytes[compIntegral] + (uncompFractional * 4) + compressedBytes[compFractional]; - var buffer = parser._buffer.slice(parser._offset, parser._offset + size); + const buffer = parser._buffer.slice(parser._offset, parser._offset + size); parser._offset += size; // Move binlog parser position forward - var str, mask, pos = 0; - var isPositive = (buffer.readUInt8(0) & (1 << 7)) === 128; + let str, mask; + let pos = 0; + const isPositive = (buffer.readUInt8(0) & (1 << 7)) === 128; buffer.writeUInt8(buffer.readUInt8(0) ^ (1 << 7), 0); if (isPositive) { // Positive number @@ -235,26 +236,26 @@ var parseNewDecimal = function(parser, column) { } // Build integer digits - var compIntegralSize = compressedBytes[compIntegral]; + const compIntegralSize = compressedBytes[compIntegral]; if (compIntegralSize > 0) { str += (readIntBE(buffer, 0, compIntegralSize) ^ mask).toString(10); pos += compIntegralSize; } - for (var i = 0; i < uncompIntegral; i++) { + for (let i = 0; i < uncompIntegral; i++) { str += zeroPad((buffer.readInt32BE(pos) ^ mask).toString(10), 9); pos += 4; } // Build fractional digits - var fractionDigits = ''; + let fractionDigits = ''; - for (var k = 0; k < uncompFractional; k++) { + for (let k = 0; k < uncompFractional; k++) { fractionDigits += zeroPad((buffer.readInt32BE(pos) ^ mask).toString(10), 9); pos += 4; } - var compFractionalSize = compressedBytes[compFractional]; + const compFractionalSize = compressedBytes[compFractional]; if (compFractionalSize > 0) { fractionDigits += zeroPad((readIntBE(buffer, pos, compFractionalSize) ^ mask).toString(10), compFractional); } @@ -267,18 +268,18 @@ var parseNewDecimal = function(parser, column) { // Did not work in place. Function cribbed from lines 311-363 of // https://github.com/felixge/node-mysql/blob/cfd0ce3572d75c3c82103418d1d03cbe67eaf8a1/lib/protocol/Parser.js -var parseGeometryValue = function(buffer) { - var offset = 4; +const parseGeometryValue = function(buffer) { + let offset = 4; if (buffer === null || !buffer.length) { return null; } function parseGeometry() { - var result = null; - var byteOrder = buffer.readUInt8(offset); offset += 1; - var wkbType = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; - var x, y, numPoints, i; + let result = null; + const byteOrder = buffer.readUInt8(offset); offset += 1; + const wkbType = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; + let x, y, numPoints, i; switch (wkbType) { case 1: // WKBPoint @@ -295,13 +296,13 @@ var parseGeometryValue = function(buffer) { result.push({x: x, y: y}); } break; - case 3: // WKBPolygon - var numRings = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; + case 3: {// WKBPolygon + const numRings = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; result = []; for (i = numRings; i > 0; i--) { numPoints = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; - var line = []; - for (var j=numPoints;j>0;j--) { + const line = []; + for (let j = numPoints; j > 0; j--) { x = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; y = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; line.push({x: x, y: y}); @@ -309,16 +310,18 @@ var parseGeometryValue = function(buffer) { result.push(line); } break; + } case 4: // WKBMultiPoint case 5: // WKBMultiLineString case 6: // WKBMultiPolygon - case 7: // WKBGeometryCollection - var num = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; + case 7: {// WKBGeometryCollection + const num = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; result = []; for (i = num; i > 0; i--) { result.push(parseGeometry()); } break; + } } return result; } @@ -327,15 +330,15 @@ var parseGeometryValue = function(buffer) { // Returns false, or an object describing the fraction of a second part of a // TIME, DATETIME, or TIMESTAMP. -var readTemporalFraction = function(parser, fractionPrecision) { +const readTemporalFraction = function(parser, fractionPrecision) { if (!fractionPrecision) return false; - var fractionSize = Math.ceil(fractionPrecision / 2); - var fraction = readIntBE(parser._buffer, parser._offset, fractionSize); + let fractionSize = Math.ceil(fractionPrecision / 2); + let fraction = readIntBE(parser._buffer, parser._offset, fractionSize); parser._offset += fractionSize; if (fractionPrecision % 2 !== 0) fraction /= 10; // Not using full space if (fraction < 0) fraction *= -1; // Negative time, fraction not negative - var milliseconds; + let milliseconds; if (fractionPrecision > 3) { milliseconds = Math.floor(fraction / Math.pow(10, fractionPrecision - 3)); } else if (fractionPrecision < 3) { @@ -363,15 +366,17 @@ exports.readMysqlValue = function( zongji // the ZongJi instance, used to read options and emit errors ) { - var result; - var high, low; - var raw; - var choices; - var size, lengthSize; - var buffer; - var isNegative; - var fraction; - var hour, minute, second; + let result; + let high, low; + let raw; + let choices; + let size, lengthSize; + let buffer; + let isNegative; + let fraction; + let hour, minute, second; + let date, time, yearMonth; + switch (column.type) { case MysqlTypes.TINY: case MysqlTypes.SHORT: @@ -405,11 +410,11 @@ exports.readMysqlValue = function( // Second argument: prefixLen = 4 'set(' choices = parseSetEnumTypeDef(columnSchema.COLUMN_TYPE, 4); result = ''; - for (var i = 0; low >= Math.pow(2, i); i++) { + for (let i = 0; low >= Math.pow(2, i); i++) { if (low & Math.pow(2, i)) result += choices[i] + ','; } if (high) { - for (i = 0; high >= Math.pow(2, i); i++) { + for (let i = 0; high >= Math.pow(2, i); i++) { if (high & Math.pow(2, i)) result += choices[i + 32] + ','; } } @@ -426,13 +431,13 @@ exports.readMysqlValue = function( result = parser.parseLengthCodedString(); break; case MysqlTypes.VARCHAR: - case MysqlTypes.STRING: - var prefixSize = column.metadata['max_length'] > 255 ? 2 : 1; + case MysqlTypes.STRING: { + const prefixSize = column.metadata['max_length'] > 255 ? 2 : 1; size = parser.parseUnsignedNumber(prefixSize); - var def = columnSchema.COLUMN_TYPE; - var defPrefix = def.substr(0, 6); + const def = columnSchema.COLUMN_TYPE; + const defPrefix = def.substr(0, 6); if (defPrefix === 'binary') { - var bufsize = parseInt(def.substr(7, def.length - 2), 10); + const bufsize = parseInt(def.substr(7, def.length - 2), 10); result = Buffer.alloc(bufsize, 0); parser.parseBuffer(size).copy(result); } else if (defPrefix === 'varbin') { @@ -441,6 +446,7 @@ exports.readMysqlValue = function( result = parser.parseString(size); } break; + } case MysqlTypes.TINY_BLOB: case MysqlTypes.MEDIUM_BLOB: case MysqlTypes.LONG_BLOB: @@ -520,8 +526,8 @@ exports.readMysqlValue = function( break; case MysqlTypes.DATETIME: raw = exports.parseUInt64(parser); - var date = Math.floor(raw / 1000000); - var time = raw % 1000000; + date = Math.floor(raw / 1000000); + time = raw % 1000000; result = dtDecode.getDateTime( zongji.connection.config.dateStrings, // node-mysql dateStrings option Math.floor(date / 10000), // year @@ -532,14 +538,14 @@ exports.readMysqlValue = function( time % 100 // seconds ); break; - case MysqlTypes.DATETIME2: + case MysqlTypes.DATETIME2: { // Overlapping high-low to get all data in 32-bit numbers - var rawHigh = readIntBE(parser._buffer, parser._offset, 4); - var rawLow = readIntBE(parser._buffer, parser._offset + 1, 4); + const rawHigh = readIntBE(parser._buffer, parser._offset, 4); + const rawLow = readIntBE(parser._buffer, parser._offset + 1, 4); parser._offset += 5; fraction = readTemporalFraction(parser, column.metadata.decimals); - var yearMonth = sliceBits(rawHigh, 14, 31); + yearMonth = sliceBits(rawHigh, 14, 31); result = dtDecode.getDateTime( zongji.connection.config.dateStrings, // node-mysql dateStrings option Math.floor(yearMonth / 13), // year @@ -551,6 +557,7 @@ exports.readMysqlValue = function( fraction // fraction of a second object ); break; + } case MysqlTypes.TIMESTAMP: raw = parser.parseUnsignedNumber(4); result = dtDecode.getTimeStamp(zongji.connection.config.dateStrings, raw); diff --git a/lib/datetime_decode.js b/lib/datetime_decode.js index a8793f33..c0e9d304 100644 --- a/lib/datetime_decode.js +++ b/lib/datetime_decode.js @@ -3,12 +3,12 @@ // dateStrings option. The dateStrings option should be read from // zongji.connection.config, where zongji is the current instance of the ZongJi // object. The dateStrings option is interpreted the same as in node-mysql. -var common = require('./common'); // used only for common.zeroPad +const common = require('./common'); // used only for common.zeroPad // dateStrings are used only if the dateStrings option is true, or is an array // containing the sql type name string, 'DATE', 'DATETIME', or 'TIMESTAMP'. // This follows the documentation of the dateStrings option in node-mysql. -var useDateStringsForType = function(dateStrings, sqlTypeString) { +const useDateStringsForType = function(dateStrings, sqlTypeString) { return dateStrings && (dateStrings === true || dateStrings.indexOf && dateStrings.indexOf(sqlTypeString) > -1); @@ -16,7 +16,7 @@ var useDateStringsForType = function(dateStrings, sqlTypeString) { // fraction is the fractional second object from readTemporalFraction(). // returns '' or a '.' followed by fraction.precision digits, like '.123' -var getFractionString = exports.getFractionString = function(fraction) { +const getFractionString = exports.getFractionString = function(fraction) { return fraction ? '.' + common.zeroPad(fraction.value, fraction.precision) : ''; @@ -25,7 +25,7 @@ var getFractionString = exports.getFractionString = function(fraction) { // 1950-00-00 and the like are perfectly valid Mysql dateStrings. A 0 portion // of a date is essentially a null part of the date, so we should keep it. // year, month, and date must be integers >= 0. January is month === 1. -var getDateString = exports.getDateString = function(year, month, date) { +const getDateString = exports.getDateString = function(year, month, date) { return common.zeroPad(year, 4) + '-' + common.zeroPad(month, 2) + '-' + common.zeroPad(date, 2); @@ -36,7 +36,7 @@ var getDateString = exports.getDateString = function(year, month, date) { // which is not what it means. It means 2017-NULL-01, but the Date object // cannot handle it, so we want to return an invalid month, rather than a // subtracted month. -var jsMonthFromMysqlMonth = function(month) { +const jsMonthFromMysqlMonth = function(month) { return month > 0 ? month - 1 : undefined; }; @@ -98,8 +98,8 @@ exports.getTimeStamp = function(dateStrings, // node-mysql dateStrings option fraction // optional fraction of second object ) { - var milliseconds = fraction ? fraction.milliseconds : 0; - var dateObject = new Date(secondsFromEpoch * 1000 + milliseconds); + const milliseconds = fraction ? fraction.milliseconds : 0; + const dateObject = new Date(secondsFromEpoch * 1000 + milliseconds); if (!useDateStringsForType(dateStrings, 'TIMESTAMP')) { return dateObject; } diff --git a/lib/json_decode.js b/lib/json_decode.js index 845b20c3..d7a0a5cc 100644 --- a/lib/json_decode.js +++ b/lib/json_decode.js @@ -1,25 +1,25 @@ -var common = require('./common'); -var Parser = require('mysql/lib/protocol/Parser'); +const common = require('./common'); +const Parser = require('mysql/lib/protocol/Parser'); -var JSONB_TYPE_SMALL_OBJECT = 0; -var JSONB_TYPE_LARGE_OBJECT = 1; -var JSONB_TYPE_SMALL_ARRAY = 2; -var JSONB_TYPE_LARGE_ARRAY = 3; -var JSONB_TYPE_LITERAL = 4; -var JSONB_TYPE_INT16 = 5; -var JSONB_TYPE_UINT16 = 6; -var JSONB_TYPE_INT32 = 7; -var JSONB_TYPE_UINT32 = 8; -var JSONB_TYPE_INT64 = 9; -var JSONB_TYPE_UINT64 = 10; -var JSONB_TYPE_DOUBLE = 11; -var JSONB_TYPE_STRING = 12; -var JSONB_TYPE_OPAQUE = 15; +const JSONB_TYPE_SMALL_OBJECT = 0; +const JSONB_TYPE_LARGE_OBJECT = 1; +const JSONB_TYPE_SMALL_ARRAY = 2; +const JSONB_TYPE_LARGE_ARRAY = 3; +const JSONB_TYPE_LITERAL = 4; +const JSONB_TYPE_INT16 = 5; +const JSONB_TYPE_UINT16 = 6; +const JSONB_TYPE_INT32 = 7; +const JSONB_TYPE_UINT32 = 8; +const JSONB_TYPE_INT64 = 9; +const JSONB_TYPE_UINT64 = 10; +const JSONB_TYPE_DOUBLE = 11; +const JSONB_TYPE_STRING = 12; +const JSONB_TYPE_OPAQUE = 15; -var JSONB_LITERALS = [ null, true, false ]; +const JSONB_LITERALS = [ null, true, false ]; // node-mysql prefixes binary string values -var VAR_STRING_PREFIX = 'base64:type253:'; +const VAR_STRING_PREFIX = 'base64:type253:'; module.exports = function(input) { // Value must be JSON string to match node-mysql results @@ -48,13 +48,11 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt) { // Only used for types which use the value stored at a pointer position // If object is root (offset 0), the value is not offset by pointer - var valueOffset = offset === 0 ? 0 : + const valueOffset = offset === 0 ? 0 : readUInt(offset + 1) + parentValueOffset; - var result = null; - var jsonType = input.readUInt8(offset); - var low, high; - var raw, fraction, yearMonth; + let result = null; + const jsonType = input.readUInt8(offset); switch (jsonType) { // Small enough types are inlined case JSONB_TYPE_INT16: @@ -64,13 +62,14 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt) { // XXX: No known instance of this type being used result = input.readUInt16LE(offset + 1); break; - case JSONB_TYPE_LITERAL: - var inlineValue = input.readUInt8(offset + 1); + case JSONB_TYPE_LITERAL: { + const inlineValue = input.readUInt8(offset + 1); result = JSONB_LITERALS[inlineValue]; break; + } // All other types are retrieved from pointer - case JSONB_TYPE_STRING: - var strLen, strLenSize = 0, curStrLenByte; + case JSONB_TYPE_STRING: { + let strLen, strLenSize = 0, curStrLenByte; // If the high bit is 1, the string length continues to the next byte while (strLenSize === 0 || (curStrLenByte & 128) === 128) { strLenSize++; @@ -86,6 +85,7 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt) { valueOffset + strLenSize + 1, valueOffset + strLenSize + 1 + strLen); break; + } case JSONB_TYPE_LARGE_OBJECT: result = readObject(input, valueOffset, true); break; @@ -98,11 +98,12 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt) { case JSONB_TYPE_SMALL_ARRAY: result = readArray(input, valueOffset, false); break; - case JSONB_TYPE_DOUBLE: - low = input.readUInt32LE(valueOffset + 1); - high = input.readUInt32LE(valueOffset + 5); + case JSONB_TYPE_DOUBLE: { + const low = input.readUInt32LE(valueOffset + 1); + const high = input.readUInt32LE(valueOffset + 5); result = common.parseIEEE754Float(high, low); break; + } case JSONB_TYPE_INT32: result = input.readInt32LE(valueOffset + 1); break; @@ -110,13 +111,13 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt) { // XXX: No known instance of this type being used result = input.readUInt32LE(valueOffset + 1); break; - case JSONB_TYPE_INT64: - low = input.readUInt32LE(valueOffset + 1); - high = input.readUInt32LE(valueOffset + 5); + case JSONB_TYPE_INT64: { + let low = input.readUInt32LE(valueOffset + 1); + let high = input.readUInt32LE(valueOffset + 5); if (high & (1 << 31)) { // Javascript integers only support 2^53 not 2^64, must trim bits! // 64-53 = 11, 32-11 = 21, so grab first 21 bits of high word only - var mask = Math.pow(2, 32) - 1; + const mask = Math.pow(2, 32) - 1; high = common.sliceBits(high ^ mask, 0, 21); low = low ^ mask; result = @@ -125,14 +126,16 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt) { result = (high * Math.pow(2,32)) + low; } break; - case JSONB_TYPE_UINT64: - low = input.readUInt32LE(valueOffset + 1); - high = input.readUInt32LE(valueOffset + 5); + } + case JSONB_TYPE_UINT64: { + const low = input.readUInt32LE(valueOffset + 1); + const high = input.readUInt32LE(valueOffset + 5); result = (high * Math.pow(2,32)) + low; break; - case JSONB_TYPE_OPAQUE: - var customType = input.readUInt8(valueOffset + 1); - var dataLen, dataLenSize = 0, curDataLenByte; + } + case JSONB_TYPE_OPAQUE: { + const customType = input.readUInt8(valueOffset + 1); + let dataLen, dataLenSize = 0, curDataLenByte; // If the high bit is 1, the string length continues to the next byte while (dataLenSize === 0 || (curDataLenByte & 128) === 128) { dataLenSize++; @@ -147,28 +150,29 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt) { // Configure parser and metadata if using standard readMysqlValue // from common.js, otherwise set result for custom decoding - var parser = new Parser(); - var metadata = {}; - var parseType = customType; + const parser = new Parser(); + let metadata = {}; + const parseType = customType; parser.append(input.slice( valueOffset + dataLenSize + 2, valueOffset + dataLenSize + 2 + dataLen)); switch (customType) { - case common.MysqlTypes.DATE: - raw = parser._buffer.readInt32LE(4); - yearMonth = common.sliceBits(raw, 14, 31); + case common.MysqlTypes.DATE: { + const raw = parser._buffer.readInt32LE(4); + const yearMonth = common.sliceBits(raw, 14, 31); result = common.zeroPad(Math.floor(yearMonth / 13), 4) + '-' + // year common.zeroPad(yearMonth % 13, 2) + '-' + // month common.zeroPad(common.sliceBits(raw, 9, 14), 2); // day break; - case common.MysqlTypes.TIME: - raw = parser._buffer.readUInt32LE(3); - fraction = common.sliceBits(parser._buffer.readInt32LE(0), 0, 24); + } + case common.MysqlTypes.TIME: { + let raw = parser._buffer.readUInt32LE(3); + let fraction = common.sliceBits(parser._buffer.readInt32LE(0), 0, 24); - var isNegative = (raw & (1 << 23)) !== 0; + const isNegative = (raw & (1 << 23)) !== 0; if (isNegative) { raw = (raw ^ ((1 << 24) - 1)) + 1; // flip all bits // If fraction exists, last bit adjustment goes to microseconds @@ -178,9 +182,9 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt) { } } - var hour = common.sliceBits(raw, 12, 22); - var minute = common.sliceBits(raw, 6, 12); - var second = common.sliceBits(raw, 0, 6); + const hour = common.sliceBits(raw, 12, 22); + const minute = common.sliceBits(raw, 6, 12); + const second = common.sliceBits(raw, 0, 6); result = (isNegative ? '-' : '') + common.zeroPad(hour, hour > 99 ? 3 : 2) + ':' + @@ -188,13 +192,14 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt) { common.zeroPad(second, 2) + '.' + common.zeroPad(fraction, 6); break; - case common.MysqlTypes.DATETIME: + } + case common.MysqlTypes.DATETIME: { // Overlapping high-low to get all data in 32-bit numbers - var rawHigh = parser._buffer.readUInt32LE(3); - var rawLow = parser._buffer.readUInt32LE(4); - fraction = common.sliceBits(parser._buffer.readInt32LE(0), 0, 24); + const rawHigh = parser._buffer.readUInt32LE(3); + const rawLow = parser._buffer.readUInt32LE(4); + const fraction = common.sliceBits(parser._buffer.readInt32LE(0), 0, 24); - yearMonth = common.sliceBits(rawLow, 14, 31); + const yearMonth = common.sliceBits(rawLow, 14, 31); result = common.zeroPad(Math.floor(yearMonth / 13), 4) + '-' + // year common.zeroPad(yearMonth % 13, 2) + '-' + // month @@ -204,6 +209,7 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt) { common.zeroPad(common.sliceBits(rawHigh, 0, 6), 2) + '.' + // seconds common.zeroPad(fraction, 6); break; + } case common.MysqlTypes.NEWDECIMAL: metadata = { precision: parser.parseUnsignedNumber(1), @@ -226,6 +232,7 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt) { }); } break; + } default: throw new Error('JSON Type Not Implemented: ' + jsonType); } @@ -233,7 +240,7 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt) { } function readObject(input, valueOffset, isLarge) { - var readUInt, intSize; + let readUInt, intSize; if (isLarge) { readUInt = input.readUInt32LE.bind(input); intSize = 4; @@ -242,26 +249,26 @@ function readObject(input, valueOffset, isLarge) { intSize = 2; } - var result = {}; - var memberCount = readUInt(valueOffset + 1); // +1 = JSON type byte + const result = {}; + const memberCount = readUInt(valueOffset + 1); // +1 = JSON type byte // Position where key entries start // Key entry: Key offset (int16/32) + Key length (int16) - var memberKeyStart = + const memberKeyStart = valueOffset + 1 + // Beginning of definition (intSize * 2); // memberCount + binarySize // Value entries (or pointers to such) begin after key entries - var memberValueStart = memberKeyStart + (memberCount * (intSize + 2)); + const memberValueStart = memberKeyStart + (memberCount * (intSize + 2)); - for (var pointerPos = 0; pointerPos < memberCount; pointerPos++) { - var keyEntryPos = memberKeyStart + (pointerPos * (intSize + 2)); + for (let pointerPos = 0; pointerPos < memberCount; pointerPos++) { + const keyEntryPos = memberKeyStart + (pointerPos * (intSize + 2)); - var keyStart = valueOffset + 1 + readUInt(keyEntryPos); - var keyEnd = keyStart + input.readUInt16LE(keyEntryPos + intSize); + const keyStart = valueOffset + 1 + readUInt(keyEntryPos); + const keyEnd = keyStart + input.readUInt16LE(keyEntryPos + intSize); - var thisKey = input.toString('utf8', keyStart, keyEnd); - var memberValueOffset = memberValueStart + (pointerPos * (intSize + 1)); + const thisKey = input.toString('utf8', keyStart, keyEnd); + const memberValueOffset = memberValueStart + (pointerPos * (intSize + 1)); result[thisKey] = parseBinaryBuffer(input, memberValueOffset, valueOffset, readUInt); @@ -271,7 +278,7 @@ function readObject(input, valueOffset, isLarge) { } function readArray(input, valueOffset, isLarge) { - var readUInt, intSize; + let readUInt, intSize; if (isLarge) { readUInt = input.readUInt32LE.bind(input); intSize = 4; @@ -280,11 +287,11 @@ function readArray(input, valueOffset, isLarge) { intSize = 2; } - var result = []; - var memberCount = readUInt(valueOffset + 1); // +1 = JSON type byte + const result = []; + const memberCount = readUInt(valueOffset + 1); // +1 = JSON type byte - for (var pointerPos = 0; pointerPos < memberCount; pointerPos++) { - var memberValueOffset = + for (let pointerPos = 0; pointerPos < memberCount; pointerPos++) { + let memberValueOffset = valueOffset + 1 + // Beginning of definition (intSize * 2) + // memberCount + binarySize (pointerPos * (1 + intSize)); // value type + value offset diff --git a/lib/packet/binlog.js b/lib/packet/binlog.js index aff95dd3..1db4d531 100644 --- a/lib/packet/binlog.js +++ b/lib/packet/binlog.js @@ -1,4 +1,4 @@ -var getEventClass = require('../code_map').getEventClass; +const getEventClass = require('../code_map').getEventClass; //TODO Don't depend on zongji instance here module.exports = function initBinlogPacketClass(zongji) { @@ -15,21 +15,21 @@ module.exports = function initBinlogPacketClass(zongji) { // uint16_t flags; parser.parseUnsignedNumber(1); - var timestamp = parser.parseUnsignedNumber(4) * 1000; - var eventType = parser.parseUnsignedNumber(1); + const timestamp = parser.parseUnsignedNumber(4) * 1000; + const eventType = parser.parseUnsignedNumber(1); parser.parseUnsignedNumber(4); // serverId - var eventLength = parser.parseUnsignedNumber(4); - var nextPosition = parser.parseUnsignedNumber(4); + const eventLength = parser.parseUnsignedNumber(4); + const nextPosition = parser.parseUnsignedNumber(4); parser.parseUnsignedNumber(2); // flags - var options = { + const options = { timestamp: timestamp, nextPosition: nextPosition, size: eventLength - BinlogPacket.Length, eventType: eventType, }; - var EventClass = getEventClass(eventType); + const EventClass = getEventClass(eventType); this.eventName = EventClass.name; yield; diff --git a/lib/reader.js b/lib/reader.js index 97ad43ea..e9a24039 100644 --- a/lib/reader.js +++ b/lib/reader.js @@ -1,9 +1,9 @@ // Constants for variable length encoded binary -var NULL_COLUMN = 251; -var UNSIGNED_CHAR_COLUMN = 251; -var UNSIGNED_SHORT_COLUMN = 252; -var UNSIGNED_INT24_COLUMN = 253; -var UNSIGNED_INT64_COLUMN = 254; +const NULL_COLUMN = 251; +const UNSIGNED_CHAR_COLUMN = 251; +const UNSIGNED_SHORT_COLUMN = 252; +const UNSIGNED_INT24_COLUMN = 253; +const UNSIGNED_INT64_COLUMN = 254; function BufferReader(buffer) { this.buffer = buffer; @@ -11,34 +11,34 @@ function BufferReader(buffer) { } BufferReader.prototype.readUInt8 = function() { - var pos = this.position; + const pos = this.position; this.position += 1; return this.buffer.readUInt8(pos); }; BufferReader.prototype.readUInt16 = function() { - var pos = this.position; + const pos = this.position; this.position += 2; return this.buffer.readUInt16LE(pos); }; BufferReader.prototype.readUInt32 = function() { - var pos = this.position; + const pos = this.position; this.position += 4; return this.buffer.readUInt32LE(pos); }; BufferReader.prototype.readUInt24 = function() { - var low = this.readUInt16(); - var high = this.readUInt8(); + const low = this.readUInt16(); + const high = this.readUInt8(); return (high << 16) + low; }; BufferReader.prototype.readUInt64 = function() { - var pos = this.position; + const pos = this.position; this.position += 8; // from http://stackoverflow.com/questions/17687307/convert-a-64bit-little-endian-integer-to-number @@ -47,30 +47,30 @@ BufferReader.prototype.readUInt64 = function() { }; BufferReader.prototype.readString = function() { - var strBuf = this.buffer.slice(this.position); + const strBuf = this.buffer.slice(this.position); this.position = this.buffer.length; return strBuf.toString('ascii'); }; BufferReader.prototype.readStringInBytes = function(length) { - var strBuf = this.buffer.slice(this.position, this.position + length); + const strBuf = this.buffer.slice(this.position, this.position + length); this.position += length; return strBuf.toString('ascii'); }; BufferReader.prototype.readHexInBytes = function(length) { - var buf = this.buffer.slice(this.position, this.position + length); + const buf = this.buffer.slice(this.position, this.position + length); this.position += length; return buf.toString('hex'); }; BufferReader.prototype.readBytesArray = function(length) { - var result = []; - var hexString = this.readHexInBytes(length); - for (var i = 0; i < hexString.length; i = i + 2) { + const result = []; + const hexString = this.readHexInBytes(length); + for (let i = 0; i < hexString.length; i = i + 2) { result.push(parseInt(hexString.substr(i, 2), 16)); } return result; @@ -83,8 +83,8 @@ BufferReader.prototype.readBytesArray = function(length) { // used to store the actual value, which can be 2, 3, or 8. It also // includes support for SQL NULL as a special case. BufferReader.prototype.readVariant = function() { - var result = null; - var firstByte = this.readUInt8(); + let result = null; + const firstByte = this.readUInt8(); if (firstByte < UNSIGNED_CHAR_COLUMN) { result = firstByte; @@ -103,11 +103,11 @@ BufferReader.prototype.readVariant = function() { return result; }; -var padWith = function(val, length) { - var bits = val.split(''); +const padWith = function(val, length) { + const bits = val.split(''); if (bits.length < length) { - var left = length - bits.length; - for (var j = left - 1; j >= 0; j--) { + const left = length - bits.length; + for (let j = left - 1; j >= 0; j--) { bits.unshift('0'); } val = bits.join(''); @@ -119,19 +119,19 @@ var padWith = function(val, length) { // Read an arbitrary-length bitmap, provided its length. // Returns an array of true/false values. BufferReader.prototype.readBitArray = function(length) { - var size = Math.floor((length + 7) / 8); + const size = Math.floor((length + 7) / 8); - var bytes = []; - for (var i = size - 1; i >= 0; i--) { + const bytes = []; + for (let i = size - 1; i >= 0; i--) { bytes.unshift(this.readUInt8()); } - var bitmap = []; - var bitmapStr = bytes.map(function(aByte) { + const bitmap = []; + const bitmapStr = bytes.map(function(aByte) { return padWith(aByte.toString(2), 8); }).join(''); - for (var k = bitmapStr.length - 1; k >= 0; k--) { + for (let k = bitmapStr.length - 1; k >= 0; k--) { bitmap.push(bitmapStr[k] === '1'); } diff --git a/lib/rows_event.js b/lib/rows_event.js index af70c895..6f973ad2 100644 --- a/lib/rows_event.js +++ b/lib/rows_event.js @@ -1,14 +1,14 @@ -var util = require('util'); -var BinlogEvent = require('./binlog_event').BinlogEvent; -var Common = require('./common'); +const util = require('util'); +const BinlogEvent = require('./binlog_event').BinlogEvent; +const Common = require('./common'); -var Version2Events = [ +const Version2Events = [ 0x1e, // WRITE_ROWS_EVENT_V2, 0x1f, // UPDATE_ROWS_EVENT_V2, 0x20, // DELETE_ROWS_EVENT_V2 ]; -var CHECKSUM_SIZE = 4; +const CHECKSUM_SIZE = 4; /** * Generic RowsEvent class @@ -37,13 +37,13 @@ function RowsEvent(parser, options, zongji) { this.tableMap = zongji.tableMap; - var tableData = this.tableMap[this.tableId]; + const tableData = this.tableMap[this.tableId]; if (tableData === undefined) { // TableMap event was filtered parser._offset = parser._packetEnd; this._filtered = true; } else { - var columnsPresentBitmapSize = Math.floor((this.numberOfColumns + 7) / 8); + const columnsPresentBitmapSize = Math.floor((this.numberOfColumns + 7) / 8); // Columns present bitmap exceeds 4 bytes with >32 rows // And is not handled anyways so just skip over its space parser._offset += columnsPresentBitmapSize; @@ -93,15 +93,15 @@ RowsEvent.prototype._fetchOneRow = function(parser) { return readRow(this.tableMap[this.tableId], parser, this._zongji); }; -var readRow = function(tableMap, parser, zongji) { - var row = {}, column, columnSchema; - var nullBitmapSize = Math.floor((tableMap.columns.length + 7) / 8); - var nullBuffer = parser._buffer.slice(parser._offset, +const readRow = function(tableMap, parser, zongji) { + let row = {}, column, columnSchema; + const nullBitmapSize = Math.floor((tableMap.columns.length + 7) / 8); + const nullBuffer = parser._buffer.slice(parser._offset, parser._offset + nullBitmapSize); - var curNullByte, curBit; + let curNullByte, curBit; parser._offset += nullBitmapSize; - for (var i = 0; i < tableMap.columns.length; i++) { + for (let i = 0; i < tableMap.columns.length; i++) { curBit = i % 8; if (curBit === 0) curNullByte = nullBuffer.readUInt8(Math.floor(i / 8)); column = tableMap.columns[i]; @@ -138,7 +138,7 @@ function UpdateRows(parser, options) { // eslint-disable-line util.inherits(UpdateRows, RowsEvent); UpdateRows.prototype._fetchOneRow = function(parser) { - var tableMap = this.tableMap[this.tableId]; + const tableMap = this.tableMap[this.tableId]; return { before: readRow(tableMap, parser, this._zongji), after: readRow(tableMap, parser, this._zongji) diff --git a/lib/sequence/binlog.js b/lib/sequence/binlog.js index 0ecf2d6f..74bff202 100644 --- a/lib/sequence/binlog.js +++ b/lib/sequence/binlog.js @@ -3,7 +3,7 @@ const { EofPacket, ErrorPacket, ComBinlog, initBinlogPacketClass } = require('.. const Sequence = require('mysql/lib/protocol/sequences').Sequence; module.exports = function(zongji) { - var BinlogPacket = initBinlogPacketClass(zongji); + const BinlogPacket = initBinlogPacketClass(zongji); function Binlog(callback) { Sequence.call(this, callback); @@ -42,7 +42,7 @@ module.exports = function(zongji) { return this._callback.call(this); } - var event, error; + let event, error; try { event = packet.getEvent(); } catch (err) { diff --git a/test/errors.js b/test/errors.js index 79831c89..f67c1a84 100644 --- a/test/errors.js +++ b/test/errors.js @@ -1,16 +1,16 @@ -var ZongJi = require('./../'); -var getEventClass = require('./../lib/code_map').getEventClass; -var settings = require('./settings/mysql'); -var connector = require('./helpers/connector'); -var querySequence = require('./helpers/querySequence'); +const ZongJi = require('./../'); +const getEventClass = require('./../lib/code_map').getEventClass; +const settings = require('./settings/mysql'); +const connector = require('./helpers/connector'); +const querySequence = require('./helpers/querySequence'); -var conn = process.testZongJi || {}; +const conn = process.testZongJi || {}; function generateDisconnectionCase(readyKillIdFun, cleanupKillIdFun) { return function(test) { - var zongji = new ZongJi(settings.connection); - var errorTrapped = false; - var ACCEPTABLE_ERRORS = [ + const zongji = new ZongJi(settings.connection); + let errorTrapped = false; + const ACCEPTABLE_ERRORS = [ 'PROTOCOL_CONNECTION_LOST', // MySQL 5.1 emits a packet sequence error when the binlog disconnected 'PROTOCOL_INCORRECT_PACKET_SEQUENCE' @@ -31,7 +31,7 @@ function generateDisconnectionCase(readyKillIdFun, cleanupKillIdFun) { }); function killThread(argFun) { - var threadId = argFun(zongji); + const threadId = argFun(zongji); test.ok(!isNaN(threadId)); conn.db.query('KILL ' + threadId); } @@ -185,7 +185,7 @@ module.exports = { }, invalid_host: function(test) { - var zongji = new ZongJi({ + const zongji = new ZongJi({ host: 'wronghost', user: 'wronguser', password: 'wrongpass' diff --git a/test/events.js b/test/events.js index 26bdad2c..caea17a8 100644 --- a/test/events.js +++ b/test/events.js @@ -1,22 +1,22 @@ -var mysql = require('mysql'); -var settings = require('./settings/mysql'); -var connector = require('./helpers/connector'); -var querySequence = require('./helpers/querySequence'); -var expectEvents = require('./helpers/expectEvents'); -var ZongJi = require('./../'); +const mysql = require('mysql'); +const settings = require('./settings/mysql'); +const connector = require('./helpers/connector'); +const querySequence = require('./helpers/querySequence'); +const expectEvents = require('./helpers/expectEvents'); +const ZongJi = require('./../'); -var conn = process.testZongJi || {}; +const conn = process.testZongJi || {}; -var checkTableMatches = function(tableName) { +const checkTableMatches = function(tableName) { return function(test, event) { - var tableDetails = event.tableMap[event.tableId]; + const tableDetails = event.tableMap[event.tableId]; test.strictEqual(tableDetails.parentSchema, settings.database); test.strictEqual(tableDetails.tableName, tableName); }; }; // For use with expectEvents() -var tableMapEvent = function(tableName) { +const tableMapEvent = function(tableName) { return { _type: 'TableMap', tableName: tableName, @@ -42,7 +42,7 @@ module.exports = { done(); }, testStartAtEnd: function(test) { - var testTable = 'start_at_end_test'; + const testTable = 'start_at_end_test'; querySequence(conn.db, [ 'FLUSH LOGS', // Ensure Zongji perserveres through a rotation event 'DROP TABLE IF EXISTS ' + conn.escId(testTable), @@ -51,8 +51,8 @@ module.exports = { ], function(error) { if (error) console.error(error); // Start second ZongJi instance - var zongji = new ZongJi(settings.connection); - var events = []; + const zongji = new ZongJi(settings.connection); + const events = []; zongji.on('binlog', function(event) { events.push(event); @@ -84,8 +84,8 @@ module.exports = { }); }, testPassedConnectionObj: function(test) { - var testTable = 'conn_obj_test'; - var connObjs = [ + const testTable = 'conn_obj_test'; + const connObjs = [ { create: mysql.createConnection, end: function(obj) { obj.destroy(); } }, { create: mysql.createPool, end: function(obj) { obj.end(); } } ]; @@ -97,9 +97,9 @@ module.exports = { if (error) console.error(error); // Start second ZongJi instance connObjs.forEach(function(connObj, index) { - var ctrlConn = connObj.create(settings.connection); - var zongji = new ZongJi(ctrlConn); - var events = []; + const ctrlConn = connObj.create(settings.connection); + const zongji = new ZongJi(ctrlConn); + const events = []; zongji.on('binlog', function(event) { events.push(event); @@ -122,7 +122,7 @@ module.exports = { ], function(error) { if (error) console.error(error); // Should only have 2 events since ZongJi start - var finishedCount = 0; + let finishedCount = 0; connObjs.forEach(function(connObj) { expectEvents(test, connObj.events, [ { /* do not bother testing anything on first event */ }, @@ -140,7 +140,7 @@ module.exports = { }); }, testWriteUpdateDelete: function(test) { - var testTable = 'events_test'; + const testTable = 'events_test'; querySequence(conn.db, [ 'DROP TABLE IF EXISTS ' + conn.escId(testTable), 'CREATE TABLE ' + conn.escId(testTable) + ' (col INT UNSIGNED)', @@ -175,7 +175,7 @@ module.exports = { }); }, testManyColumns: function(test) { - var testTable = '33_columns'; + const testTable = '33_columns'; querySequence(conn.db, [ 'DROP TABLE IF EXISTS ' + conn.escId(testTable), 'CREATE TABLE ' + conn.escId(testTable) + ' (' + @@ -230,15 +230,15 @@ module.exports = { }); }, testIntvar: function(test) { - var testTable = 'intvar_test'; + const testTable = 'intvar_test'; querySequence(conn.db, [ 'DROP TABLE IF EXISTS ' + conn.escId(testTable), 'CREATE TABLE ' + conn.escId(testTable) + ' (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY , col INT)', ], function(error) { if (error) console.error(error); // Start second ZongJi instance - var zongji = new ZongJi(settings.connection); - var events = []; + const zongji = new ZongJi(settings.connection); + const events = []; zongji.on('binlog', function(event) { if (event.getTypeName() === 'Query' && event.query === 'BEGIN') diff --git a/test/filtering.js b/test/filtering.js index 66f08882..1045a002 100644 --- a/test/filtering.js +++ b/test/filtering.js @@ -1,8 +1,8 @@ -var settings = require('./settings/mysql'); -var connector = require('./helpers/connector'); -var querySequence = require('./helpers/querySequence'); +const settings = require('./settings/mysql'); +const connector = require('./helpers/connector'); +const querySequence = require('./helpers/querySequence'); -var conn = process.testZongJi || {}; +const conn = process.testZongJi || {}; module.exports = { setUp: function(done) { @@ -22,7 +22,7 @@ module.exports = { done(); }, unitTestFilter: function(test) { - var origOptions = conn.zongji.options; + const origOptions = conn.zongji.options; conn.zongji.set({ includeEvents: ['tablemap', 'writerows', 'updaterows', 'rotate'], @@ -77,9 +77,9 @@ module.exports = { integrationTestFilter: function(test) { // Set includeSchema to not include anything, recieve no row events // Ensure that filters are applied - var origOptions = conn.zongji.options; - var testTable = 'filter_test'; - var includeSchema = {}; + const origOptions = conn.zongji.options; + const testTable = 'filter_test'; + const includeSchema = {}; // Uncomment the following line to manually test this test: // includeSchema[settings.database] = [ testTable ]; conn.zongji.set({ @@ -106,9 +106,9 @@ module.exports = { changeAfterInit: function(test) { // Set includeSchema to skip table after the tableMap has already been // cached once, recieve no row events afterwards - var origOptions = conn.zongji.options; - var testTable = 'after_init_test'; - var includeSchema = {}; + const origOptions = conn.zongji.options; + const testTable = 'after_init_test'; + const includeSchema = {}; includeSchema[settings.database] = [ testTable ]; conn.zongji.set({ includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'], diff --git a/test/helpers/connector.js b/test/helpers/connector.js index 15c54989..8c3b147a 100644 --- a/test/helpers/connector.js +++ b/test/helpers/connector.js @@ -1,16 +1,15 @@ -var ZongJi = require('./../../'); -var mysql = require('mysql'); -var querySequence = require('./querySequence'); +const ZongJi = require('./../../'); +const mysql = require('mysql'); +const querySequence = require('./querySequence'); module.exports = function(settings, callback) { - var self = this; - var db = self.db = mysql.createConnection(settings.connection); - var escId = self.escId = db.escapeId; - var eventLog = self.eventLog = []; - var errorLog = self.errorLog = []; + const db = this.db = mysql.createConnection(settings.connection); + const escId = this.escId = db.escapeId; + const eventLog = this.eventLog = []; + const errorLog = this.errorLog = []; - self.dbName = settings.database; - self.testCount = 0; + this.dbName = settings.database; + this.testCount = 0; // Perform initialization queries sequentially querySequence(db, [ @@ -20,17 +19,17 @@ module.exports = function(settings, callback) { 'USE ' + escId(settings.database), 'RESET MASTER', 'SELECT VERSION() AS version' - ], function(error, results) { + ], (error, results) => { if (error) console.error(error); - self.mysqlVersion = results[results.length - 1][0].version + this.mysqlVersion = results[results.length - 1][0].version .split('-')[0] .split('.') .map(function(part) { return parseInt(part, 10); }); - var zongji = self.zongji = new ZongJi(settings.connection); + const zongji = this.zongji = new ZongJi(settings.connection); zongji.on('binlog', function(event) { eventLog.push(event); @@ -48,19 +47,19 @@ module.exports = function(settings, callback) { }); // Extra methods on connector object - self.incCount = function() { - self.testCount++; + this.incCount = function() { + this.testCount++; }; - self.closeIfInactive = function(interval) { - var startCount = self.testCount; + this.closeIfInactive = function(interval) { + const startCount = this.testCount; setTimeout(function() { - if (startCount === self.testCount) { - self.zongji.stop(); - self.db.destroy(); + if (startCount === this.testCount) { + this.zongji.stop(); + this.db.destroy(); } }, interval); }; - return self; + return this; }; diff --git a/test/helpers/expectEvents.js b/test/helpers/expectEvents.js index 0ffb101d..2f81a09c 100644 --- a/test/helpers/expectEvents.js +++ b/test/helpers/expectEvents.js @@ -1,4 +1,4 @@ -var MAX_WAIT = 3000; +const MAX_WAIT = 3000; // Check an array of events against an array of expectations // @param {object} test - Pass-thru from nodeunit test case @@ -20,8 +20,8 @@ function expectEvents(test, events, expected, multiplier, callback, waitIndex) { } else { test.strictEqual(events.length, expected.length * multiplier); events.forEach(function(event, index) { - var exp = expected[index % expected.length]; - for (var i in exp) { + const exp = expected[index % expected.length]; + for (const i in exp) { if (exp.hasOwnProperty(i)) { if (i === '_type') { test.strictEqual(exp[i], event.getTypeName()); diff --git a/test/helpers/querySequence.js b/test/helpers/querySequence.js index 75312c06..9a748258 100644 --- a/test/helpers/querySequence.js +++ b/test/helpers/querySequence.js @@ -9,8 +9,8 @@ module.exports = function(connection, debug, queries, callback) { queries = debug; debug = false; } - var results = []; - var sequence = queries.map(function(queryStr, index) { + const results = []; + const sequence = queries.map(function(queryStr, index) { return function() { debug && console.log('Query Sequence', index, queryStr); connection.query(queryStr, function(err, rows) { diff --git a/test/helpers/strRepeat.js b/test/helpers/strRepeat.js index 3a070493..98a599cc 100644 --- a/test/helpers/strRepeat.js +++ b/test/helpers/strRepeat.js @@ -1,7 +1,7 @@ module.exports = function (pattern, count) { if (count < 1) return ''; - var result = ''; - var pos = 0; + let result = ''; + let pos = 0; while (pos < count) { result += pattern.replace(/##/g, pos); pos++; diff --git a/test/types.js b/test/types.js index 38cc5543..a87a1b52 100644 --- a/test/types.js +++ b/test/types.js @@ -1,10 +1,10 @@ -var settings = require('./settings/mysql'); -var connector = require('./helpers/connector'); -var querySequence = require('./helpers/querySequence'); -var expectEvents = require('./helpers/expectEvents'); -var strRepeat = require('./helpers/strRepeat'); +const settings = require('./settings/mysql'); +const connector = require('./helpers/connector'); +const querySequence = require('./helpers/querySequence'); +const expectEvents = require('./helpers/expectEvents'); +const strRepeat = require('./helpers/strRepeat'); -var conn = process.testZongJi || {}; +const conn = process.testZongJi || {}; module.exports = { setUp: function(done) { @@ -30,7 +30,7 @@ module.exports = { // @param {[[any]]} testRows - 2D array of rows and fields to insert and test // @param {func} customTest - optional, instead of exact row check // @param {string} minVersion - optional, e.g. '5.6.4' -var defineTypeTest = function(name, fields, testRows, customTest, minVersion) { +const defineTypeTest = function(name, fields, testRows, customTest, minVersion) { // Allow skipping customTest argument and passing minVersion in its place if (typeof customTest === 'string') { minVersion = customTest; @@ -38,14 +38,14 @@ var defineTypeTest = function(name, fields, testRows, customTest, minVersion) { } module.exports[name] = function(test) { - var testTable = 'type_' + name; - var fieldText = fields.map(function(field, index) { + const testTable = 'type_' + name; + const fieldText = fields.map(function(field, index) { return 'col' + index + ' ' + field; }).join(', '); - var insertColumns = fields.map(function(field, index) { + const insertColumns = fields.map(function(field, index) { return 'col' + index; }).join(', '); - var testQueries = [ + const testQueries = [ 'DROP TABLE IF EXISTS ' + conn.escId(testTable), 'CREATE TABLE ' + conn.escId(testTable) + ' (' + fieldText + ')', 'SET @@session.time_zone = "+00:00"'] @@ -64,11 +64,11 @@ var defineTypeTest = function(name, fields, testRows, customTest, minVersion) { if (!minVersion || checkVersion(minVersion, conn.mysqlVersion)) { querySequence(conn.db, testQueries, function(error, results) { if (error) console.error(error); - var selectResult = results[results.length - 1]; - var expectedWrite = { + const selectResult = results[results.length - 1]; + const expectedWrite = { _type: 'WriteRows', _checkTableMap: function(test, event) { - var tableDetails = event.tableMap[event.tableId]; + const tableDetails = event.tableMap[event.tableId]; test.strictEqual(tableDetails.parentSchema, settings.database); test.strictEqual(tableDetails.tableName, testTable); } @@ -88,7 +88,7 @@ var defineTypeTest = function(name, fields, testRows, customTest, minVersion) { if (conn.errorLog.length) { throw conn.errorLog[0]; } - var binlogRows = conn.eventLog.reduce(function(prev, curr) { + const binlogRows = conn.eventLog.reduce(function(prev, curr) { if (curr.getTypeName() === 'WriteRows') { prev = prev.concat(curr.rows); } @@ -111,11 +111,11 @@ var defineTypeTest = function(name, fields, testRows, customTest, minVersion) { }; }; -var checkVersion = function(check, actual) { - var parts = check.split('.').map(function(part) { +const checkVersion = function(check, actual) { + const parts = check.split('.').map(function(part) { return parseInt(part, 10); }); - for (var i = 0; i < parts.length; i++) { + for (let i = 0; i < parts.length; i++) { if (actual[i] > parts[i]) return true; else if (actual[i] < parts[i]) return false; } @@ -211,7 +211,7 @@ defineTypeTest('float', [ [1.0], [-1.0], [123.456], [-13.47], [3999.12] ], function(test, event) { // Ensure sum of differences is very low - var diff = event.rows.reduce(function(prev, cur, index) { + const diff = event.rows.reduce(function(prev, cur, index) { return prev + Math.abs(cur.col0 - this[index].col0); }.bind(this), 0); test.ok(diff < 0.001); @@ -475,21 +475,21 @@ defineTypeTest('json', [ event.rows.forEach(function(row, index) { // test.deepEqual does not work when comparison objects exceed 65536 bytes // Perform alternative assertions for these large cases - var expected = JSON.parse(this[index].col0); - var actual = JSON.parse(row.col0); + const expected = JSON.parse(this[index].col0); + const actual = JSON.parse(row.col0); if (this[index].col0.length > 65536) { // Large cases are either array or object if (expected instanceof Array) { test.strictEqual(expected.length, actual.length); - for (var i = 0; i < expected.length; i++) { + for (let i = 0; i < expected.length; i++) { test.deepEqual(expected[i], actual[i]); } } else { - var expectedKeys = Object.keys(expected); - var actualKeys = Object.keys(actual); + const expectedKeys = Object.keys(expected); + const actualKeys = Object.keys(actual); test.strictEqual(expectedKeys.length, actualKeys.length); test.deepEqual(expectedKeys, actualKeys); - for (var j = 0; j < expectedKeys.length; j++) { + for (let j = 0; j < expectedKeys.length; j++) { test.deepEqual(expected[expectedKeys[j]], actual[expectedKeys[j]]); } } From 7058a703925230b07610632ba7f886388f7753a8 Mon Sep 17 00:00:00 2001 From: Nevill Date: Wed, 23 Oct 2019 20:40:37 +0800 Subject: [PATCH 19/34] Update eslint to 6.5.1 --- package-lock.json | 796 +++++++++++++++++++--------------------------- package.json | 2 +- 2 files changed, 327 insertions(+), 471 deletions(-) diff --git a/package-lock.json b/package-lock.json index bce081c5..68c8ce1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,25 +5,24 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "dev": true, "requires": { "@babel/highlight": "^7.0.0" } }, "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz", + "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==", "dev": true, "requires": { - "@babel/types": "^7.4.4", + "@babel/types": "^7.6.3", "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "lodash": "^4.17.13", + "source-map": "^0.5.0" } }, "@babel/helper-function-name": { @@ -56,9 +55,9 @@ } }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -67,66 +66,66 @@ } }, "@babel/parser": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", - "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.4.tgz", + "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==", "dev": true }, "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" } }, "@babel/traverse": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", - "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz", + "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.3", "@babel/helper-function-name": "^7.1.0", "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4", + "@babel/parser": "^7.6.3", + "@babel/types": "^7.6.3", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", "dev": true, "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", "dev": true }, "acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", "dev": true }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -172,9 +171,9 @@ "dev": true }, "arg": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", - "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.1.tgz", + "integrity": "sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw==", "dev": true }, "argparse": { @@ -348,22 +347,29 @@ "dev": true }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -386,18 +392,18 @@ "dev": true }, "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "optional": true }, @@ -428,13 +434,13 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "coveralls": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.3.tgz", - "integrity": "sha512-viNfeGlda2zJr8Gj1zqXpDMRjw9uM54p7wzZdvLRyOgnAfCe974Dq4veZkjJdxQXbmdppu6flEajFYseHYaUhg==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.7.tgz", + "integrity": "sha512-mUuH2MFOYB2oBaA4D4Ykqi9LaEYpMMlsiOMJOrv358yAjP6enPIk55fod2fNJ8AvwoYXStWQls37rA+s5e7boA==", "dev": true, "requires": { "growl": "~> 1.10.0", - "js-yaml": "^3.11.0", + "js-yaml": "^3.13.1", "lcov-parse": "^0.0.10", "log-driver": "^1.2.7", "minimist": "^1.2.0", @@ -473,6 +479,14 @@ "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "dashdash": { @@ -552,9 +566,9 @@ } }, "ejs": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", - "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.1.tgz", + "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==", "dev": true }, "emoji-regex": { @@ -563,15 +577,6 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -594,53 +599,54 @@ "dev": true }, "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.5.1.tgz", + "integrity": "sha512-32h99BoLYStT1iq1v2P9uwpyznQ4M2jRiFB6acitKz52Gqn+vPaMDUTB1bYi1WN4Nquj2w+t+bimYUG83DC55A==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", + "ajv": "^6.10.0", "chalk": "^2.1.0", "cross-spawn": "^6.0.5", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.2", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.1", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", + "glob-parent": "^5.0.0", "globals": "^11.7.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", + "inquirer": "^6.4.1", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.11", + "lodash": "^4.17.14", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", "progress": "^2.0.0", "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", "table": "^5.2.3", - "text-table": "^0.2.0" + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" } }, "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -648,32 +654,35 @@ } }, "eslint-utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", - "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", - "dev": true + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } }, "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", "dev": true }, "esm": { - "version": "3.2.22", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.22.tgz", - "integrity": "sha512-z8YG7U44L82j1XrdEJcqZOLUnjxco8pO453gKOlaMD1/md1n/5QrscAmYG+oKUspsmDLuBFZrpbxI6aQ67yRxA==", + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", "dev": true }, "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", + "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", "dev": true, "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", + "eslint-visitor-keys": "^1.1.0" } }, "esprima": { @@ -701,15 +710,15 @@ } }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "events-to-array": { @@ -718,21 +727,6 @@ "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", "dev": true }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.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" - } - }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -740,9 +734,9 @@ "dev": true }, "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { "chardet": "^0.7.0", @@ -824,9 +818,9 @@ } }, "flatted": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", - "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", "dev": true }, "foreground-child": { @@ -898,15 +892,6 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -917,9 +902,9 @@ } }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", + "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -930,6 +915,15 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -937,9 +931,9 @@ "dev": true }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", "dev": true }, "growl": { @@ -949,9 +943,9 @@ "dev": true }, "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.5.tgz", + "integrity": "sha512-0Ce31oWVB7YidkaTq33ZxEbN+UDxMMgThvCe8ptgQViymL5DPis9uLdTA13MiRPhgvqyxIegugrP97iK3JeBHg==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -1000,9 +994,9 @@ } }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", "dev": true }, "http-signature": { @@ -1031,9 +1025,9 @@ "dev": true }, "import-fresh": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", - "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", + "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -1057,14 +1051,14 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "inquirer": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", - "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "dev": true, "requires": { "ansi-escapes": "^3.2.0", @@ -1073,50 +1067,42 @@ "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^2.0.0", - "lodash": "^4.17.11", + "lodash": "^4.17.12", "mute-stream": "0.0.7", "run-async": "^2.2.0", "rxjs": "^6.4.0", "string-width": "^2.1.0", "strip-ansi": "^5.1.0", "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", @@ -1180,14 +1166,6 @@ "@babel/types": "^7.4.0", "istanbul-lib-coverage": "^2.0.5", "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", - "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", - "dev": true - } } }, "istanbul-lib-report": { @@ -1234,9 +1212,9 @@ } }, "istanbul-reports": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.4.tgz", - "integrity": "sha512-QCHGyZEK0bfi9GR215QSm+NJwFKEShbtc7tfbUdLAEzn3kKhLDDZqvljn8rPZM9v8CEOhzL1nlYoO4r1ryl67w==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", "dev": true, "requires": { "handlebars": "^4.1.2" @@ -1312,15 +1290,6 @@ "verror": "1.10.0" } }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "lcov-parse": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", @@ -1368,9 +1337,9 @@ } }, "lodash": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", - "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "lodash.flattendeep": { @@ -1403,6 +1372,14 @@ "requires": { "pify": "^4.0.1", "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "make-error": { @@ -1411,34 +1388,6 @@ "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", "dev": true }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - } - } - }, "merge-source-map": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", @@ -1493,9 +1442,9 @@ "dev": true }, "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "requires": { "safe-buffer": "^5.1.2", @@ -1503,9 +1452,9 @@ }, "dependencies": { "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true } } @@ -1520,9 +1469,9 @@ } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "mute-stream": { @@ -1549,9 +1498,9 @@ "dev": true }, "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, "nested-error-stacks": { @@ -1586,23 +1535,16 @@ "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "nyc": { "version": "14.1.1", "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", @@ -1704,17 +1646,6 @@ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -1736,28 +1667,10 @@ "own-or": "^1.0.0" } }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -1821,12 +1734,6 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -1884,9 +1791,9 @@ "dev": true }, "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "progress": { "version": "2.0.3", @@ -1901,21 +1808,11 @@ "dev": true }, "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", + "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -2019,9 +1916,9 @@ "dev": true }, "resolve": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", - "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -2062,9 +1959,9 @@ } }, "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -2081,9 +1978,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "set-blocking": { @@ -2131,9 +2028,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -2149,9 +2046,9 @@ } }, "spawn-wrap": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", - "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", + "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==", "dev": true, "requires": { "foreground-child": "^1.5.6", @@ -2189,9 +2086,9 @@ } }, "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "sprintf-js": { @@ -2236,6 +2133,17 @@ "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "string_decoder": { @@ -2247,12 +2155,20 @@ } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } } }, "strip-bom": { @@ -2261,16 +2177,10 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", "dev": true }, "supports-color": { @@ -2283,23 +2193,17 @@ } }, "table": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/table/-/table-5.3.3.tgz", - "integrity": "sha512-3wUNCgdWX6PNpOe3amTTPWPuF6VGvgzjKCaO1snFj0z7Y3mUPWf5+zDtxUVGispJkDECPmR29wbzh6bVMOHbcw==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, "requires": { - "ajv": "^6.9.1", - "lodash": "^4.17.11", + "ajv": "^6.10.2", + "lodash": "^4.17.14", "slice-ansi": "^2.1.0", "string-width": "^3.0.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -2310,15 +2214,6 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } } } }, @@ -2483,12 +2378,6 @@ } } }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, "trivial-deferred": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", @@ -2496,22 +2385,22 @@ "dev": true }, "ts-node": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.1.0.tgz", - "integrity": "sha512-34jpuOrxDuf+O6iW1JpgTRDFynUZ1iEqtYruBqh35gICNjN8x+LpVcPAcwzLPi9VU6mdA3ym+x233nZmZp445A==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.4.1.tgz", + "integrity": "sha512-5LpRN+mTiCs7lI5EtbXmF/HfMeCjzt7DH9CZwtkr6SywStrNQC723wG+aOWFiLNn7zT3kD/RnFqi3ZUfr4l5Qw==", "dev": true, "requires": { "arg": "^4.1.0", - "diff": "^3.1.0", + "diff": "^4.0.1", "make-error": "^1.1.1", "source-map-support": "^0.5.6", "yn": "^3.0.0" }, "dependencies": { "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", "dev": true } } @@ -2523,9 +2412,9 @@ "dev": true }, "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", "dev": true }, "tunnel-agent": { @@ -2553,19 +2442,19 @@ } }, "typescript": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", - "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.4.tgz", + "integrity": "sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg==", "dev": true }, "uglify-js": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.12.tgz", - "integrity": "sha512-KeQesOpPiZNgVwJj8Ge3P4JYbQHUdZzpx6Fahy6eKAYRSV4zhVmLXoC+JtOeYxcHCHTve8RG1ZGdTvpeOUM26Q==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.3.tgz", + "integrity": "sha512-KfQUgOqTkLp2aZxrMbCuKCDGW9slFYu2A23A36Gs7sGzTLcRBDORdOi5E21KWHFIfkY8kzgi/Pr1cXCh0yIp5g==", "dev": true, "optional": true, "requires": { - "commander": "~2.20.0", + "commander": "~2.20.3", "source-map": "~0.6.1" }, "dependencies": { @@ -2626,9 +2515,15 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", "dev": true }, "validate-npm-package-license": { @@ -2674,48 +2569,25 @@ "dev": true }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } } } @@ -2736,9 +2608,9 @@ } }, "write-file-atomic": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", - "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -2765,30 +2637,23 @@ "dev": true }, "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { - "cliui": "^4.0.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" + "yargs-parser": "^13.1.1" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -2799,22 +2664,13 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } } } }, "yargs-parser": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.0.tgz", - "integrity": "sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -2822,9 +2678,9 @@ } }, "yn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz", - "integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true } } diff --git a/package.json b/package.json index 942d018a..1afec444 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "node": ">= 6.0" }, "devDependencies": { - "eslint": "5.16.0", + "eslint": "6.5.1", "nodeunit": "0.11.3" }, "dependencies": { From 9653b9aea5d24e184bc66e8417b169ce4a920fb6 Mon Sep 17 00:00:00 2001 From: Nevill Date: Wed, 23 Oct 2019 20:53:34 +0800 Subject: [PATCH 20/34] Lint the code --- test/helpers/expectEvents.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/helpers/expectEvents.js b/test/helpers/expectEvents.js index 2f81a09c..ec903666 100644 --- a/test/helpers/expectEvents.js +++ b/test/helpers/expectEvents.js @@ -22,7 +22,7 @@ function expectEvents(test, events, expected, multiplier, callback, waitIndex) { events.forEach(function(event, index) { const exp = expected[index % expected.length]; for (const i in exp) { - if (exp.hasOwnProperty(i)) { + if (Object.prototype.hasOwnProperty.call(exp, i)) { if (i === '_type') { test.strictEqual(exp[i], event.getTypeName()); } else if (String(i).substr(0, 1) === '_') { From a3d243454c96aa41604c8d9b70b63cc2f3097d64 Mon Sep 17 00:00:00 2001 From: Nevill Date: Thu, 24 Oct 2019 09:05:14 +0800 Subject: [PATCH 21/34] - Drop the support of Node.js v6 - Enable es2020 syntax in eslint --- .eslintrc | 2 +- .travis.yml | 2 +- README.md | 12 ++++-------- docker-test.sh | 2 -- package.json | 2 +- 5 files changed, 7 insertions(+), 13 deletions(-) diff --git a/.eslintrc b/.eslintrc index 21d85b3a..b418bd8c 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,7 +1,7 @@ { "env": { "node": true, - "es6": true + "es2020": true }, "extends": "eslint:recommended", "rules": { diff --git a/.travis.yml b/.travis.yml index d09a457e..826217cd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,8 +2,8 @@ language: node_js sudo: required dist: trusty node_js: - - "6" - "8" + - "12" services: - docker before_script: diff --git a/README.md b/README.md index f3ce10d9..fdae97b4 100644 --- a/README.md +++ b/README.md @@ -3,21 +3,17 @@ A MySQL binlog listener running on Node.js. ZongJi (踪迹) is pronounced as `zōng jì` in Chinese. -This package is a "pure JS" implementation based on [`mysql`](https://github.com/mysqljs/mysql). Since v0.2.0, The native part (which was written in C++) has been dropped. - -This package has been tested to work in MySQL 5.5, 5.6, and 5.7. - +This package is a pure JS implementation based on [`mysql`](https://github.com/mysqljs/mysql). It has been tested to work in MySQL 5.5, 5.6, and 5.7. # Upcoming Release v0.4.7 is the last release which supports Node.js v4.x. - -The next release will be v0.5, only supports Node.js from v6.x. It uses a lot Ecmascript 6 features. +The next release will be v0.5, only supports Node.js from v8. ## Quick Start ```javascript -var zongji = new ZongJi({ /* ... MySQL Connection Settings ... */ }); +let zongji = new ZongJi({ /* ... MySQL Connection Settings ... */ }); // Each change to the replication log results in an event zongji.on('binlog', function(evt) { @@ -34,7 +30,7 @@ For a complete implementation see [`example.js`](example.js)... ## Installation -* Requires Node.js v6+ +* Requires Node.js v8+ ```bash $ npm install zongji diff --git a/docker-test.sh b/docker-test.sh index 2d501219..3b21fc5f 100755 --- a/docker-test.sh +++ b/docker-test.sh @@ -2,8 +2,6 @@ MYSQL_HOSTS="mysql55 mysql56 mysql57" for hostname in ${MYSQL_HOSTS}; do - echo $hostname + node 6 - docker run -it --network=zongji_default -e MYSQL_HOST=$hostname -w /build -v $PWD:/build node:6 npm test echo $hostname + node 8 docker run -it --network=zongji_default -e MYSQL_HOST=$hostname -w /build -v $PWD:/build node:8 npm test echo $hostname + node 10 diff --git a/package.json b/package.json index 1afec444..c20516b1 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ }, "homepage": "https://github.com/nevill/zongji", "engines": { - "node": ">= 6.0" + "node": ">= 8.0" }, "devDependencies": { "eslint": "6.5.1", From 417ad5fae4ea522de6eb4a3300b7dbf07dcdade6 Mon Sep 17 00:00:00 2001 From: Nevill Date: Sat, 26 Oct 2019 20:25:27 +0800 Subject: [PATCH 22/34] Add a new event `stopped`, also update README to describe about all the events emitted --- README.md | 9 +++++++++ index.js | 4 +++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fdae97b4..a1eca674 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,15 @@ Method Name | Arguments | Description `set` | `options` | Change options after `start()` `on` | `eventName`, `handler` | Add a listener to the `binlog` or `error` event. Each handler function accepts one argument. +Some events can be emitted in different phases: + +Event Name | Description +-----------|------------------------ +`ready` | This event is occurred right after ZongJi successfully established a connection, setup slave status, and set binlog position. +`binlog` | Once a binlog is received and passes the filter, it will bubble up with this event. +`error` | Every error will be caught by this event. +`stopped` | Emitted when ZongJi connection is stopped (ZongJi#stop is called). + **Options available:** Option Name | Type | Description diff --git a/index.js b/index.js index cc332e37..a386ca1a 100644 --- a/index.js +++ b/index.js @@ -293,8 +293,10 @@ ZongJi.prototype.stop = function() { this.ctrlConnection.query( 'KILL ' + this.connection.threadId, () => { - if (this.ctrlConnectionOwner) + if (this.ctrlConnectionOwner) { this.ctrlConnection.destroy(); + } + this.emit('stopped'); } ); }; From 74c2e3a8a68ff5cde106a2c7a3d8d7f6562d4b48 Mon Sep 17 00:00:00 2001 From: Nevill Date: Thu, 24 Oct 2019 12:45:21 +0800 Subject: [PATCH 23/34] Replace nodeunit with tap (#109). --- package-lock.json | 1810 ++++++++++++++++++++++++++++++++++++++------- package.json | 4 +- 2 files changed, 1542 insertions(+), 272 deletions(-) diff --git a/package-lock.json b/package-lock.json index 68c8ce1d..5e015dc8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,14 @@ "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/helper-function-name": { @@ -71,6 +79,15 @@ "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==", "dev": true }, + "@babel/runtime": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", + "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, "@babel/template": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", @@ -155,6 +172,16 @@ "color-convert": "^1.9.0" } }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "append-transform": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", @@ -206,6 +233,15 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "async-hook-domain": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-1.1.3.tgz", + "integrity": "sha512-ZovMxSbADV3+biB7oR1GL5lGyptI24alp0LWHlmz1OFc5oL47pz3EiIF6nXOkDW7yLqih4NtsiYduzdDW0i+Wg==", + "dev": true, + "requires": { + "source-map-support": "^0.5.11" + } + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -244,6 +280,12 @@ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, "bind-obj-methods": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-2.0.0.tgz", @@ -260,6 +302,15 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", @@ -282,6 +333,19 @@ "make-dir": "^2.0.0", "package-hash": "^3.0.0", "write-file-atomic": "^2.4.2" + }, + "dependencies": { + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + } } }, "callsites": { @@ -296,12 +360,6 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", - "dev": true - }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -325,11 +383,21 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "clean-yaml-object": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", - "dev": true + "chokidar": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.2.2.tgz", + "integrity": "sha512-bw3pm7kZ2Wa6+jQWYP/c7bAZy3i4GwiIiMO2EeRjrE48l8vBqC/WvFhSF0xyM8fQiPEGvwMY/5bqDG7sSEOuhg==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } }, "cli-cursor": { "version": "2.1.0", @@ -347,29 +415,33 @@ "dev": true }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" }, "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "ansi-regex": "^3.0.0" } } } }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -535,9 +607,9 @@ "dev": true }, "diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", "dev": true }, "doctrine": { @@ -549,12 +621,6 @@ "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 - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -565,12 +631,6 @@ "safer-buffer": "^2.1.0" } }, - "ejs": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.1.tgz", - "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==", - "dev": true - }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -786,6 +846,15 @@ "flat-cache": "^2.0.1" } }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", @@ -806,6 +875,12 @@ "locate-path": "^3.0.0" } }, + "findit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz", + "integrity": "sha1-ZQnwEmr0wXhVHPqZOU4DLhOk1W4=", + "dev": true + }, "flat-cache": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", @@ -823,6 +898,23 @@ "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", "dev": true }, + "flow-parser": { + "version": "0.110.1", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.110.1.tgz", + "integrity": "sha512-k0QoogCKfE7cr3WSgHYTt8QhZxxoi0tun4uVMSqx68L0E9ao1ltxlhJAKibTGlwR1V6lnGfKXU1zU9JB1q2ZRg==", + "dev": true + }, + "flow-remove-types": { + "version": "2.110.1", + "resolved": "https://registry.npmjs.org/flow-remove-types/-/flow-remove-types-2.110.1.tgz", + "integrity": "sha512-xOhoJcgC5z55RDdKyMgoZFuXL+jGacGWivR8xhEjpzwLlIzqouVIY67jWqmGPS92qCEtKx7wSaIBw6CZ9I1csQ==", + "dev": true, + "requires": { + "flow-parser": "^0.110.1", + "pirates": "^3.0.2", + "vlq": "^0.2.1" + } + }, "foreground-child": { "version": "1.5.6", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", @@ -874,6 +966,13 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.1.tgz", + "integrity": "sha512-4FRPXWETxtigtJW/gxzEDsX1LVbPAM93VleB83kZB+ellqbHMkyt2aJfuzNLRvFPnGi6bcE5SvfxgbXPeKteJw==", + "dev": true, + "optional": true + }, "function-loop": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.2.tgz", @@ -931,9 +1030,9 @@ "dev": true }, "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, "growl": { @@ -952,14 +1051,6 @@ "optimist": "^0.6.1", "source-map": "^0.6.1", "uglify-js": "^3.1.4" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "har-schema": { @@ -1082,6 +1173,15 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1103,6 +1203,12 @@ "is-extglob": "^2.1.1" } }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", @@ -1168,6 +1274,19 @@ "semver": "^6.0.0" } }, + "istanbul-lib-processinfo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-1.0.0.tgz", + "integrity": "sha512-FY0cPmWa4WoQNlvB8VOcafiRoB5nB+l2Pz2xGuXHRSy1KM8QFOYfz/rN+bGMCAeejrY3mrpF5oJHcN0s/garCg==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^6.0.5", + "istanbul-lib-coverage": "^2.0.3", + "rimraf": "^2.6.3", + "uuid": "^3.3.2" + } + }, "istanbul-lib-report": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", @@ -1201,14 +1320,6 @@ "make-dir": "^2.1.0", "rimraf": "^2.6.3", "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "istanbul-reports": { @@ -1220,6 +1331,15 @@ "handlebars": "^4.1.2" } }, + "jackspeak": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-1.4.0.tgz", + "integrity": "sha512-VDcSunT+wcccoG46FtzuBAyQKlzhHjli4q31e1fIHGOsRspqNUFjVzGb+7eIFDlTvqLygxapDHPHS0ouT2o/tw==", + "dev": true, + "requires": { + "cliui": "^4.1.0" + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -1395,14 +1515,6 @@ "dev": true, "requires": { "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "mime-db": { @@ -1442,19 +1554,18 @@ "dev": true }, "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.0.1.tgz", + "integrity": "sha512-2y5okJ4uBsjoD2vAbLKL9EUQPPkC0YMIp+2mZOXG3nBba++pdfJWRxx2Ewirc0pwAJYu4XtWg2EkVo1nRXuO/w==", "dev": true, "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "yallist": "^4.0.0" }, "dependencies": { "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } @@ -1515,15 +1626,11 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "nodeunit": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/nodeunit/-/nodeunit-0.11.3.tgz", - "integrity": "sha512-gDNxrDWpx07BxYNO/jn1UrGI1vNhDQZrIFphbHMcTCDc5mrrqQBWfQMXPHJ5WSgbFwD1D6bv4HOsqtTrPG03AA==", - "dev": true, - "requires": { - "ejs": "^2.5.2", - "tap": "^12.0.1" - } + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true }, "normalize-package-data": { "version": "2.5.0", @@ -1545,6 +1652,18 @@ } } }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, "nyc": { "version": "14.1.1", "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", @@ -1769,12 +1888,27 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "picomatch": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "dev": true + }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, + "pirates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-3.0.2.tgz", + "integrity": "sha512-c5CgUJq6H2k6MJz72Ak1F5sN9n9wlSlJyEnwvpm9/y3WB4E3pHBDT2c6PEiS1vyJvq2bUxUAIu0EGf8Cx4Ic7Q==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -1860,6 +1994,21 @@ "util-deprecate": "~1.0.1" } }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "dev": true + }, "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", @@ -2022,9 +2171,9 @@ } }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "source-map-support": { @@ -2035,14 +2184,6 @@ "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "spawn-wrap": { @@ -2218,166 +2359,1248 @@ } }, "tap": { - "version": "12.7.0", - "resolved": "https://registry.npmjs.org/tap/-/tap-12.7.0.tgz", - "integrity": "sha512-SjglJmRv0pqrQQ7d5ZBEY8ZOqv3nYDBXEX51oyycOH7piuhn82JKT/yDNewwmOsodTD/RZL9MccA96EjDgK+Eg==", + "version": "14.8.2", + "resolved": "https://registry.npmjs.org/tap/-/tap-14.8.2.tgz", + "integrity": "sha512-md0cw6fH1SbT9HBdzHJgMsVqp7daZ6MMAwuVIHNTtQusFMaLOEAQEbqxPc4rnjNezgKy7wKS0aEc17gtwrVtUQ==", "dev": true, "requires": { + "async-hook-domain": "^1.1.2", "bind-obj-methods": "^2.0.0", "browser-process-hrtime": "^1.0.0", - "capture-stack-trace": "^1.0.0", - "clean-yaml-object": "^0.1.0", + "chokidar": "^3.0.2", "color-support": "^1.1.0", - "coveralls": "^3.0.2", - "domain-browser": "^1.2.0", - "esm": "^3.2.5", + "coveralls": "^3.0.6", + "diff": "^4.0.1", + "esm": "^3.2.25", + "findit": "^2.0.0", + "flow-remove-types": "^2.107.0", "foreground-child": "^1.3.3", "fs-exists-cached": "^1.0.0", - "function-loop": "^1.0.1", - "glob": "^7.1.3", + "function-loop": "^1.0.2", + "glob": "^7.1.4", + "import-jsx": "^2.0.0", + "ink": "^2.3.0", "isexe": "^2.0.0", - "js-yaml": "^3.13.1", - "minipass": "^2.3.5", + "istanbul-lib-processinfo": "^1.0.0", + "jackspeak": "^1.4.0", + "minipass": "^3.0.0", "mkdirp": "^0.5.1", - "nyc": "^14.0.0", + "nyc": "^14.1.1", "opener": "^1.5.1", - "os-homedir": "^1.0.2", "own-or": "^1.0.0", "own-or-env": "^1.0.1", - "rimraf": "^2.6.3", + "react": "^16.9.0", + "rimraf": "^2.7.1", "signal-exit": "^3.0.0", - "source-map-support": "^0.5.10", + "source-map-support": "github:tapjs/node-source-map-support#node-header-length-change", "stack-utils": "^1.0.2", - "tap-mocha-reporter": "^3.0.9", - "tap-parser": "^7.0.0", - "tmatch": "^4.0.0", + "tap-mocha-reporter": "^5.0.0", + "tap-parser": "^10.0.1", + "tap-yaml": "^1.0.0", + "tcompare": "^2.3.0", + "treport": "^0.4.2", "trivial-deferred": "^1.0.1", - "ts-node": "^8.0.2", - "tsame": "^2.0.1", - "typescript": "^3.3.3", - "write-file-atomic": "^2.4.2", + "ts-node": "^8.3.0", + "typescript": "^3.6.3", + "which": "^2.0.1", + "write-file-atomic": "^3.0.0", + "yaml": "^1.6.0", "yapool": "^1.0.0" - } - }, - "tap-mocha-reporter": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-3.0.9.tgz", - "integrity": "sha512-VO07vhC9EG27EZdOe7bWBj1ldbK+DL9TnRadOgdQmiQOVZjFpUEQuuqO7+rNSO2kfmkq5hWeluYXDWNG/ytXTQ==", - "dev": true, - "requires": { - "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", - "readable-stream": "^2.1.5", - "tap-parser": "^5.1.0", - "unicode-length": "^1.0.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "@babel/runtime": { + "version": "7.6.3", + "bundled": true, "dev": true, "requires": { - "ms": "2.0.0" + "regenerator-runtime": "^0.13.2" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.3", + "bundled": true, + "dev": true + } } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "@types/prop-types": { + "version": "15.7.3", + "bundled": true, "dev": true }, - "tap-parser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", - "integrity": "sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA==", + "@types/react": { + "version": "16.9.5", + "bundled": true, "dev": true, "requires": { - "events-to-array": "^1.0.1", - "js-yaml": "^3.2.7", - "readable-stream": "^2" + "@types/prop-types": "*", + "csstype": "^2.2.0" } - } - } - }, - "tap-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-7.0.0.tgz", - "integrity": "sha512-05G8/LrzqOOFvZhhAk32wsGiPZ1lfUrl+iV7+OkKgfofZxiceZWMHkKmow71YsyVQ8IvGBP2EjcIjE5gL4l5lA==", - "dev": true, - "requires": { - "events-to-array": "^1.0.1", - "js-yaml": "^3.2.7", - "minipass": "^2.2.0" - } - }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tmatch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-4.0.0.tgz", - "integrity": "sha512-Ynn2Gsp+oCvYScQXeV+cCs7citRDilq0qDXA6tuvFwDgiYyyaq7D5vKUlAPezzZR5NDobc/QMeN6e5guOYmvxg==", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, + }, + "ansi-escapes": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "requires": { + "type-fest": "^0.5.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "bundled": true, + "dev": true + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true, + "dev": true + }, + "arrify": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "auto-bind": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "@types/react": "^16.8.12" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-core": { + "version": "6.26.3", + "bundled": true, + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "bundled": true, + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "bundled": true, + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "bundled": true, + "dev": true + } + } + }, + "babel-helper-builder-react-jsx": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" + } + }, + "babel-helpers": { + "version": "6.24.1", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "bundled": true, + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "bundled": true, + "dev": true + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "bundled": true, + "dev": true, + "requires": { + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-register": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "bundled": true, + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "bundled": true, + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "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": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "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": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "cardinal": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + } + }, + "chalk": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "ci-info": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-truncate": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "slice-ansi": "^1.0.0", + "string-width": "^2.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "bundled": true, + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + } + } + }, + "core-js": { + "version": "2.6.10", + "bundled": true, + "dev": true + }, + "csstype": { + "version": "2.6.7", + "bundled": true, + "dev": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "detect-indent": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "bundled": true, + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "esprima": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "esutils": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "events-to-array": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "globals": { + "version": "9.18.0", + "bundled": true, + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "import-jsx": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "babel-core": "^6.25.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-object-rest-spread": "^6.23.0", + "babel-plugin-transform-react-jsx": "^6.24.1", + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "ink": { + "version": "2.5.0", + "bundled": true, + "dev": true, + "requires": { + "@types/react": "^16.8.6", + "ansi-escapes": "^4.2.1", + "arrify": "^1.0.1", + "auto-bind": "^2.0.0", + "chalk": "^2.4.1", + "cli-cursor": "^2.1.0", + "cli-truncate": "^1.1.0", + "is-ci": "^2.0.0", + "lodash.throttle": "^4.1.1", + "log-update": "^3.0.0", + "prop-types": "^15.6.2", + "react-reconciler": "^0.21.0", + "scheduler": "^0.15.0", + "signal-exit": "^3.0.2", + "slice-ansi": "^1.0.0", + "string-length": "^2.0.0", + "widest-line": "^2.0.0", + "wrap-ansi": "^5.0.0", + "yoga-layout-prebuilt": "^1.9.3" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "invariant": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "is-ci": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-finite": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "json5": { + "version": "0.5.1", + "bundled": true, + "dev": true + }, + "lodash": { + "version": "4.17.15", + "bundled": true, + "dev": true + }, + "lodash.throttle": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "log-update": { + "version": "3.3.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "cli-cursor": "^2.1.0", + "wrap-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "bundled": true, + "dev": true + } + } + }, + "loose-envify": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minipass": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "bundled": true, + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "onetime": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "private": { + "version": "0.1.8", + "bundled": true, + "dev": true + }, + "prop-types": { + "version": "15.7.2", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "punycode": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "react": { + "version": "16.10.2", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-is": { + "version": "16.10.2", + "bundled": true, + "dev": true + }, + "react-reconciler": { + "version": "0.21.0", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.15.0" + } + }, + "redeyed": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "esprima": "~4.0.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "bundled": true, + "dev": true + }, + "repeating": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "scheduler": { + "version": "0.15.0", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "slash": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true + }, + "source-map-support": { + "version": "0.5.13", + "from": "github:tapjs/node-source-map-support#node-header-length-change", + "bundled": true, + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "string-length": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "tap-parser": { + "version": "10.0.1", + "bundled": true, + "dev": true, + "requires": { + "events-to-array": "^1.0.1", + "minipass": "^3.0.0", + "tap-yaml": "^1.0.0" + } + }, + "tap-yaml": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "yaml": "^1.5.0" + } + }, + "to-fast-properties": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "treport": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "requires": { + "cardinal": "^2.1.1", + "chalk": "^2.4.2", + "import-jsx": "^2.0.0", + "ink": "^2.1.1", + "ms": "^2.1.1", + "react": "^16.8.6", + "string-length": "^2.0.0", + "tap-parser": "^10.0.1", + "unicode-length": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "unicode-length": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "punycode": "^2.0.0", + "strip-ansi": "^3.0.1" + } + } + } + }, + "trim-right": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "type-fest": { + "version": "0.5.2", + "bundled": true, + "dev": true + }, + "which": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz", + "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "widest-line": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "string-width": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yaml": { + "version": "1.7.1", + "bundled": true, + "dev": true, + "requires": { + "@babel/runtime": "^7.5.5" + } + }, + "yoga-layout-prebuilt": { + "version": "1.9.3", + "bundled": true, + "dev": true + } + } + }, + "tap-mocha-reporter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.0.tgz", + "integrity": "sha512-8HlAtdmYGlDZuW83QbF/dc46L7cN+AGhLZcanX3I9ILvxUAl+G2/mtucNPSXecTlG/4iP1hv6oMo0tMhkn3Tsw==", + "dev": true, + "requires": { + "color-support": "^1.1.0", + "debug": "^2.1.3", + "diff": "^1.3.2", + "escape-string-regexp": "^1.0.3", + "glob": "^7.0.5", + "readable-stream": "^2.1.5", + "tap-parser": "^10.0.0", + "tap-yaml": "^1.0.0", + "unicode-length": "^1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "tap-parser": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-10.0.1.tgz", + "integrity": "sha512-qdT15H0DoJIi7zOqVXDn9X0gSM68JjNy1w3VemwTJlDnETjbi6SutnqmBfjDJAwkFS79NJ97gZKqie00ZCGmzg==", + "dev": true, + "requires": { + "events-to-array": "^1.0.1", + "minipass": "^3.0.0", + "tap-yaml": "^1.0.0" + } + }, + "tap-yaml": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.0.tgz", + "integrity": "sha512-Rxbx4EnrWkYk0/ztcm5u3/VznbyFJpyXO12dDBHKWiDVxy7O2Qw6MRrwO5H6Ww0U5YhRY/4C/VzWmFPhBQc4qQ==", + "dev": true, + "requires": { + "yaml": "^1.5.0" + } + }, + "tcompare": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-2.3.0.tgz", + "integrity": "sha512-fAfA73uFtFGybWGt4+IYT6UPLYVZQ4NfsP+IXEZGY0vh8e2IF7LVKafcQNMRBLqP0wzEA65LM9Tqj+FSmO8GLw==", + "dev": true + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, "trivial-deferred": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", @@ -2395,22 +3618,8 @@ "make-error": "^1.1.1", "source-map-support": "^0.5.6", "yn": "^3.0.0" - }, - "dependencies": { - "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", - "dev": true - } } }, - "tsame": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tsame/-/tsame-2.0.1.tgz", - "integrity": "sha512-jxyxgKVKa4Bh5dPcO42TJL22lIvfd9LOVJwdovKOnJa4TLLrHxquK+DlGm4rkGmrcur+GRx+x4oW00O2pY/fFw==", - "dev": true - }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", @@ -2441,6 +3650,15 @@ "prelude-ls": "~1.1.2" } }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.4.tgz", @@ -2448,23 +3666,14 @@ "dev": true }, "uglify-js": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.3.tgz", - "integrity": "sha512-KfQUgOqTkLp2aZxrMbCuKCDGW9slFYu2A23A36Gs7sGzTLcRBDORdOi5E21KWHFIfkY8kzgi/Pr1cXCh0yIp5g==", + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.4.tgz", + "integrity": "sha512-9Yc2i881pF4BPGhjteCXQNaXx1DCwm3dtOyBaG2hitHjLWOczw/ki8vD1bqyT3u6K0Ms/FpCShkmfg+FtlOfYA==", "dev": true, "optional": true, "requires": { "commander": "~2.20.3", "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } } }, "unicode-length": { @@ -2547,6 +3756,12 @@ "extsprintf": "^1.2.0" } }, + "vlq": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", + "dev": true + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -2569,25 +3784,48 @@ "dev": true }, "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" } } } @@ -2608,14 +3846,15 @@ } }, "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", + "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, "y18n": { @@ -2630,6 +3869,15 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, + "yaml": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", + "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.6.3" + } + }, "yapool": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz", @@ -2654,6 +3902,17 @@ "yargs-parser": "^13.1.1" }, "dependencies": { + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -2664,6 +3923,17 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } } } }, diff --git a/package.json b/package.json index c20516b1..8c5656ff 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "test": "test" }, "scripts": { - "test": "nodeunit --reporter=minimal test", + "test": "tap --bail --no-coverage test/*.js", "lint": "eslint ." }, "repository": { @@ -33,7 +33,7 @@ }, "devDependencies": { "eslint": "6.5.1", - "nodeunit": "0.11.3" + "tap": "14.8.2" }, "dependencies": { "iconv-lite": "0.4.24", From 9502ad8d72246ab34674437f8ac8cd201b2fd92b Mon Sep 17 00:00:00 2001 From: Nevill Date: Thu, 24 Oct 2019 22:57:29 +0800 Subject: [PATCH 24/34] Refactor, rewrite all the tests by using tap, see #109 --- package.json | 2 +- test/codemap.js | 8 + test/errors.js | 320 +++++++++---------- test/events.js | 597 +++++++++++++++++++++-------------- test/filtering.js | 302 ++++++++++-------- test/helpers/connector.js | 65 ---- test/helpers/expectEvents.js | 4 +- test/helpers/index.js | 94 ++++++ test/helpers/strRepeat.js | 10 - test/settings/mysql.js | 4 +- test/types.js | 589 +++++++++++++++++----------------- 11 files changed, 1079 insertions(+), 916 deletions(-) create mode 100644 test/codemap.js delete mode 100644 test/helpers/connector.js create mode 100644 test/helpers/index.js delete mode 100644 test/helpers/strRepeat.js diff --git a/package.json b/package.json index 8c5656ff..7adce66e 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "test": "test" }, "scripts": { - "test": "tap --bail --no-coverage test/*.js", + "test": "tap --bail --no-coverage --jobs=1 test/*.js", "lint": "eslint ." }, "repository": { diff --git a/test/codemap.js b/test/codemap.js new file mode 100644 index 00000000..91b3639d --- /dev/null +++ b/test/codemap.js @@ -0,0 +1,8 @@ +const tap = require('tap'); +const getEventClass = require('./../lib/code_map').getEventClass; + +tap.test('Codemap', test => { + test.equal(getEventClass(2).name, 'Query'); + test.equal(getEventClass(490).name, 'Unknown'); + test.end(); +}); diff --git a/test/errors.js b/test/errors.js index f67c1a84..8b0cde6b 100644 --- a/test/errors.js +++ b/test/errors.js @@ -1,203 +1,185 @@ -const ZongJi = require('./../'); -const getEventClass = require('./../lib/code_map').getEventClass; +const tap = require('tap'); + +const ZongJi = require('../'); const settings = require('./settings/mysql'); -const connector = require('./helpers/connector'); -const querySequence = require('./helpers/querySequence'); - -const conn = process.testZongJi || {}; - -function generateDisconnectionCase(readyKillIdFun, cleanupKillIdFun) { - return function(test) { - const zongji = new ZongJi(settings.connection); - let errorTrapped = false; - const ACCEPTABLE_ERRORS = [ - 'PROTOCOL_CONNECTION_LOST', - // MySQL 5.1 emits a packet sequence error when the binlog disconnected - 'PROTOCOL_INCORRECT_PACKET_SEQUENCE' - ]; - - zongji.on('error', function(error) { - if (!errorTrapped && ACCEPTABLE_ERRORS.indexOf(error.code) > -1) { - errorTrapped = true; - killThread(cleanupKillIdFun); - test.done(); +const testDb = require('./helpers'); + +tap.test('Connect to an invalid host', test => { + const zongji = new ZongJi({ + host: 'wronghost', + user: 'wronguser', + password: 'wrongpass' + }); + + zongji.on('error', function(error) { + test.ok(['ENOTFOUND', 'ETIMEDOUT'].indexOf(error.code) !== -1); + test.end(); + }); +}); + +tap.test('Initialise testing db', test => { + testDb.init(err => { + if (err) { + return test.threw(err); + } + test.end(); + }); +}); + +const ACCEPTABLE_ERRORS = [ + 'PROTOCOL_CONNECTION_LOST', + // MySQL 5.1 emits a packet sequence error when the binlog disconnected + 'PROTOCOL_INCORRECT_PACKET_SEQUENCE' +]; + +tap.test('Disconnect binlog connection', test => { + const zongji = new ZongJi(settings.connection); + + zongji.start({ + includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'], + serverId: testDb.serverId(), + }); + + zongji.on('ready', () => { + let threadId = zongji.connection.threadId; + test.ok(!isNaN(threadId)); + testDb.execute([`kill ${threadId}`], err => { + if (err) { + test.threw(err); } }); + }); - zongji.start({ - includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'], - // Anything other than default (1) as used in helpers/connector - serverId: 12 - }); - - function killThread(argFun) { - const threadId = argFun(zongji); - test.ok(!isNaN(threadId)); - conn.db.query('KILL ' + threadId); - } - - function isZongjiReady() { - setTimeout(function() { - if (zongji.ready) { - killThread(readyKillIdFun); - } else { - isZongjiReady(); - } - }, 100); - } - isZongjiReady(); - - }; -} - -module.exports = { - setUp: function(done) { - if (!conn.db) { - process.testZongJi = connector.call(conn, settings, done); + zongji.on('error', err => { + if (ACCEPTABLE_ERRORS.indexOf(err.code) > -1) { + zongji.stop(); + test.end(); } else { - conn.incCount(); - done(); + test.threw(err); } - }, - tearDown: function(done) { - if (conn) { - conn.eventLog.splice(0, conn.eventLog.length); - conn.errorLog.splice(0, conn.errorLog.length); - conn.closeIfInactive(1000); - } - done(); - }, - binlogConnection_disconnect: generateDisconnectionCase( - function onReady(zongji) { return zongji.connection.threadId; }, - function onCleanup(zongji) { return zongji.ctrlConnection.threadId; }), - ctrlConnection_disconnect: generateDisconnectionCase( - function onReady(zongji) { return zongji.ctrlConnection.threadId; }, - function onCleanup(zongji) { return zongji.connection.threadId; }), - - reconnect_at_pos: function(test) { - // Test that binlog events come through in correct sequence after - // reconnect using the filename and position properties - const NEW_INST_TIMEOUT = 1000; - const UPDATE_INTERVAL = 300; - const UPDATE_COUNT = 5; - const TEST_TABLE = 'reconnect_at_pos'; - - let first; - let second; - - let result = []; - - // Create a new ZongJi instance using some default options that will count - // using the values in the new rows inserted - function startNewZongJi(options) { - let zongji = new ZongJi(settings.connection); - - zongji.start( - Object.assign( - { - // Must include rotate events for filename and position properties - includeEvents: [ - 'rotate', 'tablemap', 'writerows', 'updaterows', 'deleterows' - ] - }, - options - ) - ); - - zongji.on('binlog', function(event) { - if (event.getTypeName() === 'WriteRows') { - result.push(event.rows[0].col); + }); +}); + +tap.test('Disconnect control connection', test => { + const zongji = new ZongJi(settings.connection); + + zongji.start({ + includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'], + serverId: testDb.serverId(), + }); + + zongji.on('ready', () => { + let threadId = zongji.ctrlConnection.threadId; + test.ok(!isNaN(threadId)); + testDb.execute([`kill ${threadId}`], err => { + if (err) { + test.threw(err); + } + }); + }); - if (result.length === UPDATE_COUNT) { - exitTest(); - } - } - }); - return zongji; + zongji.on('error', err => { + if (ACCEPTABLE_ERRORS.indexOf(err.code) > -1) { + zongji.stop(); + test.end(); + } else { + test.threw(err); } + }); +}); + + +tap.test('Events come through in sequence', test => { + const NEW_INST_TIMEOUT = 1000; + const UPDATE_INTERVAL = 300; + const UPDATE_COUNT = 5; + const TEST_TABLE = 'reconnect_at_pos'; + + test.test(`prepare table ${TEST_TABLE}`, test => { + testDb.execute([ + `DROP TABLE IF EXISTS ${TEST_TABLE}`, + `CREATE TABLE ${TEST_TABLE} (col INT UNSIGNED)`, + `INSERT INTO ${TEST_TABLE} (col) VALUES (10)`, + ], err =>{ + if (err) { + return test.threw(err); + } + test.end(); + }); + }); - function exitTest() { - first.stop && first.stop(); - second.stop && second.stop(); - - test.deepEqual( - result, - Array.from({length: UPDATE_COUNT}, (_, i) => i) - ); - test.done(); - } + test.test('when reconnect', test => { + const result = []; function startPeriodicallyWriting() { - const INSERT_QUERY = 'INSERT INTO ' + conn.escId(TEST_TABLE) + ' (col) VALUES '; let sequences = Array.from( {length: UPDATE_COUNT}, - (_, i) => INSERT_QUERY + `(${i})` + (_, i) => `INSERT INTO ${TEST_TABLE} (col) VALUES (${i})` ); - let updateInterval; - let doInsert = () => { - querySequence(conn.db, [sequences.shift()], error => { + let updateInterval = setInterval(() => { + testDb.execute([sequences.shift()], error => { if (error) { clearInterval(updateInterval); - test.done(error); + test.threw(error); } }); if (sequences.length === 0) { clearInterval(updateInterval); } - }; + }, UPDATE_INTERVAL); + } + + function newInstance(options) { + const zongji = new ZongJi(settings.connection); - updateInterval = setInterval(doInsert, UPDATE_INTERVAL); + zongji.start({ + ...options, + // Must include rotate events for filename and position properties + includeEvents: [ + 'rotate', 'tablemap', 'writerows', 'updaterows', 'deleterows' + ] + }); + + zongji.on('binlog', function(event) { + if (event.getTypeName() === 'WriteRows') { + result.push(event.rows[0].col); + } + + if (result.length === UPDATE_COUNT) { + test.strictSame( + result, + Array.from({length: UPDATE_COUNT}, (_, i) => i) + ); + test.end(); + } + }); + + return zongji; } - function killFirstWhenTimeout() { - setTimeout(function() { + let first = newInstance({ + serverId: testDb.serverId(), + startAtEnd: true, + }); + + first.on('ready', () => { + startPeriodicallyWriting(); + + first.on('stopped', () => { // Start new ZongJi instance where the previous was when stopped - first.stop(); - second = startNewZongJi({ - serverId: 16, + let second = newInstance({ + serverId: testDb.serverId(), filename: first.get('filename'), position: first.get('position'), }); - }, NEW_INST_TIMEOUT); - } - querySequence(conn.db, [ - 'DROP TABLE IF EXISTS ' + conn.escId(TEST_TABLE), - 'CREATE TABLE ' + conn.escId(TEST_TABLE) + ' (col INT UNSIGNED)', - 'INSERT INTO ' + conn.escId(TEST_TABLE) + ' (col) VALUES (10)', - ], function(error) { - if (error) { - return test.done(error); - } - - first = startNewZongJi({ - serverId: 14, - startAtEnd: true - }); - - first.on('ready', () => { - startPeriodicallyWriting(); - killFirstWhenTimeout(); + test.tearDown(() => second.stop()); }); + setTimeout(() => first.stop(), NEW_INST_TIMEOUT); }); - }, + }); - invalid_host: function(test) { - const zongji = new ZongJi({ - host: 'wronghost', - user: 'wronguser', - password: 'wrongpass' - }); - zongji.on('error', function(error) { - test.ok([ 'ENOTFOUND', 'ETIMEDOUT' ].indexOf(error.code) !== -1); - test.done(); - }); - }, - code_map: function(test) { - test.equal(getEventClass(2).name, 'Query'); - test.equal(getEventClass(490).name, 'Unknown'); - test.done(); - } -}; + test.end(); +}); diff --git a/test/events.js b/test/events.js index caea17a8..e2c5646f 100644 --- a/test/events.js +++ b/test/events.js @@ -1,16 +1,14 @@ -const mysql = require('mysql'); -const settings = require('./settings/mysql'); -const connector = require('./helpers/connector'); -const querySequence = require('./helpers/querySequence'); -const expectEvents = require('./helpers/expectEvents'); -const ZongJi = require('./../'); +const tap = require('tap'); -const conn = process.testZongJi || {}; +const ZongJi = require('../'); +const expectEvents = require('./helpers/expectEvents'); +const testDb = require('./helpers'); +const settings = require('./settings/mysql'); const checkTableMatches = function(tableName) { return function(test, event) { const tableDetails = event.tableMap[event.tableId]; - test.strictEqual(tableDetails.parentSchema, settings.database); + test.strictEqual(tableDetails.parentSchema, testDb.SCHEMA_NAME); test.strictEqual(tableDetails.tableName, tableName); }; }; @@ -20,263 +18,394 @@ const tableMapEvent = function(tableName) { return { _type: 'TableMap', tableName: tableName, - schemaName: settings.database + schemaName: testDb.SCHEMA_NAME, }; }; -module.exports = { - setUp: function(done) { - if (!conn.db) { - process.testZongJi = connector.call(conn, settings, done); - } else { - conn.incCount(); - done(); - } - }, - tearDown: function(done) { - if (conn) { - conn.eventLog.splice(0, conn.eventLog.length); - conn.errorLog.splice(0, conn.errorLog.length); - conn.closeIfInactive(1000); +tap.test('Initialise testing db', test => { + testDb.init(err => { + if (err) { + return test.threw(err); } - done(); - }, - testStartAtEnd: function(test) { - const testTable = 'start_at_end_test'; - querySequence(conn.db, [ - 'FLUSH LOGS', // Ensure Zongji perserveres through a rotation event - 'DROP TABLE IF EXISTS ' + conn.escId(testTable), - 'CREATE TABLE ' + conn.escId(testTable) + ' (col INT UNSIGNED)', - 'INSERT INTO ' + conn.escId(testTable) + ' (col) VALUES (10)', - ], function(error) { - if (error) console.error(error); - // Start second ZongJi instance - const zongji = new ZongJi(settings.connection); - const events = []; - - zongji.on('binlog', function(event) { - events.push(event); - }); + test.end(); + }); +}); + +tap.test('Binlog option startAtEnd', test => { + const TEST_TABLE = 'start_at_end_test'; + + test.test(`prepare new table ${TEST_TABLE}`, test => { + testDb.execute([ + 'FLUSH LOGS', // Ensure ZongJi perserveres through a rotation event + `DROP TABLE IF EXISTS ${TEST_TABLE}`, + `CREATE TABLE ${TEST_TABLE} (col INT UNSIGNED)`, + `INSERT INTO ${TEST_TABLE} (col) VALUES (12)`, + ], err => { + if (err) { + return test.fail(err); + } + test.end(); + }); + }); + + test.test('start', test => { + const events = []; + + const zongji = new ZongJi(settings.connection); + test.tearDown(() => zongji.stop()); - zongji.start({ - startAtEnd: true, - serverId: 10, // Second instance must not use same server ID - includeEvents: ['tablemap', 'writerows'] + zongji.on('binlog', evt => events.push(evt)); + zongji.start({ + startAtEnd: true, + includeEvents: ['tablemap', 'writerows'], + }); + + zongji.on('ready', () => { + testDb.execute([ + `INSERT INTO ${TEST_TABLE} (col) VALUES (9)`, + ], err => { + if (err) { + return test.fail(err); + } + + // Should only have 2 events since ZongJi start + expectEvents(test, events, + [ + { /* do not bother testing anything on first event */ }, + { rows: [ { col: 9 } ] } + ], 1, + () => test.end() + ); }); + }); + + + }); + + test.end(); +}); + +tap.test('Class constructor', test => { + const TEST_TABLE = 'conn_obj_test'; - // Give enough time to initialize - setTimeout(function() { - querySequence(conn.db, [ - 'INSERT INTO ' + conn.escId(testTable) + ' (col) VALUES (10)', - ], function(error) { - if (error) console.error(error); + test.test(`prepare table ${TEST_TABLE}`, test => { + testDb.execute([ + `DROP TABLE IF EXISTS ${TEST_TABLE}`, + `CREATE TABLE ${TEST_TABLE} (col INT UNSIGNED)`, + `INSERT INTO ${TEST_TABLE} (col) VALUES (10)`, + ], err => { + if (err) { + return test.fail(err); + } + + test.end(); + }); + }); + + function run(test, zongji) { + test.tearDown(() => zongji.stop()); + + const events = []; + zongji.on('binlog', evt => events.push(evt)); + zongji.start({ + startAtEnd: true, + serverId: testDb.serverId(), + includeEvents: ['tablemap', 'writerows'], + }); + zongji.on('ready', () => { + let value = Math.round(Math.random() * 100); + testDb.execute([ + `INSERT INTO ${TEST_TABLE} (col) VALUES (${value})`, + ], err => { + if (err) { + return test.fail(err); + } // Should only have 2 events since ZongJi start + expectEvents(test, events, [ { /* do not bother testing anything on first event */ }, - { rows: [ { col: 10 } ] } - ], 1, function() { - zongji.stop(); - test.done(); - }); + { rows: [ { col: value } ] } + ], 1, () => test.end()); }); - }, 200); + }); + } + + const mysql = require('mysql'); + + test.test('pass a mysql connection instance', test => { + const conn = mysql.createConnection(settings.connection); + const zongji = new ZongJi(conn); + zongji.on('stopped', () => conn.destroy()); + run(test, zongji); + }); + + test.test('pass a mysql pool', test => { + const pool = mysql.createConnection(settings.connection); + const zongji = new ZongJi(pool); + zongji.on('stopped', () => pool.end()); + run(test, zongji); + }); + test.end(); +}); + +tap.test('Write events', test => { + const TEST_TABLE = 'write_events_test'; + + test.test(`prepare table ${TEST_TABLE}`, test => { + testDb.execute([ + `DROP TABLE IF EXISTS ${TEST_TABLE}`, + `CREATE TABLE ${TEST_TABLE} (col INT UNSIGNED)`, + ], err => { + if (err) { + return test.fail(err); + } + + test.end(); }); - }, - testPassedConnectionObj: function(test) { - const testTable = 'conn_obj_test'; - const connObjs = [ - { create: mysql.createConnection, end: function(obj) { obj.destroy(); } }, - { create: mysql.createPool, end: function(obj) { obj.end(); } } - ]; - querySequence(conn.db, [ - 'DROP TABLE IF EXISTS ' + conn.escId(testTable), - 'CREATE TABLE ' + conn.escId(testTable) + ' (col INT UNSIGNED)', - 'INSERT INTO ' + conn.escId(testTable) + ' (col) VALUES (10)', - ], function(error) { - if (error) console.error(error); - // Start second ZongJi instance - connObjs.forEach(function(connObj, index) { - const ctrlConn = connObj.create(settings.connection); - const zongji = new ZongJi(ctrlConn); - const events = []; - - zongji.on('binlog', function(event) { - events.push(event); - }); + }); - zongji.start({ - startAtEnd: true, - serverId: 12 + index, // Second instance must not use same server ID - includeEvents: ['tablemap', 'writerows'] - }); + test.test('write a record', test => { + const events = []; + const zongji = new ZongJi(settings.connection); + test.tearDown(() => zongji.stop()); - connObj.zongji = zongji; - connObj.events = events; + zongji.start({ + startAtEnd: true, + serverId: testDb.serverId(), + includeEvents: ['tablemap', 'writerows'], + }); + + zongji.on('ready', () => { + testDb.execute([ + `INSERT INTO ${TEST_TABLE} (col) VALUES (14)`, + ], err => { + if (err) { + return test.fail(err); + } }); + }); - // Give enough time to initialize - setTimeout(function() { - querySequence(conn.db, [ - 'INSERT INTO ' + conn.escId(testTable) + ' (col) VALUES (10)', - ], function(error) { - if (error) console.error(error); - // Should only have 2 events since ZongJi start - let finishedCount = 0; - connObjs.forEach(function(connObj) { - expectEvents(test, connObj.events, [ - { /* do not bother testing anything on first event */ }, - { rows: [ { col: 10 } ] } - ], 1, function() { - connObj.zongji.stop(); - // When passing connection object, connection doesn't end on stop - connObj.end(connObj.zongji.ctrlConnection); - if (++finishedCount === connObjs.length - 1) test.done(); - }); - }); - }); - }, 200); + zongji.on('binlog', evt => { + events.push(evt); + + if (events.length == 2) { + expectEvents(test, events, + [ + tableMapEvent(TEST_TABLE), + { + _type: 'WriteRows', + _checkTableMap: checkTableMatches(TEST_TABLE), + rows: [ { col: 14 } ], + } + ], 1, + () => test.end() + ); + } + }); + }); + test.test('update a record', test => { + const events = []; + const zongji = new ZongJi(settings.connection); + test.tearDown(() => zongji.stop()); + + zongji.start({ + startAtEnd: true, + serverId: testDb.serverId(), + includeEvents: ['tablemap', 'updaterows'], }); - }, - testWriteUpdateDelete: function(test) { - const testTable = 'events_test'; - querySequence(conn.db, [ - 'DROP TABLE IF EXISTS ' + conn.escId(testTable), - 'CREATE TABLE ' + conn.escId(testTable) + ' (col INT UNSIGNED)', - 'INSERT INTO ' + conn.escId(testTable) + ' (col) VALUES (10)', - 'UPDATE ' + conn.escId(testTable) + ' SET col = 15', - 'DELETE FROM ' + conn.escId(testTable) - ], function(error) { - if (error) console.error(error); - expectEvents(test, conn.eventLog, [ - tableMapEvent(testTable), - { - _type: 'WriteRows', - _checkTableMap: checkTableMatches(testTable), - rows: [ { col: 10 } ] - }, - tableMapEvent(testTable), - { - _type: 'UpdateRows', - _checkTableMap: checkTableMatches(testTable), - rows: [ { before: { col: 10 }, after: { col: 15 } } ] - }, - tableMapEvent(testTable), - { - _type: 'DeleteRows', - _checkTableMap: checkTableMatches(testTable), - rows: [ { col: 15 } ] + + zongji.on('ready', () => { + testDb.execute([ + `UPDATE ${TEST_TABLE} SET col=15`, + ], err => { + if (err) { + return test.fail(err); } - ], 1, function() { - test.equal(conn.errorLog.length, 0); - test.done(); }); }); - }, - testManyColumns: function(test) { - const testTable = '33_columns'; - querySequence(conn.db, [ - 'DROP TABLE IF EXISTS ' + conn.escId(testTable), - 'CREATE TABLE ' + conn.escId(testTable) + ' (' + - 'col1 INT SIGNED NULL, ' + - 'col2 BIGINT SIGNED NULL, ' + - 'col3 TINYINT SIGNED NULL, ' + - 'col4 SMALLINT SIGNED NULL, ' + - 'col5 MEDIUMINT SIGNED NULL, ' + - 'col6 INT SIGNED NULL, ' + - 'col7 BIGINT SIGNED NULL, ' + - 'col8 TINYINT SIGNED NULL, ' + - 'col9 SMALLINT SIGNED NULL, ' + - 'col10 INT SIGNED NULL, ' + - 'col11 BIGINT SIGNED NULL, ' + - 'col12 TINYINT SIGNED NULL, ' + - 'col13 SMALLINT SIGNED NULL, ' + - 'col14 INT SIGNED NULL, ' + - 'col15 BIGINT SIGNED NULL, ' + - 'col16 TINYINT SIGNED NULL, ' + - 'col17 SMALLINT SIGNED NULL, ' + - 'col18 INT SIGNED NULL, ' + - 'col19 BIGINT SIGNED NULL, ' + - 'col20 TINYINT SIGNED NULL, ' + - 'col21 SMALLINT SIGNED NULL, ' + - 'col22 INT SIGNED NULL, ' + - 'col23 BIGINT SIGNED NULL, ' + - 'col24 TINYINT SIGNED NULL, ' + - 'col25 SMALLINT SIGNED NULL, ' + - 'col26 INT SIGNED NULL, ' + - 'col27 BIGINT SIGNED NULL, ' + - 'col28 TINYINT SIGNED NULL, ' + - 'col29 SMALLINT SIGNED NULL, ' + - 'col30 INT SIGNED NULL, ' + - 'col31 BIGINT SIGNED NULL, ' + - 'col32 TINYINT SIGNED NULL, ' + - 'col33 SMALLINT SIGNED NULL)', - 'INSERT INTO ' + conn.escId(testTable) + - ' (col1, col2, col3, col4, col5, col33) VALUES ' + - '(2147483647, null, 127, 32767, 8388607, 12), ' + - '(-2147483648, -9007199254740992, -128, -32768, -8388608, 10), ' + - '(-2147483645, -9007199254740990, -126, -32766, -8388606, 6), ' + - '(-1, -1, -1, -1, null, -6), ' + - '(123456, 100, 96, 300, 1000, null), ' + - '(-123456, -100, -96, -300, -1000, null)', - 'SELECT * FROM ' + conn.escId(testTable) - ], function(error, results) { - if (error) console.error(error); - expectEvents(test, conn.eventLog, [ - { /* do not bother testing anything on first event */ }, - { rows: results[results.length - 1] } - ], 1, test.done); + + zongji.on('binlog', evt => { + events.push(evt); + + if (events.length == 2) { + expectEvents(test, events, + [ + tableMapEvent(TEST_TABLE), + { + _type: 'UpdateRows', + _checkTableMap: checkTableMatches(TEST_TABLE), + rows: [ { before: { col: 14 }, after: { col: 15 } } ], + } + ], 1, + () => test.end() + ); + } }); - }, - testIntvar: function(test) { - const testTable = 'intvar_test'; - querySequence(conn.db, [ - 'DROP TABLE IF EXISTS ' + conn.escId(testTable), - 'CREATE TABLE ' + conn.escId(testTable) + ' (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY , col INT)', - ], function(error) { - if (error) console.error(error); - // Start second ZongJi instance - const zongji = new ZongJi(settings.connection); - const events = []; - - zongji.on('binlog', function(event) { - if (event.getTypeName() === 'Query' && event.query === 'BEGIN') - return; - events.push(event); - }); + }); - zongji.start({ - startAtEnd: true, - serverId: 12, // Second instance must not use same server ID - includeEvents: ['intvar', 'query'] + test.test('delete a record', test => { + const events = []; + const zongji = new ZongJi(settings.connection); + test.tearDown(() => zongji.stop()); + + zongji.start({ + startAtEnd: true, + serverId: testDb.serverId(), + includeEvents: ['tablemap', 'deleterows'], + }); + + zongji.on('ready', () => { + testDb.execute([ + `DELETE FROM ${TEST_TABLE}`, + ], err => { + if (err) { + return test.fail(err); + } }); + }); - // Give enough time to initialize - setTimeout(function() { - querySequence(conn.db, [ - 'SET SESSION binlog_format=STATEMENT', - 'INSERT INTO ' + conn.escId(testTable) + ' (col) VALUES (10)', - 'INSERT INTO ' + conn.escId(testTable) + ' (col) VALUES (11)', - 'INSERT INTO ' + conn.escId(testTable) + ' (id, col) VALUES (100, LAST_INSERT_ID())', - // Other tests expect row-based replication, so reset here - 'SET SESSION binlog_format=ROW', - ], function(error) { - if (error) console.error(error); - expectEvents(test, events, [ + zongji.on('binlog', evt => { + events.push(evt); + + if (events.length == 2) { + expectEvents(test, events, + [ + tableMapEvent(TEST_TABLE), + { + _type: 'DeleteRows', + _checkTableMap: checkTableMatches(TEST_TABLE), + rows: [ { col: 15 } ], + } + ], 1, + () => test.end() + ); + } + }); + }); + + test.end(); +}); + +tap.test('Intvar / Query event', test => { + const TEST_TABLE = 'intvar_test'; + + test.test(`prepare table ${TEST_TABLE}`, test => { + testDb.execute([ + `DROP TABLE IF EXISTS ${TEST_TABLE}`, + `CREATE TABLE ${TEST_TABLE} (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, col INT)`, + ], err => { + if (err) { + return test.fail(err); + } + + test.end(); + }); + }); + + test.test('begin', test => { + const events = []; + const zongji = new ZongJi(settings.connection); + test.tearDown(() => zongji.stop()); + + zongji.on('binlog', event => { + if (event.getTypeName() === 'Query' && event.query === 'BEGIN') { + return; + } + events.push(event); + + if (events.length === 6) { + expectEvents(test, events, [ { _type: 'IntVar', type: 2, value: 1 }, { _type: 'Query' }, { _type: 'IntVar', type: 2, value: 2 }, { _type: 'Query' }, { _type: 'IntVar', type: 1, value: 2 }, { _type: 'Query' }, - ], 1, function() { - zongji.stop(); - test.done(); - }); - }); - }, 200); + ], 1, () => test.end() + ); + } }); - }, -}; + zongji.start({ + startAtEnd: true, + serverId: testDb.serverId(), + includeEvents: ['intvar', 'query'], + }); + + zongji.on('ready', () => { + testDb.execute([ + 'SET SESSION binlog_format=STATEMENT', + `INSERT INTO ${TEST_TABLE} (col) VALUES (10)`, + `INSERT INTO ${TEST_TABLE} (col) VALUES (11)`, + `INSERT INTO ${TEST_TABLE} (id, col) VALUES (100, LAST_INSERT_ID())`, + // Other tests expect row-based replication, so reset here + 'SET SESSION binlog_format=ROW', + ], err => { + if (err) { + test.fail(err); + } + }); + }); + + }); + + test.end(); +}); + +tap.test('With many columns', test => { + const TEST_TABLE = '33_columns'; + const events = []; + + const zongji = new ZongJi(settings.connection); + + test.tearDown(() => zongji.stop()); + zongji.on('binlog', evt => events.push(evt)); + zongji.start({ + startAtEnd: true, + serverId: testDb.serverId(), + includeEvents: ['tablemap', 'writerows'], + }); + + zongji.on('ready', () => { + testDb.execute([ + `DROP TABLE IF EXISTS ${TEST_TABLE}`, + `CREATE TABLE ${TEST_TABLE} ( + col1 INT SIGNED NULL, col2 BIGINT SIGNED NULL, + col3 TINYINT SIGNED NULL, col4 SMALLINT SIGNED NULL, + col5 MEDIUMINT SIGNED NULL, col6 INT SIGNED NULL, + col7 BIGINT SIGNED NULL, col8 TINYINT SIGNED NULL, + col9 SMALLINT SIGNED NULL, col10 INT SIGNED NULL, + col11 BIGINT SIGNED NULL, col12 TINYINT SIGNED NULL, + col13 SMALLINT SIGNED NULL, col14 INT SIGNED NULL, + col15 BIGINT SIGNED NULL, col16 TINYINT SIGNED NULL, + col17 SMALLINT SIGNED NULL, col18 INT SIGNED NULL, + col19 BIGINT SIGNED NULL, col20 TINYINT SIGNED NULL, + col21 SMALLINT SIGNED NULL, col22 INT SIGNED NULL, + col23 BIGINT SIGNED NULL, col24 TINYINT SIGNED NULL, + col25 SMALLINT SIGNED NULL, col26 INT SIGNED NULL, + col27 BIGINT SIGNED NULL, col28 TINYINT SIGNED NULL, + col29 SMALLINT SIGNED NULL, col30 INT SIGNED NULL, + col31 BIGINT SIGNED NULL, col32 TINYINT SIGNED NULL, + col33 SMALLINT SIGNED NULL)`, + `INSERT INTO ${TEST_TABLE} (col1, col2, col3, col4, col5, col33) VALUES + (2147483647, null, 127, 32767, 8388607, 12), + (-2147483648, -9007199254740992, -128, -32768, -8388608, 10), + (-2147483645, -9007199254740990, -126, -32766, -8388606, 6), + (-1, -1, -1, -1, null, -6), + (123456, 100, 96, 300, 1000, null), + (-123456, -100, -96, -300, -1000, null)`, + `SELECT * FROM ${TEST_TABLE}`, + ], (err, result) => { + if (err) { + return test.fail(err); + } + + expectEvents(test, events, [ + { /* do not bother testing anything on first event */ }, + { rows: result[result.length - 1] } + ], 1, test.end); + }); + }); +}); diff --git a/test/filtering.js b/test/filtering.js index 1045a002..47ac52b2 100644 --- a/test/filtering.js +++ b/test/filtering.js @@ -1,149 +1,191 @@ +const tap = require('tap'); +const ZongJi = require('../'); const settings = require('./settings/mysql'); -const connector = require('./helpers/connector'); -const querySequence = require('./helpers/querySequence'); - -const conn = process.testZongJi || {}; - -module.exports = { - setUp: function(done) { - if (!conn.db) { - process.testZongJi = connector.call(conn, settings, done); - } else { - conn.incCount(); - done(); - } - }, - tearDown: function(done) { - if (conn) { - conn.eventLog.splice(0, conn.eventLog.length); - conn.errorLog.splice(0, conn.errorLog.length); - conn.closeIfInactive(1000); +const testDb = require('./helpers'); + +// this test is only used for initialization +tap.test('Initialise testing db', test => { + testDb.init(err => { + if (err) { + return test.fail(err); } - done(); - }, - unitTestFilter: function(test) { - const origOptions = conn.zongji.options; - - conn.zongji.set({ - includeEvents: ['tablemap', 'writerows', 'updaterows', 'rotate'], - excludeEvents: ['rotate'], - includeSchema: {db1: true, db2: ['one_table'], db3: true}, - excludeSchema: {db3: true} - }); - // Check that exclude overrides include - test.ok(!conn.zongji._skipEvent('tablemap')); - test.ok(conn.zongji._skipEvent('rotate')); - test.ok(!conn.zongji._skipSchema('db1', 'any_table')); - test.ok(!conn.zongji._skipSchema('db2', 'one_table')); - test.ok(conn.zongji._skipSchema('db2', 'another_table')); - test.ok(conn.zongji._skipSchema('db3', 'any_table')); + test.end(); + }); +}); - conn.zongji.set({ - includeSchema: {db1: ['just_me']} +tap.test('Unit test', test => { + const zongji = new ZongJi(settings.connection); + zongji.on('ready', () => { + test.test('Check that exclude overrides include', test => { + zongji.set({ + includeEvents: ['tablemap', 'writerows', 'updaterows', 'rotate'], + excludeEvents: ['rotate'], + includeSchema: {db1: true, db2: ['one_table'], db3: true}, + excludeSchema: {db3: true} + }); + test.ok(!zongji._skipEvent('tablemap')); + test.ok(zongji._skipEvent('rotate')); + test.ok(!zongji._skipSchema('db1', 'any_table')); + test.ok(!zongji._skipSchema('db2', 'one_table')); + test.ok(zongji._skipSchema('db2', 'another_table')); + test.ok(zongji._skipSchema('db3', 'any_table')); + + test.end(); }); - test.ok(!conn.zongji._skipSchema('db1', 'just_me')); - test.ok(conn.zongji._skipSchema('db2', 'anything_else')); - test.ok(conn.zongji._skipSchema('db1', 'not_me')); + test.test(test => { + zongji.set({ + includeSchema: {db1: ['just_me']} + }); + test.ok(!zongji._skipSchema('db1', 'just_me')); + test.ok(zongji._skipSchema('db2', 'anything_else')); + test.ok(zongji._skipSchema('db1', 'not_me')); - conn.zongji.set({ - excludeSchema: {db1: ['not_me']} + test.end(); }); - test.ok(!conn.zongji._skipSchema('db1', 'anything_else')); - test.ok(!conn.zongji._skipSchema('db2', 'anything_else')); - test.ok(conn.zongji._skipSchema('db1', 'not_me')); + test.test(test => { + zongji.set({ + excludeSchema: {db1: ['not_me']} + }); + test.ok(!zongji._skipSchema('db1', 'anything_else')); + test.ok(!zongji._skipSchema('db2', 'anything_else')); + test.ok(zongji._skipSchema('db1', 'not_me')); - conn.zongji.set({ - excludeEvents: ['rotate'] + test.end(); }); - test.ok(!conn.zongji._skipEvent('tablemap')); - test.ok(conn.zongji._skipEvent('rotate')); + test.test(test =>{ + zongji.set({ + excludeEvents: ['rotate'] + }); + test.ok(!zongji._skipEvent('tablemap')); + test.ok(zongji._skipEvent('rotate')); - conn.zongji.set({ - includeEvents: ['rotate'] + test.end(); }); - test.ok(conn.zongji._skipEvent('tablemap')); - test.ok(!conn.zongji._skipEvent('rotate')); - - // Restore original emitter - delete conn.zongji.emit; - conn.zongji.set(origOptions); - - test.done(); - }, - integrationTestFilter: function(test) { - // Set includeSchema to not include anything, recieve no row events - // Ensure that filters are applied - const origOptions = conn.zongji.options; - const testTable = 'filter_test'; - const includeSchema = {}; - // Uncomment the following line to manually test this test: - // includeSchema[settings.database] = [ testTable ]; - conn.zongji.set({ - includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'], - includeSchema: includeSchema + + test.test(test =>{ + test.plan(2); + zongji.set({ + includeEvents: ['rotate'] + }); + test.ok(zongji._skipEvent('tablemap')); + test.ok(!zongji._skipEvent('rotate')); }); - querySequence(conn.db, [ - 'DROP TABLE IF EXISTS ' + conn.escId(testTable), - 'CREATE TABLE ' + conn.escId(testTable) + ' (col INT UNSIGNED)', - 'INSERT INTO ' + conn.escId(testTable) + ' (col) VALUES (10)', - 'UPDATE ' + conn.escId(testTable) + ' SET col = 15', - 'DELETE FROM ' + conn.escId(testTable) - ], function(error) { - if (error) console.error(error); + + zongji.stop(); // It's fine to destroy the connection early. + test.end(); + }); + +}); + +tap.test('Exclue all the schema', test => { + const zongji = new ZongJi(settings.connection); + + const eventLog = []; + const errorLog = []; + + zongji.on('binlog', event => eventLog.push(event)); + zongji.on('error', error => errorLog.push(error)); + + test.tearDown(() => zongji.stop()); + + // Set includeSchema to not include anything, recieve no row events + // Ensure that filters are applied + const includeSchema = {}; + zongji.start({ + includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'], + includeSchema: includeSchema + }); + + zongji.on('ready', () => { + const testTable = 'filter_test'; + testDb.execute([ + `DROP TABLE IF EXISTS ${testTable}`, + `CREATE TABLE ${testTable} (col INT UNSIGNED)`, + `INSERT INTO ${testTable} (col) VALUES (10)`, + `UPDATE ${testTable} SET col = 15`, + `DELETE FROM ${testTable}`, + ], (error) => { + if (error) { + return test.fail(error); + } + // Give 1 second to see if any events are emitted, they should not be! - setTimeout(function() { - conn.zongji.set(origOptions); - test.equal(conn.eventLog.length, 0); - test.equal(conn.errorLog.length, 0); - test.done(); + setTimeout(() => { + test.equal(eventLog.length, 0); + test.equal(errorLog.length, 0); + test.end(); }, 1000); }); - }, - changeAfterInit: function(test) { - // Set includeSchema to skip table after the tableMap has already been - // cached once, recieve no row events afterwards - const origOptions = conn.zongji.options; - const testTable = 'after_init_test'; - const includeSchema = {}; - includeSchema[settings.database] = [ testTable ]; - conn.zongji.set({ - includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'], - includeSchema: includeSchema - }); - querySequence(conn.db, [ - 'DROP TABLE IF EXISTS ' + conn.escId(testTable), - 'CREATE TABLE ' + conn.escId(testTable) + ' (col INT UNSIGNED)', - 'INSERT INTO ' + conn.escId(testTable) + ' (col) VALUES (10)', - ], function(error) { - if (error) console.error(error); - // Give 1 second to see if any events are emitted, they should not be! - setTimeout(function() { - // Expect 2 events, TableMap and WriteRows from the INSERT query - test.equal(conn.eventLog.length, 2); - // Reset eventLog - conn.eventLog.splice(0, conn.eventLog.length); - // Skip all events from all tables - conn.zongji.set({ - includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'], - includeSchema: {} - }); - querySequence(conn.db, [ - 'UPDATE ' + conn.escId(testTable) + ' SET col = 15', - 'DELETE FROM ' + conn.escId(testTable) - ], function(error) { - if (error) console.error(error); - setTimeout(function() { - conn.zongji.set(origOptions); - test.equal(conn.eventLog.length, 0); - test.equal(conn.errorLog.length, 0); - test.done(); - }, 500); + }); +}); + +tap.test('Change filter when ZongJi is running', test => { + // Set includeSchema to skip table after the tableMap has already been + // cached once, recieve no row events afterwards + const testTable = 'after_init_test'; + const includeSchema = {}; + includeSchema[settings.connection.database] = [ testTable ]; + + const zongji = new ZongJi(settings.connection); + const eventLog = []; + + zongji.on('binlog', event => eventLog.push(event)); + zongji.on('error', error => test.fail(error)); + + zongji.start({ + includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'], + includeSchema: includeSchema + }); + + test.tearDown(() => zongji.stop()); + + testDb.execute( + [ + `DROP TABLE IF EXISTS ${testTable}`, + `CREATE TABLE ${testTable} (col INT UNSIGNED)`, + `INSERT INTO ${testTable} (col) VALUES (10)`, + ], + err => { + if (err) { + return test.fail(err); + } + + setTimeout(() => { + test.equal(eventLog.length, 2); + + test.test('update filter', test => { + // reset for next test + eventLog.splice(0, eventLog.length); + + zongji.set({ + includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'], + includeSchema: {}, + }); + + testDb.execute( + [ + `UPDATE ${testTable} SET col = 15`, + `DELETE FROM ${testTable}`, + ], + (error) => { + if (error) { + return test.fail(error); + } + + setTimeout(() => { + test.equal(eventLog.length, 0); + test.end(); + }, 1000); + } + ); }); - }, 500); - }); - } -}; + + test.end(); + }, 1000); + } + ); +}); diff --git a/test/helpers/connector.js b/test/helpers/connector.js deleted file mode 100644 index 8c3b147a..00000000 --- a/test/helpers/connector.js +++ /dev/null @@ -1,65 +0,0 @@ -const ZongJi = require('./../../'); -const mysql = require('mysql'); -const querySequence = require('./querySequence'); - -module.exports = function(settings, callback) { - const db = this.db = mysql.createConnection(settings.connection); - const escId = this.escId = db.escapeId; - const eventLog = this.eventLog = []; - const errorLog = this.errorLog = []; - - this.dbName = settings.database; - this.testCount = 0; - - // Perform initialization queries sequentially - querySequence(db, [ - 'SET GLOBAL sql_mode = \'' + settings.sessionSqlMode + '\'', - 'DROP DATABASE IF EXISTS ' + escId(settings.database), - 'CREATE DATABASE ' + escId(settings.database), - 'USE ' + escId(settings.database), - 'RESET MASTER', - 'SELECT VERSION() AS version' - ], (error, results) => { - if (error) console.error(error); - - this.mysqlVersion = results[results.length - 1][0].version - .split('-')[0] - .split('.') - .map(function(part) { - return parseInt(part, 10); - }); - - const zongji = this.zongji = new ZongJi(settings.connection); - - zongji.on('binlog', function(event) { - eventLog.push(event); - }); - - zongji.on('error', function(error) { - errorLog.push(error); - }); - - zongji.start({ - includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'] - }); - - callback(); - }); - - // Extra methods on connector object - this.incCount = function() { - this.testCount++; - }; - - this.closeIfInactive = function(interval) { - const startCount = this.testCount; - setTimeout(function() { - if (startCount === this.testCount) { - this.zongji.stop(); - this.db.destroy(); - } - }, interval); - }; - - return this; -}; diff --git a/test/helpers/expectEvents.js b/test/helpers/expectEvents.js index ec903666..a65069a6 100644 --- a/test/helpers/expectEvents.js +++ b/test/helpers/expectEvents.js @@ -24,11 +24,11 @@ function expectEvents(test, events, expected, multiplier, callback, waitIndex) { for (const i in exp) { if (Object.prototype.hasOwnProperty.call(exp, i)) { if (i === '_type') { - test.strictEqual(exp[i], event.getTypeName()); + test.strictEqual(event.getTypeName(), exp[i]); } else if (String(i).substr(0, 1) === '_') { exp[i](test, event); } else { - test.deepEqual(exp[i], event[i]); + test.same(event[i], exp[i]); } } } diff --git a/test/helpers/index.js b/test/helpers/index.js new file mode 100644 index 00000000..6c5a77ae --- /dev/null +++ b/test/helpers/index.js @@ -0,0 +1,94 @@ +const mysql = require('mysql'); + +const settings = require('../settings/mysql'); +const querySequence = require('./querySequence'); + +const SCHEMA_NAME = settings.connection.database; + +exports.SCHEMA_NAME = SCHEMA_NAME; + +exports.init = function(done) { + const connObj = {...settings.connection}; + // database doesn't exist at this time + delete connObj.database; + const conn = mysql.createConnection(connObj); + + querySequence( + conn, + [ + 'SET GLOBAL sql_mode = \'' + settings.sessionSqlMode + '\'', + `DROP DATABASE IF EXISTS ${SCHEMA_NAME}`, + `CREATE DATABASE ${SCHEMA_NAME}`, + `USE ${SCHEMA_NAME}`, + 'RESET MASTER', + // 'SELECT VERSION() AS version' + ], + error => { + conn.destroy(); + done(error); + } + ); +}; + +exports.execute = function(queries, done) { + const conn = mysql.createConnection(settings.connection); + querySequence( + conn, + queries, + (error, result) => { + conn.destroy(); + done(error, result); + } + ); +}; + +const checkVersion = function(expected, actual) { + const parts = expected.split('.').map(part => parseInt(part, 10)); + for (let i = 0; i < parts.length; i++) { + if (actual[i] == parts[i]) { + continue; + } + return actual[i] > parts[i]; + } + return true; +}; + +exports.requireVersion = function(expected, done) { + const connObj = {...settings.connection}; + // database doesn't exist at this time + delete connObj.database; + const conn = mysql.createConnection(connObj); + querySequence(conn, ['SELECT VERSION() AS version'], (err, results) => { + conn.destroy(); + + if (err) { + throw err; + } + + let ver = results[results.length - 1][0] + .version.split('-')[0] + .split('.') + .map(part => parseInt(part, 10)); + + if (checkVersion(expected, ver)) { + done(); + } + }); +}; + +let id = 100; +exports.serverId = function() { + id ++; + return id; +}; + +exports.strRepeat = function (pattern, count) { + if (count < 1) return ''; + let result = ''; + let pos = 0; + while (pos < count) { + result += pattern.replace(/##/g, pos); + pos++; + } + return result; +}; diff --git a/test/helpers/strRepeat.js b/test/helpers/strRepeat.js deleted file mode 100644 index 98a599cc..00000000 --- a/test/helpers/strRepeat.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = function (pattern, count) { - if (count < 1) return ''; - let result = ''; - let pos = 0; - while (pos < count) { - result += pattern.replace(/##/g, pos); - pos++; - } - return result; -}; diff --git a/test/settings/mysql.js b/test/settings/mysql.js index a4705931..e3ef27a0 100644 --- a/test/settings/mysql.js +++ b/test/settings/mysql.js @@ -8,8 +8,8 @@ module.exports = { charset : 'utf8mb4_unicode_ci', port : process.env.TEST_MYSQL_PORT, dateStrings : process.env.TEST_DATE_STRINGS === 'true', + database: 'zongji_test', // debug: true }, - database: 'zongji_test', - sessionSqlMode: process.env.TEST_SESSION_SQL_MODE || '' + sessionSqlMode: process.env.TEST_SESSION_SQL_MODE || '', }; diff --git a/test/types.js b/test/types.js index a87a1b52..d0c1b074 100644 --- a/test/types.js +++ b/test/types.js @@ -1,125 +1,100 @@ -const settings = require('./settings/mysql'); -const connector = require('./helpers/connector'); -const querySequence = require('./helpers/querySequence'); +const tap = require('tap'); +const ZongJi = require('../'); const expectEvents = require('./helpers/expectEvents'); -const strRepeat = require('./helpers/strRepeat'); - -const conn = process.testZongJi || {}; - -module.exports = { - setUp: function(done) { - if (!conn.db) { - process.testZongJi = connector.call(conn, settings, done); - } else { - conn.incCount(); - done(); - } - }, - tearDown: function(done) { - if (conn) { - conn.eventLog.splice(0, conn.eventLog.length); - conn.errorLog.splice(0, conn.errorLog.length); - conn.closeIfInactive(1000); - } - done(); - } -}; +const testDb = require('./helpers'); +const settings = require('./settings/mysql'); +const strRepeat = testDb.strRepeat; + // @param {string} name - unique identifier of this test [a-zA-Z0-9] // @param {[string]} fields - MySQL field description e.g. `BIGINT NULL` // @param {[[any]]} testRows - 2D array of rows and fields to insert and test // @param {func} customTest - optional, instead of exact row check -// @param {string} minVersion - optional, e.g. '5.6.4' -const defineTypeTest = function(name, fields, testRows, customTest, minVersion) { - // Allow skipping customTest argument and passing minVersion in its place - if (typeof customTest === 'string') { - minVersion = customTest; - customTest = undefined; - } - - module.exports[name] = function(test) { - const testTable = 'type_' + name; - const fieldText = fields.map(function(field, index) { - return 'col' + index + ' ' + field; - }).join(', '); - const insertColumns = fields.map(function(field, index) { - return 'col' + index; - }).join(', '); - const testQueries = [ - 'DROP TABLE IF EXISTS ' + conn.escId(testTable), - 'CREATE TABLE ' + conn.escId(testTable) + ' (' + fieldText + ')', - 'SET @@session.time_zone = "+00:00"'] - .concat(testRows.map(function(row) { - return 'INSERT INTO ' + conn.escId(testTable) + - ' (' + insertColumns + ') VALUES (' + - row.map(function(field) { - return field === null ? 'null' : field; - }).join(', ') + ')'; - })) - .concat([ - 'SET @@session.time_zone = "SYSTEM"', - 'SELECT * FROM ' + conn.escId(testTable) - ]); - - if (!minVersion || checkVersion(minVersion, conn.mysqlVersion)) { - querySequence(conn.db, testQueries, function(error, results) { - if (error) console.error(error); - const selectResult = results[results.length - 1]; - const expectedWrite = { - _type: 'WriteRows', - _checkTableMap: function(test, event) { - const tableDetails = event.tableMap[event.tableId]; - test.strictEqual(tableDetails.parentSchema, settings.database); - test.strictEqual(tableDetails.tableName, testTable); - } - }; - - expectEvents(test, conn.eventLog, [ - { - _type: 'TableMap', - tableName: testTable, - schemaName: settings.database - }, - expectedWrite - ], testRows.length, function() { - test.equal(conn.errorLog.length, 0); - conn.errorLog.length && - console.log('Type Test Error: ', name, conn.errorLog); - if (conn.errorLog.length) { - throw conn.errorLog[0]; +function defineTypeTest(name, fields, testRows, customTest) { + const TEST_TABLE = 'type_' + name; + const fieldText = fields.map((field, index) => `col${index} ${field}`).join(','); + const insertColumns = fields.map((field, index) => 'col' + index).join(','); + const testQueries = [ + `CREATE TABLE ${TEST_TABLE} (${fieldText})`, + 'SET @@session.time_zone = "+00:00"'] + .concat( + testRows.map(row => `INSERT INTO ${TEST_TABLE} + (${insertColumns}) VALUES + (${row.map(field => field === null ? 'null' : field).join(',')})` + ) + ) + .concat([ + 'SET @@session.time_zone = "SYSTEM"', + `SELECT * FROM ${TEST_TABLE}`, + ]); + + tap.test('Initialise testing db', test => { + testDb.init(err => { + if (err) { + return test.fail(err); + } + + test.end(); + }); + }); + + tap.test(name, test => { + const eventLog = []; + const errorLog = []; + + const zongji = new ZongJi(settings.connection); + test.tearDown(() => zongji.stop()); + + zongji.start({ + includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'], + serverId: testDb.serverId(), + }); + zongji.on('binlog', event => eventLog.push(event)); + zongji.on('error', error => errorLog.push(error)); + zongji.on('ready', () => { + testDb.execute(testQueries, (error, results) => { + if (error) { + return test.fail(error); } - const binlogRows = conn.eventLog.reduce(function(prev, curr) { - if (curr.getTypeName() === 'WriteRows') { - prev = prev.concat(curr.rows); + const selectResult = results[results.length - 1]; + const expectedWrite = { + _type: 'WriteRows', + _checkTableMap: (test, event) => { + const tableDetails = event.tableMap[event.tableId]; + test.same(tableDetails.parentSchema, testDb.SCHEMA_NAME); + test.same(tableDetails.tableName, TEST_TABLE); } - return prev; - }, []); + }; - if (customTest) { - customTest.bind(selectResult)(test, { rows: binlogRows }); - } else { - test.deepEqual(selectResult, binlogRows); - } + expectEvents(test, eventLog, [ + { + _type: 'TableMap', + tableName: TEST_TABLE, + schemaName: testDb.SCHEMA_NAME, + }, + expectedWrite + ], testRows.length, () => { + test.equal(errorLog.length, 0); - test.done(); + const binlogRows = eventLog.reduce((prev, curr) => { + if (curr.getTypeName() === 'WriteRows') { + prev = prev.concat(curr.rows); + } + return prev; + }, []); + + if (customTest) { + customTest.bind(selectResult)(test, { rows: binlogRows }); + } else { + test.deepEqual(selectResult, binlogRows); + } + + test.end(); + }); }); }); - } else { - // Skip running test when version doesn't meet minVersion - test.done(); - } - }; -}; - -const checkVersion = function(check, actual) { - const parts = check.split('.').map(function(part) { - return parseInt(part, 10); - }); - for (let i = 0; i < parts.length; i++) { - if (actual[i] > parts[i]) return true; - else if (actual[i] < parts[i]) return false; - } -}; + }); +} // Begin test case definitions @@ -261,20 +236,6 @@ defineTypeTest('time_no_fraction', [ ["'-01:27:28'"], ]); -defineTypeTest('time_fraction', [ - 'TIME(0) NULL', - 'TIME(1) NULL', - 'TIME(3) NULL', - 'TIME(6) NULL' -], [ - ["'-00:00:01'", "'-00:00:01.1'", "'-00:00:01.002'", "'-00:00:01.123456'"], - ["'00:00:00'", "'00:00:00.2'", "'00:00:00.123'", "'-00:00:00.000001'"], - ["'00:07:00'", "'00:07:00.3'", "'00:07:00.654'", "'00:07:00.010203'"], - ["'20:00:00'", "'20:00:00.4'", "'20:00:00.090'", "'20:00:00.987654'"], - ["'19:00:00'", "'19:00:00.5'", "'19:00:00.999'", "'19:00:00.000001'"], - ["'04:00:00'", "'04:00:00.0'", "'04:00:00.01'", "'04:00:00.1'"], -], '5.6.4'); - defineTypeTest('datetime_no_fraction', [ 'DATETIME NULL' ], [ @@ -283,30 +244,6 @@ defineTypeTest('datetime_no_fraction', [ ["'2014-12-27 01:07:08'"] ]); -defineTypeTest('datetime_fraction', [ - 'DATETIME(0) NULL', - 'DATETIME(1) NULL', - 'DATETIME(4) NULL', - 'DATETIME(6) NULL' -], [ - ["'1000-01-01 00:00:00'", "'1000-01-01 00:00:00.5'", - "'1000-01-01 00:00:00.9999'", "'1000-01-01 00:00:00.123456'"], - ["'9999-12-31 23:59:59'", "'9999-12-31 23:59:59.9'", - "'9999-12-31 23:59:59.6543'", "'9999-12-31 23:59:59.000001'"], - ["'9999-12-31 23:59:59'", "'9999-12-31 23:59:59.1'", - "'9999-12-31 23:59:59.1234'", "'9999-12-31 23:59:59.4326'" ], - ["'2014-12-27 01:07:08'", "'2014-12-27 01:07:08.0'", - "'2014-12-27 01:07:08.0001'", "'2014-12-27 01:07:08.05'" ] -], '5.6.4'); - -defineTypeTest('timestamp_fractional', [ - 'TIMESTAMP(3) NULL', -], [ - ["'1970-01-01 00:00:01.123'"], - ["'2038-01-18 03:14:07.900'"], - ["'2014-12-27 01:07:08.001'"], -], '5.6.4'); - defineTypeTest('temporal_other', [ 'DATE NULL', 'TIMESTAMP NULL', @@ -339,163 +276,209 @@ defineTypeTest('text', [ [null, null, null, null] ]); -defineTypeTest('utf8mb4', [ - 'VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci' -], [ - ["'á'"], // 3 byte character - ["'𠜎'"], // 4 byte character -], '5.5.3'); +// ======= below require different version of MySQL ======= -defineTypeTest('datetime_then_decimal', [ - 'DATETIME(3) NULL', - 'DECIMAL(30, 10) NULL' -], [ - ["'1000-01-01 00:00:00.123'", 10.10], - ["'9999-12-31 23:59:59.001'", -123.45], - ["'2014-12-27 01:07:08.053'", 12345.123] -], '5.6.4'); +testDb.requireVersion('5.5.3', () => { + defineTypeTest('utf8mb4', [ + 'VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci' + ], [ + ["'á'"], // 3 byte character + ["'𠜎'"], // 4 byte character + ]); +}); -defineTypeTest('json', [ - 'JSON NULL' -], [ - // Small Object - ['\'{"key1": "value1", "key2": "value2", "key3": 34}\''], - // Small Object with nested object - ['\'{"key1": { "key2": "value2", "key3": 34 } }\''], - // Small Object with double nested object - ['\'{"key1": { "key2": { "key2": "value2", "key3": 34 }, "key3": 34 } }\''], - // Small Object with unicode character in key and value - ['\'{ "key2": "válue2", "keybá3": 34 }\''], - // Large Object - ['\'{' + strRepeat('"key##": "value##", ', 2839) + '"keyLast": 34}\''], - // Large Object with nested small objects - ['\'{' + strRepeat('"key##": {"subkey": "value##"}, ', 2000) + '"keyLast": 34}\''], - // Large Object with nested small arrays - ['\'{' + strRepeat('"key##": ["a", ##], ', 3000) + '"keyLast": 34}\''], - // Small array - ['\'["a", "b", 1]\''], - // Small array with nested array - ['\'["a", [2, "b"], 1]\''], - // Small array with double nested array - ['\'["a", [2, ["b", 4, 54]], 1]\''], - // Large Array - ['\'[' + strRepeat('"value##", ', 6000) + '34]\''], - // Large Array with nested small objects - ['\'[' + strRepeat('{"key##": "value##"}, ', 6000) + '34]\''], - // Large Array with nested small arrays - ['\'[' + strRepeat('[##, "value##"], ', 6000) + '34]\''], - // Strings of various lengths - ['\'"hello"\''], - ['\'{"twobytelen": "' + strRepeat('a', 256) + '"}\''], - ['\'{"twobytelen": "' + strRepeat('a', 257) + '"}\''], - ['\'{"twobytelen": "' + strRepeat('a', 258) + '"}\''], - ['\'{"twobytelen": "' + strRepeat('a', 7383) + '"}\''], - ['\'{"twobytelen": "' + strRepeat('a', 16383) + '"}\''], - ['\'{"threebytelen": "' + strRepeat('a', 16388) + '"}\''], - // Integers - ['\'{"key1": -10, "keyb": 34}\''], - ['\'10\''], - ['\'2147483647\''], // Int32 - ['\'-2147483647\''], // Int32 - ['\'2147483648\''], // Int64 - ['\'4294967295\''], // Int64 - ['\'-4294967295\''], // Int64 - ['\'9007199254740992\''], // UInt64 - ['\'-9007199254740992\''], // Int64 - ['\'3e2\''], - ['\'-3e-2\''], - // Doubles - ['\'10.123\''], - ['\'{"doubleval": "-123.38439", "another": 1283192.0004}\''], - // Literals - ['\'{"literaltest1": null, "literal2": true, "literal3": false}\''], - ['\'{"literaltest1": null, "stringafter": "heyos", "number": 35}\''], - ['\'null\''], - ['\'true\''], - ['\'false\''], - // Opaque custom data - ['JSON_OBJECT(\'key\', BINARY \'hi\')'], - ['JSON_OBJECT(\'key\', MAKEDATE(2014,361))'], - ['JSON_OBJECT(\'key\', DATE(\'100-01-01\'))'], - ['JSON_OBJECT(\'key\', DATE(\'1000-01-01\'))'], - ['JSON_OBJECT(\'key\', DATE(\'1000-01-02\'))'], - ['JSON_OBJECT(\'key\', DATE(\'1000-01-03\'))'], - ['JSON_OBJECT(\'key\', DATE(\'1000-02-01\'))'], - ['JSON_OBJECT(\'key\', DATE(\'1000-12-31\'))'], - ['JSON_OBJECT(\'key\', DATE(\'2001-01-01\'))'], - ['JSON_OBJECT(\'key\', DATE(\'2002-01-01\'))'], - ['JSON_OBJECT(\'key\', DATE(\'2003-01-01\'))'], - ['JSON_OBJECT(\'key\', DATE(\'2004-01-01\'))'], - ['JSON_OBJECT(\'key\', DATE(\'9999-01-01\'))'], - ['JSON_OBJECT(\'key\', DATE(\'9999-12-31\'))'], - ['JSON_OBJECT(\'key\', DATE(\'2002-02-02\'))'], - ['JSON_OBJECT(\'key\', DATE(\'2002-03-03\'))'], - ['JSON_OBJECT(\'key\', DATE(\'2002-12-12\'))'], - ['JSON_OBJECT(\'key\', MAKETIME(-838,59,59))'], - ['JSON_OBJECT(\'key\', MAKETIME(838,59,59))'], - ['JSON_OBJECT(\'zero\', MAKETIME(0,0,0))'], - ['JSON_OBJECT(\'onehour\', MAKETIME(1,0,0))'], - ['JSON_OBJECT(\'oneminu\', MAKETIME(0,1,0))'], - ['JSON_OBJECT(\'oneseco\', MAKETIME(0,0,1))'], - ['JSON_OBJECT(\'hurnsec\', MAKETIME(1,0,1))'], - ['JSON_OBJECT(\'minnsec\', MAKETIME(0,1,1))'], - ['JSON_OBJECT(\'2minsec\', MAKETIME(0,2,2))'], - ['JSON_OBJECT(\'2min15sec\', MAKETIME(0,2,15))'], - ['JSON_OBJECT(\'2min16sec\', MAKETIME(0,2,16))'], - ['JSON_OBJECT(\'2min32sec\', MAKETIME(0,2,32))'], - ['JSON_OBJECT(\'2min59sec\', MAKETIME(0,2,59))'], - ['JSON_OBJECT(\'key\', MAKETIME(0,59,0))'], - ['JSON_OBJECT(\'key\', MAKETIME(0,0,59))'], - ['JSON_OBJECT(\'key\', MAKETIME(20,15,10))'], - ['JSON_OBJECT(\'key\', MAKETIME(21,15,10))'], - ['JSON_OBJECT(\'key\', MAKETIME(22,15,10))'], - ['JSON_OBJECT(\'oneseco\', MAKETIME(0,0,1.123))'], - ['JSON_OBJECT(\'oneseco\', MAKETIME(0,0,1.000123))'], - ['JSON_OBJECT(\'key\', MAKETIME(-20,00,00))'], - ['JSON_OBJECT(\'-59min\', TIME(\'-00:00:00.003\'))'], - ['JSON_OBJECT(\'-59min\', TIME(\'00:00:00.003\'))'], - ['JSON_OBJECT(\'-59min\', TIME(\'-00:59:59\'))'], - ['JSON_OBJECT(\'-59min\', TIME(\'-00:59:59.0003\'))'], - ['JSON_OBJECT(\'-1hr\', MAKETIME(-1,00,00))'], - ['JSON_OBJECT(\'-2hr\', MAKETIME(-2,00,00))'], - ['JSON_OBJECT(\'-1hr1sec\', MAKETIME(-1,00,1))'], - ['JSON_OBJECT(\'-1hr1sec\', MAKETIME(-1,00,0.1))'], - ['JSON_OBJECT(\'key\', TIMESTAMP(\'2014-12-27\'))'], - ['JSON_OBJECT(\'key\', TIMESTAMP(\'2014-12-27 01:07:08\'))'], - ['JSON_OBJECT(\'key\', TIMESTAMP(\'2014-12-27 01:07:08.123\'))'], - ['JSON_OBJECT(\'key\', TIMESTAMP(\'2014-12-27 01:07:08.000456\'))'], - ['JSON_OBJECT(\'key\', TIMESTAMP(\'2014-12-28\'))'], - ['JSON_OBJECT(\'key\', TIMESTAMP(\'2014-12-29\'))'], - ['JSON_OBJECT(\'key\', TIMESTAMP(\'2003-12-31 12:00:00\'))'], - ['JSON_OBJECT(\'key\', TIMESTAMP(\'2003-12-31 12:00:00.123\'))'], - ['JSON_OBJECT(\'key\', UNIX_TIMESTAMP(\'2015-11-13 10:20:19.012\'))'], -], function(test, event) { - // JSON from MySQL client has different whitespace than JSON.stringify - // Therefore, parse and perform deep equality - event.rows.forEach(function(row, index) { - // test.deepEqual does not work when comparison objects exceed 65536 bytes - // Perform alternative assertions for these large cases - const expected = JSON.parse(this[index].col0); - const actual = JSON.parse(row.col0); - if (this[index].col0.length > 65536) { - // Large cases are either array or object - if (expected instanceof Array) { - test.strictEqual(expected.length, actual.length); - for (let i = 0; i < expected.length; i++) { - test.deepEqual(expected[i], actual[i]); +testDb.requireVersion('5.6.4', () => { + defineTypeTest('time_fraction', [ + 'TIME(0) NULL', + 'TIME(1) NULL', + 'TIME(3) NULL', + 'TIME(6) NULL' + ], [ + ["'-00:00:01'", "'-00:00:01.1'", "'-00:00:01.002'", "'-00:00:01.123456'"], + ["'00:00:00'", "'00:00:00.2'", "'00:00:00.123'", "'-00:00:00.000001'"], + ["'00:07:00'", "'00:07:00.3'", "'00:07:00.654'", "'00:07:00.010203'"], + ["'20:00:00'", "'20:00:00.4'", "'20:00:00.090'", "'20:00:00.987654'"], + ["'19:00:00'", "'19:00:00.5'", "'19:00:00.999'", "'19:00:00.000001'"], + ["'04:00:00'", "'04:00:00.0'", "'04:00:00.01'", "'04:00:00.1'"], + ]); + + defineTypeTest('datetime_fraction', [ + 'DATETIME(0) NULL', + 'DATETIME(1) NULL', + 'DATETIME(4) NULL', + 'DATETIME(6) NULL' + ], [ + ["'1000-01-01 00:00:00'", "'1000-01-01 00:00:00.5'", + "'1000-01-01 00:00:00.9999'", "'1000-01-01 00:00:00.123456'"], + ["'9999-12-31 23:59:59'", "'9999-12-31 23:59:59.9'", + "'9999-12-31 23:59:59.6543'", "'9999-12-31 23:59:59.000001'"], + ["'9999-12-31 23:59:59'", "'9999-12-31 23:59:59.1'", + "'9999-12-31 23:59:59.1234'", "'9999-12-31 23:59:59.4326'" ], + ["'2014-12-27 01:07:08'", "'2014-12-27 01:07:08.0'", + "'2014-12-27 01:07:08.0001'", "'2014-12-27 01:07:08.05'" ] + ]); + + defineTypeTest('timestamp_fractional', [ + 'TIMESTAMP(3) NULL', + ], [ + ["'1970-01-01 00:00:01.123'"], + ["'2038-01-18 03:14:07.900'"], + ["'2014-12-27 01:07:08.001'"], + ]); + + defineTypeTest('datetime_then_decimal', [ + 'DATETIME(3) NULL', + 'DECIMAL(30, 10) NULL' + ], [ + ["'1000-01-01 00:00:00.123'", 10.10], + ["'9999-12-31 23:59:59.001'", -123.45], + ["'2014-12-27 01:07:08.053'", 12345.123] + ]); +}); + +testDb.requireVersion('5.7.8', () => { + defineTypeTest('json', [ + 'JSON NULL' + ], [ + // Small Object + ['\'{"key1": "value1", "key2": "value2", "key3": 34}\''], + // Small Object with nested object + ['\'{"key1": { "key2": "value2", "key3": 34 } }\''], + // Small Object with double nested object + ['\'{"key1": { "key2": { "key2": "value2", "key3": 34 }, "key3": 34 } }\''], + // Small Object with unicode character in key and value + ['\'{ "key2": "válue2", "keybá3": 34 }\''], + // Large Object + ['\'{' + strRepeat('"key##": "value##", ', 2839) + '"keyLast": 34}\''], + // Large Object with nested small objects + ['\'{' + strRepeat('"key##": {"subkey": "value##"}, ', 2000) + '"keyLast": 34}\''], + // Large Object with nested small arrays + ['\'{' + strRepeat('"key##": ["a", ##], ', 3000) + '"keyLast": 34}\''], + // Small array + ['\'["a", "b", 1]\''], + // Small array with nested array + ['\'["a", [2, "b"], 1]\''], + // Small array with double nested array + ['\'["a", [2, ["b", 4, 54]], 1]\''], + // Large Array + ['\'[' + strRepeat('"value##", ', 6000) + '34]\''], + // Large Array with nested small objects + ['\'[' + strRepeat('{"key##": "value##"}, ', 6000) + '34]\''], + // Large Array with nested small arrays + ['\'[' + strRepeat('[##, "value##"], ', 6000) + '34]\''], + // Strings of various lengths + ['\'"hello"\''], + ['\'{"twobytelen": "' + strRepeat('a', 256) + '"}\''], + ['\'{"twobytelen": "' + strRepeat('a', 257) + '"}\''], + ['\'{"twobytelen": "' + strRepeat('a', 258) + '"}\''], + ['\'{"twobytelen": "' + strRepeat('a', 7383) + '"}\''], + ['\'{"twobytelen": "' + strRepeat('a', 16383) + '"}\''], + ['\'{"threebytelen": "' + strRepeat('a', 16388) + '"}\''], + // Integers + ['\'{"key1": -10, "keyb": 34}\''], + ['\'10\''], + ['\'2147483647\''], // Int32 + ['\'-2147483647\''], // Int32 + ['\'2147483648\''], // Int64 + ['\'4294967295\''], // Int64 + ['\'-4294967295\''], // Int64 + ['\'9007199254740992\''], // UInt64 + ['\'-9007199254740992\''], // Int64 + ['\'3e2\''], + ['\'-3e-2\''], + // Doubles + ['\'10.123\''], + ['\'{"doubleval": "-123.38439", "another": 1283192.0004}\''], + // Literals + ['\'{"literaltest1": null, "literal2": true, "literal3": false}\''], + ['\'{"literaltest1": null, "stringafter": "heyos", "number": 35}\''], + ['\'null\''], + ['\'true\''], + ['\'false\''], + // Opaque custom data + ['JSON_OBJECT(\'key\', BINARY \'hi\')'], + ['JSON_OBJECT(\'key\', MAKEDATE(2014,361))'], + ['JSON_OBJECT(\'key\', DATE(\'100-01-01\'))'], + ['JSON_OBJECT(\'key\', DATE(\'1000-01-01\'))'], + ['JSON_OBJECT(\'key\', DATE(\'1000-01-02\'))'], + ['JSON_OBJECT(\'key\', DATE(\'1000-01-03\'))'], + ['JSON_OBJECT(\'key\', DATE(\'1000-02-01\'))'], + ['JSON_OBJECT(\'key\', DATE(\'1000-12-31\'))'], + ['JSON_OBJECT(\'key\', DATE(\'2001-01-01\'))'], + ['JSON_OBJECT(\'key\', DATE(\'2002-01-01\'))'], + ['JSON_OBJECT(\'key\', DATE(\'2003-01-01\'))'], + ['JSON_OBJECT(\'key\', DATE(\'2004-01-01\'))'], + ['JSON_OBJECT(\'key\', DATE(\'9999-01-01\'))'], + ['JSON_OBJECT(\'key\', DATE(\'9999-12-31\'))'], + ['JSON_OBJECT(\'key\', DATE(\'2002-02-02\'))'], + ['JSON_OBJECT(\'key\', DATE(\'2002-03-03\'))'], + ['JSON_OBJECT(\'key\', DATE(\'2002-12-12\'))'], + ['JSON_OBJECT(\'key\', MAKETIME(-838,59,59))'], + ['JSON_OBJECT(\'key\', MAKETIME(838,59,59))'], + ['JSON_OBJECT(\'zero\', MAKETIME(0,0,0))'], + ['JSON_OBJECT(\'onehour\', MAKETIME(1,0,0))'], + ['JSON_OBJECT(\'oneminu\', MAKETIME(0,1,0))'], + ['JSON_OBJECT(\'oneseco\', MAKETIME(0,0,1))'], + ['JSON_OBJECT(\'hurnsec\', MAKETIME(1,0,1))'], + ['JSON_OBJECT(\'minnsec\', MAKETIME(0,1,1))'], + ['JSON_OBJECT(\'2minsec\', MAKETIME(0,2,2))'], + ['JSON_OBJECT(\'2min15sec\', MAKETIME(0,2,15))'], + ['JSON_OBJECT(\'2min16sec\', MAKETIME(0,2,16))'], + ['JSON_OBJECT(\'2min32sec\', MAKETIME(0,2,32))'], + ['JSON_OBJECT(\'2min59sec\', MAKETIME(0,2,59))'], + ['JSON_OBJECT(\'key\', MAKETIME(0,59,0))'], + ['JSON_OBJECT(\'key\', MAKETIME(0,0,59))'], + ['JSON_OBJECT(\'key\', MAKETIME(20,15,10))'], + ['JSON_OBJECT(\'key\', MAKETIME(21,15,10))'], + ['JSON_OBJECT(\'key\', MAKETIME(22,15,10))'], + ['JSON_OBJECT(\'oneseco\', MAKETIME(0,0,1.123))'], + ['JSON_OBJECT(\'oneseco\', MAKETIME(0,0,1.000123))'], + ['JSON_OBJECT(\'key\', MAKETIME(-20,00,00))'], + ['JSON_OBJECT(\'-59min\', TIME(\'-00:00:00.003\'))'], + ['JSON_OBJECT(\'-59min\', TIME(\'00:00:00.003\'))'], + ['JSON_OBJECT(\'-59min\', TIME(\'-00:59:59\'))'], + ['JSON_OBJECT(\'-59min\', TIME(\'-00:59:59.0003\'))'], + ['JSON_OBJECT(\'-1hr\', MAKETIME(-1,00,00))'], + ['JSON_OBJECT(\'-2hr\', MAKETIME(-2,00,00))'], + ['JSON_OBJECT(\'-1hr1sec\', MAKETIME(-1,00,1))'], + ['JSON_OBJECT(\'-1hr1sec\', MAKETIME(-1,00,0.1))'], + ['JSON_OBJECT(\'key\', TIMESTAMP(\'2014-12-27\'))'], + ['JSON_OBJECT(\'key\', TIMESTAMP(\'2014-12-27 01:07:08\'))'], + ['JSON_OBJECT(\'key\', TIMESTAMP(\'2014-12-27 01:07:08.123\'))'], + ['JSON_OBJECT(\'key\', TIMESTAMP(\'2014-12-27 01:07:08.000456\'))'], + ['JSON_OBJECT(\'key\', TIMESTAMP(\'2014-12-28\'))'], + ['JSON_OBJECT(\'key\', TIMESTAMP(\'2014-12-29\'))'], + ['JSON_OBJECT(\'key\', TIMESTAMP(\'2003-12-31 12:00:00\'))'], + ['JSON_OBJECT(\'key\', TIMESTAMP(\'2003-12-31 12:00:00.123\'))'], + ['JSON_OBJECT(\'key\', UNIX_TIMESTAMP(\'2015-11-13 10:20:19.012\'))'], + ], function(test, event) { // caution here , don't use arrow function + // JSON from MySQL client has different whitespace than JSON.stringify + // Therefore, parse and perform deep equality + event.rows.forEach((row, index) => { + // test.deepEqual does not work when comparison objects exceed 65536 bytes + // Perform alternative assertions for these large cases + const expected = JSON.parse(this[index].col0); + const actual = JSON.parse(row.col0); + if (this[index].col0.length > 65536) { + // Large cases are either array or object + if (expected instanceof Array) { + test.strictEqual(expected.length, actual.length); + for (let i = 0; i < expected.length; i++) { + test.deepEqual(expected[i], actual[i]); + } + } else { + const expectedKeys = Object.keys(expected); + const actualKeys = Object.keys(actual); + test.strictEqual(expectedKeys.length, actualKeys.length); + test.deepEqual(expectedKeys, actualKeys); + for (let j = 0; j < expectedKeys.length; j++) { + test.deepEqual(expected[expectedKeys[j]], actual[expectedKeys[j]]); + } } } else { - const expectedKeys = Object.keys(expected); - const actualKeys = Object.keys(actual); - test.strictEqual(expectedKeys.length, actualKeys.length); - test.deepEqual(expectedKeys, actualKeys); - for (let j = 0; j < expectedKeys.length; j++) { - test.deepEqual(expected[expectedKeys[j]], actual[expectedKeys[j]]); - } + // Comparison objects are smaller than 65536 bytes + test.deepEqual(expected, actual); } - } else { - // Comparison objects are smaller than 65536 bytes - test.deepEqual(expected, actual); - } - }.bind(this)); -}, '5.7.8'); + }); + }); +}); From d9701c05d0cee3af034c4fc128d55d92688c2445 Mon Sep 17 00:00:00 2001 From: Nevill Date: Sat, 2 Nov 2019 23:04:28 +0800 Subject: [PATCH 25/34] Breaking changes, see #111 - constructor doesn't have options as the 2nd parameter - store all the includeEvent / excludeEvent / includeSchema / excludeSchema in a new field `filters` - rename `set` to `_filters`, it will reset the filters everytime it's called --- README.md | 1 - index.js | 313 +++++++++++++++++++++++++--------------------- test/errors.js | 3 + test/filtering.js | 20 ++- 4 files changed, 179 insertions(+), 158 deletions(-) diff --git a/README.md b/README.md index a1eca674..d789e6a9 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,6 @@ Method Name | Arguments | Description ------------|-----------|------------------------ `start` | `options` | Start receiving replication events, see options listed below `stop` | *None* | Disconnect from MySQL server, stop receiving events -`set` | `options` | Change options after `start()` `on` | `eventName`, `handler` | Add a listener to the `binlog` or `error` event. Each handler function accepts one argument. Some events can be emitted in different phases: diff --git a/index.js b/index.js index a386ca1a..db6746f9 100644 --- a/index.js +++ b/index.js @@ -13,35 +13,23 @@ const TableInfoQueryTemplate = 'SELECT ' + 'COLUMN_COMMENT, COLUMN_TYPE ' + 'FROM information_schema.columns ' + "WHERE table_schema='%s' AND table_name='%s'"; -function ZongJi(dsn, options) { - this.set(options); - +function ZongJi(dsn) { EventEmitter.call(this); + this._options({}); + this._filters({}); this.ctrlCallbacks = []; this.tableMap = {}; this.ready = false; this.useChecksum = false; this._establishConnection(dsn); - this._init(); } util.inherits(ZongJi, EventEmitter); // dsn - can be one instance of Connection or Pool / object / url string ZongJi.prototype._establishConnection = function(dsn) { - let binlogDsn; - const configFunc = ConnectionConfigMap[dsn.constructor.name]; - - if (typeof dsn === 'object' && configFunc) { - let conn = dsn; - // reuse as ctrlConnection - this.ctrlConnection = conn; - this.ctrlConnectionOwner = false; - binlogDsn = Object.assign({}, configFunc(conn)); - } - const createConnection = (options) => { let connection = mysql.createConnection(options); connection.on('error', this.emit.bind(this, 'error')); @@ -52,6 +40,17 @@ ZongJi.prototype._establishConnection = function(dsn) { return connection; }; + const configFunc = ConnectionConfigMap[dsn.constructor.name]; + let binlogDsn; + + if (typeof dsn === 'object' && configFunc) { + // dsn is a pool or connection object + let conn = dsn; // reuse as ctrlConnection + this.ctrlConnection = conn; + this.ctrlConnectionOwner = false; + binlogDsn = Object.assign({}, configFunc(conn)); + } + if (!binlogDsn) { // assuming that the object passed is the connection settings this.ctrlConnectionOwner = true; @@ -62,51 +61,6 @@ ZongJi.prototype._establishConnection = function(dsn) { this.connection = createConnection(binlogDsn); }; -ZongJi.prototype._init = function() { - - const ready = () => { - this.BinlogClass = initBinlogClass(this); - this.ready = true; - this.emit('ready'); - this._executeCtrlCallbacks(); - }; - - const testChecksum = new Promise((resolve, reject) => { - this._isChecksumEnabled((err, checksumEnabled) => { - if (err) { - reject(err); - } - else { - this.useChecksum = checksumEnabled; - resolve(); - } - }); - }); - - const findBinlogEnd = new Promise((resolve, reject) => { - this._findBinlogEnd((err, result) => { - if (err) { - return reject(err); - } - - if (result && this.options.startAtEnd) { - Object.assign(this.options, { - filename: result.Log_name, - position: result.File_size, - }); - } - - resolve(); - }); - }); - - Promise.all([testChecksum, findBinlogEnd]) - .then(ready) - .catch(err => { - this.emit('error', err); - }); -}; - ZongJi.prototype._isChecksumEnabled = function(next) { const SelectChecksumParamSql = 'select @@GLOBAL.binlog_checksum as checksum'; const SetChecksumSql = 'set @master_binlog_checksum=@@global.binlog_checksum'; @@ -165,14 +119,6 @@ ZongJi.prototype._findBinlogEnd = function(next) { }); }; -ZongJi.prototype._executeCtrlCallbacks = function() { - if (this.ctrlCallbacks.length > 0) { - this.ctrlCallbacks.forEach(cb => { - setImmediate(cb); - }); - } -}; - ZongJi.prototype._fetchTableInfo = function(tableMapEvent, next) { const sql = util.format(TableInfoQueryTemplate, tableMapEvent.schemaName, tableMapEvent.tableName); @@ -205,25 +151,34 @@ ZongJi.prototype._fetchTableInfo = function(tableMapEvent, next) { }); }; -const AVAILABLE_OPTIONS = [ - 'includeEvents', - 'excludeEvents', - 'includeSchema', - 'excludeSchema', - 'serverId', - 'filename', - 'position', - 'startAtEnd', -]; - -ZongJi.prototype.set = function(options = {}) { - this.options = {}; - - for (const key of AVAILABLE_OPTIONS) { - if (options[key]) { - this.options[key] = options[key]; - } - } +// #_options will reset all the options. +ZongJi.prototype._options = function({ + serverId, + filename, + position, + startAtEnd, +}) { + this.options = { + serverId, + filename, + position, + startAtEnd, + }; +}; + +// #_filters will reset all the filters. +ZongJi.prototype._filters = function({ + includeEvents, + excludeEvents, + includeSchema, + excludeSchema, +}) { + this.filters = { + includeEvents, + excludeEvents, + includeSchema, + excludeSchema, + }; }; ZongJi.prototype.get = function(name) { @@ -244,47 +199,101 @@ ZongJi.prototype.get = function(name) { return result; }; -ZongJi.prototype.start = function(options) { - this.set(options); - - const _start = () => { - this.connection._protocol._enqueue(new this.BinlogClass((error, event) => { - if (error) return this.emit('error', error); - // Do not emit events that have been filtered out - if (event === undefined || event._filtered === true) return; - - switch (event.getTypeName()) { - case 'TableMap': { - const tableMap = this.tableMap[event.tableId]; - if (!tableMap) { - this.connection.pause(); - this._fetchTableInfo(event, () => { - // merge the column info with metadata - event.updateColumnInfo(); - this.emit('binlog', event); - this.connection.resume(); - }); - return; - } - break; +// @options contains a list options +// - `serverId` unique identifier +// - `filename`, `position` the position of binlog to beigin with +// - `startAtEnd` if true, will update filename / postion automatically +// - `includeEvents`, `excludeEvents`, `includeSchema`, `exludeSchema` filter different binlog events bubbling +ZongJi.prototype.start = function(options = {}) { + + this._options(options); + this._filters(options); + + const testChecksum = (resolve, reject) => { + this._isChecksumEnabled((err, checksumEnabled) => { + if (err) { + reject(err); + } + else { + this.useChecksum = checksumEnabled; + resolve(); + } + }); + }; + + + const findBinlogEnd = (resolve, reject) => { + this._findBinlogEnd((err, result) => { + if (err) { + return reject(err); + } + + if (result) { + this._options( + Object.assign({}, options, { + filename: result.Log_name, + position: result.File_size, + }) + ); + } + + resolve(); + }); + }; + + const binlogHandler = (error, event) => { + if (error) { + return this.emit('error', error); + } + + // Do not emit events that have been filtered out + if (event === undefined || event._filtered === true) return; + + switch (event.getTypeName()) { + case 'TableMap': { + const tableMap = this.tableMap[event.tableId]; + if (!tableMap) { + this.connection.pause(); + this._fetchTableInfo(event, () => { + // merge the column info with metadata + event.updateColumnInfo(); + this.emit('binlog', event); + this.connection.resume(); + }); + return; } - case 'Rotate': - if (this.options.filename !== event.binlogName) { - this.options.filename = event.binlogName; - } - break; + break; } - this.options.position = event.nextPosition; - this.emit('binlog', event); - })); + case 'Rotate': + if (this.options.filename !== event.binlogName) { + this.options.filename = event.binlogName; + } + break; + } + this.options.position = event.nextPosition; + this.emit('binlog', event); }; - if (this.ready) { - _start(); - } - else { - this.ctrlCallbacks.push(_start); + let promises = [new Promise(testChecksum)]; + + if (this.options.startAtEnd) { + promises.push(new Promise(findBinlogEnd)); } + + Promise.all(promises) + .then(() => { + this.BinlogClass = initBinlogClass(this); + this.ready = true; + this.emit('ready'); + + this.connection._protocol._enqueue( + new this.BinlogClass(binlogHandler) + ); + }) + .catch(err => { + this.emit('error', err); + }); + }; ZongJi.prototype.stop = function() { @@ -301,32 +310,44 @@ ZongJi.prototype.stop = function() { ); }; -ZongJi.prototype._skipEvent = function(eventName) { - const include = this.get('includeEvents'); - const exclude = this.get('excludeEvents'); - return !( - (include === undefined || - (include instanceof Array && include.indexOf(eventName) !== -1)) && - (exclude === undefined || - (exclude instanceof Array && exclude.indexOf(eventName) === -1))); +// It includes every events by default. +ZongJi.prototype._skipEvent = function(name) { + const includes = this.filters.includeEvents; + const excludes = this.filters.excludeEvents; + + let included = (includes === undefined) || + (Array.isArray(includes) && (includes.indexOf(name) > -1)); + let excluded = Array.isArray(excludes) && (excludes.indexOf(name) > -1); + + return excluded || !included; }; +// It doesn't skip any schema by default. ZongJi.prototype._skipSchema = function(database, table) { - const include = this.get('includeSchema'); - const exclude = this.get('excludeSchema'); - - return !( - (include === undefined || - (database !== undefined && (database in include) && - (include[database] === true || - (include[database] instanceof Array && - include[database].indexOf(table) !== -1)))) && - (exclude === undefined || - (database !== undefined && - (!(database in exclude) || - (exclude[database] !== true && - (exclude[database] instanceof Array && - exclude[database].indexOf(table) === -1)))))); + const includes = this.filters.includeSchema; + const excludes = this.filters.excludeSchema || {}; + + let included = (includes === undefined) || + ( + (database in includes) && + ( + includes[database] === true || + ( + Array.isArray(includes[database]) && + includes[database].indexOf(table) > -1 + ) + ) + ); + let excluded = (database in excludes) && + ( + excludes[database] === true || + ( + Array.isArray(excludes[database]) && + excludes[database].indexOf(table) > -1 + ) + ); + + return excluded || !included; }; module.exports = ZongJi; diff --git a/test/errors.js b/test/errors.js index 8b0cde6b..5df5f990 100644 --- a/test/errors.js +++ b/test/errors.js @@ -15,6 +15,9 @@ tap.test('Connect to an invalid host', test => { test.ok(['ENOTFOUND', 'ETIMEDOUT'].indexOf(error.code) !== -1); test.end(); }); + + test.tearDown(() => zongji.stop()); + zongji.start(); }); tap.test('Initialise testing db', test => { diff --git a/test/filtering.js b/test/filtering.js index 47ac52b2..dc3826bf 100644 --- a/test/filtering.js +++ b/test/filtering.js @@ -16,9 +16,9 @@ tap.test('Initialise testing db', test => { tap.test('Unit test', test => { const zongji = new ZongJi(settings.connection); - zongji.on('ready', () => { + test.test('Check that exclude overrides include', test => { - zongji.set({ + zongji._filters({ includeEvents: ['tablemap', 'writerows', 'updaterows', 'rotate'], excludeEvents: ['rotate'], includeSchema: {db1: true, db2: ['one_table'], db3: true}, @@ -35,7 +35,7 @@ tap.test('Unit test', test => { }); test.test(test => { - zongji.set({ + zongji._filters({ includeSchema: {db1: ['just_me']} }); test.ok(!zongji._skipSchema('db1', 'just_me')); @@ -46,9 +46,10 @@ tap.test('Unit test', test => { }); test.test(test => { - zongji.set({ + zongji._filters({ excludeSchema: {db1: ['not_me']} }); + test.ok(!zongji._skipSchema('db1', 'anything_else')); test.ok(!zongji._skipSchema('db2', 'anything_else')); test.ok(zongji._skipSchema('db1', 'not_me')); @@ -57,7 +58,7 @@ tap.test('Unit test', test => { }); test.test(test =>{ - zongji.set({ + zongji._filters({ excludeEvents: ['rotate'] }); test.ok(!zongji._skipEvent('tablemap')); @@ -68,17 +69,14 @@ tap.test('Unit test', test => { test.test(test =>{ test.plan(2); - zongji.set({ - includeEvents: ['rotate'] + zongji._filters({ + includeEvents: ['rotate'], }); test.ok(zongji._skipEvent('tablemap')); test.ok(!zongji._skipEvent('rotate')); }); - zongji.stop(); // It's fine to destroy the connection early. test.end(); - }); - }); tap.test('Exclue all the schema', test => { @@ -161,7 +159,7 @@ tap.test('Change filter when ZongJi is running', test => { // reset for next test eventLog.splice(0, eventLog.length); - zongji.set({ + zongji._filters({ includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'], includeSchema: {}, }); From 2c9d5dbcdda66de8f464cc48fae9396412865081 Mon Sep 17 00:00:00 2001 From: Nevill Date: Tue, 5 Nov 2019 09:30:06 +0800 Subject: [PATCH 26/34] Add package big-integer as dependency --- package-lock.json | 410 +++++++++++++++++++++++++++++++--------------- package.json | 1 + 2 files changed, 275 insertions(+), 136 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5e015dc8..dfdeb012 100644 --- a/package-lock.json +++ b/package-lock.json @@ -275,6 +275,11 @@ "tweetnacl": "^0.14.3" } }, + "big-integer": { + "version": "1.6.47", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.47.tgz", + "integrity": "sha512-9t9f7X3as2XGX8b52GqG6ox0GvIdM86LyIXASJnDCFhYNgt+A+MByQZ3W2PyMRZjEvG5f8TEbSPfEotVuMJnQg==" + }, "bignumber.js": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", @@ -2410,7 +2415,8 @@ "dependencies": { "@babel/runtime": { "version": "7.6.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", "dev": true, "requires": { "regenerator-runtime": "^0.13.2" @@ -2418,19 +2424,22 @@ "dependencies": { "regenerator-runtime": { "version": "0.13.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", "dev": true } } }, "@types/prop-types": { "version": "15.7.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", "dev": true }, "@types/react": { "version": "16.9.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-jQ12VMiFOWYlp+j66dghOWcmDDwhca0bnlcTxS4Qz/fh5gi6wpaZDthPEu/Gc/YlAuO87vbiUXL8qKstFvuOaA==", "dev": true, "requires": { "@types/prop-types": "*", @@ -2439,7 +2448,8 @@ }, "ansi-escapes": { "version": "4.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", "dev": true, "requires": { "type-fest": "^0.5.2" @@ -2447,32 +2457,38 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "ansi-styles": { "version": "2.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, "ansicolors": { "version": "0.3.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", "dev": true }, "arrify": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, "astral-regex": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, "auto-bind": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-NUwV1i9D3vxxY1KnfZgSZ716d6ovY7o8LfOwLhGIPFBowIb6Ln6DBW64+jCqPzUznel2hRSkQnYQqvh7/ldw8A==", "dev": true, "requires": { "@types/react": "^16.8.12" @@ -2480,7 +2496,8 @@ }, "babel-code-frame": { "version": "6.26.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { "chalk": "^1.1.3", @@ -2490,7 +2507,8 @@ }, "babel-core": { "version": "6.26.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { "babel-code-frame": "^6.26.0", @@ -2516,14 +2534,16 @@ "dependencies": { "source-map": { "version": "0.5.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true } } }, "babel-generator": { "version": "6.26.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { "babel-messages": "^6.23.0", @@ -2538,14 +2558,16 @@ "dependencies": { "source-map": { "version": "0.5.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true } } }, "babel-helper-builder-react-jsx": { "version": "6.26.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", "dev": true, "requires": { "babel-runtime": "^6.26.0", @@ -2555,7 +2577,8 @@ }, "babel-helpers": { "version": "6.24.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { "babel-runtime": "^6.22.0", @@ -2564,7 +2587,8 @@ }, "babel-messages": { "version": "6.23.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { "babel-runtime": "^6.22.0" @@ -2572,17 +2596,20 @@ }, "babel-plugin-syntax-jsx": { "version": "6.18.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", "dev": true }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", "dev": true }, "babel-plugin-transform-es2015-destructuring": { "version": "6.23.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { "babel-runtime": "^6.22.0" @@ -2590,7 +2617,8 @@ }, "babel-plugin-transform-object-rest-spread": { "version": "6.26.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", "dev": true, "requires": { "babel-plugin-syntax-object-rest-spread": "^6.8.0", @@ -2599,7 +2627,8 @@ }, "babel-plugin-transform-react-jsx": { "version": "6.24.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", "dev": true, "requires": { "babel-helper-builder-react-jsx": "^6.24.1", @@ -2609,7 +2638,8 @@ }, "babel-register": { "version": "6.26.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { "babel-core": "^6.26.0", @@ -2623,12 +2653,14 @@ "dependencies": { "source-map": { "version": "0.5.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, "source-map-support": { "version": "0.4.18", - "bundled": true, + "resolved": false, + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { "source-map": "^0.5.6" @@ -2638,7 +2670,8 @@ }, "babel-runtime": { "version": "6.26.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { "core-js": "^2.4.0", @@ -2647,7 +2680,8 @@ }, "babel-template": { "version": "6.26.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { "babel-runtime": "^6.26.0", @@ -2659,7 +2693,8 @@ }, "babel-traverse": { "version": "6.26.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { "babel-code-frame": "^6.26.0", @@ -2675,7 +2710,8 @@ }, "babel-types": { "version": "6.26.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { "babel-runtime": "^6.26.0", @@ -2686,17 +2722,20 @@ }, "babylon": { "version": "6.18.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": false, + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -2705,12 +2744,14 @@ }, "buffer-from": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "caller-callsite": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "dev": true, "requires": { "callsites": "^2.0.0" @@ -2718,7 +2759,8 @@ }, "caller-path": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "dev": true, "requires": { "caller-callsite": "^2.0.0" @@ -2726,12 +2768,14 @@ }, "callsites": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true }, "cardinal": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", "dev": true, "requires": { "ansicolors": "~0.3.2", @@ -2740,7 +2784,8 @@ }, "chalk": { "version": "1.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { "ansi-styles": "^2.2.1", @@ -2752,12 +2797,14 @@ }, "ci-info": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, "cli-cursor": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { "restore-cursor": "^2.0.0" @@ -2765,7 +2812,8 @@ }, "cli-truncate": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", "dev": true, "requires": { "slice-ansi": "^1.0.0", @@ -2774,7 +2822,8 @@ }, "color-convert": { "version": "1.9.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -2782,17 +2831,20 @@ }, "color-name": { "version": "1.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "convert-source-map": { "version": "1.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, "requires": { "safe-buffer": "~5.1.1" @@ -2800,24 +2852,28 @@ "dependencies": { "safe-buffer": { "version": "5.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true } } }, "core-js": { "version": "2.6.10", - "bundled": true, + "resolved": false, + "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==", "dev": true }, "csstype": { "version": "2.6.7", - "bundled": true, + "resolved": false, + "integrity": "sha512-9Mcn9sFbGBAdmimWb2gLVDtFJzeKtDGIr76TUqmjZrw9LFXBMSU70lcs+C0/7fyCd6iBDqmksUcCOUIkisPHsQ==", "dev": true }, "debug": { "version": "2.6.9", - "bundled": true, + "resolved": false, + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -2825,7 +2881,8 @@ }, "detect-indent": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { "repeating": "^2.0.0" @@ -2833,37 +2890,44 @@ }, "emoji-regex": { "version": "7.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "esprima": { "version": "4.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esutils": { "version": "2.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "events-to-array": { "version": "1.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", "dev": true }, "globals": { "version": "9.18.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, "has-ansi": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -2871,12 +2935,14 @@ }, "has-flag": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "home-or-tmp": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { "os-homedir": "^1.0.0", @@ -2885,7 +2951,8 @@ }, "import-jsx": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-xmrgtiRnAdjIaRzKwsHut54FA8nx59WqN4MpQvPFr/8yD6BamavkmKHrA5dotAlnIiF4uqMzg/lA5yhPdpIXsA==", "dev": true, "requires": { "babel-core": "^6.25.0", @@ -2898,7 +2965,8 @@ }, "ink": { "version": "2.5.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-HUkVglJ11cXK+W1a5cKNoOCxLkDi5hbDMAWSFDcwF2kpNd0eoX+2/cpaTP9BTFaQ8RJk7O59NxKMmyPXkmxo7w==", "dev": true, "requires": { "@types/react": "^16.8.6", @@ -2924,7 +2992,8 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -2932,7 +3001,8 @@ }, "chalk": { "version": "2.4.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -2942,7 +3012,8 @@ }, "supports-color": { "version": "5.5.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -2952,7 +3023,8 @@ }, "invariant": { "version": "2.2.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { "loose-envify": "^1.0.0" @@ -2960,7 +3032,8 @@ }, "is-ci": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "requires": { "ci-info": "^2.0.0" @@ -2968,7 +3041,8 @@ }, "is-finite": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { "number-is-nan": "^1.0.0" @@ -2976,37 +3050,44 @@ }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "js-tokens": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, "jsesc": { "version": "1.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, "json5": { "version": "0.5.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, "lodash": { "version": "4.17.15", - "bundled": true, + "resolved": false, + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "lodash.throttle": { "version": "4.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", "dev": true }, "log-update": { "version": "3.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-YSKm5n+YjZoGZT5lfmOqasVH1fIH9xQA9A81Y48nZ99PxAP62vdCCtua+Gcu6oTn0nqtZd/LwRV+Vflo53ZDWA==", "dev": true, "requires": { "ansi-escapes": "^3.2.0", @@ -3016,14 +3097,16 @@ "dependencies": { "ansi-escapes": { "version": "3.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true } } }, "loose-envify": { "version": "1.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -3031,12 +3114,14 @@ }, "mimic-fn": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -3044,7 +3129,8 @@ }, "minipass": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-2y5okJ4uBsjoD2vAbLKL9EUQPPkC0YMIp+2mZOXG3nBba++pdfJWRxx2Ewirc0pwAJYu4XtWg2EkVo1nRXuO/w==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -3052,14 +3138,16 @@ "dependencies": { "yallist": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { "minimist": "0.0.8" @@ -3067,29 +3155,34 @@ "dependencies": { "minimist": { "version": "0.0.8", - "bundled": true, + "resolved": false, + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true } } }, "ms": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, "onetime": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { "mimic-fn": "^1.0.0" @@ -3097,27 +3190,32 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "private": { "version": "0.1.8", - "bundled": true, + "resolved": false, + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", "dev": true }, "prop-types": { "version": "15.7.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", "dev": true, "requires": { "loose-envify": "^1.4.0", @@ -3127,12 +3225,14 @@ }, "punycode": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, "react": { "version": "16.10.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-MFVIq0DpIhrHFyqLU0S3+4dIcBhhOvBE8bJ/5kHPVOVaGdo0KuiQzpcjCPsf585WvhypqtrMILyoE2th6dT+Lw==", "dev": true, "requires": { "loose-envify": "^1.1.0", @@ -3142,12 +3242,14 @@ }, "react-is": { "version": "16.10.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA==", "dev": true }, "react-reconciler": { "version": "0.21.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-h4Rl3L3O6G9V4Ff+F+tCXX8ElDVn0Psk/odT+NPWeA55Yk5G7+kHT8D+Q3yE+51C72LbrYcX6OfLmCZ/7Nx9cw==", "dev": true, "requires": { "loose-envify": "^1.1.0", @@ -3158,7 +3260,8 @@ }, "redeyed": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", "dev": true, "requires": { "esprima": "~4.0.0" @@ -3166,12 +3269,14 @@ }, "regenerator-runtime": { "version": "0.11.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true }, "repeating": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { "is-finite": "^1.0.0" @@ -3179,12 +3284,14 @@ }, "resolve-from": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, "restore-cursor": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { "onetime": "^2.0.0", @@ -3202,7 +3309,8 @@ }, "scheduler": { "version": "0.15.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg==", "dev": true, "requires": { "loose-envify": "^1.1.0", @@ -3211,17 +3319,20 @@ }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "slash": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, "slice-ansi": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0" @@ -3229,13 +3340,13 @@ }, "source-map": { "version": "0.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "source-map-support": { - "version": "0.5.13", + "version": "github:tapjs/node-source-map-support#node-header-length-change", "from": "github:tapjs/node-source-map-support#node-header-length-change", - "bundled": true, "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -3244,7 +3355,8 @@ }, "string-length": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", "dev": true, "requires": { "astral-regex": "^1.0.0", @@ -3253,12 +3365,14 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "strip-ansi": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -3268,7 +3382,8 @@ }, "string-width": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -3277,12 +3392,14 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "strip-ansi": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -3292,7 +3409,8 @@ }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -3300,12 +3418,14 @@ }, "supports-color": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, "tap-parser": { "version": "10.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-qdT15H0DoJIi7zOqVXDn9X0gSM68JjNy1w3VemwTJlDnETjbi6SutnqmBfjDJAwkFS79NJ97gZKqie00ZCGmzg==", "dev": true, "requires": { "events-to-array": "^1.0.1", @@ -3315,7 +3435,8 @@ }, "tap-yaml": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Rxbx4EnrWkYk0/ztcm5u3/VznbyFJpyXO12dDBHKWiDVxy7O2Qw6MRrwO5H6Ww0U5YhRY/4C/VzWmFPhBQc4qQ==", "dev": true, "requires": { "yaml": "^1.5.0" @@ -3323,12 +3444,14 @@ }, "to-fast-properties": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, "treport": { "version": "0.4.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-Po8pQ/rmu4lVNmZWBgqyiHoIWXFeWaMA3H/WoCKw+DiS0xFn43UYRH6hYnjmrWCp0rkLItELQP/maO9uHDe/7A==", "dev": true, "requires": { "cardinal": "^2.1.1", @@ -3344,7 +3467,8 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -3352,7 +3476,8 @@ }, "chalk": { "version": "2.4.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -3362,12 +3487,14 @@ }, "ms": { "version": "2.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "supports-color": { "version": "5.5.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -3375,7 +3502,8 @@ }, "unicode-length": { "version": "2.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-Ph/j1VbS3/r77nhoY2WU0GWGjVYOHL3xpKp0y/Eq2e5r0mT/6b649vm7KFO6RdAdrZkYLdxphYVgvODxPB+Ebg==", "dev": true, "requires": { "punycode": "^2.0.0", @@ -3386,12 +3514,14 @@ }, "trim-right": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, "type-fest": { "version": "0.5.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", "dev": true }, "which": { @@ -3405,7 +3535,8 @@ }, "widest-line": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", "dev": true, "requires": { "string-width": "^2.1.1" @@ -3413,7 +3544,8 @@ }, "wrap-ansi": { "version": "5.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { "ansi-styles": "^3.2.0", @@ -3423,12 +3555,14 @@ "dependencies": { "ansi-regex": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "ansi-styles": { "version": "3.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -3436,7 +3570,8 @@ }, "string-width": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", @@ -3446,7 +3581,8 @@ }, "strip-ansi": { "version": "5.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -3456,7 +3592,8 @@ }, "yaml": { "version": "1.7.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-sR0mJ2C3LVBgMST+0zrrrsKSijbw64bfHmTt4nEXLZTZFyIAuUVARqA/LO5kaZav2OVQMaZ+5WRrZv7QjxG3uQ==", "dev": true, "requires": { "@babel/runtime": "^7.5.5" @@ -3464,7 +3601,8 @@ }, "yoga-layout-prebuilt": { "version": "1.9.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-9SNQpwuEh2NucU83i2KMZnONVudZ86YNcFk9tq74YaqrQfgJWO3yB9uzH1tAg8iqh5c9F5j0wuyJ2z72wcum2w==", "dev": true } } diff --git a/package.json b/package.json index 7adce66e..757214d3 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "tap": "14.8.2" }, "dependencies": { + "big-integer": "1.6.47", "iconv-lite": "0.4.24", "mysql": "2.17.1" } From fc5ef30ab8b9464f79b6b03780bc0fe4c4d97634 Mon Sep 17 00:00:00 2001 From: Nevill Date: Tue, 5 Nov 2019 09:32:04 +0800 Subject: [PATCH 27/34] Refactor, exports.parseUInt64 => parseUInt64, exports.parseUInt24 => parseUInt24 --- lib/common.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/common.js b/lib/common.js index 92bf4ad9..4465fc64 100644 --- a/lib/common.js +++ b/lib/common.js @@ -38,7 +38,7 @@ const MysqlTypes = exports.MysqlTypes = { GEOMETRY: 255, }; -exports.parseUInt64 = function(parser) { +const parseUInt64 = exports.parseUInt64 = function(parser) { const low = parser.parseUnsignedNumber(4); const high = parser.parseUnsignedNumber(4); @@ -57,7 +57,7 @@ exports.parseUInt48 = function(parser) { return (high * Math.pow(2, 32)) + low; }; -exports.parseUInt24 = function(parser) { +const parseUInt24 = exports.parseUInt24 = function(parser) { const low = parser.parseUnsignedNumber(2); const high = parser.parseUnsignedNumber(1); return (high << 16) + low; @@ -156,7 +156,7 @@ const parseAnyInt = function(parser, column, columnSchema) { break; case MysqlTypes.INT24: size = 3; - result = exports.parseUInt24(parser); + result = parseUInt24(parser); break; case MysqlTypes.LONG: size = 4; @@ -165,7 +165,7 @@ const parseAnyInt = function(parser, column, columnSchema) { case MysqlTypes.LONGLONG: size = 8; int64 = {}; - result = exports.parseUInt64.call(int64, parser); + result = parseUInt64.call(int64, parser); break; } if (columnSchema.COLUMN_TYPE.indexOf('unsigned') === -1) { @@ -475,7 +475,7 @@ exports.readMysqlValue = function( result = parseGeometryValue(buffer); break; case MysqlTypes.DATE: - raw = exports.parseUInt24(parser); + raw = parseUInt24(parser); result = dtDecode.getDate( zongji.connection.config.dateStrings, // node-mysql dateStrings option sliceBits(raw, 9, 24), // year @@ -484,7 +484,7 @@ exports.readMysqlValue = function( ); break; case MysqlTypes.TIME: - raw = exports.parseUInt24(parser); + raw = parseUInt24(parser); isNegative = (raw & (1 << 23)) !== 0; if (isNegative) raw = raw ^ ((1 << 24) - 1); // flip all bits @@ -525,7 +525,7 @@ exports.readMysqlValue = function( } break; case MysqlTypes.DATETIME: - raw = exports.parseUInt64(parser); + raw = parseUInt64(parser); date = Math.floor(raw / 1000000); time = raw % 1000000; result = dtDecode.getDateTime( From c3a49c1cc4c36f1d447ee51e621ae167fc9782a5 Mon Sep 17 00:00:00 2001 From: Nevill Date: Tue, 5 Nov 2019 21:27:09 +0800 Subject: [PATCH 28/34] Use big-integer to support int64 during parsing --- README.md | 2 +- lib/common.js | 36 ++++++++++++++++++++++-------------- test/events.js | 14 ++++++++------ 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index d789e6a9..1386b5e6 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ Name | Description ## Important Notes * :star2: [All types allowed by `mysql`](https://github.com/mysqljs/mysql#type-casting) are supported by this package. -* :speak_no_evil: While 64-bit integers in MySQL (`BIGINT` type) allow values in the range of 264 (± ½ × 264 for signed values), Javascript's internal storage of numbers limits values to 253, making the allowed range of `BIGINT` fields only `-9007199254740992` to `9007199254740992`. Unsigned 64-bit integers must also not exceed `9007199254740992`. +* :speak_no_evil: 64-bit integer is supported via package big-integer(see #108). If an integer is within the safe range of JS number (-2^53, 2^53), a Number object will returned, otherwise, will return as String. * :point_right: `TRUNCATE` statement does not cause corresponding `DeleteRows` event. Use unqualified `DELETE FROM` for same effect. * When using fractional seconds with `DATETIME` and `TIMESTAMP` data types in MySQL > 5.6.4, only millisecond precision is available due to the limit of Javascript's `Date` object. diff --git a/lib/common.js b/lib/common.js index 4465fc64..c9d363c2 100644 --- a/lib/common.js +++ b/lib/common.js @@ -1,6 +1,7 @@ const iconv = require('iconv-lite'); const decodeJson = require('./json_decode'); const dtDecode = require('./datetime_decode'); +const bigInt = require('big-integer'); const MysqlTypes = exports.MysqlTypes = { DECIMAL: 0, @@ -38,14 +39,17 @@ const MysqlTypes = exports.MysqlTypes = { GEOMETRY: 255, }; +const TWO_TO_POWER_THIRTY_TWO = Math.pow(2, 32); +const TWO_TO_POWER_SIXTY_THREE = '9223372036854775808'; // Math.pow(2, 63) or 1 << 63 +// This function will return a Number +// if the reuslt < Math.MAX_SAFE_INTEGER or reuslt > Math.MIN_SAFE_INTEGER, +// otherwise, will return a string. const parseUInt64 = exports.parseUInt64 = function(parser) { const low = parser.parseUnsignedNumber(4); const high = parser.parseUnsignedNumber(4); - if (this) { - // Pass extra output to context - this.low = low; - this.high = high; + if (high >>> 21) { // using bigint here + return bigInt(TWO_TO_POWER_THIRTY_TWO).multiply(high).add(low).toString(); } return (high * Math.pow(2,32)) + low; @@ -144,7 +148,7 @@ const getUInt32Value = exports.getUInt32Value = function(input) { }; const parseAnyInt = function(parser, column, columnSchema) { - let result, int64, size; + let result, size; switch (column.type) { case MysqlTypes.TINY: size = 1; @@ -164,22 +168,26 @@ const parseAnyInt = function(parser, column, columnSchema) { break; case MysqlTypes.LONGLONG: size = 8; - int64 = {}; - result = parseUInt64.call(int64, parser); + result = parseUInt64(parser); break; } if (columnSchema.COLUMN_TYPE.indexOf('unsigned') === -1) { const length = size * 8; + const int64 = (length == 64); // Flip bits on negative signed integer if (!int64 && (result & (1 << (length - 1)))) { result = ((result ^ (Math.pow(2, length) - 1)) * -1) - 1; - } else if (int64 && (int64.high & (1 << 31))) { - // Javascript integers only support 2^53 not 2^64, must trim bits! - // 64-53 = 11, 32-11 = 21, so grab first 21 bits of high word only - const mask = Math.pow(2, 32) - 1; - const high = sliceBits(int64.high ^ mask, 0, 21); - const low = int64.low ^ mask; - result = ((high * Math.pow(2, 32)) * - 1) - getUInt32Value(low) - 1; + } else if (int64 && bigInt(result).greaterOrEquals(bigInt(TWO_TO_POWER_SIXTY_THREE))) { + const Max64BitNumber = bigInt('18446744073709551615'); // 2^64 - 1 + result = bigInt(result).xor(Max64BitNumber).add(1).multiply(-1); + // Javascript integers only support 2^53, if not within the range, return a String + if (result.greater(Number.MAX_SAFE_INTEGER) || result.lesser(Number.MIN_SAFE_INTEGER)) { + result = result.toString(); + } + // Otherwise return a Number + else { + result = result.toJSNumber(); + } } } return result; diff --git a/test/events.js b/test/events.js index e2c5646f..6621d4b1 100644 --- a/test/events.js +++ b/test/events.js @@ -390,12 +390,14 @@ tap.test('With many columns', test => { col31 BIGINT SIGNED NULL, col32 TINYINT SIGNED NULL, col33 SMALLINT SIGNED NULL)`, `INSERT INTO ${TEST_TABLE} (col1, col2, col3, col4, col5, col33) VALUES - (2147483647, null, 127, 32767, 8388607, 12), - (-2147483648, -9007199254740992, -128, -32768, -8388608, 10), - (-2147483645, -9007199254740990, -126, -32766, -8388606, 6), - (-1, -1, -1, -1, null, -6), - (123456, 100, 96, 300, 1000, null), - (-123456, -100, -96, -300, -1000, null)`, + (null, null, null, null, null, null), + (-1, -1, -1, -1, -1, -1), + (2147483647, 9007199254740993, 127, 32767, 8388607, 12), + (-2147483648, -9007199254740993, -128, -32768, -8388608, 10), + (-2147483645, -1, -126, -32766, -8388606, 6), + (-1, 9223372036854775809, -1, -1, null, -6), + (123456, -9223372036854775809, 96, 300, 1000, null), + (-123456, 9223372036854775807, -96, -300, -1000, null)`, `SELECT * FROM ${TEST_TABLE}`, ], (err, result) => { if (err) { From 07b81018aaf97920cd7ac34af1c03169d664bb7b Mon Sep 17 00:00:00 2001 From: Nevill Date: Tue, 5 Nov 2019 23:25:56 +0800 Subject: [PATCH 29/34] Update README for 0.5.0 release --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1386b5e6..9e3f70e4 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,11 @@ ZongJi (踪迹) is pronounced as `zōng jì` in Chinese. This package is a pure JS implementation based on [`mysql`](https://github.com/mysqljs/mysql). It has been tested to work in MySQL 5.5, 5.6, and 5.7. -# Upcoming Release +# Latest Release + +The latest release is v0.5.0, only supports Node.js from v8. v0.4.7 is the last release which supports Node.js v4.x. -The next release will be v0.5, only supports Node.js from v8. ## Quick Start From 9bd02a906131b9317221ec209ca0667878a0a66f Mon Sep 17 00:00:00 2001 From: Nevill Date: Tue, 5 Nov 2019 23:26:21 +0800 Subject: [PATCH 30/34] Bump v0.5.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 dfdeb012..de1490ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "zongji", - "version": "0.4.7", + "version": "0.5.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 757214d3..28f387ec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "zongji", - "version": "0.4.7", + "version": "0.5.0", "description": "A mysql binlog listener running on Node.js", "main": "index.js", "directories": { From a6dea41a7fbe303c872e090f61ab90e281871ab1 Mon Sep 17 00:00:00 2001 From: Nevill Date: Fri, 8 Nov 2019 23:59:32 +0800 Subject: [PATCH 31/34] Add binlog_row_image support, see #51 --- lib/rows_event.js | 87 ++++++++++++++++++------- test/events.js | 4 +- test/rowimage.js | 162 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 226 insertions(+), 27 deletions(-) create mode 100644 test/rowimage.js diff --git a/lib/rows_event.js b/lib/rows_event.js index 6f973ad2..3ad35c30 100644 --- a/lib/rows_event.js +++ b/lib/rows_event.js @@ -10,6 +10,27 @@ const Version2Events = [ const CHECKSUM_SIZE = 4; +// A quick way to know how many bits set in a given byte +// e.g. Given 3 => 0000 0011, it has 2 bits set +const BIT_COUNT_MAP_IN_ONE_BYTE = [ + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, +]; + /** * Generic RowsEvent class * Attributes: @@ -44,12 +65,10 @@ function RowsEvent(parser, options, zongji) { this._filtered = true; } else { const columnsPresentBitmapSize = Math.floor((this.numberOfColumns + 7) / 8); - // Columns present bitmap exceeds 4 bytes with >32 rows - // And is not handled anyways so just skip over its space - parser._offset += columnsPresentBitmapSize; + this.columns_present_bitmap = parser.parseBuffer(columnsPresentBitmapSize); if (this._hasTwoRows) { // UpdateRows event slightly different, has new and old rows represented - parser._offset += columnsPresentBitmapSize; + this.columns_present_bitmap2 = parser.parseBuffer(columnsPresentBitmapSize); } if (this.useChecksum) { @@ -90,28 +109,46 @@ RowsEvent.prototype.dump = function() { }; RowsEvent.prototype._fetchOneRow = function(parser) { - return readRow(this.tableMap[this.tableId], parser, this._zongji); + const tablemap = this.tableMap[this.tableId]; + return readRow(parser, tablemap, this.columns_present_bitmap, this._zongji); }; -const readRow = function(tableMap, parser, zongji) { - let row = {}, column, columnSchema; - const nullBitmapSize = Math.floor((tableMap.columns.length + 7) / 8); - const nullBuffer = parser._buffer.slice(parser._offset, - parser._offset + nullBitmapSize); - let curNullByte, curBit; - parser._offset += nullBitmapSize; - - for (let i = 0; i < tableMap.columns.length; i++) { - curBit = i % 8; - if (curBit === 0) curNullByte = nullBuffer.readUInt8(Math.floor(i / 8)); - column = tableMap.columns[i]; - columnSchema = tableMap.columnSchemas[i]; - if ((curNullByte & (1 << curBit)) === 0) { - row[column.name] = - Common.readMysqlValue(parser, column, columnSchema, tableMap, zongji); - } else { +const countBits = function(buff) { + let bits = 0; + for (let i = 0; i < buff.length; i++) { + bits += BIT_COUNT_MAP_IN_ONE_BYTE[buff[i]]; + } + return bits; +}; + +const getBit = function(buff, position) { + let byte = buff[Math.floor(position / 8)]; + return byte & (1 << (position % 8)); +}; + +const readRow = function(parser, tablemap, bitmap, zongji) { + const nullBitmapSize = Math.floor((countBits(bitmap) + 7) / 8); + const nullBitmap = parser.parseBuffer(nullBitmapSize); + + let row = {}; + for (let i = 0, nullBitIndex = 0; i < tablemap.columns.length; i++) { + let column = tablemap.columns[i]; + + if (getBit(bitmap, i) == 0) { row[column.name] = null; + continue; } + + if (getBit(nullBitmap, nullBitIndex) != 0) { + row[column.name] = null; + } else { + let columnSchema = tablemap.columnSchemas[i]; + row[column.name] = Common.readMysqlValue( + parser, column, columnSchema, tablemap, zongji + ); + } + + nullBitIndex += 1; } return row; }; @@ -138,10 +175,10 @@ function UpdateRows(parser, options) { // eslint-disable-line util.inherits(UpdateRows, RowsEvent); UpdateRows.prototype._fetchOneRow = function(parser) { - const tableMap = this.tableMap[this.tableId]; + const tablemap = this.tableMap[this.tableId]; return { - before: readRow(tableMap, parser, this._zongji), - after: readRow(tableMap, parser, this._zongji) + before: readRow(parser, tablemap, this.columns_present_bitmap, this._zongji), + after: readRow(parser, tablemap, this.columns_present_bitmap2, this._zongji), }; }; diff --git a/test/events.js b/test/events.js index 6621d4b1..c403d88d 100644 --- a/test/events.js +++ b/test/events.js @@ -405,8 +405,8 @@ tap.test('With many columns', test => { } expectEvents(test, events, [ - { /* do not bother testing anything on first event */ }, - { rows: result[result.length - 1] } + { _type: 'TableMap' }, + { rows: result[result.length - 1], _type: 'WriteRows' } ], 1, test.end); }); }); diff --git a/test/rowimage.js b/test/rowimage.js new file mode 100644 index 00000000..f3256457 --- /dev/null +++ b/test/rowimage.js @@ -0,0 +1,162 @@ +const tap = require('tap'); + +const ZongJi = require('../'); +const testDb = require('./helpers'); +const expectEvents = require('./helpers/expectEvents'); +const settings = require('./settings/mysql'); + +tap.test('Initialise testing db', test => { + testDb.init(err => { + if (err) { + return test.threw(err); + } + test.end(); + }); +}); + +testDb.requireVersion('5.6.2', () => { + + tap.test('Update with binlog_row_image=minmal', test => { + const TEST_TABLE = 'row_image_minimal_test'; + + test.test(`prepare table ${TEST_TABLE}`, test => { + testDb.execute([ + 'SET GLOBAL binlog_row_image=minimal', + `DROP TABLE IF EXISTS ${TEST_TABLE}`, + `CREATE TABLE ${TEST_TABLE} ( + id int primary key auto_increment, + name varchar(20), + age tinyint, + height mediumint + )`, + `INSERT INTO ${TEST_TABLE} (name, age) VALUES ('Tom', 2)`, + ], err => { + if (err) { + return test.fail(err); + } + + test.end(); + }); + }); + + test.test('update a record', test => { + const events = []; + const zongji = new ZongJi(settings.connection); + test.tearDown(() => zongji.stop()); + + zongji.on('ready', () => { + testDb.execute([ + `UPDATE ${TEST_TABLE} SET age=age+1 WHERE id=1`, + ], err => { + if (err) { + test.fail(err); + } + }); + }); + + zongji.on('binlog', evt => { + events.push(evt); + + if (events.length == 2) { + expectEvents(test, events, + [ + { + _type: 'TableMap', + tableName: TEST_TABLE, + schemaName: testDb.SCHEMA_NAME, + }, + { + _type: 'UpdateRows', + rows: [ + { + before: { id: 1, age: null, name: null, height: null }, + after: { id: null, age: 3, name: null, height: null }, + }, + ], + } + ], 1, () => test.end() + ); + } + }); + + zongji.start({ + startAtEnd: true, + serverId: testDb.serverId(), + includeEvents: ['tablemap', 'updaterows'], + }); + }); + + test.end(); + }); + + tap.test('Update with binlog_row_image=noblob', test => { + const TEST_TABLE = 'row_image_noblob_test'; + + test.test(`prepare table ${TEST_TABLE}`, test => { + testDb.execute([ + 'SET GLOBAL binlog_row_image=noblob', + `DROP TABLE IF EXISTS ${TEST_TABLE}`, + `CREATE TABLE ${TEST_TABLE} ( + id int primary key auto_increment, + summary text + )`, + `INSERT INTO ${TEST_TABLE} (summary) VALUES ('Hello world')`, + ], err => { + if (err) { + return test.fail(err); + } + + test.end(); + }); + }); + + test.test('update a record', test => { + const events = []; + const zongji = new ZongJi(settings.connection); + test.tearDown(() => zongji.stop()); + + zongji.on('ready', () => { + testDb.execute([ + `UPDATE ${TEST_TABLE} SET summary='hello again' WHERE id=1`, + ], err => { + if (err) { + test.fail(err); + } + }); + }); + + zongji.on('binlog', evt => { + events.push(evt); + + if (events.length == 2) { + expectEvents(test, events, + [ + { + _type: 'TableMap', + tableName: TEST_TABLE, + schemaName: testDb.SCHEMA_NAME, + }, + { + _type: 'UpdateRows', + rows: [ + { + before: { id: 1, summary: null }, + after: { id: 1, summary: 'hello again' }, + }, + ], + } + ], 1, () => test.end() + ); + } + }); + + zongji.start({ + startAtEnd: true, + serverId: testDb.serverId(), + includeEvents: ['tablemap', 'updaterows'], + }); + }); + + test.end(); + }); +}); From 82af34246261730748ec357fda2e6b10fdfd4e86 Mon Sep 17 00:00:00 2001 From: Nevill Date: Sat, 9 Nov 2019 01:15:02 +0800 Subject: [PATCH 32/34] Bump v0.5.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 de1490ec..8ecd07a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "zongji", - "version": "0.5.0", + "version": "0.5.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 28f387ec..2c6f391b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "zongji", - "version": "0.5.0", + "version": "0.5.1", "description": "A mysql binlog listener running on Node.js", "main": "index.js", "directories": { From 4941612d491d2019594e6c8c651b348c697e6fad Mon Sep 17 00:00:00 2001 From: Jeff Barnes Date: Mon, 9 Dec 2019 14:22:10 -0900 Subject: [PATCH 33/34] Use DataView to fix IEEE754 conversion error. --- lib/common.js | 42 ++++++++---------------------------------- test/types.js | 4 ++-- 2 files changed, 10 insertions(+), 36 deletions(-) diff --git a/lib/common.js b/lib/common.js index c9d363c2..e4bdc98f 100644 --- a/lib/common.js +++ b/lib/common.js @@ -100,45 +100,19 @@ const sliceBits = exports.sliceBits = function(input, start, end) { return (input & match) >> start; }; -// See information about IEEE-754 Floating point numbers: -// http://www.h-schmidt.net/FloatConverter/IEEE754.html -// http://babbage.cs.qc.cuny.edu/IEEE-754.old/64bit.html +// Use Typed Arrays to convert IEEE 754 numbers // Pass only high for 32-bit float, pass high and low for 64-bit double const parseIEEE754Float = exports.parseIEEE754Float = function(high, low) { - let lastSignificantBit, sigFigs, expLeading; if (low !== undefined) { - // 64-bit: 1 sign, 11 exponent, 52 significand - lastSignificantBit = 20; - sigFigs = 52; - expLeading = 1023; // 2^(11-1) - 1 + let value = new DataView(new ArrayBuffer(8)); + value.setUint32(0, high); + value.setUint32(4, low); + return value.getFloat64(0); } else { - // 32-bit: 1 sign, 8 exponent, 23 significand - lastSignificantBit = 23; - sigFigs = 23; - expLeading = 127; // 2^(8-1) - 1 + let value = new DataView(new ArrayBuffer(4)); + value.setUint32(0, high); + return value.getFloat32(0); } - - const sign = (high & (1 << 31)) !== 0 ? -1 : 1; - const exponent = sliceBits(high, lastSignificantBit, 31) - expLeading; - const significandBits = sliceBits(high, 0, lastSignificantBit); - let significand = 1; // Becomes value between 1, 2 - - for (let i = 0; i < lastSignificantBit; i++) { - if (significandBits & (1 << i)) { - significand += 1 / (1 << (sigFigs - i)); - } - } - - if (low !== undefined) { - for (let j = 0; j < 32; j++) { - if (low & (1 << j)) { - // Bitwise operators only work on up to 32 bits - significand += 1 / Math.pow(2, sigFigs - j); - } - } - } - - return sign * Math.pow(2, exponent) * significand; }; const getUInt32Value = exports.getUInt32Value = function(input) { diff --git a/test/types.js b/test/types.js index d0c1b074..7f808187 100644 --- a/test/types.js +++ b/test/types.js @@ -176,14 +176,14 @@ defineTypeTest('int_unsigned', [ defineTypeTest('double', [ 'DOUBLE NULL' ], [ - [1.0], [-1.0], [123.456], [-13.47], [0.00005], [-0.00005], + [0], [1.0], [-1.0], [123.456], [-13.47], [0.00005], [-0.00005], [8589934592.123], [-8589934592.123], [null] ]); defineTypeTest('float', [ 'FLOAT NULL' ], [ - [1.0], [-1.0], [123.456], [-13.47], [3999.12] + [0], [1.0], [-1.0], [123.456], [-13.47], [3999.12] ], function(test, event) { // Ensure sum of differences is very low const diff = event.rows.reduce(function(prev, cur, index) { From 94aaac19fec7039a6d5c1fd0d591931347cf6a1c Mon Sep 17 00:00:00 2001 From: Nevill Date: Sun, 22 Mar 2020 21:04:50 +0800 Subject: [PATCH 34/34] Update dependencies to the latest --- package-lock.json | 2294 ++++++++++++++++++++++----------------------- package.json | 10 +- 2 files changed, 1144 insertions(+), 1160 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ecd07a5..110321e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,21 +5,21 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.8.3" } }, "@babel/generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz", - "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==", + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.3.tgz", + "integrity": "sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ==", "dev": true, "requires": { - "@babel/types": "^7.6.3", + "@babel/types": "^7.9.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -34,133 +34,164 @@ } }, "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.8.3" } }, + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "dev": true + }, "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.9.0", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.4.tgz", - "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==", + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.3.tgz", + "integrity": "sha512-E6SpIDJZ0cZAKoCNk+qSDd0ChfTnpiJN9FfNf3RZ20dzwA2vL2oq5IX1XTVT+4vDmRlta2nGk5HGMMskJAR+4A==", "dev": true }, "@babel/runtime": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", - "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", "dev": true, "requires": { - "regenerator-runtime": "^0.13.2" + "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", - "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/traverse": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz", - "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", "dev": true, "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.6.3", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.6.3", - "@babel/types": "^7.6.3", + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } } }, "@babel/types": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", - "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", "dev": true, "requires": { - "esutils": "^2.0.2", + "@babel/helper-validator-identifier": "^7.9.0", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", "dev": true }, "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { @@ -198,9 +229,9 @@ "dev": true }, "arg": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.1.tgz", - "integrity": "sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, "argparse": { @@ -255,9 +286,9 @@ "dev": true }, "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", "dev": true }, "balanced-match": { @@ -276,14 +307,14 @@ } }, "big-integer": { - "version": "1.6.47", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.47.tgz", - "integrity": "sha512-9t9f7X3as2XGX8b52GqG6ox0GvIdM86LyIXASJnDCFhYNgt+A+MByQZ3W2PyMRZjEvG5f8TEbSPfEotVuMJnQg==" + "version": "1.6.48", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", + "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==" }, "bignumber.js": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", - "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" }, "binary-extensions": { "version": "2.0.0", @@ -389,28 +420,28 @@ "dev": true }, "chokidar": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.2.2.tgz", - "integrity": "sha512-bw3pm7kZ2Wa6+jQWYP/c7bAZy3i4GwiIiMO2EeRjrE48l8vBqC/WvFhSF0xyM8fQiPEGvwMY/5bqDG7sSEOuhg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", "dev": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.1", + "fsevents": "~2.1.2", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" + "readdirp": "~3.3.0" } }, "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { - "restore-cursor": "^2.0.0" + "restore-cursor": "^3.1.0" } }, "cli-width": { @@ -430,6 +461,28 @@ "wrap-ansi": "^2.0.0" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -477,13 +530,6 @@ "delayed-stream": "~1.0.0" } }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true - }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -497,9 +543,9 @@ "dev": true }, "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" @@ -511,25 +557,16 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "coveralls": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.7.tgz", - "integrity": "sha512-mUuH2MFOYB2oBaA4D4Ykqi9LaEYpMMlsiOMJOrv358yAjP6enPIk55fod2fNJ8AvwoYXStWQls37rA+s5e7boA==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.11.tgz", + "integrity": "sha512-LZPWPR2NyGKyaABnc49dR0fpeP6UqhvGq4B5nUrTQ1UBy55z96+ga7r+/ChMdMJUwBgyJDXBi88UBgz2rs9IiQ==", "dev": true, "requires": { - "growl": "~> 1.10.0", "js-yaml": "^3.13.1", - "lcov-parse": "^0.0.10", + "lcov-parse": "^1.0.0", "log-driver": "^1.2.7", - "minimist": "^1.2.0", - "request": "^2.86.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } + "minimist": "^1.2.5", + "request": "^2.88.0" } }, "cp-file": { @@ -612,9 +649,15 @@ "dev": true }, "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-frag": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/diff-frag/-/diff-frag-1.0.1.tgz", + "integrity": "sha512-6/v2PC/6UTGcWPPetb9acL8foberUg/CtPdALeJUdD1B/weHNvzftoo00gYznqHGRhHEbykUGzqfG9RWOSr5yw==", "dev": true }, "doctrine": { @@ -637,9 +680,9 @@ } }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "error-ex": { @@ -664,9 +707,9 @@ "dev": true }, "eslint": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.5.1.tgz", - "integrity": "sha512-32h99BoLYStT1iq1v2P9uwpyznQ4M2jRiFB6acitKz52Gqn+vPaMDUTB1bYi1WN4Nquj2w+t+bimYUG83DC55A==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -676,19 +719,19 @@ "debug": "^4.0.1", "doctrine": "^3.0.0", "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.2", + "eslint-utils": "^1.4.3", "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.1", + "espree": "^6.1.2", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.0.0", - "globals": "^11.7.0", + "globals": "^12.1.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.4.1", + "inquirer": "^7.0.0", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -697,7 +740,7 @@ "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", + "optionator": "^0.8.3", "progress": "^2.0.0", "regexpp": "^2.0.1", "semver": "^6.1.2", @@ -740,13 +783,13 @@ "dev": true }, "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "dev": true, "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.1.0" } }, @@ -757,9 +800,9 @@ "dev": true }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", + "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", "dev": true, "requires": { "estraverse": "^4.0.0" @@ -807,6 +850,17 @@ "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } } }, "extsprintf": { @@ -816,15 +870,15 @@ "dev": true }, "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", "dev": true }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fast-levenshtein": { @@ -834,9 +888,9 @@ "dev": true }, "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" @@ -904,18 +958,18 @@ "dev": true }, "flow-parser": { - "version": "0.110.1", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.110.1.tgz", - "integrity": "sha512-k0QoogCKfE7cr3WSgHYTt8QhZxxoi0tun4uVMSqx68L0E9ao1ltxlhJAKibTGlwR1V6lnGfKXU1zU9JB1q2ZRg==", + "version": "0.121.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.121.0.tgz", + "integrity": "sha512-1gIBiWJNR0tKUNv8gZuk7l9rVX06OuLzY9AoGio7y/JT4V1IZErEMEq2TJS+PFcw/y0RshZ1J/27VfK1UQzYVg==", "dev": true }, "flow-remove-types": { - "version": "2.110.1", - "resolved": "https://registry.npmjs.org/flow-remove-types/-/flow-remove-types-2.110.1.tgz", - "integrity": "sha512-xOhoJcgC5z55RDdKyMgoZFuXL+jGacGWivR8xhEjpzwLlIzqouVIY67jWqmGPS92qCEtKx7wSaIBw6CZ9I1csQ==", + "version": "2.121.0", + "resolved": "https://registry.npmjs.org/flow-remove-types/-/flow-remove-types-2.121.0.tgz", + "integrity": "sha512-DbHgYJLD88fMK6CF3Z6wvoZuMb2sqKYP9WLzrZ0SPWbQf61+XyNq6vC8HAJeWJf2DD8z7XhrFHUCH2cJvpAAIQ==", "dev": true, "requires": { - "flow-parser": "^0.110.1", + "flow-parser": "^0.121.0", "pirates": "^3.0.2", "vlq": "^0.2.1" } @@ -972,9 +1026,9 @@ "dev": true }, "fsevents": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.1.tgz", - "integrity": "sha512-4FRPXWETxtigtJW/gxzEDsX1LVbPAM93VleB83kZB+ellqbHMkyt2aJfuzNLRvFPnGi6bcE5SvfxgbXPeKteJw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", "dev": true, "optional": true }, @@ -1006,9 +1060,9 @@ } }, "glob": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", - "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -1020,19 +1074,22 @@ } }, "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, "requires": { "is-glob": "^4.0.1" } }, "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } }, "graceful-fs": { "version": "4.2.3", @@ -1040,24 +1097,6 @@ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "handlebars": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.5.tgz", - "integrity": "sha512-0Ce31oWVB7YidkaTq33ZxEbN+UDxMMgThvCe8ptgQViymL5DPis9uLdTA13MiRPhgvqyxIegugrP97iK3JeBHg==", - "dev": true, - "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - } - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -1090,9 +1129,15 @@ } }, "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "html-escaper": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.1.tgz", + "integrity": "sha512-hNX23TjWwD3q56HpWjUHOKj1+4KKlnjv9PcmBUYKVpga+2cnb9nDx/B1o0yO4n+RZXZdiNxzx6B24C9aNMTkkQ==", "dev": true }, "http-signature": { @@ -1107,9 +1152,9 @@ } }, "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.1.tgz", + "integrity": "sha512-ONHr16SQvKZNSqjQT9gy5z24Jw+uqfO02/ngBSBoqChZ+W8qXX7GPRa1RoUnzGADw8K63R1BXUMzarCVQBpY8Q==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -1121,9 +1166,9 @@ "dev": true }, "import-fresh": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -1152,24 +1197,85 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", "dev": true, "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "is-arrayish": { @@ -1194,9 +1300,9 @@ "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "is-glob": { @@ -1328,12 +1434,12 @@ } }, "istanbul-reports": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", - "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", "dev": true, "requires": { - "handlebars": "^4.1.2" + "html-escaper": "^2.0.0" } }, "jackspeak": { @@ -1416,9 +1522,9 @@ } }, "lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", + "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", "dev": true }, "levn": { @@ -1479,6 +1585,15 @@ "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true }, + "loose-envify": { + "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 || ^4.0.0" + } + }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -1508,9 +1623,9 @@ } }, "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "merge-source-map": { @@ -1523,24 +1638,24 @@ } }, "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", "dev": true }, "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", "dev": true, "requires": { - "mime-db": "1.40.0" + "mime-db": "1.43.0" } }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "minimatch": { @@ -1553,15 +1668,15 @@ } }, "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "minipass": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.0.1.tgz", - "integrity": "sha512-2y5okJ4uBsjoD2vAbLKL9EUQPPkC0YMIp+2mZOXG3nBba++pdfJWRxx2Ewirc0pwAJYu4XtWg2EkVo1nRXuO/w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -1576,12 +1691,12 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" } }, "ms": { @@ -1591,18 +1706,18 @@ "dev": true }, "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, "mysql": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.17.1.tgz", - "integrity": "sha512-7vMqHQ673SAk5C8fOzTG2LpPcf3bNt0oL3sFpxPEEFp1mdlDcrLK0On7z8ZYKaaHrHwNcQ/MTUz7/oobZ2OyyA==", + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", "requires": { - "bignumber.js": "7.2.1", - "readable-stream": "2.3.6", + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", "safe-buffer": "5.1.2", "sqlstring": "2.3.1" } @@ -1613,12 +1728,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, "nested-error-stacks": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", @@ -1708,6 +1817,12 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1718,12 +1833,12 @@ } }, "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "^2.1.0" } }, "opener": { @@ -1732,36 +1847,18 @@ "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", "dev": true }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "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": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "word-wrap": "~1.2.3" } }, "os-homedir": { @@ -1792,9 +1889,9 @@ } }, "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -1894,9 +1991,9 @@ "dev": true }, "picomatch": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", - "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, "pify": { @@ -1940,6 +2037,17 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -1947,9 +2055,9 @@ "dev": true }, "psl": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", - "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", "dev": true }, "punycode": { @@ -1964,6 +2072,23 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, + "react": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -1986,9 +2111,9 @@ } }, "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": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -2000,18 +2125,18 @@ } }, "readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", "dev": true, "requires": { - "picomatch": "^2.0.4" + "picomatch": "^2.0.7" } }, "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", "dev": true }, "regexpp": { @@ -2030,9 +2155,9 @@ } }, "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -2042,7 +2167,7 @@ "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", - "har-validator": "~5.1.0", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -2052,7 +2177,7 @@ "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" } @@ -2070,9 +2195,9 @@ "dev": true }, "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -2085,12 +2210,12 @@ "dev": true }, "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "requires": { - "onetime": "^2.0.0", + "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, @@ -2104,18 +2229,18 @@ } }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", "dev": true, "requires": { "is-promise": "^2.1.0" } }, "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -2173,6 +2298,14 @@ "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } } }, "source-map": { @@ -2182,9 +2315,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -2272,22 +2405,23 @@ "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" }, "dependencies": { "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^5.0.0" } } } @@ -2350,6 +2484,18 @@ "string-width": "^3.0.0" }, "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -2364,394 +2510,331 @@ } }, "tap": { - "version": "14.8.2", - "resolved": "https://registry.npmjs.org/tap/-/tap-14.8.2.tgz", - "integrity": "sha512-md0cw6fH1SbT9HBdzHJgMsVqp7daZ6MMAwuVIHNTtQusFMaLOEAQEbqxPc4rnjNezgKy7wKS0aEc17gtwrVtUQ==", + "version": "14.10.7", + "resolved": "https://registry.npmjs.org/tap/-/tap-14.10.7.tgz", + "integrity": "sha512-DVx00lfiMxFhofwFDP77pitRCruVQJn8Dcj/6auIU3dErJQWsKT94oG6Yj0MQRuYANhSec8ruIPyUjH/RI9Hrw==", "dev": true, "requires": { - "async-hook-domain": "^1.1.2", + "@types/react": "^16.9.16", + "async-hook-domain": "^1.1.3", "bind-obj-methods": "^2.0.0", "browser-process-hrtime": "^1.0.0", - "chokidar": "^3.0.2", + "chokidar": "^3.3.0", "color-support": "^1.1.0", - "coveralls": "^3.0.6", + "coveralls": "^3.0.8", "diff": "^4.0.1", "esm": "^3.2.25", "findit": "^2.0.0", - "flow-remove-types": "^2.107.0", + "flow-remove-types": "^2.112.0", "foreground-child": "^1.3.3", "fs-exists-cached": "^1.0.0", "function-loop": "^1.0.2", - "glob": "^7.1.4", - "import-jsx": "^2.0.0", - "ink": "^2.3.0", + "glob": "^7.1.6", + "import-jsx": "^3.1.0", + "ink": "^2.6.0", "isexe": "^2.0.0", "istanbul-lib-processinfo": "^1.0.0", "jackspeak": "^1.4.0", - "minipass": "^3.0.0", + "minipass": "^3.1.1", "mkdirp": "^0.5.1", "nyc": "^14.1.1", "opener": "^1.5.1", "own-or": "^1.0.0", "own-or-env": "^1.0.1", - "react": "^16.9.0", + "react": "^16.12.0", "rimraf": "^2.7.1", "signal-exit": "^3.0.0", - "source-map-support": "github:tapjs/node-source-map-support#node-header-length-change", + "source-map-support": "^0.5.16", "stack-utils": "^1.0.2", "tap-mocha-reporter": "^5.0.0", "tap-parser": "^10.0.1", "tap-yaml": "^1.0.0", - "tcompare": "^2.3.0", - "treport": "^0.4.2", + "tcompare": "^3.0.0", + "treport": "^1.0.2", "trivial-deferred": "^1.0.1", - "ts-node": "^8.3.0", - "typescript": "^3.6.3", - "which": "^2.0.1", - "write-file-atomic": "^3.0.0", - "yaml": "^1.6.0", + "ts-node": "^8.5.2", + "typescript": "^3.7.2", + "which": "^2.0.2", + "write-file-atomic": "^3.0.1", + "yaml": "^1.7.2", "yapool": "^1.0.0" }, "dependencies": { - "@babel/runtime": { - "version": "7.6.3", - "resolved": false, - "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", + "@babel/code-frame": { + "version": "7.8.3", + "bundled": true, + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/core": { + "version": "7.8.7", + "bundled": true, + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.7", + "@babel/helpers": "^7.8.4", + "@babel/parser": "^7.8.7", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "bundled": true, + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.8.8", + "bundled": true, "dev": true, "requires": { - "regenerator-runtime": "^0.13.2" + "@babel/types": "^7.8.7", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" }, "dependencies": { - "regenerator-runtime": { - "version": "0.13.3", - "resolved": false, - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "source-map": { + "version": "0.5.7", + "bundled": true, "dev": true } } }, - "@types/prop-types": { - "version": "15.7.3", - "resolved": false, - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", - "dev": true + "@babel/helper-builder-react-jsx": { + "version": "7.8.3", + "bundled": true, + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "esutils": "^2.0.0" + } }, - "@types/react": { - "version": "16.9.5", - "resolved": false, - "integrity": "sha512-jQ12VMiFOWYlp+j66dghOWcmDDwhca0bnlcTxS4Qz/fh5gi6wpaZDthPEu/Gc/YlAuO87vbiUXL8qKstFvuOaA==", + "@babel/helper-function-name": { + "version": "7.8.3", + "bundled": true, "dev": true, "requires": { - "@types/prop-types": "*", - "csstype": "^2.2.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, - "ansi-escapes": { - "version": "4.2.1", - "resolved": false, - "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "bundled": true, "dev": true, "requires": { - "type-fest": "^0.5.2" + "@babel/types": "^7.8.3" } }, - "ansi-regex": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "bundled": true, "dev": true }, - "ansi-styles": { - "version": "2.2.1", - "resolved": false, - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "bundled": true, + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } }, - "ansicolors": { - "version": "0.3.2", - "resolved": false, - "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", - "dev": true + "@babel/helpers": { + "version": "7.8.4", + "bundled": true, + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.4", + "@babel/types": "^7.8.3" + } }, - "arrify": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true + "@babel/highlight": { + "version": "7.8.3", + "bundled": true, + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } }, - "astral-regex": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "@babel/parser": { + "version": "7.8.8", + "bundled": true, "dev": true }, - "auto-bind": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha512-NUwV1i9D3vxxY1KnfZgSZ716d6ovY7o8LfOwLhGIPFBowIb6Ln6DBW64+jCqPzUznel2hRSkQnYQqvh7/ldw8A==", + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.8.3", + "bundled": true, "dev": true, "requires": { - "@types/react": "^16.8.12" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" } }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": false, - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "@babel/plugin-syntax-jsx": { + "version": "7.8.3", + "bundled": true, "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": false, - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": false, - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "@babel/helper-plugin-utils": "^7.8.3" } }, - "babel-generator": { - "version": "6.26.1", - "resolved": false, - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "bundled": true, "dev": true, "requires": { - "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" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": false, - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "@babel/helper-plugin-utils": "^7.8.0" } }, - "babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": false, - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "@babel/plugin-transform-destructuring": { + "version": "7.8.8", + "bundled": true, "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" + "@babel/helper-plugin-utils": "^7.8.3" } }, - "babel-helpers": { - "version": "6.24.1", - "resolved": false, - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "@babel/plugin-transform-react-jsx": { + "version": "7.8.3", + "bundled": true, "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "@babel/helper-builder-react-jsx": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" } }, - "babel-messages": { - "version": "6.23.0", - "resolved": false, - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "@babel/runtime": { + "version": "7.8.7", + "bundled": true, "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "regenerator-runtime": "^0.13.4" } }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": false, - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": false, - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": false, - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "@babel/template": { + "version": "7.8.6", + "bundled": true, "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" } }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": false, - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "@babel/traverse": { + "version": "7.8.6", + "bundled": true, "dev": true, "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.6", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" } }, - "babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": false, - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "@babel/types": { + "version": "7.8.7", + "bundled": true, "dev": true, "requires": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } }, - "babel-register": { - "version": "6.26.0", - "resolved": false, - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": false, - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": false, - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - } - } + "@types/color-name": { + "version": "1.1.1", + "bundled": true, + "dev": true }, - "babel-runtime": { - "version": "6.26.0", - "resolved": false, - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } + "@types/prop-types": { + "version": "15.7.3", + "bundled": true, + "dev": true }, - "babel-template": { - "version": "6.26.0", - "resolved": false, - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "@types/react": { + "version": "16.9.23", + "bundled": true, "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" + "@types/prop-types": "*", + "csstype": "^2.2.0" } }, - "babel-traverse": { - "version": "6.26.0", - "resolved": false, - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "@types/yoga-layout": { + "version": "1.9.1", + "bundled": true, + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "bundled": true, "dev": true, "requires": { - "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" + "type-fest": "^0.11.0" } }, - "babel-types": { - "version": "6.26.0", - "resolved": false, - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "ansi-regex": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "bundled": true, "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "color-convert": "^1.9.0" } }, - "babylon": { - "version": "6.18.0", - "resolved": false, - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "ansicolors": { + "version": "0.3.2", + "bundled": true, "dev": true }, - "balanced-match": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "arrify": { + "version": "2.0.1", + "bundled": true, "dev": true }, - "brace-expansion": { - "version": "1.1.11", - "resolved": false, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "astral-regex": { + "version": "2.0.0", + "bundled": true, + "dev": true }, - "buffer-from": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "auto-bind": { + "version": "4.0.0", + "bundled": true, "dev": true }, "caller-callsite": { "version": "2.0.0", - "resolved": false, - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "bundled": true, "dev": true, "requires": { "callsites": "^2.0.0" @@ -2759,8 +2842,7 @@ }, "caller-path": { "version": "2.0.0", - "resolved": false, - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "bundled": true, "dev": true, "requires": { "caller-callsite": "^2.0.0" @@ -2768,14 +2850,12 @@ }, "callsites": { "version": "2.0.0", - "resolved": false, - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "bundled": true, "dev": true }, "cardinal": { "version": "2.1.1", - "resolved": false, - "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", + "bundled": true, "dev": true, "requires": { "ansicolors": "~0.3.2", @@ -2783,47 +2863,40 @@ } }, "chalk": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "2.4.2", + "bundled": true, "dev": true, "requires": { - "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" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "ci-info": { "version": "2.0.0", - "resolved": false, - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "bundled": true, "dev": true }, "cli-cursor": { - "version": "2.1.0", - "resolved": false, - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "version": "3.1.0", + "bundled": true, "dev": true, "requires": { - "restore-cursor": "^2.0.0" + "restore-cursor": "^3.1.0" } }, "cli-truncate": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", + "version": "2.1.0", + "bundled": true, "dev": true, "requires": { - "slice-ansi": "^1.0.0", - "string-width": "^2.0.0" + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" } }, "color-convert": { "version": "1.9.3", - "resolved": false, - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "bundled": true, "dev": true, "requires": { "color-name": "1.1.3" @@ -2831,20 +2904,12 @@ }, "color-name": { "version": "1.1.3", - "resolved": false, - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": false, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "bundled": true, "dev": true }, "convert-source-map": { - "version": "1.6.0", - "resolved": false, - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "version": "1.7.0", + "bundled": true, "dev": true, "requires": { "safe-buffer": "~5.1.1" @@ -2852,242 +2917,192 @@ "dependencies": { "safe-buffer": { "version": "5.1.2", - "resolved": false, - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "bundled": true, "dev": true } } }, - "core-js": { - "version": "2.6.10", - "resolved": false, - "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==", - "dev": true - }, "csstype": { - "version": "2.6.7", - "resolved": false, - "integrity": "sha512-9Mcn9sFbGBAdmimWb2gLVDtFJzeKtDGIr76TUqmjZrw9LFXBMSU70lcs+C0/7fyCd6iBDqmksUcCOUIkisPHsQ==", + "version": "2.6.9", + "bundled": true, "dev": true }, "debug": { - "version": "2.6.9", - "resolved": false, - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "detect-indent": { - "version": "4.0.0", - "resolved": false, - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "version": "4.1.1", + "bundled": true, "dev": true, "requires": { - "repeating": "^2.0.0" + "ms": "^2.1.1" } }, "emoji-regex": { - "version": "7.0.3", - "resolved": false, - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "version": "8.0.0", + "bundled": true, "dev": true }, "escape-string-regexp": { "version": "1.0.5", - "resolved": false, - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "bundled": true, "dev": true }, "esprima": { "version": "4.0.1", - "resolved": false, - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bundled": true, "dev": true }, "esutils": { "version": "2.0.3", - "resolved": false, - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "bundled": true, "dev": true }, "events-to-array": { "version": "1.1.2", - "resolved": false, - "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", + "bundled": true, "dev": true }, - "globals": { - "version": "9.18.0", - "resolved": false, - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "gensync": { + "version": "1.0.0-beta.1", + "bundled": true, "dev": true }, - "has-ansi": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } + "globals": { + "version": "11.12.0", + "bundled": true, + "dev": true }, "has-flag": { "version": "3.0.0", - "resolved": false, - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "bundled": true, "dev": true }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, "import-jsx": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha512-xmrgtiRnAdjIaRzKwsHut54FA8nx59WqN4MpQvPFr/8yD6BamavkmKHrA5dotAlnIiF4uqMzg/lA5yhPdpIXsA==", + "version": "3.1.0", + "bundled": true, "dev": true, "requires": { - "babel-core": "^6.25.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-object-rest-spread": "^6.23.0", - "babel-plugin-transform-react-jsx": "^6.24.1", + "@babel/core": "^7.5.5", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-transform-destructuring": "^7.5.0", + "@babel/plugin-transform-react-jsx": "^7.3.0", "caller-path": "^2.0.0", "resolve-from": "^3.0.0" } }, "ink": { - "version": "2.5.0", - "resolved": false, - "integrity": "sha512-HUkVglJ11cXK+W1a5cKNoOCxLkDi5hbDMAWSFDcwF2kpNd0eoX+2/cpaTP9BTFaQ8RJk7O59NxKMmyPXkmxo7w==", + "version": "2.7.1", + "bundled": true, "dev": true, "requires": { - "@types/react": "^16.8.6", "ansi-escapes": "^4.2.1", - "arrify": "^1.0.1", - "auto-bind": "^2.0.0", - "chalk": "^2.4.1", - "cli-cursor": "^2.1.0", - "cli-truncate": "^1.1.0", + "arrify": "^2.0.1", + "auto-bind": "^4.0.0", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-truncate": "^2.1.0", "is-ci": "^2.0.0", "lodash.throttle": "^4.1.1", "log-update": "^3.0.0", "prop-types": "^15.6.2", - "react-reconciler": "^0.21.0", - "scheduler": "^0.15.0", + "react-reconciler": "^0.24.0", + "scheduler": "^0.18.0", "signal-exit": "^3.0.2", - "slice-ansi": "^1.0.0", - "string-length": "^2.0.0", - "widest-line": "^2.0.0", - "wrap-ansi": "^5.0.0", + "slice-ansi": "^3.0.0", + "string-length": "^3.1.0", + "widest-line": "^3.1.0", + "wrap-ansi": "^6.2.0", "yoga-layout-prebuilt": "^1.9.3" }, "dependencies": { "ansi-styles": { - "version": "3.2.1", - "resolved": false, - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.2.1", + "bundled": true, "dev": true, "requires": { - "color-convert": "^1.9.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, "chalk": { - "version": "2.4.2", - "resolved": false, - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "bundled": true, "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "color-name": "~1.1.4" } }, + "color-name": { + "version": "1.1.4", + "bundled": true, + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, "supports-color": { - "version": "5.5.0", - "resolved": false, - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.1.0", + "bundled": true, "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } }, - "invariant": { - "version": "2.2.4", - "resolved": false, - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, "is-ci": { "version": "2.0.0", - "resolved": false, - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "bundled": true, "dev": true, "requires": { "ci-info": "^2.0.0" } }, - "is-finite": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "bundled": true, "dev": true }, "js-tokens": { - "version": "3.0.2", - "resolved": false, - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "version": "4.0.0", + "bundled": true, "dev": true }, "jsesc": { - "version": "1.3.0", - "resolved": false, - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "version": "2.5.2", + "bundled": true, "dev": true }, "json5": { - "version": "0.5.1", - "resolved": false, - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true + "version": "2.1.2", + "bundled": true, + "dev": true, + "requires": { + "minimist": "^1.2.5" + } }, "lodash": { "version": "4.17.15", - "resolved": false, - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "bundled": true, "dev": true }, "lodash.throttle": { "version": "4.1.1", - "resolved": false, - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", + "bundled": true, "dev": true }, "log-update": { - "version": "3.3.0", - "resolved": false, - "integrity": "sha512-YSKm5n+YjZoGZT5lfmOqasVH1fIH9xQA9A81Y48nZ99PxAP62vdCCtua+Gcu6oTn0nqtZd/LwRV+Vflo53ZDWA==", + "version": "3.4.0", + "bundled": true, "dev": true, "requires": { "ansi-escapes": "^3.2.0", @@ -3097,40 +3112,105 @@ "dependencies": { "ansi-escapes": { "version": "3.2.0", - "resolved": false, - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "bundled": true, + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "bundled": true, "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "mimic-fn": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "onetime": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } } } }, "loose-envify": { "version": "1.4.0", - "resolved": false, - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "bundled": true, "dev": true, "requires": { "js-tokens": "^3.0.0 || ^4.0.0" } }, "mimic-fn": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "version": "2.1.0", + "bundled": true, "dev": true }, - "minimatch": { - "version": "3.0.4", - "resolved": false, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } + "minimist": { + "version": "1.2.5", + "bundled": true, + "dev": true }, "minipass": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha512-2y5okJ4uBsjoD2vAbLKL9EUQPPkC0YMIp+2mZOXG3nBba++pdfJWRxx2Ewirc0pwAJYu4XtWg2EkVo1nRXuO/w==", + "version": "3.1.1", + "bundled": true, "dev": true, "requires": { "yallist": "^4.0.0" @@ -3138,84 +3218,37 @@ "dependencies": { "yallist": { "version": "4.0.0", - "resolved": false, - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": false, - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": false, - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "bundled": true, "dev": true } } }, "ms": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "version": "2.1.2", + "bundled": true, "dev": true }, "object-assign": { "version": "4.1.1", - "resolved": false, - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "bundled": true, "dev": true }, "onetime": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "version": "5.1.0", + "bundled": true, "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "^2.1.0" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": false, - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "path-parse": { + "version": "1.0.6", + "bundled": true, "dev": true }, "prop-types": { "version": "15.7.2", - "resolved": false, - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "bundled": true, "dev": true, "requires": { "loose-envify": "^1.4.0", @@ -3225,76 +3258,57 @@ }, "punycode": { "version": "2.1.1", - "resolved": false, - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "bundled": true, "dev": true }, - "react": { - "version": "16.10.2", - "resolved": false, - "integrity": "sha512-MFVIq0DpIhrHFyqLU0S3+4dIcBhhOvBE8bJ/5kHPVOVaGdo0KuiQzpcjCPsf585WvhypqtrMILyoE2th6dT+Lw==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - } - }, "react-is": { - "version": "16.10.2", - "resolved": false, - "integrity": "sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA==", + "version": "16.13.1", + "bundled": true, "dev": true }, "react-reconciler": { - "version": "0.21.0", - "resolved": false, - "integrity": "sha512-h4Rl3L3O6G9V4Ff+F+tCXX8ElDVn0Psk/odT+NPWeA55Yk5G7+kHT8D+Q3yE+51C72LbrYcX6OfLmCZ/7Nx9cw==", + "version": "0.24.0", + "bundled": true, "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.15.0" + "scheduler": "^0.18.0" } }, "redeyed": { "version": "2.1.1", - "resolved": false, - "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", + "bundled": true, "dev": true, "requires": { "esprima": "~4.0.0" } }, "regenerator-runtime": { - "version": "0.11.1", - "resolved": false, - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "version": "0.13.5", + "bundled": true, "dev": true }, - "repeating": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "resolve": { + "version": "1.15.1", + "bundled": true, "dev": true, "requires": { - "is-finite": "^1.0.0" + "path-parse": "^1.0.6" } }, "resolve-from": { "version": "3.0.0", - "resolved": false, - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "bundled": true, "dev": true }, "restore-cursor": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "version": "3.1.0", + "bundled": true, "dev": true, "requires": { - "onetime": "^2.0.0", + "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, @@ -3308,124 +3322,116 @@ } }, "scheduler": { - "version": "0.15.0", - "resolved": false, - "integrity": "sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg==", + "version": "0.18.0", + "bundled": true, "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, - "signal-exit": { - "version": "3.0.2", - "resolved": false, - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "semver": { + "version": "5.7.1", + "bundled": true, "dev": true }, - "slash": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "signal-exit": { + "version": "3.0.2", + "bundled": true, "dev": true }, "slice-ansi": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": false, - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "github:tapjs/node-source-map-support#node-header-length-change", - "from": "github:tapjs/node-source-map-support#node-header-length-change", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "string-length": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "version": "3.0.0", + "bundled": true, "dev": true, "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": false, - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "ansi-styles": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": false, - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "color-convert": { + "version": "2.0.1", + "bundled": true, "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "color-name": "~1.1.4" } + }, + "color-name": { + "version": "1.1.4", + "bundled": true, + "dev": true } } }, - "string-width": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "string-length": { + "version": "3.1.0", + "bundled": true, "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "astral-regex": "^1.0.0", + "strip-ansi": "^5.2.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": false, - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "bundled": true, "dev": true }, "strip-ansi": { - "version": "4.0.0", - "resolved": false, - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "bundled": true, "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } }, + "string-width": { + "version": "4.2.0", + "bundled": true, + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, "strip-ansi": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.0", + "bundled": true, "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.0" } }, "supports-color": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "version": "5.5.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } }, "tap-parser": { "version": "10.0.1", - "resolved": false, - "integrity": "sha512-qdT15H0DoJIi7zOqVXDn9X0gSM68JjNy1w3VemwTJlDnETjbi6SutnqmBfjDJAwkFS79NJ97gZKqie00ZCGmzg==", + "bundled": true, "dev": true, "requires": { "events-to-array": "^1.0.1", @@ -3435,214 +3441,196 @@ }, "tap-yaml": { "version": "1.0.0", - "resolved": false, - "integrity": "sha512-Rxbx4EnrWkYk0/ztcm5u3/VznbyFJpyXO12dDBHKWiDVxy7O2Qw6MRrwO5H6Ww0U5YhRY/4C/VzWmFPhBQc4qQ==", + "bundled": true, "dev": true, "requires": { "yaml": "^1.5.0" } }, "to-fast-properties": { - "version": "1.0.3", - "resolved": false, - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "version": "2.0.0", + "bundled": true, "dev": true }, "treport": { - "version": "0.4.2", - "resolved": false, - "integrity": "sha512-Po8pQ/rmu4lVNmZWBgqyiHoIWXFeWaMA3H/WoCKw+DiS0xFn43UYRH6hYnjmrWCp0rkLItELQP/maO9uHDe/7A==", + "version": "1.0.2", + "bundled": true, "dev": true, "requires": { "cardinal": "^2.1.1", - "chalk": "^2.4.2", - "import-jsx": "^2.0.0", - "ink": "^2.1.1", - "ms": "^2.1.1", - "react": "^16.8.6", - "string-length": "^2.0.0", + "chalk": "^3.0.0", + "import-jsx": "^3.1.0", + "ink": "^2.6.0", + "ms": "^2.1.2", + "string-length": "^3.1.0", "tap-parser": "^10.0.1", - "unicode-length": "^2.0.1" + "unicode-length": "^2.0.2" }, "dependencies": { "ansi-styles": { - "version": "3.2.1", - "resolved": false, - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.2.1", + "bundled": true, "dev": true, "requires": { - "color-convert": "^1.9.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, "chalk": { - "version": "2.4.2", - "resolved": false, - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "3.0.0", + "bundled": true, "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "ms": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": false, - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "color-convert": { + "version": "2.0.1", + "bundled": true, "dev": true, "requires": { - "has-flag": "^3.0.0" + "color-name": "~1.1.4" } }, - "unicode-length": { - "version": "2.0.2", - "resolved": false, - "integrity": "sha512-Ph/j1VbS3/r77nhoY2WU0GWGjVYOHL3xpKp0y/Eq2e5r0mT/6b649vm7KFO6RdAdrZkYLdxphYVgvODxPB+Ebg==", + "color-name": { + "version": "1.1.4", + "bundled": true, + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "bundled": true, "dev": true, "requires": { - "punycode": "^2.0.0", - "strip-ansi": "^3.0.1" + "has-flag": "^4.0.0" } } } }, - "trim-right": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, "type-fest": { - "version": "0.5.2", - "resolved": false, - "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", + "version": "0.11.0", + "bundled": true, "dev": true }, + "unicode-length": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "punycode": "^2.0.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "which": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz", - "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" } }, "widest-line": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "version": "3.1.0", + "bundled": true, "dev": true, "requires": { - "string-width": "^2.1.1" + "string-width": "^4.0.0" } }, "wrap-ansi": { - "version": "5.1.0", - "resolved": false, - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "version": "6.2.0", + "bundled": true, "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": false, - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, "ansi-styles": { - "version": "3.2.1", - "resolved": false, - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.2.1", + "bundled": true, "dev": true, "requires": { - "color-convert": "^1.9.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "string-width": { - "version": "3.1.0", - "resolved": false, - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "color-convert": { + "version": "2.0.1", + "bundled": true, "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "color-name": "~1.1.4" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": false, - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } + "color-name": { + "version": "1.1.4", + "bundled": true, + "dev": true } } }, "yaml": { - "version": "1.7.1", - "resolved": false, - "integrity": "sha512-sR0mJ2C3LVBgMST+0zrrrsKSijbw64bfHmTt4nEXLZTZFyIAuUVARqA/LO5kaZav2OVQMaZ+5WRrZv7QjxG3uQ==", + "version": "1.8.2", + "bundled": true, "dev": true, "requires": { - "@babel/runtime": "^7.5.5" + "@babel/runtime": "^7.8.7" } }, "yoga-layout-prebuilt": { - "version": "1.9.3", - "resolved": false, - "integrity": "sha512-9SNQpwuEh2NucU83i2KMZnONVudZ86YNcFk9tq74YaqrQfgJWO3yB9uzH1tAg8iqh5c9F5j0wuyJ2z72wcum2w==", - "dev": true + "version": "1.9.5", + "bundled": true, + "dev": true, + "requires": { + "@types/yoga-layout": "1.9.1" + } } } }, "tap-mocha-reporter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.0.tgz", - "integrity": "sha512-8HlAtdmYGlDZuW83QbF/dc46L7cN+AGhLZcanX3I9ILvxUAl+G2/mtucNPSXecTlG/4iP1hv6oMo0tMhkn3Tsw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.1.tgz", + "integrity": "sha512-1knFWOwd4khx/7uSEnUeaP9IPW3w+sqTgJMhrwah6t46nZ8P25atOKAjSvVDsT67lOPu0nfdOqUwoyKn+3E5pA==", "dev": true, "requires": { "color-support": "^1.1.0", - "debug": "^2.1.3", - "diff": "^1.3.2", - "escape-string-regexp": "^1.0.3", + "debug": "^4.1.1", + "diff": "^4.0.1", + "escape-string-regexp": "^2.0.0", "glob": "^7.0.5", - "readable-stream": "^2.1.5", "tap-parser": "^10.0.0", "tap-yaml": "^1.0.0", - "unicode-length": "^1.0.0" + "unicode-length": "^2.0.2" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", - "dev": true - }, - "ms": { + "escape-string-regexp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true } } @@ -3668,10 +3656,13 @@ } }, "tcompare": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-2.3.0.tgz", - "integrity": "sha512-fAfA73uFtFGybWGt4+IYT6UPLYVZQ4NfsP+IXEZGY0vh8e2IF7LVKafcQNMRBLqP0wzEA65LM9Tqj+FSmO8GLw==", - "dev": true + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-3.0.4.tgz", + "integrity": "sha512-Q3TitMVK59NyKgQyFh+857wTAUE329IzLDehuPgU4nF5e8g+EUQ+yUbjUy1/6ugiNnXztphT+NnqlCXolv9P3A==", + "dev": true, + "requires": { + "diff-frag": "^1.0.1" + } }, "test-exclude": { "version": "5.2.3", @@ -3722,21 +3713,13 @@ } }, "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } + "psl": "^1.1.28", + "punycode": "^2.1.1" } }, "trivial-deferred": { @@ -3746,22 +3729,22 @@ "dev": true }, "ts-node": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.4.1.tgz", - "integrity": "sha512-5LpRN+mTiCs7lI5EtbXmF/HfMeCjzt7DH9CZwtkr6SywStrNQC723wG+aOWFiLNn7zT3kD/RnFqi3ZUfr4l5Qw==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.8.1.tgz", + "integrity": "sha512-10DE9ONho06QORKAaCBpPiFCdW+tZJuY/84tyypGtl6r+/C7Asq0dhqbRZURuUlLQtZxxDvT8eoj8cGW0ha6Bg==", "dev": true, "requires": { "arg": "^4.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "source-map-support": "^0.5.6", - "yn": "^3.0.0" + "yn": "3.1.1" } }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", "dev": true }, "tunnel-agent": { @@ -3788,6 +3771,12 @@ "prelude-ls": "~1.1.2" } }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -3798,29 +3787,18 @@ } }, "typescript": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.4.tgz", - "integrity": "sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", "dev": true }, - "uglify-js": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.4.tgz", - "integrity": "sha512-9Yc2i881pF4BPGhjteCXQNaXx1DCwm3dtOyBaG2hitHjLWOczw/ki8vD1bqyT3u6K0Ms/FpCShkmfg+FtlOfYA==", - "dev": true, - "optional": true, - "requires": { - "commander": "~2.20.3", - "source-map": "~0.6.1" - } - }, "unicode-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz", - "integrity": "sha1-Wtp6f+1RhBpBijKM8UlHisg1irs=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-2.0.2.tgz", + "integrity": "sha512-Ph/j1VbS3/r77nhoY2WU0GWGjVYOHL3xpKp0y/Eq2e5r0mT/6b649vm7KFO6RdAdrZkYLdxphYVgvODxPB+Ebg==", "dev": true, "requires": { - "punycode": "^1.3.2", + "punycode": "^2.0.0", "strip-ansi": "^3.0.1" }, "dependencies": { @@ -3830,12 +3808,6 @@ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -3862,9 +3834,9 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, "v8-compile-cache": { @@ -3915,10 +3887,10 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, "wrap-ansi": { @@ -3984,9 +3956,9 @@ } }, "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { "imurmurhash": "^0.1.4", @@ -4008,12 +3980,12 @@ "dev": true }, "yaml": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", - "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.3.tgz", + "integrity": "sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw==", "dev": true, "requires": { - "@babel/runtime": "^7.6.3" + "@babel/runtime": "^7.8.7" } }, "yapool": { @@ -4023,9 +3995,9 @@ "dev": true }, "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { "cliui": "^5.0.0", @@ -4037,7 +4009,7 @@ "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" + "yargs-parser": "^13.1.2" }, "dependencies": { "cliui": { @@ -4051,6 +4023,18 @@ "wrap-ansi": "^5.1.0" } }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -4076,9 +4060,9 @@ } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", diff --git a/package.json b/package.json index 2c6f391b..0c2ee900 100644 --- a/package.json +++ b/package.json @@ -32,12 +32,12 @@ "node": ">= 8.0" }, "devDependencies": { - "eslint": "6.5.1", - "tap": "14.8.2" + "eslint": "6.8.0", + "tap": "14.10.7" }, "dependencies": { - "big-integer": "1.6.47", - "iconv-lite": "0.4.24", - "mysql": "2.17.1" + "big-integer": "1.6.48", + "iconv-lite": "0.5.1", + "mysql": "2.18.1" } }