diff --git a/README.md b/README.md index aa3b0bc..9b19b2f 100644 --- a/README.md +++ b/README.md @@ -336,6 +336,22 @@ app.service('/user-todos').get([1, 2]) app.service('/user-todos').get({ userId: 1, todoId: 2 }) ``` +* **`materializedViews`** - (optional) array of materialized views to use when queries contains the same set of columns that constructs their compound PK. + +```js +app.use('/players', service({ + materializedViews: [ + { + view: 'top_season_players', + keys: [ + 'season', + 'score' + ] + } + ] +}) +``` + ## Complete Example Here's a complete example of a Feathers server with a `todos` Feathers-Cassandra service: diff --git a/package-lock.json b/package-lock.json index 4653091..4dc1529 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,13 @@ { "name": "feathers-cassandra", - "version": "3.4.0", + "version": "3.4.1", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/cli": { - "version": "7.7.5", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.7.5.tgz", - "integrity": "sha512-y2YrMGXM3NUyu1Myg0pxg+Lx6g8XhEyvLHYNRwTBV6fDek3H7Io6b7N/LXscLs4HWn4HxMdy7f2rM1rTMp2mFg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.8.4.tgz", + "integrity": "sha512-XXLgAm6LBbaNxaGhMAznXXaxtCWfuv6PIDJ9Alsy9JYTOh+j2jJz+L/162kkfU1j/pTSxK1xGmlwI4pdIMkoag==", "dev": true, "requires": { "chokidar": "^2.1.8", @@ -41,12 +41,6 @@ "readdirp": "^2.2.1", "upath": "^1.1.1" } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true } } }, @@ -59,21 +53,33 @@ "@babel/highlight": "^7.0.0" } }, - "@babel/core": { - "version": "7.7.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.5.tgz", - "integrity": "sha512-M42+ScN4+1S9iB6f+TL7QBpoQETxbclx+KNoKJABghnKYE+fMzSGqst0BZJc8CpI625bwPwYgUyRvxZ+0mZzpw==", + "@babel/compat-data": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.5.tgz", + "integrity": "sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg==", "dev": true, "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.4", - "@babel/helpers": "^7.7.4", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4", + "browserslist": "^4.8.5", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", + "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helpers": "^7.8.4", + "@babel/parser": "^7.8.4", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.4", + "@babel/types": "^7.8.3", "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", @@ -81,6 +87,132 @@ "source-map": "^0.5.0" }, "dependencies": { + "@babel/code-frame": { + "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.8.3" + } + }, + "@babel/generator": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "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.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "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.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "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.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/traverse": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.4", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -90,10 +222,31 @@ "ms": "^2.1.1" } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "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 + }, + "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 + }, + "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" + } + }, + "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 } } @@ -119,72 +272,554 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz", - "integrity": "sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz", - "integrity": "sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", + "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-explode-assignable-expression": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } } }, "@babel/helper-call-delegate": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz", - "integrity": "sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz", + "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/code-frame": { + "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.8.3" + } + }, + "@babel/generator": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "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.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "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.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "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.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/traverse": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.4", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz", + "integrity": "sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.4", + "browserslist": "^4.8.5", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz", - "integrity": "sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", + "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", "dev": true, "requires": { - "@babel/helper-regex": "^7.4.4", + "@babel/helper-regex": "^7.8.3", "regexpu-core": "^4.6.0" } }, "@babel/helper-define-map": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz", - "integrity": "sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", + "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.7.4", - "@babel/types": "^7.7.4", + "@babel/helper-function-name": "^7.8.3", + "@babel/types": "^7.8.3", "lodash": "^4.17.13" }, "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - } - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz", - "integrity": "sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg==", + "@babel/code-frame": { + "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.8.3" + } + }, + "@babel/helper-function-name": { + "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.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "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.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", + "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", "dev": true, "requires": { - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/code-frame": { + "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.8.3" + } + }, + "@babel/generator": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "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.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "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.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "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.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/traverse": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.4", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "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 + } } }, "@babel/helper-function-name": { @@ -208,153 +843,1060 @@ } }, "@babel/helper-hoist-variables": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz", - "integrity": "sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", + "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } } }, "@babel/helper-member-expression-to-functions": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz", - "integrity": "sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } } }, "@babel/helper-module-imports": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz", - "integrity": "sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } } }, "@babel/helper-module-transforms": { - "version": "7.7.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz", - "integrity": "sha512-A7pSxyJf1gN5qXVcidwLWydjftUN878VkalhXX5iQDuGyiGK3sOrrKKHF4/A4fwHtnsotv/NipwAeLzY4KQPvw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", + "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.7.4", - "@babel/helper-simple-access": "^7.7.4", - "@babel/helper-split-export-declaration": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3", "lodash": "^4.17.13" }, "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "@babel/code-frame": { + "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.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "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.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz", - "integrity": "sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg==", - "dev": true, - "requires": { - "@babel/types": "^7.7.4" + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", + "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", + "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-wrap-function": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/code-frame": { + "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.8.3" + } + }, + "@babel/generator": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "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.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "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.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "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.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/traverse": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.4", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", + "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/code-frame": { + "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.8.3" + } + }, + "@babel/generator": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "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.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "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.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "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.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/traverse": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.4", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/code-frame": { + "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.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-wrap-function": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", + "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/code-frame": { + "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.8.3" + } + }, + "@babel/generator": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "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.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "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.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "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.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/traverse": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.4", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "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 + } } }, - "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", - "dev": true - }, - "@babel/helper-regex": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", - "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "@babel/helpers": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", + "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", "dev": true, "requires": { - "lodash": "^4.17.13" + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.4", + "@babel/types": "^7.8.3" }, "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "@babel/code-frame": { + "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.8.3" + } + }, + "@babel/generator": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "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.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "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.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "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.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/traverse": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.4", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "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 } } }, - "@babel/helper-remap-async-to-generator": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz", - "integrity": "sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.7.4", - "@babel/helper-wrap-function": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz", - "integrity": "sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.7.4", - "@babel/helper-optimise-call-expression": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz", - "integrity": "sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A==", - "dev": true, - "requires": { - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", - "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", - "dev": true, - "requires": { - "@babel/types": "^7.7.4" - } - }, - "@babel/helper-wrap-function": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz", - "integrity": "sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" - } - }, - "@babel/helpers": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.4.tgz", - "integrity": "sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg==", - "dev": true, - "requires": { - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" - } - }, "@babel/highlight": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", @@ -403,6 +1945,36 @@ } } }, + "@babel/node": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.8.4.tgz", + "integrity": "sha512-MlczXI/VYRnoaWHjicqrzq2z4DhRPaWQIC+C3ISEQs5z+mEccBsn7IAI5Q97ZDTnFYw6ts5IUTzqArilC/g7nw==", + "dev": true, + "requires": { + "@babel/register": "^7.8.3", + "commander": "^4.0.1", + "core-js": "^3.2.1", + "lodash": "^4.17.13", + "node-environment-flags": "^1.0.5", + "regenerator-runtime": "^0.13.3", + "resolve": "^1.13.1", + "v8flags": "^3.1.1" + }, + "dependencies": { + "core-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", + "dev": true + }, + "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 + } + } + }, "@babel/parser": { "version": "7.7.5", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.5.tgz", @@ -410,505 +1982,818 @@ "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz", - "integrity": "sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", + "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.7.4", - "@babel/plugin-syntax-async-generators": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz", - "integrity": "sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", + "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz", - "integrity": "sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", + "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-json-strings": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz", - "integrity": "sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz", - "integrity": "sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz", + "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.4.tgz", - "integrity": "sha512-cHgqHgYvffluZk85dJ02vloErm3Y6xtH+2noOBOJ2kXOJH3aVCDnj5eR/lVNlTnYu4hndAPJD3rTFjW3qee0PA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", + "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-async-generators": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz", - "integrity": "sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-dynamic-import": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz", - "integrity": "sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-json-strings": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz", - "integrity": "sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-object-rest-spread": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz", - "integrity": "sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz", - "integrity": "sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz", - "integrity": "sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", + "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz", - "integrity": "sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", + "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz", - "integrity": "sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", + "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.7.4" + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz", - "integrity": "sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", + "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz", - "integrity": "sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", + "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-plugin-utils": "^7.8.3", "lodash": "^4.17.13" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - } } }, "@babel/plugin-transform-classes": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz", - "integrity": "sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.7.4", - "@babel/helper-define-map": "^7.7.4", - "@babel/helper-function-name": "^7.7.4", - "@babel/helper-optimise-call-expression": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.7.4", - "@babel/helper-split-export-declaration": "^7.7.4", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", + "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-define-map": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", "globals": "^11.1.0" }, "dependencies": { + "@babel/code-frame": { + "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.8.3" + } + }, + "@babel/helper-function-name": { + "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.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "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.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "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.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, "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 + }, + "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 + }, + "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" + } + }, + "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 } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz", - "integrity": "sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", + "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-destructuring": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz", - "integrity": "sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", + "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.4.tgz", - "integrity": "sha512-mk0cH1zyMa/XHeb6LOTXTbG7uIJ8Rrjlzu91pUx/KS3JpcgaTDwMS8kM+ar8SLOvlL2Lofi4CGBAjCo3a2x+lw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", + "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz", - "integrity": "sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", + "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz", - "integrity": "sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", + "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-for-of": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz", - "integrity": "sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz", + "integrity": "sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-function-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz", - "integrity": "sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", + "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + }, + "dependencies": { + "@babel/code-frame": { + "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.8.3" + } + }, + "@babel/helper-function-name": { + "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.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "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.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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 + } } }, "@babel/plugin-transform-literals": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz", - "integrity": "sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", + "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz", - "integrity": "sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", + "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.7.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.5.tgz", - "integrity": "sha512-CT57FG4A2ZUNU1v+HdvDSDrjNWBrtCmSH6YbbgN3Lrf0Di/q/lWRxZrE72p3+HCCz9UjfZOEBdphgC0nzOS6DQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", + "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.7.5", - "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.7.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.5.tgz", - "integrity": "sha512-9Cq4zTFExwFhQI6MT1aFxgqhIsMWQWDVwOgLzl7PTWJHsNaqFvklAU+Oz6AQLAS0dJKTwZSOCo20INwktxpi3Q==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", + "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.7.5", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.7.4", + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz", - "integrity": "sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", + "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz", - "integrity": "sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", + "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz", - "integrity": "sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.4" + "@babel/helper-create-regexp-features-plugin": "^7.8.3" } }, "@babel/plugin-transform-new-target": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz", - "integrity": "sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", + "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-object-super": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz", - "integrity": "sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", + "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3" } }, "@babel/plugin-transform-parameters": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.4.tgz", - "integrity": "sha512-VJwhVePWPa0DqE9vcfptaJSzNDKrWU/4FbYCjZERtmqEs05g3UMXnYMZoXja7JAJ7Y7sPZipwm/pGApZt7wHlw==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz", + "integrity": "sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA==", "dev": true, "requires": { - "@babel/helper-call-delegate": "^7.7.4", - "@babel/helper-get-function-arity": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-call-delegate": "^7.8.3", + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + }, + "dependencies": { + "@babel/helper-get-function-arity": { + "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.8.3" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } } }, "@babel/plugin-transform-property-literals": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz", - "integrity": "sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", + "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-regenerator": { - "version": "7.7.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.5.tgz", - "integrity": "sha512-/8I8tPvX2FkuEyWbjRCt4qTAgZK0DVy8QRguhA524UH48RfGJy94On2ri+dCuwOpcerPRl9O4ebQkRcVzIaGBw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz", + "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==", "dev": true, "requires": { "regenerator-transform": "^0.14.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz", - "integrity": "sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", + "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz", - "integrity": "sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", + "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-spread": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz", - "integrity": "sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", + "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz", - "integrity": "sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", + "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-regex": "^7.8.3" } }, "@babel/plugin-transform-template-literals": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz", - "integrity": "sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", + "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz", - "integrity": "sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", + "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz", - "integrity": "sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", + "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/preset-env": { - "version": "7.7.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.5.tgz", - "integrity": "sha512-wDPbiaZdGzsJuTWlpLHJxmwslwHGLZ8F5v69zX3oAWeTOFWdy4OJHoTKg26oAnFg052v+/LAPY5os9KB0LrOEA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.7.4", - "@babel/plugin-proposal-dynamic-import": "^7.7.4", - "@babel/plugin-proposal-json-strings": "^7.7.4", - "@babel/plugin-proposal-object-rest-spread": "^7.7.4", - "@babel/plugin-proposal-optional-catch-binding": "^7.7.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.7.4", - "@babel/plugin-syntax-async-generators": "^7.7.4", - "@babel/plugin-syntax-dynamic-import": "^7.7.4", - "@babel/plugin-syntax-json-strings": "^7.7.4", - "@babel/plugin-syntax-object-rest-spread": "^7.7.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.7.4", - "@babel/plugin-syntax-top-level-await": "^7.7.4", - "@babel/plugin-transform-arrow-functions": "^7.7.4", - "@babel/plugin-transform-async-to-generator": "^7.7.4", - "@babel/plugin-transform-block-scoped-functions": "^7.7.4", - "@babel/plugin-transform-block-scoping": "^7.7.4", - "@babel/plugin-transform-classes": "^7.7.4", - "@babel/plugin-transform-computed-properties": "^7.7.4", - "@babel/plugin-transform-destructuring": "^7.7.4", - "@babel/plugin-transform-dotall-regex": "^7.7.4", - "@babel/plugin-transform-duplicate-keys": "^7.7.4", - "@babel/plugin-transform-exponentiation-operator": "^7.7.4", - "@babel/plugin-transform-for-of": "^7.7.4", - "@babel/plugin-transform-function-name": "^7.7.4", - "@babel/plugin-transform-literals": "^7.7.4", - "@babel/plugin-transform-member-expression-literals": "^7.7.4", - "@babel/plugin-transform-modules-amd": "^7.7.5", - "@babel/plugin-transform-modules-commonjs": "^7.7.5", - "@babel/plugin-transform-modules-systemjs": "^7.7.4", - "@babel/plugin-transform-modules-umd": "^7.7.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.4", - "@babel/plugin-transform-new-target": "^7.7.4", - "@babel/plugin-transform-object-super": "^7.7.4", - "@babel/plugin-transform-parameters": "^7.7.4", - "@babel/plugin-transform-property-literals": "^7.7.4", - "@babel/plugin-transform-regenerator": "^7.7.5", - "@babel/plugin-transform-reserved-words": "^7.7.4", - "@babel/plugin-transform-shorthand-properties": "^7.7.4", - "@babel/plugin-transform-spread": "^7.7.4", - "@babel/plugin-transform-sticky-regex": "^7.7.4", - "@babel/plugin-transform-template-literals": "^7.7.4", - "@babel/plugin-transform-typeof-symbol": "^7.7.4", - "@babel/plugin-transform-unicode-regex": "^7.7.4", - "@babel/types": "^7.7.4", - "browserslist": "^4.6.0", - "core-js-compat": "^3.4.7", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", + "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.4", + "@babel/helper-compilation-targets": "^7.8.4", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.8.3", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.8.4", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.8.3", + "@babel/plugin-transform-modules-commonjs": "^7.8.3", + "@babel/plugin-transform-modules-systemjs": "^7.8.3", + "@babel/plugin-transform-modules-umd": "^7.8.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.4", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.3", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/types": "^7.8.3", + "browserslist": "^4.8.5", + "core-js-compat": "^3.6.2", "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", + "levenary": "^1.1.1", "semver": "^5.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } } }, "@babel/register": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.7.4.tgz", - "integrity": "sha512-/fmONZqL6ZMl9KJUYajetCrID6m0xmL4odX7v+Xvoxcv0DdbP/oO0TWIeLUCHqczQ6L6njDMqmqHFy2cp3FFsA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.8.3.tgz", + "integrity": "sha512-t7UqebaWwo9nXWClIPLPloa5pN33A2leVs8Hf0e9g9YwUP8/H9NeR7DJU+4CXo23QtjChQv5a3DjEtT83ih1rg==", "dev": true, "requires": { "find-cache-dir": "^2.0.0", @@ -916,14 +2801,6 @@ "make-dir": "^2.1.0", "pirates": "^4.0.0", "source-map-support": "^0.5.16" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - } } }, "@babel/template": { @@ -1034,9 +2911,9 @@ } }, "@feathersjs/adapter-tests": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@feathersjs/adapter-tests/-/adapter-tests-4.4.1.tgz", - "integrity": "sha512-lzgUnzf3FWW/csevk+tH+Ub6FXMGYi6x1xq/iyveCO590+/yyIjvYR/+efnVJAPv0ndsiBVvu5ECiiS1ZHYDeg==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@feathersjs/adapter-tests/-/adapter-tests-4.5.1.tgz", + "integrity": "sha512-4CO4NO7J+vxKJ4sdyRttqkFemHadgeEVYneKxjg5wIzXTO8aV4MOZ51wrDKJJ/RHHywOtxWTV4lPERndttezMA==", "dev": true }, "@feathersjs/commons": { @@ -1063,20 +2940,35 @@ } }, "@feathersjs/express": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@feathersjs/express/-/express-4.4.1.tgz", - "integrity": "sha512-hpFkz7XxP/WhXh2WioQLewXU2oTLwBKRJgHP5TVHbgXo/y/TUjToPOS1sLd0ITXX5OeQxFKFx0T5OWNQJ6htuQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@feathersjs/express/-/express-4.5.1.tgz", + "integrity": "sha512-qpJp7GzW0PKBQy0dUtj+Gf2vj+uAoKTgXl9P3Pc566LhBT5fy5HifUvS3bONdYY6Is5VtL1Gx2lMgpuEI7UVEg==", "dev": true, "requires": { - "@feathersjs/commons": "^4.4.1", - "@feathersjs/errors": "^4.4.1", - "@types/express": "^4.17.1", + "@feathersjs/commons": "^4.5.1", + "@feathersjs/errors": "^4.5.1", + "@types/express": "^4.17.2", "debug": "^4.1.1", "express": "^4.17.1", "lodash": "^4.17.15", "uberproto": "^2.0.4" }, "dependencies": { + "@feathersjs/commons": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@feathersjs/commons/-/commons-4.5.1.tgz", + "integrity": "sha512-wSanrV1Tvqf4U8PE4bx+gEdLT0cCuusuoVOvyK4uOlTIOgT85qJMw9MBa99jF7BFF022EzHrpo0CjzwqcMBMIA==", + "dev": true + }, + "@feathersjs/errors": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@feathersjs/errors/-/errors-4.5.1.tgz", + "integrity": "sha512-ztNL+g7pmZm4xYfmgc9ZtHfuWQl83CpCDtkXk3wZB8h4u4U0j1nUE6/QikmwzLS+/wHOnBDI7qSWV9ZnxzX1ww==", + "dev": true, + "requires": { + "debug": "^4.1.1" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -1085,27 +2977,27 @@ "requires": { "ms": "^2.1.1" } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true } } }, "@feathersjs/feathers": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@feathersjs/feathers/-/feathers-4.4.1.tgz", - "integrity": "sha512-nly0g7UxrWizwECqc8c3vrk/x+B+cgxaJu66mV+5OJI8qSpc72EnGR4MhUhsT+lPKOyCFlRRoq7om93QxFBDWw==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@feathersjs/feathers/-/feathers-4.5.1.tgz", + "integrity": "sha512-fR+JjdW6HN0LgZzlS0TatyYhtr0Hu7Zh5/uJWbDVQ1+3Eqe3IFeqQzXXIVWipnFUEZ0Pw9d2n7TFvtMCkgHu3Q==", "dev": true, "requires": { - "@feathersjs/commons": "^4.4.1", + "@feathersjs/commons": "^4.5.1", "debug": "^4.1.1", - "events": "^3.0.0", + "events": "^3.1.0", "uberproto": "^2.0.4" }, "dependencies": { + "@feathersjs/commons": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@feathersjs/commons/-/commons-4.5.1.tgz", + "integrity": "sha512-wSanrV1Tvqf4U8PE4bx+gEdLT0cCuusuoVOvyK4uOlTIOgT85qJMw9MBa99jF7BFF022EzHrpo0CjzwqcMBMIA==", + "dev": true + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -1114,6 +3006,12 @@ "requires": { "ms": "^2.1.1" } + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "dev": true } } }, @@ -1128,9 +3026,9 @@ } }, "@types/connect": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", - "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", + "version": "3.4.33", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", + "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", "dev": true, "requires": { "@types/node": "*" @@ -1148,9 +3046,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.0.tgz", - "integrity": "sha512-Xnub7w57uvcBqFdIGoRg1KhNOeEj0vB6ykUM7uFWyxvbdE89GFyqgmUcanAriMr4YOxNFZBAWkfcWIb4WBPt3g==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.2.tgz", + "integrity": "sha512-El9yMpctM6tORDAiBwZVLMcxoTMcqqRO9dVyYcn7ycLWbvR8klrDn8CAOwRfZujZtWD7yS/mshTdz43jMOejbg==", "dev": true, "requires": { "@types/node": "*", @@ -1164,9 +3062,9 @@ "dev": true }, "@types/node": { - "version": "12.12.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.14.tgz", - "integrity": "sha512-u/SJDyXwuihpwjXy7hOOghagLEV1KdAST6syfnOk6QZAMzZuWZqXy5aYYZbh8Jdpd4escVFP0MvftHNDb9pruA==", + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.0.tgz", + "integrity": "sha512-GnZbirvmqZUzMgkFn70c74OQpTTUcCzlhQliTzYjQMqg+hVKcDnxdL19Ne3UdYzdMA/+W3eb646FWn/ZaT1NfQ==", "dev": true }, "@types/range-parser": { @@ -1206,18 +3104,18 @@ }, "dependencies": { "mime-db": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", - "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", + "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.25", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", - "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", + "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.42.0" + "mime-db": "1.43.0" } } } @@ -1336,18 +3234,81 @@ }, "array-flatten": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } } }, "array-unique": { @@ -1869,14 +3830,14 @@ "dev": true }, "browserslist": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.2.tgz", - "integrity": "sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA==", + "version": "4.8.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz", + "integrity": "sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001015", - "electron-to-chromium": "^1.3.322", - "node-releases": "^1.1.42" + "caniuse-lite": "^1.0.30001023", + "electron-to-chromium": "^1.3.341", + "node-releases": "^1.1.47" } }, "buffer-from": { @@ -1939,9 +3900,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001015", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001015.tgz", - "integrity": "sha512-/xL2AbW/XWHNu1gnIrO8UitBGoFthcsDgU9VLK1/dpsoxbaD5LscHozKze05R6WLsBvLhqv78dAPozMFQBYLbQ==", + "version": "1.0.30001023", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001023.tgz", + "integrity": "sha512-C5TDMiYG11EOhVOA62W1p3UsJ2z4DsHtMBQtjzp3ZsUglcQn62WOUgW0y795c7A5uZ+GCEIvzkMatLIlAsbNTA==", "dev": true }, "caseless": { @@ -2176,9 +4137,9 @@ } }, "commander": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.0.1.tgz", - "integrity": "sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.0.tgz", + "integrity": "sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw==", "dev": true }, "commondir": { @@ -2262,19 +4223,19 @@ "dev": true }, "core-js-compat": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.4.7.tgz", - "integrity": "sha512-57+mgz/P/xsGdjwQYkwtBZR3LuISaxD1dEwVDtbk8xJMqAmwqaxLOvnNT7kdJ7jYE/NjNptyzXi+IQFMi/2fCw==", + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", + "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", "dev": true, "requires": { - "browserslist": "^4.8.0", - "semver": "^6.3.0" + "browserslist": "^4.8.3", + "semver": "7.0.0" }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", "dev": true } } @@ -2539,9 +4500,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.322", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz", - "integrity": "sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA==", + "version": "1.3.344", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.344.tgz", + "integrity": "sha512-tvbx2Wl8WBR+ym3u492D0L6/jH+8NoQXqe46+QhbWH3voVPauGuZYeb1QAXYoOAWuiP2dbSvlBx0kQ1F3hu/Mw==", "dev": true }, "emoji-regex": { @@ -2653,12 +4614,12 @@ }, "dependencies": { "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.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", "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" @@ -2706,9 +4667,9 @@ "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 }, "glob-parent": { @@ -2732,12 +4693,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -2770,6 +4725,12 @@ } } }, + "eslint-config-semistandard": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-15.0.0.tgz", + "integrity": "sha512-volIMnosUvzyxGkYUA5QvwkahZZLeUx7wcS0+7QumPn+MMEBbV6P7BY1yukamMst0w3Et3QZlCjQEwQ8tQ6nug==", + "dev": true + }, "eslint-config-standard": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz", @@ -2783,13 +4744,13 @@ "dev": true }, "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", "dev": true, "requires": { "debug": "^2.6.9", - "resolve": "^1.5.0" + "resolve": "^1.13.1" }, "dependencies": { "debug": { @@ -2806,16 +4767,25 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + }, + "resolve": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", + "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } } } }, "eslint-module-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", - "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", + "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", "dev": true, "requires": { - "debug": "^2.6.8", + "debug": "^2.6.9", "pkg-dir": "^2.0.0" }, "dependencies": { @@ -2899,9 +4869,9 @@ "dev": true }, "resolve": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", - "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", + "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -2930,9 +4900,9 @@ "dev": true }, "resolve": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", - "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", + "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -2979,9 +4949,9 @@ } }, "resolve": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", - "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", + "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -3675,7 +5645,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -3696,12 +5667,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3716,17 +5689,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -3843,7 +5819,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -3855,6 +5832,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -3869,6 +5847,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -3876,12 +5855,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -3900,6 +5881,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -3980,7 +5962,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -3992,6 +5975,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -4077,7 +6061,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -4113,6 +6098,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -4132,6 +6118,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -4175,12 +6162,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -4196,6 +6185,12 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -4397,6 +6392,15 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, "hosted-git-info": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", @@ -4529,12 +6533,6 @@ "supports-color": "^5.3.0" } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -4749,6 +6747,12 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, "is-symbol": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", @@ -4899,12 +6903,6 @@ "handlebars": "^4.1.2" } }, - "js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "dev": true - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -5021,6 +7019,21 @@ "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", "dev": true }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -5516,9 +7529,9 @@ "dev": true }, "node-releases": { - "version": "1.1.42", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.42.tgz", - "integrity": "sha512-OQ/ESmUqGawI2PRX+XIRao44qWYBBfN54ImQYdWVTQqUckuejOg76ysSqDBK8NG3zwySRVnX36JwDQ6x+9GxzA==", + "version": "1.1.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.47.tgz", + "integrity": "sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA==", "dev": true, "requires": { "semver": "^6.3.0" @@ -5743,45 +7756,108 @@ } }, "object.entries": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", + "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1", "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } } }, "object.fromentries": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.1.tgz", - "integrity": "sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", + "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.15.0", + "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1", "has": "^1.0.3" }, "dependencies": { "es-abstract": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.3.tgz", - "integrity": "sha512-WtY7Fx5LiOnSYgF5eg/1T+GONaGmpvpPdCpSnYij+U2gDTL0UPfWrhDw7b2IYb+9NQJsYpCA0wOQvZfsd6YwRw==", + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", "object-inspect": "^1.7.0", "object-keys": "^1.1.1", - "string.prototype.trimleft": "^2.1.0", - "string.prototype.trimright": "^2.1.0" + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" } }, "es-to-primitive": { @@ -5795,6 +7871,21 @@ "is-symbol": "^1.0.2" } }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", @@ -5832,15 +7923,77 @@ } }, "object.values": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", + "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1", "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } } }, "on-finished": { @@ -5976,6 +8129,12 @@ "error-ex": "^1.2.0" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -6110,9 +8269,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" @@ -6426,9 +8585,9 @@ "dev": true }, "regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.2.tgz", + "integrity": "sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -6554,12 +8713,12 @@ "dev": true }, "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", + "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "^1.0.6" } }, "resolve-from": { @@ -6615,9 +8774,9 @@ "dev": true }, "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" @@ -6644,6 +8803,24 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "semistandard": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/semistandard/-/semistandard-14.2.0.tgz", + "integrity": "sha512-mQ0heTpbW7WWBXKOIqitlfEcAZhgGTwaHr1zzv70PnZZc53J+4u31+vLUEsh2oKVWfVgcjrykT2hz02B1Cfaaw==", + "dev": true, + "requires": { + "eslint": "~6.4.0", + "eslint-config-semistandard": "15.0.0", + "eslint-config-standard": "14.1.0", + "eslint-config-standard-jsx": "8.1.0", + "eslint-plugin-import": "~2.18.0", + "eslint-plugin-node": "~10.0.0", + "eslint-plugin-promise": "~4.2.1", + "eslint-plugin-react": "~7.14.2", + "eslint-plugin-standard": "~4.0.0", + "standard-engine": "^12.0.0" + } + }, "semver": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", @@ -7040,23 +9217,6 @@ "tweetnacl": "~0.14.0" } }, - "standard": { - "version": "14.3.1", - "resolved": "https://registry.npmjs.org/standard/-/standard-14.3.1.tgz", - "integrity": "sha512-TUQwU7znlZLfgKH1Zwn/D84FitWZkUTfbxSiz/vFx+4c9GV+clSfG/qLiLZOlcdyzhw3oF5/pZydNjbNDfHPEw==", - "dev": true, - "requires": { - "eslint": "~6.4.0", - "eslint-config-standard": "14.1.0", - "eslint-config-standard-jsx": "8.1.0", - "eslint-plugin-import": "~2.18.0", - "eslint-plugin-node": "~10.0.0", - "eslint-plugin-promise": "~4.2.1", - "eslint-plugin-react": "~7.14.2", - "eslint-plugin-standard": "~4.0.0", - "standard-engine": "^12.0.0" - } - }, "standard-engine": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-12.0.0.tgz", @@ -7071,7 +9231,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -7138,9 +9298,9 @@ } }, "string.prototype.trimleft": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", - "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", "dev": true, "requires": { "define-properties": "^1.1.3", @@ -7148,9 +9308,9 @@ } }, "string.prototype.trimright": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", - "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", "dev": true, "requires": { "define-properties": "^1.1.3", @@ -7206,12 +9366,12 @@ }, "dependencies": { "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.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", "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" @@ -7224,9 +9384,9 @@ "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 }, "json-schema-traverse": { @@ -7235,12 +9395,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -7523,18 +9677,18 @@ }, "dependencies": { "mime-db": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", - "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", + "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.25", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", - "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", + "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.42.0" + "mime-db": "1.43.0" } } } @@ -7723,6 +9877,15 @@ "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", "dev": true }, + "v8flags": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", + "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, "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", diff --git a/package.json b/package.json index 22f5f64..bc1daf6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "feathers-cassandra", "description": "Feathers service adapter for Cassandra DB based on Express-Cassandra ORM and CassanKnex query builder", - "version": "3.4.0", + "version": "3.4.1", "homepage": "https://github.com/dekelev/feathers-cassandra", "keywords": [ "feathers", @@ -36,16 +36,18 @@ ], "scripts": { "prepare": "npm run compile", - "publish": "git push origin && git push origin --tags", + "publish": "git push origin --tags && npm run changelog && git push origin", + "changelog": "github_changelog_generator && git add CHANGELOG.md && git commit -am \"Updating changelog\"", "release:patch": "npm version patch && npm publish", "release:minor": "npm version minor && npm publish", "release:major": "npm version major && npm publish", "compile": "rimraf lib/ && babel -d lib/ src/", "watch": "babel --watch -d lib/ src/", - "lint": "standard --fix src/**/*.js test/**/*.js --config", + "lint": "semistandard --fix src/**/*.js test/**/*.js --config", + "dtslint": "dtslint --localTs node_modules/typescript/lib types", "mocha": "nyc mocha --opts mocha.opts", "coverage": "nyc report --reporter=text-lcov | coveralls", - "test": "npm run compile && npm run lint && npm run mocha", + "test": "npm run compile && npm run lint && npm run dtslint && npm run mocha", "example": "npm run compile && babel-node example/app" }, "directories": { @@ -58,13 +60,14 @@ "lodash.isequal": "^4.5.0" }, "devDependencies": { - "@babel/cli": "^7.7.5", - "@babel/core": "^7.7.5", - "@babel/preset-env": "^7.7.5", - "@babel/register": "^7.7.4", - "@feathersjs/adapter-tests": "^4.4.1", - "@feathersjs/express": "^4.4.1", - "@feathersjs/feathers": "^4.4.1", + "@babel/cli": "^7.7.7", + "@babel/core": "^7.7.7", + "@babel/preset-env": "^7.7.7", + "@babel/node": "^7.7.7", + "@babel/register": "^7.7.7", + "@feathersjs/adapter-tests": "^4.4.3", + "@feathersjs/express": "^4.4.3", + "@feathersjs/feathers": "^4.4.3", "await-sleep": "0.0.1", "babel-eslint": "^10.0.3", "babel-plugin-add-module-exports": "^1.0.2", @@ -82,7 +85,7 @@ "request": "^2.88.0", "request-promise": "^4.2.5", "rimraf": "^3.0.0", - "standard": "^14.3.1" + "semistandard": "^14.2.0" }, "peerDependencies": { "express-cassandra": "*" @@ -111,7 +114,7 @@ "example/**" ] }, - "standard": { + "semistandard": { "parser": "babel-eslint", "env": [ "mocha" diff --git a/src/error-handler.js b/src/error-handler.js index f6f134d..72543f0 100644 --- a/src/error-handler.js +++ b/src/error-handler.js @@ -1,6 +1,6 @@ -const errors = require('@feathersjs/errors') +const errors = require('@feathersjs/errors'); -const ERROR = Symbol('feathers-knex/error') +const ERROR = Symbol('feathers-knex/error'); const ERROR_CODES = { serverError: 0x0000, protocolError: 0x000A, @@ -20,79 +20,79 @@ const ERROR_CODES = { configError: 0x2300, alreadyExists: 0x2400, unprepared: 0x2500 -} +}; module.exports = function errorHandler (error) { - const { message } = error - let feathersError = error + const { message } = error; + let feathersError = error; if (error instanceof TypeError) { - feathersError = new errors.BadRequest(message) + feathersError = new errors.BadRequest(message); } else if (!(error instanceof errors.FeathersError)) { if (error.code !== undefined) { // CassanKnex errors switch (error.code) { case ERROR_CODES.syntaxError: case ERROR_CODES.invalid: case ERROR_CODES.truncateError: - feathersError = new errors.BadRequest(message) - break + feathersError = new errors.BadRequest(message); + break; case ERROR_CODES.badCredentials: - feathersError = new errors.NotAuthenticated(message) - break + feathersError = new errors.NotAuthenticated(message); + break; case ERROR_CODES.unauthorized: - feathersError = new errors.Forbidden(message) - break + feathersError = new errors.Forbidden(message); + break; case ERROR_CODES.functionFailure: - feathersError = new errors.MethodNotAllowed(message) - break + feathersError = new errors.MethodNotAllowed(message); + break; case ERROR_CODES.protocolError: - feathersError = new errors.NotAcceptable(message) - break + feathersError = new errors.NotAcceptable(message); + break; case ERROR_CODES.readTimeout: case ERROR_CODES.writeTimeout: - feathersError = new errors.Timeout(message) - break + feathersError = new errors.Timeout(message); + break; case ERROR_CODES.alreadyExists: - feathersError = new errors.Conflict(message) - break + feathersError = new errors.Conflict(message); + break; case ERROR_CODES.overloaded: - feathersError = new errors.Unprocessable(message) - break + feathersError = new errors.Unprocessable(message); + break; case ERROR_CODES.configError: case ERROR_CODES.serverError: case ERROR_CODES.readFailure: case ERROR_CODES.writeFailure: - feathersError = new errors.GeneralError(message) - break + feathersError = new errors.GeneralError(message); + break; case ERROR_CODES.unprepared: - feathersError = new errors.NotImplemented(message) - break + feathersError = new errors.NotImplemented(message); + break; case ERROR_CODES.isBootstrapping: case ERROR_CODES.unavailableException: - feathersError = new errors.Unavailable(message) - break + feathersError = new errors.Unavailable(message); + break; default: - feathersError = new errors.GeneralError(message) + feathersError = new errors.GeneralError(message); } } else { - feathersError = new errors.GeneralError(message) + feathersError = new errors.GeneralError(message); } } - feathersError[ERROR] = error + feathersError[ERROR] = error; - throw feathersError -} + throw feathersError; +}; -module.exports.ERROR = ERROR +module.exports.ERROR = ERROR; diff --git a/src/index.js b/src/index.js index 8df7e89..cb9b4dd 100644 --- a/src/index.js +++ b/src/index.js @@ -1,9 +1,9 @@ -const { AdapterService } = require('@feathersjs/adapter-commons') -const errors = require('@feathersjs/errors') -const types = require('cassandra-driver').types -const flatten = require('arr-flatten') -const utils = require('./utils') -const errorHandler = require('./error-handler') +const { AdapterService } = require('@feathersjs/adapter-commons'); +const errors = require('@feathersjs/errors'); +const types = require('cassandra-driver').types; +const flatten = require('arr-flatten'); +const utils = require('./utils'); +const errorHandler = require('./error-handler'); const METHODS = { $or: 'orWhere', // not supported @@ -18,7 +18,7 @@ const METHODS = { $remove: 'remove', $increment: 'increment', $decrement: 'decrement' -} +}; const OPERATORS = { eq: '$eq', @@ -35,7 +35,7 @@ const OPERATORS = { notILike: '$notILike', // not supported or: '$or', // not supported and: '$and' -} +}; const OPERATORS_MAP = { $eq: '=', @@ -53,7 +53,7 @@ const OPERATORS_MAP = { $notILike: 'NOT ILIKE', // not supported $contains: 'CONTAINS', // applicable for indexed collections only $containsKey: 'CONTAINS KEY' // applicable for indexed maps only -} +}; /** * Class representing a feathers adapter for ExpressCassandra ORM & CassanKnex query builder. @@ -66,61 +66,61 @@ const OPERATORS_MAP = { class Service extends AdapterService { constructor (options) { if (!options.model) { - throw new errors.GeneralError('You must provide an ExpressCassandra Model') + throw new errors.GeneralError('You must provide an ExpressCassandra Model'); } - const id = flatten(options.model._properties.schema.key) + const id = flatten(options.model._properties.schema.key); - const whitelist = Object.values(OPERATORS).concat(options.whitelist || []) + const whitelist = Object.values(OPERATORS).concat(options.whitelist || []); super(Object.assign({ id: id.length === 1 ? id[0] : id, whitelist - }, options)) - - this.idSeparator = options.idSeparator || ',' - this.keyspace = options.model.get_keyspace_name() - this.tableName = options.model.get_table_name() - this.materializedViews = options.materializedViews || [] - this.modelOptions = options.model._properties.schema.options || {} - this.fields = options.model._properties.schema.fields - this.filters = options.model._properties.schema.filters || {} + }, options)); + + this.idSeparator = options.idSeparator || ','; + this.keyspace = options.model.get_keyspace_name(); + this.tableName = options.model.get_table_name(); + this.materializedViews = options.materializedViews || []; + this.modelOptions = options.model._properties.schema.options || {}; + this.fields = options.model._properties.schema.fields; + this.filters = options.model._properties.schema.filters || {}; } get Model () { - return this.options.model + return this.options.model; } getModel (params) { - return this.options.model + return this.options.model; } filterQuery (params) { const filter = query => { Object.keys(query).forEach(key => { - const value = query[key] + const value = query[key]; if (key[0] !== '$' && this.fields[key] && utils.getFieldType(this.fields[key]) === 'boolean' && typeof value === 'string') { - query[key] = (value !== '' && value !== '0' && value !== 'false') + query[key] = (value !== '' && value !== '0' && value !== 'false'); } else if (value instanceof types.Uuid || Buffer.isBuffer(value)) { - query[key] = value.toString() + query[key] = value.toString(); } else if (Array.isArray(value)) { value.forEach((fieldValue, fieldKey) => { if (fieldValue instanceof types.Uuid || Buffer.isBuffer(fieldValue)) { - query[key][fieldKey] = fieldValue.toString() + query[key][fieldKey] = fieldValue.toString(); } - }) + }); } else if (utils.isPlainObject(value)) { - return filter(value) + return filter(value); } - }) - } + }); + }; if (params.query) { - filter(params.query) + filter(params.query); } - return super.filterQuery(params) + return super.filterQuery(params); } /** @@ -129,35 +129,35 @@ class Service extends AdapterService { * @param idList */ getIdsQuery (id, idList) { - const query = {} + const query = {}; if (Array.isArray(this.id)) { - let ids = id + let ids = id; if (id && !Array.isArray(id)) { - ids = utils.extractIds(id, this.id, this.idSeparator) + ids = utils.extractIds(id, this.id, this.idSeparator); } this.id.forEach((idKey, index) => { if (!ids) { if (idList) { if (idList[index]) { - query[idKey] = idList[index].length === 1 ? idList[index] : { $in: idList[index] } + query[idKey] = idList[index].length === 1 ? idList[index] : { $in: idList[index] }; } } else { - query[idKey] = null + query[idKey] = null; } } else if (ids[index]) { - query[idKey] = ids[index] + query[idKey] = ids[index]; } else { - throw new errors.BadRequest('When using composite primary key, id must contain values for all primary keys') + throw new errors.BadRequest('When using composite primary key, id must contain values for all primary keys'); } - }) + }); } else { - query[`${this.id}`] = idList ? (idList.length === 1 ? idList[0] : { $in: idList }) : id + query[`${this.id}`] = idList ? (idList.length === 1 ? idList[0] : { $in: idList }) : id; } - return query + return query; } /** @@ -168,164 +168,164 @@ class Service extends AdapterService { * @param methodKey */ objectify (query, params, parentKey, methodKey) { - if (params.$filters) { delete params.$filters } - if (params.$allowFiltering) { delete params.$allowFiltering } - if (!isNaN(params.$ttl)) { delete params.$ttl } - if (params.$timestamp) { delete params.$timestamp } - if (params.$noSelect) { delete params.$noSelect } - if (params.$limitPerPartition) { delete params.$limitPerPartition } + if (params.$filters) { delete params.$filters; } + if (params.$allowFiltering) { delete params.$allowFiltering; } + if (!isNaN(params.$ttl)) { delete params.$ttl; } + if (params.$timestamp) { delete params.$timestamp; } + if (params.$noSelect) { delete params.$noSelect; } + if (params.$limitPerPartition) { delete params.$limitPerPartition; } Object.keys(params || {}).forEach(key => { - if (parentKey === '$token' && key === '$condition') { return } + if (parentKey === '$token' && key === '$condition') { return; } - let value = params[key] + let value = params[key]; if (utils.isPlainObject(value)) { - return this.objectify(query, value, key, parentKey) + return this.objectify(query, value, key, parentKey); } - const column = parentKey && parentKey[0] !== '$' ? parentKey : key - const method = METHODS[methodKey] || METHODS[parentKey] || METHODS[key] - const operator = OPERATORS_MAP[key] || '=' + const column = parentKey && parentKey[0] !== '$' ? parentKey : key; + const method = METHODS[methodKey] || METHODS[parentKey] || METHODS[key]; + const operator = OPERATORS_MAP[key] || '='; if (method) { if (!methodKey && (key === '$or' || key === '$and')) { value.forEach(condition => { - this.objectify(query, condition, null, key) - }) + this.objectify(query, condition, null, key); + }); - return + return; } if (parentKey === '$token') { - return query.tokenWhere(params.$keys, OPERATORS_MAP[Object.keys(params.$condition)[0]], params.$condition[Object.keys(params.$condition)[0]]) + return query.tokenWhere(params.$keys, OPERATORS_MAP[Object.keys(params.$condition)[0]], params.$condition[Object.keys(params.$condition)[0]]); } - if (method === METHODS.$or) { throw new errors.BadRequest('`$or` is not supported') } + if (method === METHODS.$or) { throw new errors.BadRequest('`$or` is not supported'); } - if (method === METHODS.$if && value === 'null') { value = null } + if (method === METHODS.$if && value === 'null') { value = null; } - return query[method].call(query, column, operator, value) // eslint-disable-line no-useless-call + return query[method].call(query, column, operator, value); // eslint-disable-line no-useless-call } - if (operator === 'NOT IN') { throw new errors.BadRequest('`$nin` is not supported') } + if (operator === 'NOT IN') { throw new errors.BadRequest('`$nin` is not supported'); } - return query.where(column, operator, value) - }) + return query.where(column, operator, value); + }); } _createQuery (type) { - let q = null + let q = null; if (!Service.cassanknex) { - throw new errors.GeneralError('You must bind FeathersCassandra with an initialized CassanKnex object') + throw new errors.GeneralError('You must bind FeathersCassandra with an initialized CassanKnex object'); } - if (!type) { q = Service.cassanknex(this.keyspace).from(this.tableName) } - if (type === 'create') { q = Service.cassanknex(this.keyspace).into(this.tableName) } - if (type === 'update') { q = Service.cassanknex(this.keyspace).update(this.tableName) } - if (type === 'delete') { q = Service.cassanknex(this.keyspace).delete().from(this.tableName) } + if (!type) { q = Service.cassanknex(this.keyspace).from(this.tableName); } + if (type === 'create') { q = Service.cassanknex(this.keyspace).into(this.tableName); } + if (type === 'update') { q = Service.cassanknex(this.keyspace).update(this.tableName); } + if (type === 'delete') { q = Service.cassanknex(this.keyspace).delete().from(this.tableName); } - return q + return q; } createQuery (filters, query) { - let q = this._createQuery() + let q = this._createQuery(); // $select uses a specific find syntax, so it has to come first. if (filters.$select) { - const fieldsToRemove = [] + const fieldsToRemove = []; for (const field of filters.$select) { - const match = field && field.match(/(ttl|writetime|dateOf|unixTimestampOf|toDate|toTimestamp|toUnixTimestamp)\((.+)\)/) + const match = field && field.match(/(ttl|writetime|dateOf|unixTimestampOf|toDate|toTimestamp|toUnixTimestamp)\((.+)\)/); if (match) { - const fieldMethod = match[1] - const fieldName = match[2] + const fieldMethod = match[1]; + const fieldName = match[2]; - q[fieldMethod]({ [fieldName]: `${fieldMethod}(${fieldName})` }) - fieldsToRemove.push(field) + q[fieldMethod]({ [fieldName]: `${fieldMethod}(${fieldName})` }); + fieldsToRemove.push(field); } } - filters.$select = filters.$select.filter(val => !fieldsToRemove.includes(val)) + filters.$select = filters.$select.filter(val => !fieldsToRemove.includes(val)); - q = q.select(...filters.$select.concat(this.id)) + q = q.select(...filters.$select.concat(this.id)); } else { - q = q.select() + q = q.select(); } - this.objectify(q, query) + this.objectify(q, query); if (filters.$sort) { Object.keys(filters.$sort).forEach(key => { - q = q.orderBy(key, filters.$sort[key] === 1 ? 'asc' : 'desc') - }) + q = q.orderBy(key, filters.$sort[key] === 1 ? 'asc' : 'desc'); + }); } - return q + return q; } validate (data, type) { - const model = new this.Model() - const fields = type === 'patch' ? Object.keys(data) : Object.keys(this.fields) + const model = new this.Model(); + const fields = type === 'patch' ? Object.keys(data) : Object.keys(this.fields); if (type === 'update') { if (Array.isArray(this.id)) { for (const idKey of this.id) { - fields.splice(fields.indexOf(idKey), 1) + fields.splice(fields.indexOf(idKey), 1); } } else { - fields.splice(fields.indexOf(this.id), 1) + fields.splice(fields.indexOf(this.id), 1); } } for (const field of fields) { - let value = data[field] - const fieldRule = utils.getFieldRule(this.fields[field]) - const fieldType = utils.getFieldType(this.fields[field]) + let value = data[field]; + const fieldRule = utils.getFieldRule(this.fields[field]); + const fieldType = utils.getFieldType(this.fields[field]); if (value === undefined || value === null) { - if (fieldRule && fieldRule.required) { throw new errors.BadRequest(`\`${field}\` field is required`) } + if (fieldRule && fieldRule.required) { throw new errors.BadRequest(`\`${field}\` field is required`); } } - let methodKey = null + let methodKey = null; if (value && utils.isPlainObject(value) && METHODS[Object.keys(value)[0]]) { - methodKey = Object.keys(value)[0] + methodKey = Object.keys(value)[0]; } if (!methodKey || methodKey !== '$remove' || fieldType !== 'map') { - if (methodKey === '$increment' || methodKey === '$decrement') { value = Number(value) } + if (methodKey === '$increment' || methodKey === '$decrement') { value = Number(value); } - let valueToValidate = methodKey ? value[methodKey] : value + let valueToValidate = methodKey ? value[methodKey] : value; if (valueToValidate) { if (fieldType === 'timeuuid') { if (valueToValidate instanceof types.TimeUuid || valueToValidate.constructor.name === 'TimeUuid' || Buffer.isBuffer(valueToValidate)) { - data[field] = valueToValidate.toString() + data[field] = valueToValidate.toString(); } else { - valueToValidate = types.TimeUuid.fromString(valueToValidate.toString()) + valueToValidate = types.TimeUuid.fromString(valueToValidate.toString()); } if (valueToValidate instanceof types.TimeUuid) { // workaround for issue with express-cassandra validator when fromString is used - continue + continue; } } else if (fieldType === 'uuid') { if (valueToValidate instanceof types.Uuid || valueToValidate.constructor.name === 'Uuid' || Buffer.isBuffer(valueToValidate)) { - data[field] = valueToValidate.toString() + data[field] = valueToValidate.toString(); } else { - valueToValidate = types.Uuid.fromString(valueToValidate.toString()) + valueToValidate = types.Uuid.fromString(valueToValidate.toString()); } if (valueToValidate instanceof types.Uuid) { // workaround for issue with express-cassandra validator when fromString is used - continue + continue; } } } - const validated = model.validate(field, valueToValidate) + const validated = model.validate(field, valueToValidate); - if (validated !== true) { throw new errors.BadRequest(validated(valueToValidate, field, fieldType)) } + if (validated !== true) { throw new errors.BadRequest(validated(valueToValidate, field, fieldType)); } } } } @@ -336,37 +336,37 @@ class Service extends AdapterService { */ _find (params) { const find = (params, count, filters, query) => { - let allowFiltering = false - let filtersQueue = null - const materializedView = utils.getMaterializedView(query, this.materializedViews) - const q = this.createQuery(filters, query) + let allowFiltering = false; + let filtersQueue = null; + const materializedView = utils.getMaterializedView(query, this.materializedViews); + const q = this.createQuery(filters, query); - if (materializedView) { q.from(materializedView) } + if (materializedView) { q.from(materializedView); } if (params.query) { if (params.query.$allowFiltering) { - allowFiltering = true - q.allowFiltering() - delete params.query.$allowFiltering + allowFiltering = true; + q.allowFiltering(); + delete params.query.$allowFiltering; } if (params.query.$filters) { - filtersQueue = utils.runFilters(params, q, params.query.$filters, this.filters) - delete params.query.$filters + filtersQueue = utils.runFilters(params, q, params.query.$filters, this.filters); + delete params.query.$filters; } if (params.query.$limitPerPartition) { - q.limitPerPartition(params.query.$limitPerPartition) - delete params.query.$limitPerPartition + q.limitPerPartition(params.query.$limitPerPartition); + delete params.query.$limitPerPartition; } } if (filters.$limit) { - q.limit(filters.$limit) + q.limit(filters.$limit); } let executeQuery = res => { - const total = res ? Number(res.rows[0].count) : undefined + const total = res ? Number(res.rows[0].count) : undefined; return utils.exec(q, params) .then(res => { @@ -374,68 +374,68 @@ class Service extends AdapterService { total, limit: filters.$limit, data: res.rows - } - }) - } + }; + }); + }; if (filters.$limit === 0) { executeQuery = res => { - const total = res ? Number(res.rows[0].count) : undefined + const total = res ? Number(res.rows[0].count) : undefined; return Promise.resolve({ total, limit: filters.$limit, data: [] - }) - } + }); + }; } if (count) { const countQuery = this._createQuery() .select() - .count('*') + .count('*'); - if (allowFiltering) { countQuery.allowFiltering() } + if (allowFiltering) { countQuery.allowFiltering(); } if (filtersQueue) { - for (const filter of filtersQueue) { filter(countQuery) } + for (const filter of filtersQueue) { filter(countQuery); } } - this.objectify(countQuery, query) + this.objectify(countQuery, query); return utils.exec(countQuery, params) .then(res => { - return executeQuery(res) + return executeQuery(res); }) - .catch(errorHandler) + .catch(errorHandler); } - return executeQuery().catch(errorHandler) - } + return executeQuery().catch(errorHandler); + }; - const { filters, query, paginate } = this.filterQuery(params) - const result = find(params, Boolean(paginate && paginate.default), filters, query) + const { filters, query, paginate } = this.filterQuery(params); + const result = find(params, Boolean(paginate && paginate.default), filters, query); if (!paginate || !paginate.default) { - return result.then(page => page.data || page) + return result.then(page => page.data || page); } - return result + return result; } _get (id, params) { - const query = Object.assign({}, params.query, this.getIdsQuery(id)) + const query = Object.assign({}, params.query, this.getIdsQuery(id)); return this._find(Object.assign({}, params, { query })) .then(page => { - const data = page.data || page + const data = page.data || page; if (data.length !== 1) { - throw new errors.NotFound(`No record found for id '${id}'`) + throw new errors.NotFound(`No record found for id '${id}'`); } - return data[0] - }) + return data[0]; + }); } /** @@ -445,84 +445,84 @@ class Service extends AdapterService { */ _create (data, params) { const create = (data, params, hookOptions, batch = false) => { - this.validate(data) - utils.setTimestampFields(data, true, true, this.modelOptions.timestamps) - utils.setVersionField(data, this.modelOptions.versions) + this.validate(data); + utils.setTimestampFields(data, true, true, this.modelOptions.timestamps); + utils.setVersionField(data, this.modelOptions.versions); - const beforeHook = this.Model._properties.schema.before_save - const afterHook = this.Model._properties.schema.after_save + const beforeHook = this.Model._properties.schema.before_save; + const afterHook = this.Model._properties.schema.after_save; - if (beforeHook && beforeHook(data, hookOptions) === false) { throw new errors.BadRequest('Error in before_save lifecycle function') } + if (beforeHook && beforeHook(data, hookOptions) === false) { throw new errors.BadRequest('Error in before_save lifecycle function'); } - const q = this._createQuery('create') + const q = this._createQuery('create'); if (params.query) { if (params.query.$ifNotExists) { - q.ifNotExists() - delete params.query.$ifNotExists + q.ifNotExists(); + delete params.query.$ifNotExists; } if (!isNaN(params.query.$ttl)) { - q.usingTTL(Number(params.query.$ttl)) - delete params.query.$ttl + q.usingTTL(Number(params.query.$ttl)); + delete params.query.$ttl; } if (params.query.$timestamp) { - q.usingTimestamp(params.query.$timestamp) - delete params.query.$timestamp + q.usingTimestamp(params.query.$timestamp); + delete params.query.$timestamp; } } if (batch) { - return q.insert(data) + return q.insert(data); } return utils.exec(q.insert(data), params) .then(row => { - if (afterHook && afterHook(data, hookOptions) === false) { throw new errors.BadRequest('Error in after_save lifecycle function') } + if (afterHook && afterHook(data, hookOptions) === false) { throw new errors.BadRequest('Error in after_save lifecycle function'); } - if (params.query && params.query.$noSelect) { return data } + if (params.query && params.query.$noSelect) { return data; } - let id = null + let id = null; if (Array.isArray(this.id)) { - id = [] + id = []; for (const idKey of this.id) { - id.push(typeof data[idKey] !== 'undefined' ? data[idKey] : row[idKey]) + id.push(typeof data[idKey] !== 'undefined' ? data[idKey] : row[idKey]); } } else { - id = typeof data[this.id] !== 'undefined' ? data[this.id] : row[this.id] + id = typeof data[this.id] !== 'undefined' ? data[this.id] : row[this.id]; } - return this._get(id, params) + return this._get(id, params); }) - .catch(errorHandler) - } + .catch(errorHandler); + }; if (Array.isArray(data)) { - const dataCopy = data.map(val => Object.assign({}, val)) - const query = this.filterQuery(params).query + const dataCopy = data.map(val => Object.assign({}, val)); + const query = this.filterQuery(params).query; if (query.$batch) { - const afterHook = this.Model._properties.schema.after_save - const hookOptions = utils.getHookOptions(query) + const afterHook = this.Model._properties.schema.after_save; + const hookOptions = utils.getHookOptions(query); return utils.batch(Service.cassanknex, dataCopy.map(current => create(current, params, hookOptions, true)), params) .then(res => { dataCopy.forEach(item => { - if (afterHook && afterHook(item, hookOptions) === false) { throw new errors.BadRequest('Error in after_save lifecycle function') } - }) + if (afterHook && afterHook(item, hookOptions) === false) { throw new errors.BadRequest('Error in after_save lifecycle function'); } + }); - return dataCopy + return dataCopy; }) - .catch(errorHandler) + .catch(errorHandler); } - return Promise.all(dataCopy.map(current => create(current, params))) + return Promise.all(dataCopy.map(current => create(current, params))); } - return create(Object.assign({}, data), params) + return create(Object.assign({}, data), params); } /** @@ -533,113 +533,113 @@ class Service extends AdapterService { */ _update (id, data, params) { const update = (id, data, params, oldData) => { - const fields = Object.keys(oldData || this.fields) - const createdAtField = this.modelOptions.timestamps && this.modelOptions.timestamps.createdAt - let newObject = {} + const fields = Object.keys(oldData || this.fields); + const createdAtField = this.modelOptions.timestamps && this.modelOptions.timestamps.createdAt; + let newObject = {}; // Set missing fields to null for (const key of fields) { if (data[key] === undefined) { if (!createdAtField || key !== createdAtField) { - newObject[key] = null + newObject[key] = null; } } else { - newObject[key] = data[key] + newObject[key] = data[key]; } } // Delete id field so we don't update it if (Array.isArray(this.id)) { for (const idKey of this.id) { - delete newObject[idKey] + delete newObject[idKey]; } } else { - delete newObject[this.id] + delete newObject[this.id]; } - const q = this._createQuery('update') - const idsQuery = this.getIdsQuery(id) + const q = this._createQuery('update'); + const idsQuery = this.getIdsQuery(id); if (params.query && !isNaN(params.query.$ttl)) { - q.usingTTL(Number(params.query.$ttl)) - delete params.query.$ttl + q.usingTTL(Number(params.query.$ttl)); + delete params.query.$ttl; } if (params.query && params.query.$timestamp) { - q.usingTimestamp(params.query.$timestamp) - delete params.query.$timestamp + q.usingTimestamp(params.query.$timestamp); + delete params.query.$timestamp; } - utils.prepareData(q, newObject, METHODS) + utils.prepareData(q, newObject, METHODS); - q.set(newObject) + q.set(newObject); Object.keys(idsQuery).forEach(key => { - q.where(key, '=', idsQuery[key]) - }) + q.where(key, '=', idsQuery[key]); + }); if (!oldData) { - const query = this.filterQuery(params).query - utils.prepareIfCondition(id, query, this.id) - this.objectify(q, query) + const query = this.filterQuery(params).query; + utils.prepareIfCondition(id, query, this.id); + this.objectify(q, query); } return utils.exec(q, params) .then(() => { // Restore the createdAt field so we can return it to the client - if (createdAtField && !newObject[createdAtField] && oldData) { newObject[createdAtField] = oldData[createdAtField] } + if (createdAtField && !newObject[createdAtField] && oldData) { newObject[createdAtField] = oldData[createdAtField]; } // Restore the id field so we can return it to the client if (Array.isArray(this.id)) { - newObject = Object.assign({}, newObject, this.getIdsQuery(id)) + newObject = Object.assign({}, newObject, this.getIdsQuery(id)); } else { - newObject[this.id] = id + newObject[this.id] = id; } if (oldData) { - utils.prepareUpdateResult(data, oldData, newObject, this.fields) + utils.prepareUpdateResult(data, oldData, newObject, this.fields); } if (params.query && params.query.$select) { - const selectedFields = {} - for (const field of params.query.$select) { selectedFields[field] = newObject[field] } + const selectedFields = {}; + for (const field of params.query.$select) { selectedFields[field] = newObject[field]; } - return selectedFields + return selectedFields; } - return newObject + return newObject; }) - .catch(errorHandler) - } + .catch(errorHandler); + }; - this.validate(data, 'update') - utils.setTimestampFields(data, true, false, this.modelOptions.timestamps) - utils.setVersionField(data, this.modelOptions.versions) + this.validate(data, 'update'); + utils.setTimestampFields(data, true, false, this.modelOptions.timestamps); + utils.setVersionField(data, this.modelOptions.versions); - const beforeHook = this.Model._properties.schema.before_update - const afterHook = this.Model._properties.schema.after_update - const hookOptions = utils.getHookOptions(params.query) + const beforeHook = this.Model._properties.schema.before_update; + const afterHook = this.Model._properties.schema.after_update; + const hookOptions = utils.getHookOptions(params.query); - if (beforeHook && beforeHook(params.query, data, hookOptions, id) === false) { throw new errors.BadRequest('Error in before_update lifecycle function') } + if (beforeHook && beforeHook(params.query, data, hookOptions, id) === false) { throw new errors.BadRequest('Error in before_update lifecycle function'); } if (params.query && params.query.$noSelect) { - delete params.query.$noSelect + delete params.query.$noSelect; return update(id, data, params) .then(data => { - if (afterHook && afterHook(params.query, data, hookOptions, id) === false) { throw new errors.BadRequest('Error in after_update lifecycle function') } - return data - }) + if (afterHook && afterHook(params.query, data, hookOptions, id) === false) { throw new errors.BadRequest('Error in after_update lifecycle function'); } + return data; + }); } return this._get(id, params) .then(oldData => { return update(id, data, params, oldData) .then(data => { - if (afterHook && afterHook(params.query, data, hookOptions, id) === false) { throw new errors.BadRequest('Error in after_update lifecycle function') } - return data - }) - }) + if (afterHook && afterHook(params.query, data, hookOptions, id) === false) { throw new errors.BadRequest('Error in after_update lifecycle function'); } + return data; + }); + }); } /** @@ -649,96 +649,96 @@ class Service extends AdapterService { * @param params */ _patch (id, data, params) { - this.validate(data, 'patch') - utils.setTimestampFields(data, true, false, this.modelOptions.timestamps) - utils.setVersionField(data, this.modelOptions.versions) + this.validate(data, 'patch'); + utils.setTimestampFields(data, true, false, this.modelOptions.timestamps); + utils.setVersionField(data, this.modelOptions.versions); - const beforeHook = this.Model._properties.schema.before_update - const afterHook = this.Model._properties.schema.after_update - const hookOptions = utils.getHookOptions(params.query) + const beforeHook = this.Model._properties.schema.before_update; + const afterHook = this.Model._properties.schema.after_update; + const hookOptions = utils.getHookOptions(params.query); - if (beforeHook && beforeHook(params.query, data, hookOptions, id) === false) { throw new errors.BadRequest('Error in before_update lifecycle function') } + if (beforeHook && beforeHook(params.query, data, hookOptions, id) === false) { throw new errors.BadRequest('Error in before_update lifecycle function'); } - let { filters, query } = this.filterQuery(params) - const dataCopy = Object.assign({}, data) + let { filters, query } = this.filterQuery(params); + const dataCopy = Object.assign({}, data); const mapIds = page => Array.isArray(this.id) ? this.id.map(idKey => [...new Set((page.data || page).map(current => current[idKey]))]) - : (page.data || page).map(current => current[this.id]) + : (page.data || page).map(current => current[this.id]); // By default we will just query for the one id. For multi patch // we create a list of the ids of all items that will be changed // to re-query them after the update const ids = - id === null ? this._find(params).then(mapIds) : Promise.resolve([id]) + id === null ? this._find(params).then(mapIds) : Promise.resolve([id]); if (id !== null) { if (Array.isArray(this.id)) { - query = Object.assign({}, query, this.getIdsQuery(id)) + query = Object.assign({}, query, this.getIdsQuery(id)); } else { - query[this.id] = id + query[this.id] = id; } } - const q = this._createQuery('update') + const q = this._createQuery('update'); if (params.query) { if (!isNaN(params.query.$ttl)) { - q.usingTTL(Number(params.query.$ttl)) - delete params.query.$ttl + q.usingTTL(Number(params.query.$ttl)); + delete params.query.$ttl; } if (params.query.$timestamp) { - q.usingTimestamp(params.query.$timestamp) - delete params.query.$timestamp + q.usingTimestamp(params.query.$timestamp); + delete params.query.$timestamp; } } - utils.prepareIfCondition(id, query, this.id) - this.objectify(q, query) + utils.prepareIfCondition(id, query, this.id); + this.objectify(q, query); if (Array.isArray(this.id)) { for (const idKey of this.id) { - delete dataCopy[idKey] + delete dataCopy[idKey]; } } else { - delete dataCopy[this.id] + delete dataCopy[this.id]; } return ids .then(idList => { // Create a new query that re-queries all ids that // were originally changed - const selectParam = filters.$select ? { $select: filters.$select } : undefined - const findParams = Object.assign({}, params, { query: Object.assign({}, this.getIdsQuery(id, idList), selectParam) }) + const selectParam = filters.$select ? { $select: filters.$select } : undefined; + const findParams = Object.assign({}, params, { query: Object.assign({}, this.getIdsQuery(id, idList), selectParam) }); - utils.prepareData(q, dataCopy, METHODS) + utils.prepareData(q, dataCopy, METHODS); - q.set(dataCopy) + q.set(dataCopy); return utils.exec(q, params) .then(() => { - if (afterHook && afterHook(params.query, data, hookOptions, id) === false) { throw new errors.BadRequest('Error in after_update lifecycle function') } + if (afterHook && afterHook(params.query, data, hookOptions, id) === false) { throw new errors.BadRequest('Error in after_update lifecycle function'); } return params.query && params.query.$noSelect ? {} : this._find(findParams) .then(page => { - const items = page.data || page + const items = page.data || page; if (id !== null) { if (items.length === 1) { - return items[0] + return items[0]; } else { - throw new errors.NotFound(`No record found for id '${id}'`) + throw new errors.NotFound(`No record found for id '${id}'`); } } else if (!items.length) { - throw new errors.NotFound(`No record found for id '${id}'`) + throw new errors.NotFound(`No record found for id '${id}'`); } - return items - }) - }) + return items; + }); + }); }) - .catch(errorHandler) + .catch(errorHandler); } /** @@ -747,73 +747,73 @@ class Service extends AdapterService { * @param params */ _remove (id, params) { - const beforeHook = this.Model._properties.schema.before_delete - const afterHook = this.Model._properties.schema.after_delete - const hookOptions = utils.getHookOptions(params.query) + const beforeHook = this.Model._properties.schema.before_delete; + const afterHook = this.Model._properties.schema.after_delete; + const hookOptions = utils.getHookOptions(params.query); - if (beforeHook && beforeHook(params.query, hookOptions, id) === false) { throw new errors.BadRequest('Error in before_delete lifecycle function') } + if (beforeHook && beforeHook(params.query, hookOptions, id) === false) { throw new errors.BadRequest('Error in before_delete lifecycle function'); } - params.query = Object.assign({}, params.query) + params.query = Object.assign({}, params.query); // First fetch the record so that we can return // it when we delete it. if (id !== null) { if (Array.isArray(this.id)) { - params.query = Object.assign({}, params.query, this.getIdsQuery(id)) + params.query = Object.assign({}, params.query, this.getIdsQuery(id)); } else { - params.query[this.id] = id + params.query[this.id] = id; } } - const { query: queryParams } = this.filterQuery(params) - const query = this._createQuery('delete') + const { query: queryParams } = this.filterQuery(params); + const query = this._createQuery('delete'); - utils.prepareIfCondition(id, queryParams, this.id) - this.objectify(query, queryParams) + utils.prepareIfCondition(id, queryParams, this.id); + this.objectify(query, queryParams); if (params.query && params.query.$noSelect) { return utils.exec(query, params) .then(() => { - if (afterHook && afterHook(params.query, hookOptions, id) === false) { throw new errors.BadRequest('Error in after_delete lifecycle function') } - return {} + if (afterHook && afterHook(params.query, hookOptions, id) === false) { throw new errors.BadRequest('Error in after_delete lifecycle function'); } + return {}; }) - .catch(errorHandler) + .catch(errorHandler); } else { return this._find(params) .then(page => { - const items = page.data || page + const items = page.data || page; return utils.exec(query, params) .then(() => { - if (afterHook && afterHook(params.query, hookOptions, id) === false) { throw new errors.BadRequest('Error in after_delete lifecycle function') } + if (afterHook && afterHook(params.query, hookOptions, id) === false) { throw new errors.BadRequest('Error in after_delete lifecycle function'); } if (id !== null) { if (items.length === 1) { - return items[0] + return items[0]; } else { - throw new errors.NotFound(`No record found for id '${id}'`) + throw new errors.NotFound(`No record found for id '${id}'`); } } else if (!items.length) { - throw new errors.NotFound(`No record found for id '${id}'`) + throw new errors.NotFound(`No record found for id '${id}'`); } - return items - }) + return items; + }); }) - .catch(errorHandler) + .catch(errorHandler); } } } const init = options => { - return new Service(options) -} + return new Service(options); +}; init.cassanknex = val => { - Service.cassanknex = val -} + Service.cassanknex = val; +}; -init.Service = Service -init.ERROR = errorHandler.ERROR +init.Service = Service; +init.ERROR = errorHandler.ERROR; -module.exports = init +module.exports = init; diff --git a/src/utils.js b/src/utils.js index 13b1541..eb3977a 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,205 +1,205 @@ -const errors = require('@feathersjs/errors') -const _isEqual = require('lodash.isequal') -const types = require('cassandra-driver').types +const errors = require('@feathersjs/errors'); +const _isEqual = require('lodash.isequal'); +const types = require('cassandra-driver').types; exports.isPlainObject = obj => { - return obj && obj.constructor === {}.constructor -} + return obj && obj.constructor === {}.constructor; +}; exports.extractIds = (id, idKey, idSeparator) => { - if (typeof id === 'object') { return idKey.map(idKey => id[idKey]) } - if (id[0] === '[' && id[id.length - 1] === ']') { return JSON.parse(id) } + if (typeof id === 'object') { return idKey.map(idKey => id[idKey]); } + if (id[0] === '[' && id[id.length - 1] === ']') { return JSON.parse(id); } if (id[0] === '{' && id[id.length - 1] === '}') { - const obj = JSON.parse(id) - return Object.keys(obj).map(key => obj[key]) + const obj = JSON.parse(id); + return Object.keys(obj).map(key => obj[key]); } - if (typeof id !== 'string' || !id.includes(idSeparator)) { throw new errors.BadRequest('When using composite primary key, id must contain values for all primary keys') } + if (typeof id !== 'string' || !id.includes(idSeparator)) { throw new errors.BadRequest('When using composite primary key, id must contain values for all primary keys'); } - return id.split(idSeparator) -} + return id.split(idSeparator); +}; exports.runFilters = (params, query, filtersExpression, filtersFunctions) => { - const filters = [] - const filtersNames = filtersExpression.replace(/[^a-zA-Z0-9_,]/g, '').split(',') + const filters = []; + const filtersNames = filtersExpression.replace(/[^a-zA-Z0-9_,]/g, '').split(','); for (const name of filtersNames) { - if (name && filtersFunctions[name]) { filters.push(filtersFunctions[name]) } + if (name && filtersFunctions[name]) { filters.push(filtersFunctions[name]); } } - for (const filter of filters) { filter(query) } + for (const filter of filters) { filter(query); } - return filters -} + return filters; +}; exports.getFieldType = field => { - return exports.isPlainObject(field) ? field.type : field -} + return exports.isPlainObject(field) ? field.type : field; +}; exports.getFieldRule = field => { - return exports.isPlainObject(field) ? field.rule : null -} + return exports.isPlainObject(field) ? field.rule : null; +}; exports.prepareUpdateResult = (data, oldData, newObject, fields) => { Object.keys(data).forEach(field => { - const fieldType = exports.getFieldType(fields[field]) - const value = data[field] - const oldFieldValue = oldData[field] + const fieldType = exports.getFieldType(fields[field]); + const value = data[field]; + const oldFieldValue = oldData[field]; if (fieldType && ['map', 'list', 'set'].includes(fieldType) && exports.isPlainObject(value)) { - const methodKey = Object.keys(value)[0] - const fieldValue = value[methodKey] + const methodKey = Object.keys(value)[0]; + const fieldValue = value[methodKey]; if (methodKey === '$add') { if (fieldType === 'map') { - newObject[field] = oldFieldValue ? Object.assign({}, oldFieldValue, fieldValue) : fieldValue + newObject[field] = oldFieldValue ? Object.assign({}, oldFieldValue, fieldValue) : fieldValue; } else if (fieldType === 'list') { - newObject[field] = oldFieldValue ? oldFieldValue.concat(fieldValue) : fieldValue + newObject[field] = oldFieldValue ? oldFieldValue.concat(fieldValue) : fieldValue; } else if (fieldType === 'set') { - newObject[field] = Array.from(new Set(oldFieldValue ? oldFieldValue.concat(fieldValue) : fieldValue)).sort() + newObject[field] = Array.from(new Set(oldFieldValue ? oldFieldValue.concat(fieldValue) : fieldValue)).sort(); } } else if (methodKey === '$remove' && oldFieldValue) { if (fieldType === 'map') { - newObject[field] = oldFieldValue - fieldValue.forEach(prop => delete newObject[field][prop]) + newObject[field] = oldFieldValue; + fieldValue.forEach(prop => delete newObject[field][prop]); if (!Object.keys(newObject[field]).length) { - newObject[field] = null + newObject[field] = null; } } else if (fieldType === 'list' || fieldType === 'set') { - newObject[field] = oldFieldValue.filter(val => !fieldValue.includes(val)) + newObject[field] = oldFieldValue.filter(val => !fieldValue.includes(val)); if (!newObject[field].length) { - newObject[field] = null + newObject[field] = null; } } } } else if (fieldType === 'set') { - newObject[field] = Array.from(new Set(value)).sort() + newObject[field] = Array.from(new Set(value)).sort(); } else if (fieldType === 'counter' && exports.isPlainObject(value)) { - const methodKey = Object.keys(value)[0] - const fieldValue = value[methodKey] + const methodKey = Object.keys(value)[0]; + const fieldValue = value[methodKey]; if (methodKey === '$increment') { - newObject[field] = oldFieldValue.add(Number(fieldValue)) + newObject[field] = oldFieldValue.add(Number(fieldValue)); } else if (methodKey === '$decrement') { - newObject[field] = oldFieldValue.subtract(Number(fieldValue)) + newObject[field] = oldFieldValue.subtract(Number(fieldValue)); } } - }) -} + }); +}; exports.prepareIfCondition = (id, query, idKey) => { if (id !== null && !query.$if) { - query.$if = {} + query.$if = {}; Object.keys(query).forEach(key => { - const idField = Array.isArray(idKey) ? idKey.includes(key) : key === idKey + const idField = Array.isArray(idKey) ? idKey.includes(key) : key === idKey; if (!idField && key[0] !== '$') { - query.$if[key] = query[key] - delete query[key] + query.$if[key] = query[key]; + delete query[key]; } - }) + }); } -} +}; exports.getMaterializedView = (query, materializedViews) => { - const keys = Object.keys(query) + const keys = Object.keys(query); if (materializedViews.length > 0 && keys.length > 0) { for (const mv of materializedViews) { - if (_isEqual(mv.keys.sort(), keys.sort())) { return mv.view } + if (_isEqual(mv.keys.sort(), keys.sort())) { return mv.view; } } } - return null -} + return null; +}; exports.prepareData = (query, data, methods) => { for (const field of Object.keys(data)) { - const value = data[field] - let removeKey = false + const value = data[field]; + let removeKey = false; if (exports.isPlainObject(value)) { - const key = Object.keys(value)[0] - const fieldValue = value[key] + const key = Object.keys(value)[0]; + const fieldValue = value[key]; if (key === '$add' || key === '$remove' || key === '$increment' || key === '$decrement') { - query[methods[key]](field, key === '$add' && Array.isArray(fieldValue) ? [fieldValue] : fieldValue) - removeKey = true + query[methods[key]](field, key === '$add' && Array.isArray(fieldValue) ? [fieldValue] : fieldValue); + removeKey = true; } } if (removeKey) { - delete data[field] + delete data[field]; } } -} +}; exports.setTimestampFields = (data, updatedAt, createdAt, timestamps) => { if (timestamps) { - const now = new Date().toISOString() - const createdAtFieldName = 'createdAt' - const updatedAtFieldName = 'updatedAt' + const now = new Date().toISOString(); + const createdAtFieldName = 'createdAt'; + const updatedAtFieldName = 'updatedAt'; if (createdAt && timestamps.createdAt) { - data[typeof timestamps.createdAt === 'string' ? timestamps.createdAt : createdAtFieldName] = now + data[typeof timestamps.createdAt === 'string' ? timestamps.createdAt : createdAtFieldName] = now; } if (updatedAt && timestamps.updatedAt) { - data[typeof timestamps.updatedAt === 'string' ? timestamps.updatedAt : updatedAtFieldName] = now + data[typeof timestamps.updatedAt === 'string' ? timestamps.updatedAt : updatedAtFieldName] = now; } } -} +}; exports.setVersionField = (data, versions) => { if (versions) { - const timeuuidVersion = types.TimeUuid.now() - const versionFieldName = '__v' + const timeuuidVersion = types.TimeUuid.now(); + const versionFieldName = '__v'; - data[typeof versions.key === 'string' ? versions.key : versionFieldName] = timeuuidVersion + data[typeof versions.key === 'string' ? versions.key : versionFieldName] = timeuuidVersion; } -} +}; exports.getHookOptions = (query = {}) => { - const options = {} + const options = {}; Object.keys(query).forEach(key => { if (key[0] === '$') { - const optionName = key.substr(1).replace(/([A-Z])/g, (match, p1) => '_' + p1.toLowerCase()) - options[optionName] = query[key] + const optionName = key.substr(1).replace(/([A-Z])/g, (match, p1) => '_' + p1.toLowerCase()); + options[optionName] = query[key]; } - }) + }); - return options -} + return options; +}; exports.exec = (query, params) => { return new Promise((resolve, reject) => { const callback = (err, res) => { - if (err) return reject(err) - resolve(res) - } + if (err) return reject(err); + resolve(res); + }; if (params && params.queryOptions) { - query.exec(params.queryOptions, callback) + query.exec(params.queryOptions, callback); } else { - query.exec(callback) + query.exec(callback); } - }) -} + }); +}; exports.batch = (cassanKnex, queries, params) => { return new Promise((resolve, reject) => { const callback = (err, res) => { - if (err) return reject(err) - resolve(res) - } + if (err) return reject(err); + resolve(res); + }; if (params && params.queryOptions) { - cassanKnex().batch({ prepare: true, ...params.queryOptions }, queries, callback) + cassanKnex().batch({ prepare: true, ...params.queryOptions }, queries, callback); } else { - cassanKnex().batch({ prepare: true }, queries, callback) + cassanKnex().batch({ prepare: true }, queries, callback); } - }) -} + }); +}; diff --git a/test/adapter-tests-people-custom-id.hooks.js b/test/adapter-tests-people-custom-id.hooks.js index 078782e..8c849b1 100644 --- a/test/adapter-tests-people-custom-id.hooks.js +++ b/test/adapter-tests-people-custom-id.hooks.js @@ -1,10 +1,10 @@ const setAllowFiltering = () => { return async context => { - if (context.params.query) { context.params.query.$allowFiltering = true } + if (context.params.query) { context.params.query.$allowFiltering = true; } - return context - } -} + return context; + }; +}; module.exports = { before: { @@ -36,4 +36,4 @@ module.exports = { patch: [], remove: [] } -} +}; diff --git a/test/adapter-tests-people-custom-id.model.js b/test/adapter-tests-people-custom-id.model.js index 50d17ce..99f0c8e 100644 --- a/test/adapter-tests-people-custom-id.model.js +++ b/test/adapter-tests-people-custom-id.model.js @@ -1,5 +1,5 @@ module.exports = function (app) { - const models = app.get('models') + const models = app.get('models'); const AdapterTestsPeopleCustomIdModel = models.loadSchema('AdapterTestsPeopleCustomId', { table_name: 'adapter_tests_people_custom_id', fields: { @@ -31,16 +31,16 @@ module.exports = function (app) { } ], before_save: function (instance, options) { - instance.custom_id = models.uuid().toString() - return true + instance.custom_id = models.uuid().toString(); + return true; } }, function (err) { - if (err) throw err - }) + if (err) throw err; + }); AdapterTestsPeopleCustomIdModel.syncDB(function (err) { - if (err) throw err - }) + if (err) throw err; + }); - return AdapterTestsPeopleCustomIdModel -} + return AdapterTestsPeopleCustomIdModel; +}; diff --git a/test/adapter-tests-people-custom-id.service.js b/test/adapter-tests-people-custom-id.service.js index c83ba12..38b5768 100644 --- a/test/adapter-tests-people-custom-id.service.js +++ b/test/adapter-tests-people-custom-id.service.js @@ -1,19 +1,19 @@ -const createService = require('../src') -const createModel = require('./adapter-tests-people-custom-id.model') -const hooks = require('./adapter-tests-people-custom-id.hooks') +const createService = require('../src'); +const createModel = require('./adapter-tests-people-custom-id.model'); +const hooks = require('./adapter-tests-people-custom-id.hooks'); module.exports = function (app) { - const Model = createModel(app) + const Model = createModel(app); const options = { model: Model, whitelist: ['$allowFiltering'], events: ['testing'] - } + }; - app.use('/adapter-tests-people-custom-id', createService(options)) + app.use('/adapter-tests-people-custom-id', createService(options)); - const service = app.service('adapter-tests-people-custom-id') + const service = app.service('adapter-tests-people-custom-id'); - service.hooks(hooks) -} + service.hooks(hooks); +}; diff --git a/test/adapter-tests-people.hooks.js b/test/adapter-tests-people.hooks.js index 078782e..8c849b1 100644 --- a/test/adapter-tests-people.hooks.js +++ b/test/adapter-tests-people.hooks.js @@ -1,10 +1,10 @@ const setAllowFiltering = () => { return async context => { - if (context.params.query) { context.params.query.$allowFiltering = true } + if (context.params.query) { context.params.query.$allowFiltering = true; } - return context - } -} + return context; + }; +}; module.exports = { before: { @@ -36,4 +36,4 @@ module.exports = { patch: [], remove: [] } -} +}; diff --git a/test/adapter-tests-people.model.js b/test/adapter-tests-people.model.js index 043eb73..89492ad 100644 --- a/test/adapter-tests-people.model.js +++ b/test/adapter-tests-people.model.js @@ -1,5 +1,5 @@ module.exports = function (app) { - const models = app.get('models') + const models = app.get('models'); const AdapterTestsPeopleModel = models.loadSchema('AdapterTestsPeople', { table_name: 'adapter_tests_people', fields: { @@ -31,16 +31,16 @@ module.exports = function (app) { } ], before_save: function (instance, options) { - instance.id = models.uuid().toString() - return true + instance.id = models.uuid().toString(); + return true; } }, function (err) { - if (err) throw err - }) + if (err) throw err; + }); AdapterTestsPeopleModel.syncDB(function (err) { - if (err) throw err - }) + if (err) throw err; + }); - return AdapterTestsPeopleModel -} + return AdapterTestsPeopleModel; +}; diff --git a/test/adapter-tests-people.service.js b/test/adapter-tests-people.service.js index 0b87f24..9e8a3d0 100644 --- a/test/adapter-tests-people.service.js +++ b/test/adapter-tests-people.service.js @@ -1,19 +1,19 @@ -const createService = require('../src') -const createModel = require('./adapter-tests-people.model') -const hooks = require('./adapter-tests-people.hooks') +const createService = require('../src'); +const createModel = require('./adapter-tests-people.model'); +const hooks = require('./adapter-tests-people.hooks'); module.exports = function (app) { - const Model = createModel(app) + const Model = createModel(app); const options = { model: Model, whitelist: ['$allowFiltering'], events: ['testing'] - } + }; - app.use('/adapter-tests-people', createService(options)) + app.use('/adapter-tests-people', createService(options)); - const service = app.service('adapter-tests-people') + const service = app.service('adapter-tests-people'); - service.hooks(hooks) -} + service.hooks(hooks); +}; diff --git a/test/index.test.js b/test/index.test.js index f249b5c..c3464f2 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -1,15 +1,15 @@ /* eslint-env mocha */ /* eslint-disable no-unused-expressions */ -const { expect } = require('chai') -const { prepare, app } = require('./prepare') -const assert = require('assert') -const { base, example } = require('feathers-service-tests-cassandra') -const adapterTests = require('@feathersjs/adapter-tests') -const errors = require('@feathersjs/errors') -const sleep = require('await-sleep') -const server = require('../example/app') -const service = require('../src') -const errorHandler = require('../src/error-handler') +const { expect } = require('chai'); +const { prepare, app } = require('./prepare'); +const assert = require('assert'); +const { base, example } = require('feathers-service-tests-cassandra'); +const adapterTests = require('@feathersjs/adapter-tests'); +const errors = require('@feathersjs/errors'); +const sleep = require('await-sleep'); +const server = require('../example/app'); +const service = require('../src'); +const errorHandler = require('../src/error-handler'); const ERROR_CODES = { serverError: 0x0000, @@ -30,7 +30,7 @@ const ERROR_CODES = { configError: 0x2300, alreadyExists: 0x2400, unprepared: 0x2500 -} +}; const testSuite = adapterTests([ '.options', @@ -73,205 +73,205 @@ const testSuite = adapterTests([ '.find + $lte', '.find + $gt', '.find + $gte' -]) +]); describe('Feathers Cassandra service', () => { - let models = null - let types = null - let people = null - let peopleMv = null - let peopleRooms = null - let peopleRoomsCustomIdSeparator = null + let models = null; + let types = null; + let people = null; + let peopleMv = null; + let peopleRooms = null; + let peopleRoomsCustomIdSeparator = null; before(async () => { - await prepare() + await prepare(); - models = app.get('models') - types = models.datatypes - people = app.service('people') - peopleRooms = app.service('people-rooms') - peopleRoomsCustomIdSeparator = app.service('people-rooms-custom-id-separator') - peopleMv = app.service('people-mv') - }) + models = app.get('models'); + types = models.datatypes; + people = app.service('people'); + peopleRooms = app.service('people-rooms'); + peopleRoomsCustomIdSeparator = app.service('people-rooms-custom-id-separator'); + peopleMv = app.service('people-mv'); + }); describe('Initialization', () => { describe('when missing a model', () => { it('throws an error', () => { expect(service.bind(null, {})).to.throw( 'You must provide an ExpressCassandra Model' - ) - }) - }) + ); + }); + }); describe('when missing CassanKnex object', () => { - let cassanknex = null + let cassanknex = null; before(() => { - cassanknex = service.Service.cassanknex - service.Service.cassanknex = null - }) + cassanknex = service.Service.cassanknex; + service.Service.cassanknex = null; + }); after(() => { - service.Service.cassanknex = cassanknex - }) + service.Service.cassanknex = cassanknex; + }); it('throws an error', () => { return people.get(1).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error instanceof errors.GeneralError).to.be.ok - expect(error.message).to.equal('You must bind FeathersCassandra with an initialized CassanKnex object') - }) - }) - }) + expect(error).to.be.ok; + expect(error instanceof errors.GeneralError).to.be.ok; + expect(error.message).to.equal('You must bind FeathersCassandra with an initialized CassanKnex object'); + }); + }); + }); describe('when missing the paginate option', () => { it('sets the default to be {}', () => { - expect(people.paginate).to.equal(undefined) - }) - }) + expect(people.paginate).to.equal(undefined); + }); + }); describe('when missing filters', () => { it('sets the default to be {}', () => { - expect(peopleRooms.filters).to.deep.equal({}) - }) - }) - }) + expect(peopleRooms.filters).to.deep.equal({}); + }); + }); + }); describe('error handler', () => { it('no error code', () => { - const error = new Error('Unknown Error') - expect(errorHandler.bind(null, error)).to.throw('Unknown Error') - expect(errorHandler.bind(null, error)).to.throw(errors.GeneralError) - }) + const error = new Error('Unknown Error'); + expect(errorHandler.bind(null, error)).to.throw('Unknown Error'); + expect(errorHandler.bind(null, error)).to.throw(errors.GeneralError); + }); it('Get original error', () => { - const error = new Error() - error.code = 'SQLITE_ERROR' - error.errno = 999 + const error = new Error(); + error.code = 'SQLITE_ERROR'; + error.errno = 999; try { - errorHandler(error) + errorHandler(error); } catch (err) { - expect(err[service.ERROR]).to.deep.equal(error) + expect(err[service.ERROR]).to.deep.equal(error); } - }) + }); it('Unknown error code', () => { - const error = new Error() - error.code = 999 - expect(errorHandler.bind(null, error)).to.throw(errors.GeneralError) - }) + const error = new Error(); + error.code = 999; + expect(errorHandler.bind(null, error)).to.throw(errors.GeneralError); + }); it('syntaxError', () => { - const error = new Error() - error.code = ERROR_CODES.syntaxError - expect(errorHandler.bind(null, error)).to.throw(errors.BadRequest) - }) + const error = new Error(); + error.code = ERROR_CODES.syntaxError; + expect(errorHandler.bind(null, error)).to.throw(errors.BadRequest); + }); it('invalid', () => { - const error = new Error() - error.code = ERROR_CODES.invalid - expect(errorHandler.bind(null, error)).to.throw(errors.BadRequest) - }) + const error = new Error(); + error.code = ERROR_CODES.invalid; + expect(errorHandler.bind(null, error)).to.throw(errors.BadRequest); + }); it('truncateError', () => { - const error = new Error() - error.code = ERROR_CODES.truncateError - expect(errorHandler.bind(null, error)).to.throw(errors.BadRequest) - }) + const error = new Error(); + error.code = ERROR_CODES.truncateError; + expect(errorHandler.bind(null, error)).to.throw(errors.BadRequest); + }); it('badCredentials', () => { - const error = new Error() - error.code = ERROR_CODES.badCredentials - expect(errorHandler.bind(null, error)).to.throw(errors.NotAuthenticated) - }) + const error = new Error(); + error.code = ERROR_CODES.badCredentials; + expect(errorHandler.bind(null, error)).to.throw(errors.NotAuthenticated); + }); it('unauthorized', () => { - const error = new Error() - error.code = ERROR_CODES.unauthorized - expect(errorHandler.bind(null, error)).to.throw(errors.Forbidden) - }) + const error = new Error(); + error.code = ERROR_CODES.unauthorized; + expect(errorHandler.bind(null, error)).to.throw(errors.Forbidden); + }); it('functionFailure', () => { - const error = new Error() - error.code = ERROR_CODES.functionFailure - expect(errorHandler.bind(null, error)).to.throw(errors.MethodNotAllowed) - }) + const error = new Error(); + error.code = ERROR_CODES.functionFailure; + expect(errorHandler.bind(null, error)).to.throw(errors.MethodNotAllowed); + }); it('protocolError', () => { - const error = new Error() - error.code = ERROR_CODES.protocolError - expect(errorHandler.bind(null, error)).to.throw(errors.NotAcceptable) - }) + const error = new Error(); + error.code = ERROR_CODES.protocolError; + expect(errorHandler.bind(null, error)).to.throw(errors.NotAcceptable); + }); it('readTimeout', () => { - const error = new Error() - error.code = ERROR_CODES.readTimeout - expect(errorHandler.bind(null, error)).to.throw(errors.Timeout) - }) + const error = new Error(); + error.code = ERROR_CODES.readTimeout; + expect(errorHandler.bind(null, error)).to.throw(errors.Timeout); + }); it('writeTimeout', () => { - const error = new Error() - error.code = ERROR_CODES.writeTimeout - expect(errorHandler.bind(null, error)).to.throw(errors.Timeout) - }) + const error = new Error(); + error.code = ERROR_CODES.writeTimeout; + expect(errorHandler.bind(null, error)).to.throw(errors.Timeout); + }); it('alreadyExists', () => { - const error = new Error() - error.code = ERROR_CODES.alreadyExists - expect(errorHandler.bind(null, error)).to.throw(errors.Conflict) - }) + const error = new Error(); + error.code = ERROR_CODES.alreadyExists; + expect(errorHandler.bind(null, error)).to.throw(errors.Conflict); + }); it('overloaded', () => { - const error = new Error() - error.code = ERROR_CODES.overloaded - expect(errorHandler.bind(null, error)).to.throw(errors.Unprocessable) - }) + const error = new Error(); + error.code = ERROR_CODES.overloaded; + expect(errorHandler.bind(null, error)).to.throw(errors.Unprocessable); + }); it('configError', () => { - const error = new Error() - error.code = ERROR_CODES.configError - expect(errorHandler.bind(null, error)).to.throw(errors.GeneralError) - }) + const error = new Error(); + error.code = ERROR_CODES.configError; + expect(errorHandler.bind(null, error)).to.throw(errors.GeneralError); + }); it('serverError', () => { - const error = new Error() - error.code = ERROR_CODES.serverError - expect(errorHandler.bind(null, error)).to.throw(errors.GeneralError) - }) + const error = new Error(); + error.code = ERROR_CODES.serverError; + expect(errorHandler.bind(null, error)).to.throw(errors.GeneralError); + }); it('readFailure', () => { - const error = new Error() - error.code = ERROR_CODES.readFailure - expect(errorHandler.bind(null, error)).to.throw(errors.GeneralError) - }) + const error = new Error(); + error.code = ERROR_CODES.readFailure; + expect(errorHandler.bind(null, error)).to.throw(errors.GeneralError); + }); it('writeFailure', () => { - const error = new Error() - error.code = ERROR_CODES.writeFailure - expect(errorHandler.bind(null, error)).to.throw(errors.GeneralError) - }) + const error = new Error(); + error.code = ERROR_CODES.writeFailure; + expect(errorHandler.bind(null, error)).to.throw(errors.GeneralError); + }); it('unprepared', () => { - const error = new Error() - error.code = ERROR_CODES.unprepared - expect(errorHandler.bind(null, error)).to.throw(errors.NotImplemented) - }) + const error = new Error(); + error.code = ERROR_CODES.unprepared; + expect(errorHandler.bind(null, error)).to.throw(errors.NotImplemented); + }); it('isBootstrapping', () => { - const error = new Error() - error.code = ERROR_CODES.isBootstrapping - expect(errorHandler.bind(null, error)).to.throw(errors.Unavailable) - }) + const error = new Error(); + error.code = ERROR_CODES.isBootstrapping; + expect(errorHandler.bind(null, error)).to.throw(errors.Unavailable); + }); it('unavailableException', () => { - const error = new Error() - error.code = ERROR_CODES.unavailableException - expect(errorHandler.bind(null, error)).to.throw(errors.Unavailable) - }) - }) + const error = new Error(); + error.code = ERROR_CODES.unavailableException; + expect(errorHandler.bind(null, error)).to.throw(errors.Unavailable); + }); + }); describe('Composite PK queries', () => { beforeEach(async () => { @@ -305,102 +305,102 @@ describe('Feathers Cassandra service', () => { query: { $batch: true } - }) + }); await peopleRoomsCustomIdSeparator .patch([1, 2], { days: { $increment: 1 } - }) + }); await peopleRoomsCustomIdSeparator .patch([2, 2], { days: { $increment: 2 } - }) - }) + }); + }); afterEach(async () => { try { - await peopleRooms.remove([1, 1, 1]) + await peopleRooms.remove([1, 1, 1]); } catch (err) {} try { - await peopleRooms.remove([1, 2, 2]) + await peopleRooms.remove([1, 2, 2]); } catch (err) {} try { - await peopleRooms.remove([2, 2, 3]) + await peopleRooms.remove([2, 2, 3]); } catch (err) {} try { - await peopleRooms.remove([2, 2, 4]) + await peopleRooms.remove([2, 2, 4]); } catch (err) {} try { - await peopleRooms.remove([999, 999, 999]) + await peopleRooms.remove([999, 999, 999]); } catch (err) {} try { - await peopleRoomsCustomIdSeparator.remove([1, 2]) + await peopleRoomsCustomIdSeparator.remove([1, 2]); } catch (err) {} try { - await peopleRoomsCustomIdSeparator.remove([2, 2]) + await peopleRoomsCustomIdSeparator.remove([2, 2]); } catch (err) {} - }) + }); it('allows get queries', () => { return peopleRooms.get([2, 2, 3]).then(data => { - expect(data.people_id).to.equal(2) - expect(data.room_id).to.equal(2) - expect(data.admin).to.equal(true) - }) - }) + expect(data.people_id).to.equal(2); + expect(data.room_id).to.equal(2); + expect(data.admin).to.equal(true); + }); + }); it('allows get queries by object', () => { return peopleRooms.get({ people_id: 2, room_id: 2, time: 3 }).then(data => { - expect(data.people_id).to.equal(2) - }) - }) + expect(data.people_id).to.equal(2); + }); + }); it('allows get queries by separator', () => { return peopleRooms.get('2,2,3').then(data => { - expect(data.people_id).to.equal(2) - }) - }) + expect(data.people_id).to.equal(2); + }); + }); it('allows get queries by custom separator', () => { return peopleRoomsCustomIdSeparator.get('2.2').then(data => { - expect(data.people_id).to.equal(2) - }) - }) + expect(data.people_id).to.equal(2); + }); + }); it('allows get queries by array in string', () => { return peopleRoomsCustomIdSeparator.get('[2, 2]').then(data => { - expect(data.people_id).to.equal(2) - }) - }) + expect(data.people_id).to.equal(2); + }); + }); it('allows get queries by object in string', () => { return peopleRoomsCustomIdSeparator.get('{ "people_id": 2, "room_id": 2 }').then(data => { - expect(data.people_id).to.equal(2) - }) - }) + expect(data.people_id).to.equal(2); + }); + }); it('get with partial id in string throws an error', () => { return peopleRooms.update('2', { admin: false }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error instanceof errors.BadRequest).to.be.ok - expect(error.message).to.equal('When using composite primary key, id must contain values for all primary keys') - }) - }) + expect(error).to.be.ok; + expect(error instanceof errors.BadRequest).to.be.ok; + expect(error.message).to.equal('When using composite primary key, id must contain values for all primary keys'); + }); + }); it('allows find queries', () => { return peopleRooms.find({ query: { people_id: 2, room_id: 2 } }).then(data => { - expect(data.length).to.equal(2) - expect(data[0].people_id).to.equal(2) - expect(data[1].people_id).to.equal(2) - }) - }) + expect(data.length).to.equal(2); + expect(data[0].people_id).to.equal(2); + expect(data[1].people_id).to.equal(2); + }); + }); it('allows find with $token queries', () => { return peopleRooms.find({ @@ -411,45 +411,45 @@ describe('Feathers Cassandra service', () => { } } }).then(data => { - expect(data.length).to.equal(1) - expect(data[0].people_id).to.equal(1) - expect(data[0].room_id).to.equal(1) - }) - }) + expect(data.length).to.equal(1); + expect(data[0].people_id).to.equal(1); + expect(data[0].room_id).to.equal(1); + }); + }); it('allows update queries', () => { return peopleRooms.update([2, 2, 3], { people_id: 1, admin: false }).then(data => { - expect(data.people_id).to.equal(2) - expect(data.admin).to.equal(false) - }) - }) + expect(data.people_id).to.equal(2); + expect(data.admin).to.equal(false); + }); + }); it('update multiple records throws an error', () => { return peopleRooms.update([2, 2, 3], [{ admin: false }]).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error instanceof errors.BadRequest).to.be.ok - expect(error.message).to.equal('You can not replace multiple instances. Did you mean \'patch\'?') - }) - }) + expect(error).to.be.ok; + expect(error instanceof errors.BadRequest).to.be.ok; + expect(error.message).to.equal('You can not replace multiple instances. Did you mean \'patch\'?'); + }); + }); it('update with partial id throws an error', () => { return peopleRooms.update([2, 2], { admin: false }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error instanceof errors.BadRequest).to.be.ok - expect(error.message).to.equal('When using composite primary key, id must contain values for all primary keys') - }) - }) + expect(error).to.be.ok; + expect(error instanceof errors.BadRequest).to.be.ok; + expect(error.message).to.equal('When using composite primary key, id must contain values for all primary keys'); + }); + }); it('allows patch queries', () => { return peopleRooms.patch([2, 2, 3], { people_id: 1, admin: false }).then(data => { - expect(data.people_id).to.equal(2) - expect(data.admin).to.equal(false) - }) - }) + expect(data.people_id).to.equal(2); + expect(data.admin).to.equal(false); + }); + }); it('patch multiple records', () => { return peopleRooms.patch(null, { people_id: 1, admin: false }, { @@ -462,24 +462,24 @@ describe('Feathers Cassandra service', () => { $select: ['people_id', 'admin'] } }).then(data => { - expect(data).to.be.instanceof(Array) - expect(data.length).to.equal(2) - expect(data[0].people_id).to.equal(2) - expect(data[0].admin).to.equal(false) - expect(data[1].people_id).to.equal(2) - expect(data[1].admin).to.equal(false) - }) - }) + expect(data).to.be.instanceof(Array); + expect(data.length).to.equal(2); + expect(data[0].people_id).to.equal(2); + expect(data[0].admin).to.equal(false); + expect(data[1].people_id).to.equal(2); + expect(data[1].admin).to.equal(false); + }); + }); it('patch with partial id throws an error', () => { return peopleRooms.patch([2, 2], { admin: false }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error instanceof errors.BadRequest).to.be.ok - expect(error.message).to.equal('When using composite primary key, id must contain values for all primary keys') - }) - }) + expect(error).to.be.ok; + expect(error instanceof errors.BadRequest).to.be.ok; + expect(error.message).to.equal('When using composite primary key, id must contain values for all primary keys'); + }); + }); it('patch with id and no results throws an error', () => { return peopleRooms.patch([999, 999, 999], { admin: false }, { @@ -489,32 +489,32 @@ describe('Feathers Cassandra service', () => { } } }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error instanceof errors.NotFound).to.be.ok - expect(error.message).to.equal('No record found for id \'999,999,999\'') - }) - }) + expect(error).to.be.ok; + expect(error instanceof errors.NotFound).to.be.ok; + expect(error.message).to.equal('No record found for id \'999,999,999\''); + }); + }); it('patch with invalid id', () => { return peopleRooms.patch(false, { admin: false }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error instanceof errors.BadRequest).to.be.ok - expect(error.message).to.equal('Invalid null value in condition for column people_id') - }) - }) + expect(error).to.be.ok; + expect(error instanceof errors.BadRequest).to.be.ok; + expect(error.message).to.equal('Invalid null value in condition for column people_id'); + }); + }); it('allows remove queries', () => { return peopleRooms.remove([2, 2, 3]).then(() => { return peopleRooms.find().then(data => { - expect(data.length).to.equal(3) - }) - }) - }) - }) + expect(data.length).to.equal(3); + }); + }); + }); + }); describe('$noSelect', () => { beforeEach(async () => { @@ -524,8 +524,8 @@ describe('Feathers Cassandra service', () => { name: 'Dave', age: 10, created: true - }) - }) + }); + }); it('create with $noSelect', () => { return people.create({ @@ -537,27 +537,27 @@ describe('Feathers Cassandra service', () => { $noSelect: true } }).then(data => { - expect(data).to.be.ok - expect(data.id).to.equal(2) - expect(data.name).to.equal('John') - expect(data.age).to.equal(10) - }) - }) + expect(data).to.be.ok; + expect(data.id).to.equal(2); + expect(data.name).to.equal('John'); + expect(data.age).to.equal(10); + }); + }); it('patch with $noSelect', () => { return people.patch(1, { name: 'John' }, { query: { $noSelect: true } }).then(data => { - expect(data).to.be.ok - expect(data).to.be.empty - }) - }) + expect(data).to.be.ok; + expect(data).to.be.empty; + }); + }); it('update with $noSelect', () => { return people.update(1, { name: 'John', age: 10 }, { query: { $noSelect: true } }).then(data => { - expect(data).to.be.ok - expect(data.name).to.equal('John') - expect(data.created).to.equal(null) - }) - }) + expect(data).to.be.ok; + expect(data.name).to.equal('John'); + expect(data.created).to.equal(null); + }); + }); it('remove with $noSelect', () => { return people.remove(1, { @@ -565,11 +565,11 @@ describe('Feathers Cassandra service', () => { $noSelect: true } }).then(data => { - expect(data).to.be.ok - expect(data).to.be.empty - }) - }) - }) + expect(data).to.be.ok; + expect(data).to.be.empty; + }); + }); + }); describe('cast string to boolean', () => { beforeEach(async () => { @@ -587,41 +587,41 @@ describe('Feathers Cassandra service', () => { time: 2, admin: false } - ]) - }) + ]); + }); afterEach(async () => { - await peopleRooms.remove([1, 1, 1]) - await peopleRooms.remove([2, 2, 2]) - }) + await peopleRooms.remove([1, 1, 1]); + await peopleRooms.remove([2, 2, 2]); + }); it('find with \'false\'', () => { return peopleRooms.find({ query: { admin: 'false' } }).then(data => { - expect(data).to.be.instanceof(Array) - expect(data.length).to.equal(1) - expect(data[0].people_id).to.equal(2) - expect(data[0].admin).to.equal(false) - }) - }) + expect(data).to.be.instanceof(Array); + expect(data.length).to.equal(1); + expect(data[0].people_id).to.equal(2); + expect(data[0].admin).to.equal(false); + }); + }); it('find with \'0\'', () => { return peopleRooms.find({ query: { admin: '0' } }).then(data => { - expect(data).to.be.instanceof(Array) - expect(data.length).to.equal(1) - expect(data[0].people_id).to.equal(2) - expect(data[0].admin).to.equal(false) - }) - }) + expect(data).to.be.instanceof(Array); + expect(data.length).to.equal(1); + expect(data[0].people_id).to.equal(2); + expect(data[0].admin).to.equal(false); + }); + }); it('find with \'\'', () => { return peopleRooms.find({ query: { admin: '' } }).then(data => { - expect(data).to.be.instanceof(Array) - expect(data.length).to.equal(1) - expect(data[0].people_id).to.equal(2) - expect(data[0].admin).to.equal(false) - }) - }) - }) + expect(data).to.be.instanceof(Array); + expect(data.length).to.equal(1); + expect(data[0].people_id).to.equal(2); + expect(data[0].admin).to.equal(false); + }); + }); + }); describe('$like method', () => { beforeEach(async () => { @@ -630,19 +630,19 @@ describe('Feathers Cassandra service', () => { id: 1, name: 'Charlie Brown', age: 10 - }) - }) + }); + }); afterEach(async () => { - await people.remove(1) - }) + await people.remove(1); + }); it('$like in query', () => { return people.find({ query: { name: { $like: '%lie%' } } }).then(data => { - expect(data[0].name).to.equal('Charlie Brown') - }) - }) - }) + expect(data[0].name).to.equal('Charlie Brown'); + }); + }); + }); describe('$and method', () => { beforeEach(async () => { @@ -663,27 +663,27 @@ describe('Feathers Cassandra service', () => { name: 'Dada', age: 1 } - ]) - }) + ]); + }); afterEach(async () => { try { - await people.remove(1) + await people.remove(1); } catch (err) {} try { - await people.remove(2) + await people.remove(2); } catch (err) {} try { - await people.remove(3) + await people.remove(3); } catch (err) {} - }) + }); it('$and in query', () => { return people.find({ query: { $and: [{ name: 'Dave' }, { age: { $lt: 32 } }], $allowFiltering: true } }).then(data => { - expect(data[0].age).to.equal(23) - }) - }) - }) + expect(data[0].age).to.equal(23); + }); + }); + }); describe('$or method', () => { beforeEach(async () => { @@ -704,31 +704,31 @@ describe('Feathers Cassandra service', () => { name: 'Dada', age: 1 } - ]) - }) + ]); + }); afterEach(async () => { try { - await people.remove(1) + await people.remove(1); } catch (err) {} try { - await people.remove(2) + await people.remove(2); } catch (err) {} try { - await people.remove(3) + await people.remove(3); } catch (err) {} - }) + }); it('$or in query', () => { return people.find({ query: { $or: [{ name: 'John' }, { name: 'Dada' }] } }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error instanceof errors.BadRequest).to.be.ok - expect(error.message).to.equal('`$or` is not supported') - }) - }) - }) + expect(error).to.be.ok; + expect(error instanceof errors.BadRequest).to.be.ok; + expect(error.message).to.equal('`$or` is not supported'); + }); + }); + }); describe('$token query', () => { beforeEach(async () => { @@ -749,20 +749,20 @@ describe('Feathers Cassandra service', () => { name: 'Dada', age: 1 } - ]) - }) + ]); + }); afterEach(async () => { try { - await people.remove(1) + await people.remove(1); } catch (err) {} try { - await people.remove(2) + await people.remove(2); } catch (err) {} try { - await people.remove(3) + await people.remove(3); } catch (err) {} - }) + }); it('$token $gt query', () => { return people.find({ @@ -774,228 +774,228 @@ describe('Feathers Cassandra service', () => { } } }).then(data => { - expect(data.length).to.equal(2) - expect(data[0].name).to.equal('John') - expect(data[1].name).to.equal('Dada') - }) - }) - }) + expect(data.length).to.equal(2); + expect(data[0].name).to.equal('John'); + expect(data[1].name).to.equal('Dada'); + }); + }); + }); describe('validators', () => { beforeEach(async () => { try { - await people.remove(1) + await people.remove(1); } catch (err) {} - }) + }); afterEach(async () => { try { - await people.remove(1) + await people.remove(1); } catch (err) {} - }) + }); it('can validate create data', () => { return people.create({ id: 1, name: 'forbidden', age: 30 }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error.name).to.equal('BadRequest') - expect(error.message).to.equal('`forbidden` is a reserved word') - }) - }) + expect(error).to.be.ok; + expect(error.name).to.equal('BadRequest'); + expect(error.message).to.equal('`forbidden` is a reserved word'); + }); + }); it('can validate create data required fields', () => { return people.create({ id: 1, name: 'John' }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error.name).to.equal('BadRequest') - expect(error.message).to.equal('`age` field is required') - }) - }) + expect(error).to.be.ok; + expect(error.name).to.equal('BadRequest'); + expect(error.message).to.equal('`age` field is required'); + }); + }); it('can validate create data required fields with undefined', () => { return people.create({ id: 1, name: 'John', age: undefined }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error.name).to.equal('BadRequest') - expect(error.message).to.equal('`age` field is required') - }) - }) + expect(error).to.be.ok; + expect(error.name).to.equal('BadRequest'); + expect(error.message).to.equal('`age` field is required'); + }); + }); it('can validate create data required fields with null', () => { return people.create({ id: 1, name: 'John', age: null }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error.name).to.equal('BadRequest') - expect(error.message).to.equal('`age` field is required') - }) - }) + expect(error).to.be.ok; + expect(error.name).to.equal('BadRequest'); + expect(error.message).to.equal('`age` field is required'); + }); + }); it('can pass validate create data', () => { return people.create({ id: 1, name: 'John', age: 30 }).then(data => { - expect(data.name).to.equal('John') - }) - }) + expect(data.name).to.equal('John'); + }); + }); it('can validate multiple create data', () => { return people.create([{ id: 1, name: 'forbidden', age: 30 }]).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error.name).to.equal('BadRequest') - expect(error.message).to.equal('`forbidden` is a reserved word') - }) - }) + expect(error).to.be.ok; + expect(error.name).to.equal('BadRequest'); + expect(error.message).to.equal('`forbidden` is a reserved word'); + }); + }); it('can validate multiple create data required fields', () => { return people.create([{ id: 1, name: 'John' }]).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error.name).to.equal('BadRequest') - expect(error.message).to.equal('`age` field is required') - }) - }) + expect(error).to.be.ok; + expect(error.name).to.equal('BadRequest'); + expect(error.message).to.equal('`age` field is required'); + }); + }); it('can validate multiple create data required fields with undefined', () => { return people.create([{ id: 1, name: 'John', age: undefined }]).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error.name).to.equal('BadRequest') - expect(error.message).to.equal('`age` field is required') - }) - }) + expect(error).to.be.ok; + expect(error.name).to.equal('BadRequest'); + expect(error.message).to.equal('`age` field is required'); + }); + }); it('can validate multiple create data required fields with null', () => { return people.create([{ id: 1, name: 'John', age: null }]).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error.name).to.equal('BadRequest') - expect(error.message).to.equal('`age` field is required') - }) - }) + expect(error).to.be.ok; + expect(error.name).to.equal('BadRequest'); + expect(error.message).to.equal('`age` field is required'); + }); + }); it('can pass validate multiple create data', () => { return people.create([{ id: 1, name: 'John', age: 30 }]).then(data => { - expect(data).to.be.instanceof(Array) - expect(data.length).to.equal(1) - expect(data[0].name).to.equal('John') - }) - }) + expect(data).to.be.instanceof(Array); + expect(data.length).to.equal(1); + expect(data[0].name).to.equal('John'); + }); + }); it('can validate update data', () => { return people.update(1, { name: 'forbidden', age: 30 }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error.name).to.equal('BadRequest') - expect(error.message).to.equal('`forbidden` is a reserved word') - }) - }) + expect(error).to.be.ok; + expect(error.name).to.equal('BadRequest'); + expect(error.message).to.equal('`forbidden` is a reserved word'); + }); + }); it('can validate update data required fields', () => { return people.update(1, { name: 'John' }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error.name).to.equal('BadRequest') - expect(error.message).to.equal('`age` field is required') - }) - }) + expect(error).to.be.ok; + expect(error.name).to.equal('BadRequest'); + expect(error.message).to.equal('`age` field is required'); + }); + }); it('can validate update data required fields with undefined', () => { return people.update(1, { name: 'John', age: null }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error.name).to.equal('BadRequest') - expect(error.message).to.equal('`age` field is required') - }) - }) + expect(error).to.be.ok; + expect(error.name).to.equal('BadRequest'); + expect(error.message).to.equal('`age` field is required'); + }); + }); it('can validate update data required fields with null', () => { return people.update(1, { name: 'John', age: null }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error.name).to.equal('BadRequest') - expect(error.message).to.equal('`age` field is required') - }) - }) + expect(error).to.be.ok; + expect(error.name).to.equal('BadRequest'); + expect(error.message).to.equal('`age` field is required'); + }); + }); it('can pass validate update data', () => { return people.create({ id: 1, name: 'Dave', age: 30 }).then(() => { return people.update(1, { name: 'John', age: 30 }).then(data => { - expect(data.name).to.equal('John') - }) - }) - }) + expect(data.name).to.equal('John'); + }); + }); + }); it('can validate patch data', () => { return people.patch(1, { name: 'forbidden' }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error.name).to.equal('BadRequest') - expect(error.message).to.equal('`forbidden` is a reserved word') - }) - }) + expect(error).to.be.ok; + expect(error.name).to.equal('BadRequest'); + expect(error.message).to.equal('`forbidden` is a reserved word'); + }); + }); it('can validate patch data required fields with undefined', () => { return people.patch(1, { name: 'John', age: undefined }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error.name).to.equal('BadRequest') - expect(error.message).to.equal('`age` field is required') - }) - }) + expect(error).to.be.ok; + expect(error.name).to.equal('BadRequest'); + expect(error.message).to.equal('`age` field is required'); + }); + }); it('can validate patch data required fields with null', () => { return people.patch(1, { name: 'John', age: null }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error.name).to.equal('BadRequest') - expect(error.message).to.equal('`age` field is required') - }) - }) + expect(error).to.be.ok; + expect(error.name).to.equal('BadRequest'); + expect(error.message).to.equal('`age` field is required'); + }); + }); it('can pass validate patch data', () => { return people.patch(1, { name: 'John' }).then(data => { - expect(data.name).to.equal('John') - }) - }) + expect(data.name).to.equal('John'); + }); + }); it('can validate multiple patch data', () => { return people.patch(null, { name: 'forbidden' }, { query: { id: 1 } }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error.name).to.equal('BadRequest') - expect(error.message).to.equal('`forbidden` is a reserved word') - }) - }) + expect(error).to.be.ok; + expect(error.name).to.equal('BadRequest'); + expect(error.message).to.equal('`forbidden` is a reserved word'); + }); + }); it('can pass validate multiple patch data', () => { return people.create({ id: 1, name: 'Dave', age: 30 }).then(() => { return people.patch(null, { name: 'John' }, { query: { id: 1 } }).then(data => { - expect(data).to.be.instanceof(Array) - expect(data.length).to.equal(1) - expect(data[0].name).to.equal('John') - }) - }) - }) - }) + expect(data).to.be.instanceof(Array); + expect(data.length).to.equal(1); + expect(data[0].name).to.equal('John'); + }); + }); + }); + }); describe('filters', () => { beforeEach(async () => { - people.options.paginate = { default: 10, max: 20 } + people.options.paginate = { default: 10, max: 20 }; await people .create([ @@ -1014,32 +1014,32 @@ describe('Feathers Cassandra service', () => { name: 'Dada', age: 29 } - ]) - }) + ]); + }); afterEach(async () => { - people.options.paginate = undefined + people.options.paginate = undefined; try { - await people.remove(1) + await people.remove(1); } catch (err) {} try { - await people.remove(2) + await people.remove(2); } catch (err) {} try { - await people.remove(3) + await people.remove(3); } catch (err) {} - }) + }); it('can query with named filter', () => { return people.find({ query: { $filters: 'old' } }).then(data => { - expect(data).to.be.ok - expect(data.total).to.equal(1) - expect(data.data.length).to.equal(1) - expect(data.data[0].name).to.equal('John') - }) - }) - }) + expect(data).to.be.ok; + expect(data.total).to.equal(1); + expect(data.data.length).to.equal(1); + expect(data.data[0].name).to.equal('John'); + }); + }); + }); describe('materialized views', () => { beforeEach(async () => { @@ -1057,17 +1057,17 @@ describe('Feathers Cassandra service', () => { id: 3, name: 'Dada' } - ]) - }) + ]); + }); it('can query from materialized view', () => { return peopleMv.find({ query: { name: 'Dada' } }).then(data => { - expect(data).to.be.instanceof(Array) - expect(data.length).to.equal(1) - expect(data[0].name).to.equal('Dada') - }) - }) - }) + expect(data).to.be.instanceof(Array); + expect(data.length).to.equal(1); + expect(data[0].name).to.equal('Dada'); + }); + }); + }); describe('$limitPerPartition', () => { beforeEach(async () => { @@ -1091,20 +1091,20 @@ describe('Feathers Cassandra service', () => { time: 3, admin: false } - ]) - }) + ]); + }); afterEach(async () => { try { - await peopleRooms.remove([1, 1, 1]) + await peopleRooms.remove([1, 1, 1]); } catch (err) {} try { - await peopleRooms.remove([2, 2, 2]) + await peopleRooms.remove([2, 2, 2]); } catch (err) {} try { - await peopleRooms.remove([2, 2, 3]) + await peopleRooms.remove([2, 2, 3]); } catch (err) {} - }) + }); it('find', () => { return peopleRooms.find({ @@ -1113,28 +1113,28 @@ describe('Feathers Cassandra service', () => { $limitPerPartition: 1 } }).then(data => { - expect(data).to.be.instanceof(Array) - expect(data.length).to.equal(2) - expect(data[0].people_id).to.equal(2) - expect(data[0].time).to.equal(2) - expect(data[1].people_id).to.equal(1) - }) - }) - }) + expect(data).to.be.instanceof(Array); + expect(data.length).to.equal(2); + expect(data[0].people_id).to.equal(2); + expect(data[0].time).to.equal(2); + expect(data[1].people_id).to.equal(1); + }); + }); + }); describe('uuid & timeuuid', () => { - let uuid1 = null - let timeuuid1 = null - let uuid2 = null - let timeuuid2 = null + let uuid1 = null; + let timeuuid1 = null; + let uuid2 = null; + let timeuuid2 = null; before(() => { - uuid1 = models.uuidFromString('d9e41929-2e9a-4619-bb06-b07fa7ef1461') - timeuuid1 = models.timeuuidFromString('66260eb0-ba6a-11e8-b27a-c6c477aea255') + uuid1 = models.uuidFromString('d9e41929-2e9a-4619-bb06-b07fa7ef1461'); + timeuuid1 = models.timeuuidFromString('66260eb0-ba6a-11e8-b27a-c6c477aea255'); - uuid2 = models.uuidFromString('d9e41929-2e9a-4619-bb06-b07fa7ef1462') - timeuuid2 = models.timeuuidFromString('b48af500-ba6c-11e8-b1b4-1503c0dbeff1') - }) + uuid2 = models.uuidFromString('d9e41929-2e9a-4619-bb06-b07fa7ef1462'); + timeuuid2 = models.timeuuidFromString('b48af500-ba6c-11e8-b1b4-1503c0dbeff1'); + }); beforeEach(async () => { await peopleRooms @@ -1155,33 +1155,33 @@ describe('Feathers Cassandra service', () => { uuid: uuid2, timeuuid: timeuuid2 } - ]) - }) + ]); + }); afterEach(async () => { try { - await peopleRooms.remove([1, 1, 1]) + await peopleRooms.remove([1, 1, 1]); } catch (err) {} try { - await peopleRooms.remove([2, 2, 2]) + await peopleRooms.remove([2, 2, 2]); } catch (err) {} - }) + }); it('get', () => { return peopleRooms.get([1, 1, 1]).then(data => { - expect(data).to.be.ok - expect(data.people_id).to.equal(1) - expect(data.uuid.toString()).to.equal(uuid1.toString()) - expect(data.timeuuid.toString()).to.equal(timeuuid1.toString()) + expect(data).to.be.ok; + expect(data.people_id).to.equal(1); + expect(data.uuid.toString()).to.equal(uuid1.toString()); + expect(data.timeuuid.toString()).to.equal(timeuuid1.toString()); return peopleRooms.get([2, 2, 2]).then(data => { - expect(data).to.be.ok - expect(data.people_id).to.equal(2) - expect(data.uuid.toString()).to.equal(uuid2.toString()) - expect(data.timeuuid.toString()).to.equal(timeuuid2.toString()) - }) - }) - }) + expect(data).to.be.ok; + expect(data.people_id).to.equal(2); + expect(data.uuid.toString()).to.equal(uuid2.toString()); + expect(data.timeuuid.toString()).to.equal(timeuuid2.toString()); + }); + }); + }); it('find with string', () => { return peopleRooms.find({ @@ -1191,12 +1191,12 @@ describe('Feathers Cassandra service', () => { $allowFiltering: true } }).then(data => { - expect(data).to.be.instanceof(Array) - expect(data.length).to.equal(1) - expect(data[0].uuid.toString()).to.equal(uuid1.toString()) - expect(data[0].timeuuid.toString()).to.equal(timeuuid1.toString()) - }) - }) + expect(data).to.be.instanceof(Array); + expect(data.length).to.equal(1); + expect(data[0].uuid.toString()).to.equal(uuid1.toString()); + expect(data[0].timeuuid.toString()).to.equal(timeuuid1.toString()); + }); + }); it('find with object', () => { return peopleRooms.find({ @@ -1206,12 +1206,12 @@ describe('Feathers Cassandra service', () => { $allowFiltering: true } }).then(data => { - expect(data).to.be.instanceof(Array) - expect(data.length).to.equal(1) - expect(data[0].uuid.toString()).to.equal(uuid2.toString()) - expect(data[0].timeuuid.toString()).to.equal(timeuuid2.toString()) - }) - }) + expect(data).to.be.instanceof(Array); + expect(data.length).to.equal(1); + expect(data[0].uuid.toString()).to.equal(uuid2.toString()); + expect(data[0].timeuuid.toString()).to.equal(timeuuid2.toString()); + }); + }); it('find with object & uuid in array', () => { return peopleRooms.find({ @@ -1222,13 +1222,13 @@ describe('Feathers Cassandra service', () => { } } }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error instanceof errors.BadRequest).to.be.ok - expect(error.message).to.equal(`Expected Number, obtained '${uuid1.toString()}'`) - }) - }) + expect(error).to.be.ok; + expect(error instanceof errors.BadRequest).to.be.ok; + expect(error.message).to.equal(`Expected Number, obtained '${uuid1.toString()}'`); + }); + }); it('find with object & timeuuid in array', () => { return peopleRooms.find({ @@ -1239,14 +1239,14 @@ describe('Feathers Cassandra service', () => { } } }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error instanceof errors.BadRequest).to.be.ok - expect(error.message).to.equal(`Expected Number, obtained '${timeuuid1.toString()}'`) - }) - }) - }) + expect(error).to.be.ok; + expect(error instanceof errors.BadRequest).to.be.ok; + expect(error.message).to.equal(`Expected Number, obtained '${timeuuid1.toString()}'`); + }); + }); + }); describe('map, list, set', () => { beforeEach(async () => { @@ -1270,35 +1270,35 @@ describe('Feathers Cassandra service', () => { games: ['x', 'y', 'y'], winners: ['x', 'y', 'y'] } - ]) - }) + ]); + }); afterEach(async () => { try { - await peopleRooms.remove([1, 1, 1]) + await peopleRooms.remove([1, 1, 1]); } catch (err) {} try { - await peopleRooms.remove([2, 2, 2]) + await peopleRooms.remove([2, 2, 2]); } catch (err) {} try { - await peopleRooms.remove([3, 3, 3]) + await peopleRooms.remove([3, 3, 3]); } catch (err) {} - }) + }); it('get', () => { return peopleRooms.get([1, 1, 1]).then(data => { - expect(data).to.be.ok - expect(data.people_id).to.equal(1) - expect(data.teams).to.be.deep.equal({ a: 'b', c: 'd' }) - expect(data.games).to.be.deep.equal(['a', 'b', 'b']) - expect(data.winners).to.be.deep.equal(['a', 'b']) + expect(data).to.be.ok; + expect(data.people_id).to.equal(1); + expect(data.teams).to.be.deep.equal({ a: 'b', c: 'd' }); + expect(data.games).to.be.deep.equal(['a', 'b', 'b']); + expect(data.winners).to.be.deep.equal(['a', 'b']); return peopleRooms.get([2, 2, 2]).then(data => { - expect(data).to.be.ok - expect(data.people_id).to.equal(2) - }) - }) - }) + expect(data).to.be.ok; + expect(data.people_id).to.equal(2); + }); + }); + }); it('find contains', () => { return peopleRooms.find({ @@ -1315,14 +1315,14 @@ describe('Feathers Cassandra service', () => { $allowFiltering: true } }).then(data => { - expect(data).to.be.instanceof(Array) - expect(data.length).to.equal(1) - expect(data[0].people_id).to.equal(1) - expect(data[0].teams).to.be.deep.equal({ a: 'b', c: 'd' }) - expect(data[0].games).to.be.deep.equal(['a', 'b', 'b']) - expect(data[0].winners).to.be.deep.equal(['a', 'b']) - }) - }) + expect(data).to.be.instanceof(Array); + expect(data.length).to.equal(1); + expect(data[0].people_id).to.equal(1); + expect(data[0].teams).to.be.deep.equal({ a: 'b', c: 'd' }); + expect(data[0].games).to.be.deep.equal(['a', 'b', 'b']); + expect(data[0].winners).to.be.deep.equal(['a', 'b']); + }); + }); it('find containsKey', () => { return peopleRooms.find({ @@ -1333,14 +1333,14 @@ describe('Feathers Cassandra service', () => { $allowFiltering: true } }).then(data => { - expect(data).to.be.instanceof(Array) - expect(data.length).to.equal(1) - expect(data[0].people_id).to.equal(1) - expect(data[0].teams).to.be.deep.equal({ a: 'b', c: 'd' }) - expect(data[0].games).to.be.deep.equal(['a', 'b', 'b']) - expect(data[0].winners).to.be.deep.equal(['a', 'b']) - }) - }) + expect(data).to.be.instanceof(Array); + expect(data.length).to.equal(1); + expect(data[0].people_id).to.equal(1); + expect(data[0].teams).to.be.deep.equal({ a: 'b', c: 'd' }); + expect(data[0].games).to.be.deep.equal(['a', 'b', 'b']); + expect(data[0].winners).to.be.deep.equal(['a', 'b']); + }); + }); it('create', () => { return peopleRooms.create({ @@ -1352,13 +1352,13 @@ describe('Feathers Cassandra service', () => { games: ['a', 'b', 'b'], winners: ['a', 'b', 'b'] }).then(data => { - expect(data).to.be.ok - expect(data.people_id).to.equal(3) - expect(data.teams).to.be.deep.equal({ a: 'b', c: 'd' }) - expect(data.games).to.be.deep.equal(['a', 'b', 'b']) - expect(data.winners).to.be.deep.equal(['a', 'b']) - }) - }) + expect(data).to.be.ok; + expect(data.people_id).to.equal(3); + expect(data.teams).to.be.deep.equal({ a: 'b', c: 'd' }); + expect(data.games).to.be.deep.equal(['a', 'b', 'b']); + expect(data.winners).to.be.deep.equal(['a', 'b']); + }); + }); it('update', () => { return peopleRooms.update([1, 1, 1], { @@ -1367,17 +1367,17 @@ describe('Feathers Cassandra service', () => { games: ['b', 'c', 'c'], winners: ['b', 'c', 'c'] }).then(data => { - expect(data).to.be.ok - expect(data.people_id).to.equal(1) - expect(data.teams).to.be.deep.equal({ b: 'c', d: 'e' }) - expect(data.games).to.be.deep.equal(['b', 'c', 'c']) - expect(data.winners).to.be.deep.equal(['b', 'c']) - expect(data.created_at).to.be.ok - expect(data.updated_at).to.be.ok - expect(data.created_at.toString()).to.not.equal(data.updated_at.toString()) - expect(data._version).to.be.ok - }) - }) + expect(data).to.be.ok; + expect(data.people_id).to.equal(1); + expect(data.teams).to.be.deep.equal({ b: 'c', d: 'e' }); + expect(data.games).to.be.deep.equal(['b', 'c', 'c']); + expect(data.winners).to.be.deep.equal(['b', 'c']); + expect(data.created_at).to.be.ok; + expect(data.updated_at).to.be.ok; + expect(data.created_at.toString()).to.not.equal(data.updated_at.toString()); + expect(data._version).to.be.ok; + }); + }); it('update with $add', () => { return peopleRooms.update([1, 1, 1], { @@ -1386,12 +1386,12 @@ describe('Feathers Cassandra service', () => { games: { $add: ['b', 'c', 'c'] }, winners: { $add: ['b', 'c', 'c'] } }).then(data => { - expect(data).to.be.ok - expect(data.teams).to.be.deep.equal({ a: 'b', c: 'd', b: 'c', d: 'e' }) - expect(data.games).to.be.deep.equal(['a', 'b', 'b', 'b', 'c', 'c']) - expect(data.winners).to.be.deep.equal(['a', 'b', 'c']) - }) - }) + expect(data).to.be.ok; + expect(data.teams).to.be.deep.equal({ a: 'b', c: 'd', b: 'c', d: 'e' }); + expect(data.games).to.be.deep.equal(['a', 'b', 'b', 'b', 'c', 'c']); + expect(data.winners).to.be.deep.equal(['a', 'b', 'c']); + }); + }); it('update with $remove', () => { return peopleRooms.update([1, 1, 1], { @@ -1400,12 +1400,12 @@ describe('Feathers Cassandra service', () => { games: { $remove: ['b', 'z'] }, winners: { $remove: ['b', 'z'] } }).then(data => { - expect(data).to.be.ok - expect(data.teams).to.be.deep.equal({ c: 'd' }) - expect(data.games).to.be.deep.equal(['a']) - expect(data.winners).to.be.deep.equal(['a']) - }) - }) + expect(data).to.be.ok; + expect(data.teams).to.be.deep.equal({ c: 'd' }); + expect(data.games).to.be.deep.equal(['a']); + expect(data.winners).to.be.deep.equal(['a']); + }); + }); it('update with $remove to null', () => { return peopleRooms.update([1, 1, 1], { @@ -1414,12 +1414,12 @@ describe('Feathers Cassandra service', () => { games: { $remove: ['a', 'b'] }, winners: { $remove: ['a', 'b'] } }).then(data => { - expect(data).to.be.ok - expect(data.teams).to.equal(null) - expect(data.games).to.equal(null) - expect(data.winners).to.equal(null) - }) - }) + expect(data).to.be.ok; + expect(data.teams).to.equal(null); + expect(data.games).to.equal(null); + expect(data.winners).to.equal(null); + }); + }); it('patch', () => { return peopleRooms.patch([1, 1, 1], { @@ -1427,12 +1427,12 @@ describe('Feathers Cassandra service', () => { games: ['b', 'c', 'c'], winners: ['b', 'c', 'c'] }).then(data => { - expect(data).to.be.ok - expect(data.teams).to.be.deep.equal({ b: 'c', d: 'e' }) - expect(data.games).to.be.deep.equal(['b', 'c', 'c']) - expect(data.winners).to.be.deep.equal(['b', 'c']) - }) - }) + expect(data).to.be.ok; + expect(data.teams).to.be.deep.equal({ b: 'c', d: 'e' }); + expect(data.games).to.be.deep.equal(['b', 'c', 'c']); + expect(data.winners).to.be.deep.equal(['b', 'c']); + }); + }); it('patch with $add', () => { return peopleRooms.patch([1, 1, 1], { @@ -1440,12 +1440,12 @@ describe('Feathers Cassandra service', () => { games: { $add: ['b', 'c', 'c'] }, winners: { $add: ['b', 'c', 'c'] } }).then(data => { - expect(data).to.be.ok - expect(data.teams).to.be.deep.equal({ a: 'b', c: 'd', b: 'c', d: 'e' }) - expect(data.games).to.be.deep.equal(['a', 'b', 'b', 'b', 'c', 'c']) - expect(data.winners).to.be.deep.equal(['a', 'b', 'c']) - }) - }) + expect(data).to.be.ok; + expect(data.teams).to.be.deep.equal({ a: 'b', c: 'd', b: 'c', d: 'e' }); + expect(data.games).to.be.deep.equal(['a', 'b', 'b', 'b', 'c', 'c']); + expect(data.winners).to.be.deep.equal(['a', 'b', 'c']); + }); + }); it('patch with $remove', () => { return peopleRooms.patch([1, 1, 1], { @@ -1453,12 +1453,12 @@ describe('Feathers Cassandra service', () => { games: { $remove: ['b', 'z'] }, winners: { $remove: ['b', 'z'] } }).then(data => { - expect(data).to.be.ok - expect(data.teams).to.be.deep.equal({ c: 'd' }) - expect(data.games).to.be.deep.equal(['a']) - expect(data.winners).to.be.deep.equal(['a']) - }) - }) + expect(data).to.be.ok; + expect(data.teams).to.be.deep.equal({ c: 'd' }); + expect(data.games).to.be.deep.equal(['a']); + expect(data.winners).to.be.deep.equal(['a']); + }); + }); it('patch with $remove to null', () => { return peopleRooms.patch([1, 1, 1], { @@ -1466,13 +1466,13 @@ describe('Feathers Cassandra service', () => { games: { $remove: ['a', 'b'] }, winners: { $remove: ['a', 'b'] } }).then(data => { - expect(data).to.be.ok - expect(data.teams).to.equal(null) - expect(data.games).to.equal(null) - expect(data.winners).to.equal(null) - }) - }) - }) + expect(data).to.be.ok; + expect(data.teams).to.equal(null); + expect(data.games).to.equal(null); + expect(data.winners).to.equal(null); + }); + }); + }); describe('increment & decrement', () => { beforeEach(async () => { @@ -1485,16 +1485,16 @@ describe('Feathers Cassandra service', () => { query: { $noSelect: true } - }) - }) + }); + }); it('get', () => { return peopleRoomsCustomIdSeparator.get([1, 1]).then(data => { - expect(data).to.be.ok - expect(data.people_id).to.equal(1) - expect(data.days.toString()).to.equal('1') - }) - }) + expect(data).to.be.ok; + expect(data.people_id).to.equal(1); + expect(data.days.toString()).to.equal('1'); + }); + }); it('find', () => { return peopleRoomsCustomIdSeparator.find({ @@ -1503,12 +1503,12 @@ describe('Feathers Cassandra service', () => { $allowFiltering: true } }).then(data => { - expect(data).to.be.instanceof(Array) - expect(data.length).to.equal(1) - expect(data[0].people_id).to.equal(1) - expect(data[0].days.toString()).to.equal('2') - }) - }) + expect(data).to.be.instanceof(Array); + expect(data.length).to.equal(1); + expect(data[0].people_id).to.equal(1); + expect(data[0].days.toString()).to.equal('2'); + }); + }); it('update increment', () => { return peopleRoomsCustomIdSeparator.update([1, 1], { @@ -1516,11 +1516,11 @@ describe('Feathers Cassandra service', () => { $increment: 2 } }).then(data => { - expect(data).to.be.ok - expect(data.people_id).to.equal(1) - expect(data.days.toString()).to.equal('5') - }) - }) + expect(data).to.be.ok; + expect(data.people_id).to.equal(1); + expect(data.days.toString()).to.equal('5'); + }); + }); it('update decrement', () => { return peopleRoomsCustomIdSeparator.update([1, 1], { @@ -1528,11 +1528,11 @@ describe('Feathers Cassandra service', () => { $decrement: 1 } }).then(data => { - expect(data).to.be.ok - expect(data.people_id).to.equal(1) - expect(data.days.toString()).to.equal('5') - }) - }) + expect(data).to.be.ok; + expect(data.people_id).to.equal(1); + expect(data.days.toString()).to.equal('5'); + }); + }); it('patch increment', () => { return peopleRoomsCustomIdSeparator.patch([1, 1], { @@ -1540,11 +1540,11 @@ describe('Feathers Cassandra service', () => { $increment: 2 } }).then(data => { - expect(data).to.be.ok - expect(data.people_id).to.equal(1) - expect(data.days.toString()).to.equal('8') - }) - }) + expect(data).to.be.ok; + expect(data.people_id).to.equal(1); + expect(data.days.toString()).to.equal('8'); + }); + }); it('patch decrement', () => { return peopleRoomsCustomIdSeparator.patch([1, 1], { @@ -1552,19 +1552,19 @@ describe('Feathers Cassandra service', () => { $decrement: 1 } }).then(data => { - expect(data).to.be.ok - expect(data.people_id).to.equal(1) - expect(data.days.toString()).to.equal('8') - }) - }) - }) + expect(data).to.be.ok; + expect(data.people_id).to.equal(1); + expect(data.days.toString()).to.equal('8'); + }); + }); + }); describe('special selectors', () => { - const timestamp = Date.now() * 1000 - let timeuuid = null + const timestamp = Date.now() * 1000; + let timeuuid = null; before(async () => { - timeuuid = models.timeuuidFromString('66260eb0-ba6a-11e8-b27a-c6c477aea255') + timeuuid = models.timeuuidFromString('66260eb0-ba6a-11e8-b27a-c6c477aea255'); await people .create({ @@ -1576,7 +1576,7 @@ describe('Feathers Cassandra service', () => { $ttl: 600, $timestamp: timestamp } - }) + }); await peopleRooms .create({ @@ -1585,17 +1585,17 @@ describe('Feathers Cassandra service', () => { time: 1, admin: false, timeuuid - }) - }) + }); + }); after(async () => { try { - await people.remove(7) + await people.remove(7); } catch (err) {} try { - await peopleRooms.remove([1, 1, 1]) + await peopleRooms.remove([1, 1, 1]); } catch (err) {} - }) + }); it('find with ttl & writetime', () => { return people.find({ @@ -1604,12 +1604,12 @@ describe('Feathers Cassandra service', () => { $select: ['ttl(name)', 'writetime(name)'] } }).then(data => { - expect(data).to.be.instanceof(Array) - expect(data.length).to.equal(1) - expect(data[0]['ttl(name)']).to.be.ok - expect(data[0]['writetime(name)'].toString()).to.equal(timestamp.toString()) - }) - }) + expect(data).to.be.instanceof(Array); + expect(data.length).to.equal(1); + expect(data[0]['ttl(name)']).to.be.ok; + expect(data[0]['writetime(name)'].toString()).to.equal(timestamp.toString()); + }); + }); it('get timeuuid with time functions', () => { return peopleRooms.get([1, 1, 1], { @@ -1617,23 +1617,23 @@ describe('Feathers Cassandra service', () => { $select: ['dateOf(timeuuid)', 'unixTimestampOf(timeuuid)', 'toDate(timeuuid)', 'toTimestamp(timeuuid)', 'toUnixTimestamp(timeuuid)'] } }).then(data => { - expect(data).to.be.ok - expect(data['dateOf(timeuuid)'].toISOString()).to.equal('2018-09-17T11:11:17.787Z') - expect(data['unixTimestampOf(timeuuid)'].toString()).to.equal('1537182677787') - expect(data['toDate(timeuuid)'].toString()).to.equal('2018-09-17') - expect(data['toTimestamp(timeuuid)'].toISOString()).to.equal('2018-09-17T11:11:17.787Z') - expect(data['toUnixTimestamp(timeuuid)'].toString()).to.equal('1537182677787') - }) - }) - }) + expect(data).to.be.ok; + expect(data['dateOf(timeuuid)'].toISOString()).to.equal('2018-09-17T11:11:17.787Z'); + expect(data['unixTimestampOf(timeuuid)'].toString()).to.equal('1537182677787'); + expect(data['toDate(timeuuid)'].toString()).to.equal('2018-09-17'); + expect(data['toTimestamp(timeuuid)'].toISOString()).to.equal('2018-09-17T11:11:17.787Z'); + expect(data['toUnixTimestamp(timeuuid)'].toString()).to.equal('1537182677787'); + }); + }); + }); describe('minTimeuuid & maxTimeuuid', () => { - let timeuuid1 = null - let timeuuid2 = null + let timeuuid1 = null; + let timeuuid2 = null; before(async () => { - timeuuid1 = models.timeuuidFromString('66260eb0-ba6a-11e8-b27a-c6c477aea255') - timeuuid2 = models.timeuuidFromString('b48af500-ba6c-11e8-b1b4-1503c0dbeff1') + timeuuid1 = models.timeuuidFromString('66260eb0-ba6a-11e8-b27a-c6c477aea255'); + timeuuid2 = models.timeuuidFromString('b48af500-ba6c-11e8-b1b4-1503c0dbeff1'); await peopleRooms .create({ @@ -1642,7 +1642,7 @@ describe('Feathers Cassandra service', () => { time: 1, admin: false, timeuuid: timeuuid1 - }) + }); await peopleRooms .create({ @@ -1651,17 +1651,17 @@ describe('Feathers Cassandra service', () => { time: 2, admin: false, timeuuid: timeuuid2 - }) - }) + }); + }); after(async () => { try { - await peopleRooms.remove([1, 1, 1]) + await peopleRooms.remove([1, 1, 1]); } catch (err) {} try { - await peopleRooms.remove([2, 2, 2]) + await peopleRooms.remove([2, 2, 2]); } catch (err) {} - }) + }); it('find with minTimeuuid and maxTimeuuid', () => { return peopleRooms.find({ @@ -1679,13 +1679,13 @@ describe('Feathers Cassandra service', () => { $allowFiltering: true } }).then(data => { - expect(data).to.be.instanceof(Array) - expect(data.length).to.equal(1) - expect(data[0].people_id).to.equal(2) - expect(data[0].timeuuid.toString()).to.equal(timeuuid2.toString()) - }) - }) - }) + expect(data).to.be.instanceof(Array); + expect(data.length).to.equal(1); + expect(data[0].people_id).to.equal(2); + expect(data[0].timeuuid.toString()).to.equal(timeuuid2.toString()); + }); + }); + }); describe('auto-generated fields', () => { before(async () => { @@ -1695,27 +1695,27 @@ describe('Feathers Cassandra service', () => { room_id: 1, time: 1, admin: false - }) - }) + }); + }); after(async () => { try { - await peopleRooms.remove([1, 1, 1]) + await peopleRooms.remove([1, 1, 1]); } catch (err) {} try { - await peopleMv.remove(1) + await peopleMv.remove(1); } catch (err) {} - }) + }); it('field exists when enabled with boolean', () => { return peopleRooms.get([1, 1, 1]).then(data => { - expect(data).to.be.ok - expect(data.people_id).to.equal(1) - expect(data._version).to.be.instanceof(types.TimeUuid) - expect(data.created_at).to.be.instanceof(Date) - expect(data.updated_at).to.be.instanceof(Date) - }) - }) + expect(data).to.be.ok; + expect(data.people_id).to.equal(1); + expect(data._version).to.be.instanceof(types.TimeUuid); + expect(data.created_at).to.be.instanceof(Date); + expect(data.updated_at).to.be.instanceof(Date); + }); + }); it('field exists when enabled with object', () => { return peopleMv @@ -1725,113 +1725,113 @@ describe('Feathers Cassandra service', () => { }) .then(() => { return peopleMv.get(1).then(data => { - expect(data).to.be.ok - expect(data.name).to.equal('Dave') - expect(data.__v).to.be.instanceof(types.TimeUuid) - expect(data.createdAt).to.be.instanceof(Date) - expect(data.updatedAt).to.be.instanceof(Date) - }) - }) - }) - }) + expect(data).to.be.ok; + expect(data.name).to.equal('Dave'); + expect(data.__v).to.be.instanceof(types.TimeUuid); + expect(data.createdAt).to.be.instanceof(Date); + expect(data.updatedAt).to.be.instanceof(Date); + }); + }); + }); + }); describe('hooks', () => { before(async () => { await peopleMv .create({ id: 1 - }) - }) + }); + }); after(async () => { try { - await peopleMv.remove(1) - await peopleMv.remove(2) + await peopleMv.remove(1); + await peopleMv.remove(2); } catch (err) {} - }) + }); it('before_save hook sets default value', () => { return peopleMv.get(1).then(data => { - expect(data).to.be.ok - expect(data.id).to.equal(1) - expect(data.name).to.equal('Default') - }) - }) + expect(data).to.be.ok; + expect(data.id).to.equal(1); + expect(data.name).to.equal('Default'); + }); + }); it('before_save hook throws an error', () => { return peopleMv.create({ id: 2, name: 'Forbidden' }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error instanceof errors.BadRequest).to.be.ok - expect(error.message).to.equal('Error in before_save lifecycle function') - }) - }) + expect(error).to.be.ok; + expect(error instanceof errors.BadRequest).to.be.ok; + expect(error.message).to.equal('Error in before_save lifecycle function'); + }); + }); it('after_save hook throws an error', () => { return peopleMv.create({ id: 2, name: 'ForbiddenAfter' }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error instanceof errors.BadRequest).to.be.ok - expect(error.message).to.equal('Error in after_save lifecycle function') - }) - }) + expect(error).to.be.ok; + expect(error instanceof errors.BadRequest).to.be.ok; + expect(error.message).to.equal('Error in after_save lifecycle function'); + }); + }); it('before_update hook replace a value', () => { return peopleMv.update(1, { name: 'Replace' }).then(data => { - expect(data).to.be.ok - expect(data.id).to.equal(1) - expect(data.name).to.equal('Default') - }) - }) + expect(data).to.be.ok; + expect(data.id).to.equal(1); + expect(data.name).to.equal('Default'); + }); + }); it('before_update hook throws an error', () => { return peopleMv.update(1, { name: 'Forbidden' }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error instanceof errors.BadRequest).to.be.ok - expect(error.message).to.equal('Error in before_update lifecycle function') - }) - }) + expect(error).to.be.ok; + expect(error instanceof errors.BadRequest).to.be.ok; + expect(error.message).to.equal('Error in before_update lifecycle function'); + }); + }); it('after_update hook throws an error', () => { return peopleMv.update(1, { name: 'ForbiddenAfter' }).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error instanceof errors.BadRequest).to.be.ok - expect(error.message).to.equal('Error in after_update lifecycle function') - }) - }) + expect(error).to.be.ok; + expect(error instanceof errors.BadRequest).to.be.ok; + expect(error.message).to.equal('Error in after_update lifecycle function'); + }); + }); it('before_delete hook throws an error', () => { return peopleMv.remove(998).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error instanceof errors.BadRequest).to.be.ok - expect(error.message).to.equal('Error in before_delete lifecycle function') - }) - }) + expect(error).to.be.ok; + expect(error instanceof errors.BadRequest).to.be.ok; + expect(error.message).to.equal('Error in before_delete lifecycle function'); + }); + }); it('after_delete hook throws an error', () => { return peopleMv.remove(999).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error instanceof errors.BadRequest).to.be.ok - expect(error.message).to.equal('Error in after_delete lifecycle function') - }) - }) - }) + expect(error).to.be.ok; + expect(error instanceof errors.BadRequest).to.be.ok; + expect(error.message).to.equal('Error in after_delete lifecycle function'); + }); + }); + }); describe('$timestamp', () => { beforeEach(async () => { @@ -1840,20 +1840,20 @@ describe('Feathers Cassandra service', () => { id: 5, name: 'Dave', age: 10 - }) - }) + }); + }); afterEach(async () => { try { - await people.remove(5) + await people.remove(5); } catch (err) {} try { - await people.remove(6) + await people.remove(6); } catch (err) {} - }) + }); it('create with $timestamp', () => { - const timestamp = (Date.now() - 1000) * 1000 + const timestamp = (Date.now() - 1000) * 1000; return people.create({ id: 6, @@ -1869,14 +1869,14 @@ describe('Feathers Cassandra service', () => { $select: ['writetime(name)'] } }).then(data => { - expect(data).to.be.ok - expect(data['writetime(name)'].toString()).to.equal(timestamp.toString()) - }) - }) - }) + expect(data).to.be.ok; + expect(data['writetime(name)'].toString()).to.equal(timestamp.toString()); + }); + }); + }); it('patch with $timestamp', () => { - const timestamp = Date.now() * 1000 + const timestamp = Date.now() * 1000; return people.patch(5, { name: 'John', @@ -1891,14 +1891,14 @@ describe('Feathers Cassandra service', () => { $select: ['writetime(name)'] } }).then(data => { - expect(data).to.be.ok - expect(data['writetime(name)'].toString()).to.equal(timestamp.toString()) - }) - }) - }) + expect(data).to.be.ok; + expect(data['writetime(name)'].toString()).to.equal(timestamp.toString()); + }); + }); + }); it('update with $timestamp', () => { - const timestamp = (Date.now() * 1000).toString() + const timestamp = (Date.now() * 1000).toString(); return people.update(5, { name: 'John', @@ -1913,15 +1913,15 @@ describe('Feathers Cassandra service', () => { $select: ['writetime(name)'] } }).then(data => { - expect(data).to.be.ok - expect(data['writetime(name)'].toString()).to.equal(timestamp) - }) - }) - }) - }) + expect(data).to.be.ok; + expect(data['writetime(name)'].toString()).to.equal(timestamp); + }); + }); + }); + }); describe('$ttl', function () { - this.slow(6000) + this.slow(6000); beforeEach(async () => { await people @@ -1929,8 +1929,8 @@ describe('Feathers Cassandra service', () => { id: 1, name: 'Dave', age: 10 - }) - }) + }); + }); it('create with $ttl', () => { return people.create({ @@ -1943,23 +1943,23 @@ describe('Feathers Cassandra service', () => { } }).then(() => { return people.get(2).then(data => { - expect(data).to.be.ok - expect(data.name).to.equal('John') + expect(data).to.be.ok; + expect(data.name).to.equal('John'); return sleep(5000).then(() => { return people.get(2).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error instanceof errors.NotFound).to.be.ok - }) - }) - }) - }) - }) + expect(error).to.be.ok; + expect(error instanceof errors.NotFound).to.be.ok; + }); + }); + }); + }); + }); it('create with $timestamp & $ttl', () => { - const timestamp = Date.now() * 1000 + const timestamp = Date.now() * 1000; return people.create({ id: 6, @@ -1976,20 +1976,20 @@ describe('Feathers Cassandra service', () => { $select: ['writetime(name)'] } }).then(data => { - expect(data).to.be.ok - expect(data['writetime(name)'].toString()).to.equal(timestamp.toString()) + expect(data).to.be.ok; + expect(data['writetime(name)'].toString()).to.equal(timestamp.toString()); return sleep(5000).then(() => { return people.get(6).then(() => { - throw new Error('Should never get here') + throw new Error('Should never get here'); }).catch(function (error) { - expect(error).to.be.ok - expect(error instanceof errors.NotFound).to.be.ok - }) - }) - }) - }) - }) + expect(error).to.be.ok; + expect(error instanceof errors.NotFound).to.be.ok; + }); + }); + }); + }); + }); it('patch with $ttl', () => { return people.patch(1, { @@ -2000,19 +2000,19 @@ describe('Feathers Cassandra service', () => { } }).then(() => { return people.get(1).then(data => { - expect(data).to.be.ok - expect(data.name).to.equal('John') + expect(data).to.be.ok; + expect(data.name).to.equal('John'); return sleep(5000).then(() => { return people.get(1).then(data => { - expect(data).to.be.ok - expect(data.id).to.equal(1) - expect(data.name).to.equal(null) - }) - }) - }) - }) - }) + expect(data).to.be.ok; + expect(data.id).to.equal(1); + expect(data.name).to.equal(null); + }); + }); + }); + }); + }); it('update with $ttl', () => { return people.update(1, { @@ -2024,19 +2024,19 @@ describe('Feathers Cassandra service', () => { } }).then(() => { return people.get(1).then(data => { - expect(data).to.be.ok - expect(data.name).to.equal('John') + expect(data).to.be.ok; + expect(data.name).to.equal('John'); return sleep(5000).then(() => { return people.get(1).then(data => { - expect(data).to.be.ok - expect(data.id).to.equal(1) - expect(data.name).to.equal(null) - }) - }) - }) - }) - }) + expect(data).to.be.ok; + expect(data.id).to.equal(1); + expect(data.name).to.equal(null); + }); + }); + }); + }); + }); it('update with $ttl 0', () => { return people.update(1, { @@ -2056,50 +2056,50 @@ describe('Feathers Cassandra service', () => { } }).then(() => { return people.get(1).then(data => { - expect(data).to.be.ok - expect(data.name).to.equal('John') + expect(data).to.be.ok; + expect(data.name).to.equal('John'); return sleep(5000).then(() => { return people.get(1).then(data => { - expect(data).to.be.ok - expect(data.id).to.equal(1) - expect(data.name).to.equal('John') - }) - }) - }) - }) - }) - }) - }) + expect(data).to.be.ok; + expect(data.id).to.equal(1); + expect(data.name).to.equal('John'); + }); + }); + }); + }); + }); + }); + }); describe('$batch', function () { - const batchSize = 10 + const batchSize = 10; before(async () => { for (let id = 1; id <= batchSize; id++) { try { - await people.remove(id) + await people.remove(id); } catch (err) {} } - }) + }); afterEach(async () => { for (let id = 1; id <= batchSize; id++) { try { - await people.remove(id) + await people.remove(id); } catch (err) {} } - }) + }); it('create with $batch', () => { - const data = [] + const data = []; for (let id = 1; id <= batchSize; id++) { data.push({ id, name: 'John', age: 10 - }) + }); } return people.create(data, { @@ -2107,36 +2107,36 @@ describe('Feathers Cassandra service', () => { $batch: true } }).then(data => { - expect(data).to.be.instanceof(Array) - expect(data.length).to.equal(batchSize) - expect(data[0].name).to.equal('John') + expect(data).to.be.instanceof(Array); + expect(data.length).to.equal(batchSize); + expect(data[0].name).to.equal('John'); return people.get(batchSize).then(data => { - expect(data).to.be.ok - expect(data.name).to.equal('John') - }) - }) - }) - }) -}) + expect(data).to.be.ok; + expect(data.name).to.equal('John'); + }); + }); + }); + }); +}); describe('Common Tests', function () { - this.slow(2000) + this.slow(2000); it('is CommonJS compatible', () => - assert.strictEqual(typeof require('../lib'), 'function')) + assert.strictEqual(typeof require('../lib'), 'function')); - base(app, errors, 'people') - base(app, errors, 'people-custom-id', 'custom_id') + base(app, errors, 'people'); + base(app, errors, 'people-custom-id', 'custom_id'); - testSuite(app, errors, 'adapter-tests-people', 'id') - testSuite(app, errors, 'adapter-tests-people-custom-id', 'custom_id') -}) + testSuite(app, errors, 'adapter-tests-people', 'id'); + testSuite(app, errors, 'adapter-tests-people-custom-id', 'custom_id'); +}); describe('Feathers Cassandra service example test', function () { after(done => { - server.close(() => done()) - }) + server.close(() => done()); + }); - example() -}) + example(); +}); diff --git a/test/people-custom-id.model.js b/test/people-custom-id.model.js index 60e143f..0b05b4c 100644 --- a/test/people-custom-id.model.js +++ b/test/people-custom-id.model.js @@ -1,5 +1,5 @@ module.exports = function (app) { - const models = app.get('models') + const models = app.get('models'); const PeopleCustomIdModel = models.loadSchema('PeopleCustomId', { table_name: 'people_custom_id', fields: { @@ -37,12 +37,12 @@ module.exports = function (app) { } ] }, function (err) { - if (err) throw err - }) + if (err) throw err; + }); PeopleCustomIdModel.syncDB(function (err) { - if (err) throw err - }) + if (err) throw err; + }); - return PeopleCustomIdModel -} + return PeopleCustomIdModel; +}; diff --git a/test/people-custom-id.service.js b/test/people-custom-id.service.js index 77fdd87..bdf10a9 100644 --- a/test/people-custom-id.service.js +++ b/test/people-custom-id.service.js @@ -1,15 +1,15 @@ -const createService = require('../src') -const createModel = require('./people-custom-id.model') +const createService = require('../src'); +const createModel = require('./people-custom-id.model'); module.exports = function (app) { - const Model = createModel(app) + const Model = createModel(app); const options = { model: Model, multi: ['create', 'patch', 'remove'], whitelist: ['$and', '$like', '$token', '$noSelect', '$allowFiltering', '$filters', '$timestamp', '$ttl', '$if', '$ifExists'], events: ['testing'] - } + }; - app.use('/people-custom-id', createService(options)) -} + app.use('/people-custom-id', createService(options)); +}; diff --git a/test/people-mv.model.js b/test/people-mv.model.js index 4275de1..6943bb8 100644 --- a/test/people-mv.model.js +++ b/test/people-mv.model.js @@ -1,5 +1,5 @@ module.exports = function (app) { - const models = app.get('models') + const models = app.get('models'); const PeopleMvModel = models.loadSchema('PeopleMv', { table_name: 'people_mv', fields: { @@ -18,32 +18,32 @@ module.exports = function (app) { versions: true }, before_save: function (instance, options) { - if (!instance.name) { instance.name = 'Default' } else if (instance.name === 'Forbidden') { return false } - return true + if (!instance.name) { instance.name = 'Default'; } else if (instance.name === 'Forbidden') { return false; } + return true; }, after_save: function (instance, options) { - return instance.name !== 'ForbiddenAfter' + return instance.name !== 'ForbiddenAfter'; }, before_update: function (queryObject, updateValues, options, id) { - if (updateValues.name === 'Replace') { updateValues.name = 'Default' } else if (updateValues.name === 'Forbidden') { return false } - return true + if (updateValues.name === 'Replace') { updateValues.name = 'Default'; } else if (updateValues.name === 'Forbidden') { return false; } + return true; }, after_update: function (queryObject, updateValues, options, id) { - return updateValues.name !== 'ForbiddenAfter' + return updateValues.name !== 'ForbiddenAfter'; }, before_delete: function (queryObject, options, id) { - return !id || id !== 998 + return !id || id !== 998; }, after_delete: function (queryObject, options, id) { - return !id || id !== 999 + return !id || id !== 999; } }, function (err) { - if (err) throw err - }) + if (err) throw err; + }); PeopleMvModel.syncDB(function (err) { - if (err) throw err - }) + if (err) throw err; + }); - return PeopleMvModel -} + return PeopleMvModel; +}; diff --git a/test/people-mv.service.js b/test/people-mv.service.js index 1162950..8329458 100644 --- a/test/people-mv.service.js +++ b/test/people-mv.service.js @@ -1,8 +1,8 @@ -const createService = require('../src') -const createModel = require('./people-mv.model') +const createService = require('../src'); +const createModel = require('./people-mv.model'); module.exports = function (app) { - const Model = createModel(app) + const Model = createModel(app); const options = { model: Model, @@ -14,7 +14,7 @@ module.exports = function (app) { } ], events: ['testing'] - } + }; - app.use('/people-mv', createService(options)) -} + app.use('/people-mv', createService(options)); +}; diff --git a/test/people-rooms-custom-id-separator.model.js b/test/people-rooms-custom-id-separator.model.js index 7c35d50..cbf4bfd 100644 --- a/test/people-rooms-custom-id-separator.model.js +++ b/test/people-rooms-custom-id-separator.model.js @@ -1,5 +1,5 @@ module.exports = function (app) { - const models = app.get('models') + const models = app.get('models'); const PeopleRoomsCustomIdSeparatorModel = models.loadSchema('PeopleRoomsCustomIdSeparator', { table_name: 'people_rooms_custom_id_separator', fields: { @@ -9,12 +9,12 @@ module.exports = function (app) { }, key: ['people_id', 'room_id'] }, function (err) { - if (err) throw err - }) + if (err) throw err; + }); PeopleRoomsCustomIdSeparatorModel.syncDB(function (err) { - if (err) throw err - }) + if (err) throw err; + }); - return PeopleRoomsCustomIdSeparatorModel -} + return PeopleRoomsCustomIdSeparatorModel; +}; diff --git a/test/people-rooms-custom-id-separator.service.js b/test/people-rooms-custom-id-separator.service.js index 73b8459..3890b92 100644 --- a/test/people-rooms-custom-id-separator.service.js +++ b/test/people-rooms-custom-id-separator.service.js @@ -1,8 +1,8 @@ -const createService = require('../src') -const createModel = require('./people-rooms-custom-id-separator.model') +const createService = require('../src'); +const createModel = require('./people-rooms-custom-id-separator.model'); module.exports = function (app) { - const Model = createModel(app) + const Model = createModel(app); const options = { model: Model, @@ -10,7 +10,7 @@ module.exports = function (app) { multi: ['create'], whitelist: ['$allowFiltering'], events: ['testing'] - } + }; - app.use('/people-rooms-custom-id-separator', createService(options)) -} + app.use('/people-rooms-custom-id-separator', createService(options)); +}; diff --git a/test/people-rooms.model.js b/test/people-rooms.model.js index 67b5178..7026c5e 100644 --- a/test/people-rooms.model.js +++ b/test/people-rooms.model.js @@ -1,5 +1,5 @@ module.exports = function (app) { - const models = app.get('models') + const models = app.get('models'); const PeopleRoomModel = models.loadSchema('PeopleRoom', { table_name: 'people_rooms', fields: { @@ -40,12 +40,12 @@ module.exports = function (app) { } } }, function (err) { - if (err) throw err - }) + if (err) throw err; + }); PeopleRoomModel.syncDB(function (err) { - if (err) throw err - }) + if (err) throw err; + }); - return PeopleRoomModel -} + return PeopleRoomModel; +}; diff --git a/test/people-rooms.service.js b/test/people-rooms.service.js index 242d3a2..895a407 100644 --- a/test/people-rooms.service.js +++ b/test/people-rooms.service.js @@ -1,15 +1,15 @@ -const createService = require('../src') -const createModel = require('./people-rooms.model') +const createService = require('../src'); +const createModel = require('./people-rooms.model'); module.exports = function (app) { - const Model = createModel(app) + const Model = createModel(app); const options = { model: Model, multi: ['create', 'patch'], whitelist: ['$token', '$keys', '$condition', '$allowFiltering', '$limitPerPartition', '$contains', '$containsKey', '$minTimeuuid', '$maxTimeuuid', '$if', '$batch'], events: ['testing'] - } + }; - app.use('/people-rooms', createService(options)) -} + app.use('/people-rooms', createService(options)); +}; diff --git a/test/people.model.js b/test/people.model.js index 851b5ad..9996cf7 100644 --- a/test/people.model.js +++ b/test/people.model.js @@ -1,5 +1,5 @@ module.exports = function (app) { - const models = app.get('models') + const models = app.get('models'); const PeopleModel = models.loadSchema('People', { table_name: 'people', fields: { @@ -10,7 +10,7 @@ module.exports = function (app) { required: true, validators: [ { - validator: function (value) { return value !== 'forbidden' }, + validator: function (value) { return value !== 'forbidden'; }, message: '`forbidden` is a reserved word' } ] @@ -54,16 +54,16 @@ module.exports = function (app) { ], filters: { old: builder => { - builder.where('age', '=', 32) + builder.where('age', '=', 32); } } }, function (err) { - if (err) throw err - }) + if (err) throw err; + }); PeopleModel.syncDB(function (err) { - if (err) throw err - }) + if (err) throw err; + }); - return PeopleModel -} + return PeopleModel; +}; diff --git a/test/people.service.js b/test/people.service.js index a67f4ab..55a28c2 100644 --- a/test/people.service.js +++ b/test/people.service.js @@ -1,15 +1,15 @@ -const createService = require('../src') -const createModel = require('./people.model') +const createService = require('../src'); +const createModel = require('./people.model'); module.exports = function (app) { - const Model = createModel(app) + const Model = createModel(app); const options = { model: Model, multi: ['create', 'patch', 'remove'], whitelist: ['$and', '$like', '$token', '$noSelect', '$allowFiltering', '$filters', '$timestamp', '$ttl', '$if', '$ifExists', '$batch'], events: ['testing'] - } + }; - app.use('/people', createService(options)) -} + app.use('/people', createService(options)); +}; diff --git a/test/prepare.js b/test/prepare.js index 2306555..bf5c4e1 100644 --- a/test/prepare.js +++ b/test/prepare.js @@ -1,59 +1,59 @@ -const feathers = require('@feathersjs/feathers') -const sleep = require('await-sleep') -const services = require('./services') -const FeathersCassandra = require('../src') +const feathers = require('@feathersjs/feathers'); +const sleep = require('await-sleep'); +const services = require('./services'); +const FeathersCassandra = require('../src'); -const KEYSPACE = 'test' +const KEYSPACE = 'test'; -let app = null +let app = null; const exec = async (query) => { return new Promise((resolve, reject) => { query.exec((err, res) => { - if (err) return reject(err) - resolve(res) - }) - }) -} + if (err) return reject(err); + resolve(res); + }); + }); +}; const truncateTables = async cassanknex => { - await exec(cassanknex(KEYSPACE).truncate('people')) - await exec(cassanknex(KEYSPACE).truncate('people_custom_id')) - await exec(cassanknex(KEYSPACE).truncate('people_rooms')) - await exec(cassanknex(KEYSPACE).truncate('people_rooms_custom_id_separator')) - await exec(cassanknex(KEYSPACE).truncate('people_mv')) - await exec(cassanknex(KEYSPACE).truncate('adapter_tests_people')) - await exec(cassanknex(KEYSPACE).truncate('adapter_tests_people_custom_id')) - await exec(cassanknex(KEYSPACE).truncate('todos')) -} + await exec(cassanknex(KEYSPACE).truncate('people')); + await exec(cassanknex(KEYSPACE).truncate('people_custom_id')); + await exec(cassanknex(KEYSPACE).truncate('people_rooms')); + await exec(cassanknex(KEYSPACE).truncate('people_rooms_custom_id_separator')); + await exec(cassanknex(KEYSPACE).truncate('people_mv')); + await exec(cassanknex(KEYSPACE).truncate('adapter_tests_people')); + await exec(cassanknex(KEYSPACE).truncate('adapter_tests_people_custom_id')); + await exec(cassanknex(KEYSPACE).truncate('todos')); +}; const prepare = async () => { return new Promise((resolve, reject) => { function knex (app) { - const cassandraClient = app.get('models').orm.get_system_client() + const cassandraClient = app.get('models').orm.get_system_client(); cassandraClient.connect(err => { - if (err) return reject(err) + if (err) return reject(err); const cassanknex = require('cassanknex')({ connection: cassandraClient - }) + }); - FeathersCassandra.cassanknex(cassanknex) + FeathersCassandra.cassanknex(cassanknex); cassanknex.on('ready', async err => { - if (err) return reject(err) + if (err) return reject(err); - await sleep(30000) - await truncateTables(cassanknex) + await sleep(30000); + await truncateTables(cassanknex); - resolve() - }) - }) + resolve(); + }); + }); } sleep(5000).then(() => { // wait for keyspace to be created by the Todos example app - const ExpressCassandra = require('express-cassandra') + const ExpressCassandra = require('express-cassandra'); const models = ExpressCassandra.createClient({ clientOptions: { contactPoints: ['127.0.0.1'], @@ -69,15 +69,15 @@ const prepare = async () => { migration: 'alter', createKeyspace: false } - }) + }); app = feathers() .set('models', models) .configure(knex) - .configure(services) - }) - }) -} + .configure(services); + }); + }); +}; module.exports = { prepare, @@ -85,4 +85,4 @@ module.exports = { get: name => app.get(name), service: name => app.service(name) } -} +}; diff --git a/test/services.js b/test/services.js index dcf5cf3..0734380 100644 --- a/test/services.js +++ b/test/services.js @@ -1,17 +1,17 @@ -const people = require('./people.service') -const peopleCustomId = require('./people-custom-id.service') -const peopleRooms = require('./people-rooms.service') -const peopleRoomsCustomIdSeparator = require('./people-rooms-custom-id-separator.service') -const peopleMaterializedView = require('./people-mv.service') -const adapterTestsPeople = require('./adapter-tests-people.service') -const adapterTestsPeopleCustomId = require('./adapter-tests-people-custom-id.service') +const people = require('./people.service'); +const peopleCustomId = require('./people-custom-id.service'); +const peopleRooms = require('./people-rooms.service'); +const peopleRoomsCustomIdSeparator = require('./people-rooms-custom-id-separator.service'); +const peopleMaterializedView = require('./people-mv.service'); +const adapterTestsPeople = require('./adapter-tests-people.service'); +const adapterTestsPeopleCustomId = require('./adapter-tests-people-custom-id.service'); module.exports = function (app) { - app.configure(people) - app.configure(peopleCustomId) - app.configure(peopleRooms) - app.configure(peopleRoomsCustomIdSeparator) - app.configure(peopleMaterializedView) - app.configure(adapterTestsPeople) - app.configure(adapterTestsPeopleCustomId) -} + app.configure(people); + app.configure(peopleCustomId); + app.configure(peopleRooms); + app.configure(peopleRoomsCustomIdSeparator); + app.configure(peopleMaterializedView); + app.configure(adapterTestsPeople); + app.configure(adapterTestsPeopleCustomId); +}; diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 0000000..8ae20bc --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1,32 @@ +// TypeScript Version: 3.0 +import { Params, Paginated, Id, NullableId } from '@feathersjs/feathers'; +import { AdapterService, ServiceOptions, InternalServiceMethods } from '@feathersjs/adapter-commons'; + +export interface MaterializedView { + view: string; + keys: string[]; +} + +export interface CassandraServiceOptions extends ServiceOptions { + model: object; + idSeparator: string; + materializedViews: MaterializedView[]; +} + +export class Service extends AdapterService implements InternalServiceMethods { + model: object; + options: CassandraServiceOptions; + + constructor(config?: Partial); + + _find(params?: Params): Promise>; + _get(id: Id, params?: Params): Promise; + _create(data: Partial | Array>, params?: Params): Promise; + _update(id: NullableId, data: T, params?: Params): Promise; + _patch(id: NullableId, data: Partial, params?: Params): Promise; + _remove(id: NullableId, params?: Params): Promise; +} + +// tslint:disable-next-line:no-unnecessary-generics +declare const cassandra: ((config?: Partial) => Service); +export default cassandra; diff --git a/types/tsconfig.json b/types/tsconfig.json new file mode 100644 index 0000000..3eda81a --- /dev/null +++ b/types/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": ["es6"], + "target": "es6", + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "noEmit": true, + + // If the library is an external module (uses `export`), this allows your test file to import "mylib" instead of "./index". + // If the library is global (cannot be imported via `import` or `require`), leave this out. + "baseUrl": ".", + "paths": { "feathers-objection": ["."] } + } +} \ No newline at end of file diff --git a/types/tslint.json b/types/tslint.json new file mode 100644 index 0000000..f6d83bb --- /dev/null +++ b/types/tslint.json @@ -0,0 +1,6 @@ +{ + "extends": "dtslint/dtslint.json", // Or "dtslint/dt.json" if on DefinitelyTyped + "rules": { + "indent": [true, "spaces"] + } +} \ No newline at end of file